LangChain4j作为Java生态中新兴的AI应用开发框架,其会话功能正在成为企业级智能对话系统开发的热门选择。不同于简单的聊天接口封装,LangChain4j提供了完整的会话管理、记忆保持和上下文理解能力,让开发者能够快速构建具备长期记忆和复杂逻辑处理能力的对话应用。
我在实际企业级对话系统开发中,曾用LangChain4j成功实现了多个金融领域的智能客服项目。本文将基于这些实战经验,带你从零开始掌握LangChain4j会话功能的核心用法,包括基础配置、高级特性以及生产环境中的最佳实践。
首先需要在项目中添加LangChain4j的核心依赖。建议使用最新稳定版本(当前为0.25.0):
xml复制<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>0.25.0</version>
</dependency>
基础会话系统的初始化非常简单:
java复制// 创建对话模型实例
OpenAiChatModel model = OpenAiChatModel.builder()
.apiKey("your_api_key")
.modelName("gpt-3.5-turbo")
.temperature(0.3)
.build();
// 构建会话链
ConversationChain chain = ConversationChain.builder()
.chatLanguageModel(model)
.build();
注意:生产环境中建议通过配置中心管理API密钥,不要硬编码在代码中
实现一个简单的对话循环:
java复制try (Scanner scanner = new Scanner(System.in)) {
System.out.println("对话系统已启动,输入'exit'退出");
while (true) {
System.out.print("用户: ");
String userInput = scanner.nextLine();
if ("exit".equalsIgnoreCase(userInput)) break;
String response = chain.execute(userInput);
System.out.println("AI: " + response);
}
}
这个基础实现已经具备了连续对话能力,但缺乏会话记忆和历史管理功能。
LangChain4j通过ConversationMemory接口实现会话记忆。默认提供两种实现:
java复制ConversationMemory memory = new InMemoryConversationMemory();
java复制ConversationMemory memory = PersistentConversationMemory.builder()
.persistenceStore(new RedisChatMemoryStore("redis://localhost:6379"))
.build();
配置带记忆功能的会话链:
java复制ConversationChain chain = ConversationChain.builder()
.chatLanguageModel(model)
.conversationMemory(memory)
.build();
控制对话历史的最大长度,避免token超限:
java复制ConversationMemory memory = new InMemoryConversationMemory(
TokenWindowChatMemory.withMaxTokens(1000)
);
也可以按消息条数限制:
java复制ConversationMemory memory = new InMemoryConversationMemory(
MessageWindowChatMemory.withMaxMessages(10)
);
通过自定义状态实现复杂对话流程:
java复制public class OrderState implements ConversationState {
private String product;
private Integer quantity;
private String address;
// getters/setters...
}
ConversationChain chain = ConversationChain.builder()
.chatLanguageModel(model)
.conversationMemory(memory)
.conversationState(new OrderState())
.build();
在对话处理器中访问状态:
java复制@Override
public String process(String input) {
OrderState state = chain.currentState();
// 根据state实现业务逻辑
}
让AI可以调用外部工具:
java复制public class Calculator {
@Tool("执行数学计算")
public double calculate(double a, String operator, double b) {
// 实现计算逻辑
}
}
Calculator calculator = new Calculator();
ConversationChain chain = ConversationChain.builder()
.chatLanguageModel(model)
.tools(calculator)
.build();
AI现在可以理解"计算123乘以456"这样的指令,并自动调用计算器工具。
支持图片等多媒体输入:
java复制OpenAiChatModel multimodalModel = OpenAiChatModel.builder()
.apiKey("your_api_key")
.modelName("gpt-4-vision-preview")
.build();
// 构建多模态消息
ImageContent image = ImageContent.fromFile(Paths.get("product.jpg"));
TextContent text = TextContent.from("请描述这张图片中的商品");
String response = multimodalModel.generate(List.of(image, text));
实现实时流式输出:
java复制StreamingChatLanguageModel streamingModel = OpenAiStreamingChatModel.builder()
.apiKey("your_api_key")
.modelName("gpt-3.5-turbo")
.build();
streamingModel.generate("请用100字介绍Java", new StreamingResponseHandler() {
@Override
public void onNext(String token) {
System.out.print(token);
}
// 其他回调方法...
});
java复制OpenAiChatModel optimizedModel = OpenAiChatModel.builder()
.apiKey("your_api_key")
.modelName("gpt-3.5-turbo")
.timeout(Duration.ofSeconds(30))
.logRequests(true)
.logResponses(true)
.maxRetries(3)
.build();
实现健壮的错误处理:
java复制try {
String response = chain.execute(userInput);
} catch (LangChain4jException e) {
if (e instanceof RateLimitExceededException) {
// 处理限流
} else if (e instanceof InvalidApiKeyException) {
// 处理密钥错误
} else {
// 通用错误处理
}
}
集成监控系统:
java复制ConversationChain monitoredChain = chain.monitoredBy(new ConversationMonitor() {
@Override
public void onRequest(String input) {
metrics.increment("requests.total");
}
@Override
public void onResponse(String input, String output) {
auditLog.log(input, output);
}
});
症状:AI不记得之前的对话内容
排查步骤:
症状:AI对之前讨论的内容理解错误
解决方案:
java复制String systemPrompt = "你是一个专业客服,请记住当前对话是关于订单查询的...";
chain.setSystemPrompt(systemPrompt);
症状:AI识别了工具需求但执行失败
调试方法:
java复制public class CustomerSupportChain {
private final ConversationChain chain;
public CustomerSupportChain() {
this.chain = ConversationChain.builder()
.chatLanguageModel(createModel())
.conversationMemory(createMemory())
.tools(new OrderTool(), new RefundTool())
.build();
}
public String handleQuery(String query) {
// 添加业务逻辑预处理
return chain.execute(query);
}
}
java复制ConversationChain tutorChain = ConversationChain.builder()
.chatLanguageModel(model)
.conversationMemory(memory)
.promptTemplate("你是一位{subject}老师,请用适合{grade}学生的语言回答问题")
.build();
String response = tutorChain.execute(
"subject", "数学",
"grade", "五年级",
"input", "请解释分数乘法"
);
在实际项目中,我发现合理设置temperature参数对教育类应用特别重要 - 值太高会导致解释过于发散,太低又会显得机械。经过多次测试,0.2-0.4之间的值通常能取得最佳平衡。