基于 LangChain4j 构建智能 AI 助手:从零到一的实战指南
前言
在人工智能快速发展的今天,构建一个功能强大的 AI 助手已经不再是遥不可及的梦想。本文将通过一个实际的 Java 项目,详细介绍如何使用 LangChain4j 框架构建一个具备工具调用能力的智能 AI 助手。
项目概述
本项目是一个基于 LangChain4j 的 AI 对话应用,主要特点包括:
- 🤖 流式对话:支持实时流式响应,提供更好的用户体验
- 🛠️ 工具集成:通过 MCP (Model Context Protocol) 集成外部工具
- 💭 思考过程:支持显示 AI 的思考过程
- 🔄 异步处理:采用 CompletableFuture 进行异步响应处理
- 📝 记忆管理:内置对话历史记忆功能
核心架构解析
1. 主应用类 - AiTool.java
这是整个应用的核心入口,负责初始化 AI 模型、工具提供者和用户交互逻辑。
关键组件初始化
// 创建流式模型
StreamingChatModel model = OpenAiStreamingChatModel.builder()
.baseUrl("https://api.siliconflow.cn")
.apiKey("xxxxxxxxxxxx")
.modelName("Qwen/Qwen3-8B")
.temperature(0.01)
.logRequests(true)
.logResponses(true)
.timeout(Duration.ofSeconds(3000))
.maxTokens(50000)
.returnThinking(true)
.build();
技术亮点:
- 使用 SiliconFlow API 作为模型提供商
- 配置了 Qwen3-8B 模型,具备强大的中文理解能力
- 启用思考模式 (
returnThinking(true)),可以观察 AI 的推理过程 - 设置较低的温度值 (0.01) 确保回答的一致性和准确性
MCP 工具集成
// 创建mcp工具
McpClient mcpClient = LangChain4jUtils.createMcpClient(
List.of("D:\\vfox\\nodejs\\current\\npx.cmd", "-y", "howtocook-mcp")
);
McpToolProvider toolProvider = McpToolProvider.builder()
.mcpClients(mcpClient)
.build();
技术特色:
- 集成了
howtocook-mcp工具,为 AI 提供烹饪相关的知识和功能 - 通过 MCP 协议实现工具的标准化接入
- 支持动态工具调用和结果处理
流式响应处理
tokenStream
.onPartialResponse(partialResponse -> System.out.print(partialResponse))
.onPartialThinking(partialThinking -> System.out.println("[思考中] " + partialThinking))
.onRetrieved(contents -> System.out.println("[检索到内容] " + contents))
.beforeToolExecution(beforeToolExecution -> System.out.println("【工具请求参数】" + beforeToolExecution))
.onToolExecuted(toolExecution -> System.out.println("【工具请求结果】" + toolExecution))
.onCompleteResponse(response -> {
futureResponse.complete(response);
System.out.println("\n--- 回复结束 ---");
})
.start();
设计优势:
- 实时反馈:用户可以实时看到 AI 的回复过程
- 透明化:显示思考过程、工具调用参数和结果
- 异步处理:使用 CompletableFuture 确保主线程不被阻塞
- 错误处理:完善的异常捕获和处理机制
2. 工具类 - LangChain4jUtils.java
这是一个专门用于创建和管理 MCP 客户端的工具类,体现了良好的代码组织和复用性。
核心功能
public static McpClient createMcpClient(List<String> command, String key){
McpTransport transport = new StdioMcpTransport.Builder()
.command(command)
.logEvents(true)
.build();
if (key == null) {
return new DefaultMcpClient.Builder()
.transport(transport)
.build();
}
return new DefaultMcpClient.Builder()
.key(key)
.transport(transport)
.build();
}
相关资源: