基于Spring AI的AI Agent应用demo地址:https://github.com/q644266189/aiagentdemo
项目核心模块
| 模块/功能 | 核心能力描述 |
|---|---|
| AgentCore核心编排器 | 负责意图识别、记忆管理与大模型调用,协调各模块运行。 |
| ChatMemory | 对话记忆管理,支持三层上下文压缩:摘要压缩 → Assistant裁剪 → 滑动窗口。 |
| Tool (Function Calling) | 可插拔工具注册机制,通过InnerTool统一接口注册,LLM自主决策调用工具。 |
| RAG | 完整检索增强生成流水线:文档加载 → 分块 → 向量化 → 存储 → 多路召回(语义+BM25+查询改写)→ RRF融合 → 重排 → LLM生成。 |
| Command & Skill | Markdown驱动的Prompt模板机制:Command由用户主动触发,Skill作为Tool由LLM决策调用。 |
| SubAgent | 拥有独立记忆的子代理,支持内部SubAgent和外部IdeaLab Agent两种形态。 |
| MCP | 双向MCP支持:作为Client动态连接外部MCP服务,或作为Server对外暴露服务。 |
1.ChatMemory 对话记忆(会话压缩)实现
三层递进上下文压缩策略(防 Token 溢出 / 成本失控)
第一层:摘要压缩(智能压缩,优先触发)
触发条件:历史消息 > 16 条
执行逻辑:自动用 LLM 将早期消息总结为300 字内摘要,注入 system prompt,原消息移除
核心设计
内聚透明:压缩逻辑封装,调用方无感知
增量压缩:旧摘要 + 新对话合并总结,避免信息丢失
TOOL 消息保护:截断自动避开 TOOL 消息,保证工具调用上下文完整
第二层:Assistant 消息裁剪(精准裁剪,持续生效)
规则:仅保留最近 3 条LLM 回复
优势:LLM 回复占 Token 多,精准裁剪大幅减少上下文体积
第三层:滑动窗口(兜底保护,最后防线)
规则:消息总数 > maxRounds×4 时,直接丢弃最早消息
作用:硬性限制上下文大小,防止无限增长
三层协同逻辑
摘要压缩(保信息)→ Assistant 裁剪(省 Token)→ 滑动窗口(硬保护)
2.RAG 模块:检索增强生成
一、RAG 整体流程(总览)
文档分块 → 向量入库 → 用户提问 → 多路召回 → RRF 融合 → Rerank 重排 → 拼接上下文 → 交给 LLM 回答
二、分步详细流程
- 文档预处理:分块(决定检索质量)
使用递归语义分块 TextSplitter(默认)
规则:500 字符 / 块,重叠 50 字符
目标:保证语义完整,不破坏段落逻辑 - 向量存储
用 EmbeddingModel 生成文本向量
存入内存 VectorStore(生产可换 Milvus/Pinecone)
支持余弦相似度检索 - 用户发起查询
输入用户问题 question - 多路召回(粗检索,求全)
同时启动 3 路召回,每路取若干候选,汇总成候选池:
SemanticRecaller 语义召回:向量相似度,懂语义
Bm25Recaller 关键词召回:BM25 算法,精准匹配
QueryRewriteRecaller 查询改写召回:把问题转 3 种说法再检索,扩大覆盖
→ 输出:9 个候选文档 - RRF 融合(多路结果合并)
对 3 路结果用 RRF 倒数排名融合
不看原始分数,只看排名
合并、去重、重新排序
输出:排序后的候选集 - Rerank 重排(精检索,求精)
将 9 个候选送入 LLM 重排模型
按问题相关性重新精准打分
取 TOP3 最相关文档 - 构建上下文
把 TOP3 文档按格式拼接:
【参考资料1】【参考资料2】【参考资料3】
返回干净的上下文字符串
供 LLM 基于事实回答
三、核心技术串讲
多路召回:向量 + BM25 + 查询改写,互补盲区
RRF 融合:按倒数排名合并多路结果
Rerank:精排提升相关性,只留最有用的 3 条
BM25:关键词匹配召回
TextSplitter:递归语义分块
Embedding + VectorStore:向量检索
四、超精简流程
文档先分块、转向量入库;用户提问后,走三路召回 + RRF 融合,再经 Rerank 取 TOP3,最后拼接成上下文给大模型生成答案。