系列定位:企业级 AI 应用全栈实战,从“多模型统一 + 对话系统 + 知识库检索 + MCP 工具化”一步步搭建可扩展智能体底座。本篇为开篇介绍与代码结构导览。

1. 为什么再造一个脚手架?

在大模型应用快速迭代的当下,单纯“调用一个 Chat 接口”已经不能满足企业需求:

  • 多模型并存:OpenAI 兼容、阿里云百炼、国产模型差异化明显。
  • 对话体验:需要多轮上下文、流式输出、历史摘要、成本控制。
  • 知识增强:RAG 检索 + 内部知识库同步(结构化 & 文本)。
  • 工具协作:Agent 需要安全、可控、标准协议调用外部能力(MCP)。
  • 企业治理:权限、审计、日志、指标、合规与可观测是刚需。

langchain4j-spring-agent 目标:成为“企业级智能对话与检索增强的最小可行底座”,让你把精力投入在业务 Prompt 与场景创新上。

2. 整体模块速览

后端多模块聚合(Maven)+ 前端多 UI。核心模块:

模块 职责 关键词
chat-v2 多轮对话 / SSE / 自动摘要(>16轮触发) Redis / MyBatis-Plus / 流式
llm-common 模型统一封装 / 适配层 Spring AI / LangChain4j / Provider
elasticsearch 知识库索引管理 & 检索 API ES / 文本索引 / 预留向量
elasticsearch-mcp 将检索暴露为 MCP Tool MCP 协议 / Agent 工具化
elasticsearch-common 公共 DTO & 客户端 复用 / 规范化
security-(common v1) JWT / 权限演示
logging 日志埋点 + 收集服务 审计 / 可观测预留
ui-chat-v2 聊天前端 (模型+MCP 会话配置) Vue3 / Element Plus
ui-v1 管理后台基础骨架 菜单 / 权限 / 动态路由

3. 运行一眼就懂的主类

3.1 会话自动摘要机制

当前已实现“多轮对话上下文自动摘要”逻辑:当同一会话累计消息数(user+assistant)超过 16 轮时触发:

  1. 取早期历史片段拼接成压缩输入,调用所选模型生成一段 Summary(保留角色/主题/关键上下文)。
  2. 用摘要替换最早的大段历史,仅保留必要系统提示 + 近期 K 轮原始对话。
  3. 记录摘要产生时间与原始内容长度(便于后续成本分析与回溯)。

带来收益:

  • 控制 Token 成本(上下文膨胀风险降低)。
  • 维持语义连续性(保留主题与人物/任务状态)。
  • 为 RAG 后续拼接预留更多上下文窗口空间。

后续增强计划:

  • 多摘要分层:第一层“主题摘要”+第二层“细节补充”。
  • Token 使用统计面板(展示压缩前后差异)。
  • 可选关闭 / 不同阈值(配置化:如 12/16/20)。

Chat 服务:

@MapperScan(basePackages = "com.soft.nda.chat.mapper")
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
@EnableScheduling
public class ChatV2ServerApplication { ... }

MCP 检索服务:

@SpringBootApplication
public class McpSearchServerApplication { ... }

它们是独立进程,可按需部署或合并。

4. 知识库如何进入 Elasticsearch?

4.1 拆章节写入数据库

测试类 OcrFileInsertTest#testInsertChapters 会读取 ./doc/斗破苍穹.txt,按“第X章”正则切分写入表 aigc_ocr_file
核心片段:

Pattern chapterPattern = Pattern.compile("^(\\s*(正文|卷)?\\s*)?第([\\u4e00-\\u9fa5]{1,9}|\\d{1,4})章[ ::,、..\\s]?.*$");

它支持中文数字、阿拉伯数字、“正文/卷”前缀,适配常见网络小说章节格式。

4.2 从 DB 同步到 ES

两种方式:

  1. 测试方法 syncToES()(或之前的 sync)手动执行。
  2. 生产:SyncDocTask(可加 @Scheduled)分页扫描未同步记录(SYNC_BY_ES_STATUS != 2),写入 ES。

任务核心:

queryWrapper.ne("SYNC_BY_ES_STATUS", 2);
fulltextService.addDocument(doc);
ocr.setSyncByEsStatus(2);

失败会回写状态 99,便于重试/告警。

5. 前端:如何发起“模型 + MCP 工具”对话?

ui-chat-v2 设计关注:

  • 会话创建时绑定:模型配置 + MCP 服务地址。
  • 对话流式渲染:SSE 事件增量刷新。
  • 未来接入:RAG 片段高亮 / 工具调用轨迹(Plan → Tool → Final)。

(后续篇章将给出前端交互与接口协议细节)

5.1 可视化步骤(截图演示)

下面通过实际界面,展示“配置模型 → 测试 → 配置 MCP → 建立会话 → 流式对话与记忆”完整链路:

  1. 创建模型(填写模型名称、Base URL、API Key 等)
    在这里插入图片描述

  2. 点击测试按钮,校验模型连通性(成功后提示可用)
    在这里插入图片描述

  3. 进入 MCP 配置视图(支持 SSE 与 stdio 两种接入方式总览)
    在这里插入图片描述

  4. stdio 方式参数示例(适合本地可执行工具 / 进程型 Tool Server)
    在这里插入图片描述

  5. SSE 方式参数示例(适合远程部署的轻量服务)
    在这里插入图片描述

  6. 测试 MCP 连接并查看返回的 Tool 列表 / 示例响应
    在这里插入图片描述

  7. 新增会话时选择“模型 + MCP”组合(为后续对话注入工具上下文)
    在这里插入图片描述

  8. 实际对话界面:模型调用 + MCP 工具检索 + 记忆生效(多轮上下文)
    在这里插入图片描述

提示:会话超过 16 轮后,后端已自动触发摘要,界面仍仅展示近期核心上下文,减少 Token 消耗。

6. MCP 在这里扮演什么角色?

传统 REST + SDK 模式下,Agent 工具集成碎片化、协议不统一。MCP(Model Context Protocol)提供:

  • 双向模型上下文交互标准。
  • Tool 列表、调用、结果封装统一。
  • 更易于在多模型/多供应商之间迁移。

elasticsearch-mcp 将检索包装成 Tool:Agent 能通过统一协议获取文档,再与模型对话融合(典型链:Query → Tool(Search) → Context → LLM 回答)。

6.1 MCP 两种接入模式对比(SSE vs stdio)

方式 典型场景 优点 注意事项
SSE 远程 HTTP 服务 / 云端工具 配置简单,天然支持容器/网关 需保证网络稳定与超时控制
stdio 本地进程型工具 / CLI / 私有脚本 低延迟、便于调试 进程守护与资源回收需自行处理

截图 3/4/5 已演示两种模式的配置界面与差异。

7. 后续会补什么?

方向 计划 价值
RAG 向量检索 增加 Embedding 写入 & Hybrid 检索 更准召回
会话摘要 长上下文压缩 降低 Token 成本
观察性 指标 + Trace + 日志关联 快速定位问题
Tool 权限 MCP Tool 频控 / 白名单 防滥用
多租户 tenantId 透传隔离 SaaS 化准备

8. 如何快速尝鲜?

中间件环境准备

组件 版本建议 获取方式 备注
MySQL 8.x (>=8.0.28) 本地/容器自行安装 需提前建库并执行对应 init.sql
Redis 6.x / 7.x 本地/容器 用于会话上下文、黑名单等
Elasticsearch 8.19.4 提供 docker-compose 单节点开发模式,生产请多节点
Kibana 8.19.4 docker-compose 伴随启动 用于可视化查看索引/调试

Elasticsearch + Kibana 一键启动脚本:
langchain4j-spring-ai/langchain4j-spring-ai-elasticsearch-common/docker/docker-compose-elasticsearch-8.19.4.yml

启动示例:

cd langchain4j-spring-ai/langchain4j-spring-ai-elasticsearch-common/docker
docker compose -f docker-compose-elasticsearch-8.19.4.yml up -d
# 验证
curl http://localhost:9200

MySQL 不提供内置脚本,请自行安装(Windows / macOS / Linux 任一环境或使用官方容器):

docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=your_pwd -p 3306:3306 mysql:8.0

建库示例:

CREATE DATABASE IF NOT EXISTS langchain4j_ai DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

仓库地址

Gitee:https://gitee.com/zhangjq123/langchain4j-spring-agent.git

git clone https://gitee.com/zhangjq123/langchain4j-spring-agent.git
cd langchain4j-spring-agent

数据库初始化脚本位置

模块 脚本路径 说明
chat-v2 langchain4j-spring-ai/langchain4j-spring-ai-chat-v2/doc/init.sql 会话/用户/演示表结构(若存在)
elasticsearch langchain4j-spring-ai/langchain4j-spring-ai-elasticsearch/doc/init.sql OCR 拆章节数据相关表(如 aigc_ocr_file

执行(示例):

mysql -u root -p < langchain4j-spring-ai/langchain4j-spring-ai-chat-v2/doc/init.sql
mysql -u root -p < langchain4j-spring-ai/langchain4j-spring-ai-elasticsearch/doc/init.sql

后端

mvn -DskipTests clean package
# 运行 chat-v2 / elasticsearch / elasticsearch-mcp

前端

cd langchain4j-spring-ai-ui/langchain4j-spring-ai-ui-chat-v2
pnpm install
pnpm dev

初始化知识库

# 在 elasticsearch 模块执行对应测试 (IDE 内运行 testInsertChapters / syncToES)

9. 你可以这样参与

  • ⭐ Star / Fork / Issue 你的需求
  • 提交:向量检索实现 / Embedding 接入 / 指标埋点 / Tool 安全策略
  • 反馈:模型适配、MCP 行为、RAG 场景想法

详细贡献流程(分支模型、Issue / PR 模板、命名规范、测试要求)请参见仓库根目录文件:代码贡献方式.md


如果本文对你有帮助,欢迎点赞、收藏、转发,让更多人少踩坑。

(系列同步更新:可关注专栏 “企业级AI实战:LangChain4j+SpringAI”)

Logo

更多推荐