langchain4j 中,ChatLanguageModelStreamingChatLanguageModel 是两个用于与语言模型(如 OpenAI、Anthropic 等)交互的核心接口。它们的主要区别在于响应的获取方式使用场景


在这里插入图片描述

🧩 一、接口差异详解

特性 ChatLanguageModel StreamingChatLanguageModel
调用方式 同步阻塞式调用 异步流式调用
响应获取 等待完整生成结果后返回 逐块接收内容(token-by-token)
适用场景 获取最终答案、非交互式任务 实时聊天、对话机器人、可视化反馈
是否支持回调 ❌ 不支持 ✅ 支持回调函数处理每一块输出
性能体验 用户需等待全部生成完成 用户可立即看到部分结果,提升体验
线程安全

💡 二、代码示例说明

基于你当前项目中使用的依赖:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-beta3</version>
</dependency>

✅ 示例 1:使用 ChatLanguageModel 获取完整回复

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;

@Service
public class ChatExample {

    private final ChatLanguageModel chatModel;

    public ChatExample(ChatLanguageModel chatModel) {
        this.chatModel = chatModel;
    }

    /**
     * 使用 ChatLanguageModel 发送用户消息并等待完整响应
     */
    public void getFullResponse() {
        String userMessage = "请介绍下你自己";
        // 同步调用,等待完整响应返回
        String response = chatModel.generate(userMessage);
        System.out.println("完整回复: " + response);
    }
}

注:Spring Boot Starter 默认会从配置文件中读取 API Key,例如在 application.properties 中配置:

langchain4j.open-ai.api-key=your_api_key_here

✅ 示例 2:使用 StreamingChatLanguageModel 流式接收回复

import dev.langchain4j.model.chat.StreamingChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicReference;

@Service
public class StreamingChatExample {

    private final StreamingChatLanguageModel streamingChatModel;

    public StreamingChatExample(StreamingChatLanguageModel streamingChatModel) {
        this.streamingChatModel = streamingChatModel;
    }

    /**
     * 使用 StreamingChatLanguageModel 流式接收回复,适合实时聊天场景
     */
    public void getStreamingResponse() {
        String userMessage = "请介绍下你自己";

        // 创建一个原子引用保存完整响应(可选)
        AtomicReference<StringBuilder> fullResponse = new AtomicReference<>(new StringBuilder());

        // 流式调用,每次收到一块内容时触发 onToken 方法
        streamingChatModel.generate(userMessage, token -> {
            System.out.print(token); // 实时打印每个 token
            fullResponse.get().append(token);
        });

        System.out.println("\n完整流式回复: " + fullResponse.get());
    }
}

⚠️ 注意:StreamingChatLanguageModelgenerate 方法是异步的,不能保证在方法结束时就获得完整响应。建议结合 CompletableFuture 或 Reactor 进行更复杂的异步处理。


📊 三、总结对比表格

功能/特性 ChatLanguageModel StreamingChatLanguageModel
接口类型 同步接口 异步流式接口
返回方式 完整响应一次性返回 分块逐步返回(token-by-token)
是否阻塞 是(需要等待完整响应) 否(异步处理每一块)
是否适合聊天界面
是否支持回调
典型用途 非交互式问答、批处理任务 实时聊天、语音助手、前端反馈
线程安全性
Spring Boot 自动注入

🧠 四、使用建议

  • 如果你的应用是传统问答系统离线处理任务,推荐使用 ChatLanguageModel
  • 如果你的应用是聊天机器人、客服系统、可视化反馈界面等需要实时性的场景,推荐使用 StreamingChatLanguageModel
  • 在 Web 应用中,StreamingChatLanguageModel 可以配合 WebSocket 或 Server-Sent Events (SSE) 提供更好的用户体验。

如果你希望我为你生成一个完整的 Spring Boot 控制器(Controller)来演示这两种模型在 REST 接口中的使用,请告诉我!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐