在 langchain4j 中,ChatLanguageModel 和 StreamingChatLanguageModel 是两个用于与语言模型交互的核心,它们的主要区别在于响应的获取方式和使用场景
在 langchain4j 中,ChatLanguageModel 和 StreamingChatLanguageModel 是两个用于与语言模型交互的核心,它们的主要区别在于响应的获取方式和使用场景
·
在 langchain4j 中,ChatLanguageModel 和 StreamingChatLanguageModel 是两个用于与语言模型(如 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());
}
}
⚠️ 注意:
StreamingChatLanguageModel的generate方法是异步的,不能保证在方法结束时就获得完整响应。建议结合CompletableFuture或 Reactor 进行更复杂的异步处理。
📊 三、总结对比表格
| 功能/特性 | ChatLanguageModel |
StreamingChatLanguageModel |
|---|---|---|
| 接口类型 | 同步接口 | 异步流式接口 |
| 返回方式 | 完整响应一次性返回 | 分块逐步返回(token-by-token) |
| 是否阻塞 | 是(需要等待完整响应) | 否(异步处理每一块) |
| 是否适合聊天界面 | ❌ | ✅ |
| 是否支持回调 | ❌ | ✅ |
| 典型用途 | 非交互式问答、批处理任务 | 实时聊天、语音助手、前端反馈 |
| 线程安全性 | ✅ | ✅ |
| Spring Boot 自动注入 | ✅ | ✅ |
🧠 四、使用建议
- 如果你的应用是传统问答系统或离线处理任务,推荐使用
ChatLanguageModel。 - 如果你的应用是聊天机器人、客服系统、可视化反馈界面等需要实时性的场景,推荐使用
StreamingChatLanguageModel。 - 在 Web 应用中,
StreamingChatLanguageModel可以配合 WebSocket 或 Server-Sent Events (SSE) 提供更好的用户体验。
如果你希望我为你生成一个完整的 Spring Boot 控制器(Controller)来演示这两种模型在 REST 接口中的使用,请告诉我!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)