langchain4j笔记-04

流式调用

模型创建
java 复制代码
public static StreamingChatModel STREAMING_BASE_MODEL = OpenAiStreamingChatModel.builder()
            .baseUrl("https://api.deepseek.com")
            .apiKey(System.getenv("DS_API_KEY"))
            .modelName("deepseek-v4-flash")
            .logRequests(true)
            .logResponses(true)
            .build();
对话
java 复制代码
    /**
     * Response Streaming
     */
    @Test
    void test01() throws InterruptedException {
        String userMessage = "给我讲一个笑话";

        STREAMING_BASE_MODEL.chat(userMessage, new StreamingChatResponseHandler() {

            // 部分响应
            @Override
            public void onPartialResponse(String partialResponse) {
                System.out.println("onPartialResponse: " + partialResponse);
            }

            // 部分思考
            @Override
            public void onPartialThinking(PartialThinking partialThinking) {
                System.out.println("onPartialThinking: " + partialThinking);
            }

            // 部分工具调用
            @Override
            public void onPartialToolCall(PartialToolCall partialToolCall) {
                System.out.println("onPartialToolCall: " + partialToolCall);
            }

            // 工具调用完成
            @Override
            public void onCompleteToolCall(CompleteToolCall completeToolCall) {
                System.out.println("onCompleteToolCall: " + completeToolCall);
            }

            // 完成调用
            @Override
            public void onCompleteResponse(ChatResponse completeResponse) {
                System.out.println("onCompleteResponse: " + completeResponse);
            }

            // 异常
            @Override
            public void onError(Throwable error) {
                error.printStackTrace();
            }
        });

        Thread.sleep(1000000000000000L);
    }
输出结果如下:
json 复制代码
{
  "aiMessage": {
    "text": "当然!这是一个经典的笑话:有一天,一只海鸥飞到一家咖啡馆,点了一杯咖啡和一块蛋糕。服务员惊讶地说:"您居然会说话?"海鸥淡定地回答:"这里的蛋糕,难道不会说话吗?"",
    "thinking": null,
    "toolExecutionRequests": [],
    "attributes": {}
  },
  "metadata": {
    "id": "8cf726c0-6b4e-4d56-8d78-9bd78228cdea",
    "modelName": "deepseek-v4-flash",
    "tokenUsage": {
      "inputTokenCount": 8,
      "inputTokensDetails": {
        "cachedTokens": 0
      },
      "outputTokenCount": 90,
      "outputTokensDetails": {
        "reasoningTokens": 44
      },
      "totalTokenCount": 98
    },
    "finishReason": "STOP",
    "created": 1778565664,
    "serviceTier": "null",
    "systemFingerprint": "fp_8b330d02d0_prod0820_fp8_kvcache_20260402",
    "rawHttpResponse": "dev.langchain4j.http.client.SuccessfulHttpResponse@662e8336",
    "rawServerSentEvents": [{
      "event": null,
      "data": "{\"id\":\"8cf726c0-6b4e-4d56-8d78-9bd78228cdea\",\"object\":\"chat.completion.chunk\",\"created\":1778565664,\"model\":\"deepseek-v4-flash\",\"system_fingerprint\":\"fp_8b330d02d0_prod0820_fp8_kvcache_20260402\",\"choices\":[{\"index\":0,\"delta\":{\"role\":\"assistant\",\"content\":null,\"reasoning_content\":\"\"},\"logprobs\":null,\"finish_reason\":null}],\"usage\":null}"
    }],
    "logProbs": null
  }
}
简化如下:
java 复制代码
@Test
void test01() throws InterruptedException {
    String userMessage = "给我讲一个笑话";
    //StreamingChatResponseHandler handler = LambdaStreamingResponseHandler.onPartialResponse(System.out::println);
    STREAMING_BASE_MODEL.chat(userMessage, LambdaStreamingResponseHandler.onPartialResponse(System.out::println));
    STREAMING_BASE_MODEL.chat("Tell me a joke", LambdaStreamingResponseHandler.onPartialResponseAndError(System.out::print, Throwable::printStackTrace));
    Thread.sleep(1000000000000000L);
}
流的取消
java 复制代码
@Test
void test02() throws InterruptedException {
    String userMessage = "给我讲一个笑话";
    boolean shouldCancel = true;
    STREAMING_BASE_MODEL.chat(userMessage, new StreamingChatResponseHandler() {

        @Override
        public void onPartialResponse(PartialResponse partialResponse, PartialResponseContext context) {
            System.out.println("onPartialResponse: " + partialResponse);
            if (shouldCancel) {
                // 取消
                context.streamingHandle().cancel();
            }
        }

        @Override
        public void onCompleteResponse(ChatResponse completeResponse) {
            System.out.println("onCompleteResponse: " + completeResponse);
        }

        @Override
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    });
}
相关推荐
2501_9269783322 分钟前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
天天爱吃肉821832 分钟前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
IT19951 小时前
Dify 实战笔记:工作流核心玩法 + 开源 AI 应用全解析
笔记
dong1326972 小时前
Agent Skills学习笔记
笔记·学习
liferecords3 小时前
阅读笔记:ExtractBench: A Benchmark for Schema-Guided Enterprise Document Extraction
笔记
尤乐娃子4 小时前
进入大厂(厂子大)实习Day8
前端·笔记·实习
一只小菜鸡..4 小时前
南京大学 操作系统 (JYY) 学习笔记:持久化的黑魔法——从磁铁、刻坑到闪存电荷
服务器·笔记·学习
aFakeProgramer5 小时前
Linux版本兼容问题及RTA-VRTE环境配置笔记
linux·笔记
kels88995 小时前
多品种贵金属 Tick 怎样无缝合并回测?
笔记·python·信息可视化·金融·开发
龙仔7256 小时前
RustDesk 完整笔记
运维·笔记·rust·远程工具·rustdesk