12.用 Java + LangChain4j 构建第一个 AI 客服系统
·
如果你已经看过上一篇架构设计,这一篇我们正式开始“动手写系统”。你也可以去 GitHub 上获取相配套的项目代码。
我们不会一上来就做 RAG、多 Agent,而是先做一件最重要的事:
👉 让 AI 客服“真正跑起来”
一、为什么要先做 ai-core?
很多人做 AI 系统,一上来就:
- RAG
- 向量数据库
- Prompt 工程
- 多 Agent
结果就是:
❌ 系统没跑起来,概念一大堆
👉 正确顺序是:
LLM调用 → Chat系统 → Memory → RAG → Tools → Eval
二、本章目标:做一个“最小可运行 AI 客服”
这一章完成后,你将拥有:
✅ 能运行的 AI Chat 系统
能力包括:
- ✔ 对话接口
- ✔ session 记忆
- ✔ prompt 构建
- ✔ LangChain4j 接入 OpenAI demo
三、技术栈说明
本项目使用:
- Spring Boot 3.x
- LangChain4j(最新版本)
- OpenAI Demo Key(无需申请)
- 内存 Memory(后续可替换 Redis)
四、系统结构(对应 ai-core 模块)
ai-core
├── llm
├── chat
├── memory
├── config
五、第一步:接入 LangChain4j(LLM能力)
1️⃣ Maven 依赖
<!-- LangChain4j core -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.13.0</version>
</dependency>
<!-- OpenAI integration (demo key) -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.13.0</version>
</dependency>
2️⃣ LLM 配置
@Configuration
public class LlmConfig {
@Bean
public OpenAiChatModel openAiChatModel() {
return OpenAiChatModel.builder()
.apiKey("demo")
.baseUrl("http://langchain4j.dev/demo/openai/v1")
.modelName("gpt-4o-mini")
//.modelName(modelName)
.temperature(0.3) // 控制创造性
.timeout(Duration.ofSeconds(60))
.logRequests(true) // 调试用
.logResponses(true)
.build();
}
}
六、第二步:抽象 LLM 调用层
👉 这是未来支持 GPT / Claude / DeepSeek 的关键
接口设计
public interface LlmProvider {
String chat(String prompt);
}
OpenAI 实现
@Component
public class OpenAiLlmClient implements LlmProvider {
private final OpenAiChatModel model;
public OpenAiLlmClient(OpenAiChatModel model) {
this.model = model;
}
@Override
public String chat(String prompt) {
return model.generate(prompt);
}
}
七、第三步:构建 Memory(AI 记忆能力)
👉 AI 客服的关键差异点
1️⃣ Memory 接口
public interface MemoryStore {
String load(String sessionId);
void save(String sessionId, String userMsg, String aiMsg);
}
2️⃣ 内存实现(先用简单版本)
@Component
public class InMemoryChatMemory implements MemoryStore {
private final Map<String, StringBuilder> store = new ConcurrentHashMap<>();
@Override
public String load(String sessionId) {
return store.getOrDefault(sessionId, new StringBuilder()).toString();
}
@Override
public void save(String sessionId, String userMsg, String aiMsg) {
store.computeIfAbsent(sessionId, k -> new StringBuilder())
.append("User: ").append(userMsg).append("\n")
.append("AI: ").append(aiMsg).append("\n");
}
}
八、第四步:核心 Chat Service(系统大脑)
👉 这一层是整个 ai-core 的核心
@Service
public class ChatService {
private final LlmProvider llmProvider;
private final MemoryStore memoryStore;
public ChatService(LlmProvider llmProvider,
MemoryStore memoryStore) {
this.llmProvider = llmProvider;
this.memoryStore = memoryStore;
}
public String chat(String sessionId, String message) {
// 1. 获取历史记忆
String history = memoryStore.load(sessionId);
// 2. 构建 prompt
String prompt = buildPrompt(history, message);
// 3. 调用 LLM
String answer = llmProvider.chat(prompt);
// 4. 保存记忆
memoryStore.save(sessionId, message, answer);
return answer;
}
private String buildPrompt(String history, String message) {
return """
你是一个专业的AI客服助手,请用中文回答用户问题。
历史对话:
%s
当前问题:
%s
""".formatted(history, message);
}
}
九、第五步:测试
Test
@SpringBootTest(classes = AiCoreAutoConfiguration.class)
class ChatServiceTest {
@Autowired
private ChatService chatService;
@Test
void chat() {
//第一次会话:第一次提问
String answer1 = chatService.chat("session-1", "你好");
System.out.println(answer1);
System.out.println("-------------------------");
//第一次会话:第二次提问,获取会话记忆拼接提示词
String answer2 = chatService.chat("session-1", "你好");
System.out.println(answer2);
System.out.println("-------------------------");
//第二轮会话
String answer3 = chatService.chat("session-3", "你好");
System.out.println(answer3);
}
}
十、运行效果
2026-04-17T23:08:03.732+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP request:
- method: POST
- url: http://langchain4j.dev/demo/openai/v1/chat/completions
- headers: [Authorization: Beare...mo], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {
"model" : "gpt-4o-mini",
"messages" : [ {
"role" : "user",
"content" : "你是一个专业AI客服助手。\n\n历史对话:\n\n\n用户问题:\n你好\n\n请用中文回答。\n"
} ],
"temperature" : 0.3,
"stream" : false
}
2026-04-17T23:08:05.386+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP response:
- status code: 200
- headers: [content-type: text/html;charset=utf-8], [date: Fri, 17 Apr 2026 15:08:04 GMT], [server: Jetty(9.4.48.v20220622)], [transfer-encoding: chunked]
- body: {"id":"chatcmpl-DVf5Y0eqjnwWwFc8qUILBvQfr11Cs","created":1776438484,"model":"gpt-4o-mini-2024-07-18","choices":[{"index":0,"message":{"role":"assistant","content":"你好!有什么我可以帮助你的吗?"},"finish_reason":"stop"}],"usage":{"prompt_tokens":30,"completion_tokens":9,"total_tokens":39},"system_fingerprint":"fp_2153ead53d"}
你好!有什么我可以帮助你的吗?
-------------------------
2026-04-17T23:08:05.415+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP request:
- method: POST
- url: http://langchain4j.dev/demo/openai/v1/chat/completions
- headers: [Authorization: Beare...mo], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {
"model" : "gpt-4o-mini",
"messages" : [ {
"role" : "user",
"content" : "你是一个专业AI客服助手。\n\n历史对话:\n用户: 你好\nAI: 你好!有什么我可以帮助你的吗?\n\n\n用户问题:\n你好\n\n请用中文回答。\n"
} ],
"temperature" : 0.3,
"stream" : false
}
2026-04-17T23:08:07.268+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP response:
- status code: 200
- headers: [content-type: text/html;charset=utf-8], [date: Fri, 17 Apr 2026 15:08:05 GMT], [server: Jetty(9.4.48.v20220622)], [transfer-encoding: chunked]
- body: {"id":"chatcmpl-DVf5aVUufKfZa6ppXMEhh9JRNmlzC","created":1776438486,"model":"gpt-4o-mini-2024-07-18","choices":[{"index":0,"message":{"role":"assistant","content":"你好!有什么我可以帮助你的吗?"},"finish_reason":"stop"}],"usage":{"prompt_tokens":47,"completion_tokens":9,"total_tokens":56},"system_fingerprint":"fp_2153ead53d"}
你好!有什么我可以帮助你的吗?
-------------------------
2026-04-17T23:08:07.270+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP request:
- method: POST
- url: http://langchain4j.dev/demo/openai/v1/chat/completions
- headers: [Authorization: Beare...mo], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {
"model" : "gpt-4o-mini",
"messages" : [ {
"role" : "user",
"content" : "你是一个专业AI客服助手。\n\n历史对话:\n\n\n用户问题:\n你好\n\n请用中文回答。\n"
} ],
"temperature" : 0.3,
"stream" : false
}
2026-04-17T23:08:08.638+08:00 INFO 30304 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP response:
- status code: 200
- headers: [content-type: text/html;charset=utf-8], [date: Fri, 17 Apr 2026 15:08:07 GMT], [server: Jetty(9.4.48.v20220622)], [transfer-encoding: chunked]
- body: {"id":"chatcmpl-DVf5cwwjZ9iV29OxPPBlE3fALUDnK","created":1776438488,"model":"gpt-4o-mini-2024-07-18","choices":[{"index":0,"message":{"role":"assistant","content":"你好!有什么我可以帮助你的吗?"},"finish_reason":"stop"}],"usage":{"prompt_tokens":30,"completion_tokens":9,"total_tokens":39},"system_fingerprint":"fp_2153ead53d"}
你好!有什么我可以帮助你的吗?
十一、这个系统现在已经具备什么能力?
✅ 当前能力
- LLM 调用
- session 对话
- memory上下文
- prompt构建
❌ 还不具备
- RAG知识库
- Tool调用
- 多轮优化策略
- 评估系统
十二、这一章真正的意义(非常重要)
很多人会觉得:
“这不就是个聊天接口吗?”
但实际上这是:
👉 整个 AI 客服系统的“CPU内核”
为什么它很重要?
因为后面所有模块都建立在这里:
ChatService
↓
Prompt增强(ai-prompt)
↓
Memory升级(Redis)
↓
RAG接入(ai-rag)
↓
Tools接入(ai-tools)
↓
评估系统(ai-eval)
下一篇我们会做:
👉 《Prompt工程:让AI从“能说话”到“会干活”》
内容包括:
- Prompt模板设计
- System Prompt工程化
- 多版本Prompt管理
- Prompt评估基础
🚀 最后总结
这一篇你完成的是:
✔ 一个最小可运行 AI 客服系统(MVP)
但更重要的是:
👉 你已经拥有了一个“可持续演进的AI系统内核”
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)