如果你已经看过上一篇架构设计,这一篇我们正式开始“动手写系统”。你也可以去 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系统内核”


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐