经过第三周六天的深度学习,我们系统地掌握了 LangChain4J 中 RAG、Embedding、向量数据库、Tool/MCP、多智能体协作以及 RAG+Agent 融合等高级主题。本文是 Week 3 的全景回顾,帮助你巩固知识、查漏补缺,并为最后一周的生产级实战做好准备。
时间:20分钟 | 难度:⭐⭐ | Week 3 Day 21
📊 Week 3 学习全景
学习路径思维导图
Week 3: 高级功能与系统集成
│
├── Day 15: RAG系统完全指南
│ ├── 两阶段架构(检索 + 生成)
│ ├── ContentRetriever 核心接口
│ ├── EmbeddingStoreContentRetriever
│ └── 三种实现方式对比
│
├── Day 16: 向量化和Embedding
│ ├── 文本 → 向量的数学原理
│ ├── 余弦相似度计算
│ ├── 本地模型 vs 云端模型
│ └── EmbeddingModel 接口详解
│
├── Day 17: 向量数据库选型
│ ├── InMemoryEmbeddingStore
│ ├── Milvus / Chroma / Pinecone
│ ├── 选型五维度评估
│ └── 集成配置实战
│
├── Day 18: Tool定义和MCP
│ ├── @Tool 本地工具注解
│ ├── MCP 远程协议标准
│ ├── JSON Schema 描述规范
│ └── 四种扩展模式对比
│
├── Day 19: 多智能体协作
│ ├── 四种协作模式
│ ├── 协调者 / 流水线 / 辩论 / 群聊
│ ├── Token 成本分析
│ └── 复杂推理任务编排
│
└── Day 20: RAG和Agent融合
├── RAG 作为 Tool 注入 Agent
├── Agent 动态决策检索策略
├── 混合架构设计
└── 端到端实战案例
学习时间统计
| 天数 | 主题 | 预计时间 | 核心产出 |
|---|---|---|---|
| Day 15 | RAG系统完全指南 | 45分钟 | 完整RAG流水线 |
| Day 16 | 向量化和Embedding | 40分钟 | Embedding模型集成 |
| Day 17 | 向量数据库选型 | 40分钟 | 数据库选型决策树 |
| Day 18 | Tool定义和MCP | 45分钟 | 工具链扩展方案 |
| Day 19 | 多智能体协作 | 50分钟 | 多Agent编排模式 |
| Day 20 | RAG和Agent融合 | 45分钟 | 融合架构实战 |
| 合计 | 约4.5小时 | 6个核心能力 |
📝 五大核心概念回顾
1. RAG(检索增强生成)
一句话总结: RAG 通过"先检索、再生成"的两阶段架构,让 LLM 基于外部知识库回答问题,解决幻觉和知识过时问题。
关键 API:
// 核心接口:ContentRetriever
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(embeddingStore)
.embeddingModel(embeddingModel)
.maxResults(5)
.minScore(0.7)
.build();
// 注入到 AI Service
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.contentRetriever(retriever)
.build();
三种实现方式:
EmbeddingStoreContentRetriever-- 基于向量相似度检索WebSearchContentRetriever-- 基于网络搜索引擎- 自定义
ContentRetriever-- 实现接口对接任意数据源
常见错误: 忘记设置 minScore 阈值,导致低相关性内容被注入 prompt,反而干扰模型输出质量。建议生产环境始终设置 minScore(0.7) 以上。
2. Embedding(向量化)
一句话总结: Embedding 将自然语言文本转换为高维数值向量,使计算机能通过余弦相似度等数学方法衡量语义相似性。
关键 API:
// 云端模型(OpenAI)
EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
.apiKey(apiKey)
.modelName("text-embedding-3-small")
.build();
// 本地模型(ONNX)
EmbeddingModel localModel = OnnxEmbeddingModel.builder()
.modelPath("path/to/model.onnx")
.tokenizerPath("path/to/tokenizer.json")
.build();
// 生成向量
Response<Embedding> response = embeddingModel.embed("你好,世界");
float[] vector = response.content().vector();
本地 vs 云端选型:
| 维度 | 本地模型 | 云端模型 |
|---|---|---|
| 延迟 | 低(无网络) | 中等(网络开销) |
| 成本 | 固定(硬件) | 按量付费 |
| 质量 | 中等 | 高(持续更新) |
| 隐私 | 数据不出域 | 数据上传第三方 |
常见错误: 索引和查询使用了不同的 Embedding 模型。必须确保写入向量库和检索时使用完全相同的模型,否则相似度计算毫无意义。
3. 向量数据库
一句话总结: 向量数据库是专门存储和高效检索高维向量的数据库,是 RAG 系统的存储引擎核心。
关键 API:
// 内存(开发测试)
InMemoryEmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();
// Milvus(生产推荐)
EmbeddingStore<TextSegment> milvusStore = MilvusEmbeddingStore.builder()
.host("localhost")
.port(19530)
.collectionName("my_docs")
.dimension(1536)
.build();
// 通用写入操作
store.add(embedding, textSegment);
// 通用检索操作
List<EmbeddingMatch<TextSegment>> matches = store.findRelevant(
queryEmbedding, maxResults, minScore
);
选型五维度:
| 维度 | InMemory | Milvus | Chroma | Pinecone |
|---|---|---|---|---|
| 数据规模 | <10万 | 千万级 | 百万级 | 千万级 |
| 部署方式 | 嵌入式 | 自托管/云 | 自托管 | 纯云托管 |
| 运维成本 | 零 | 中等 | 低 | 零 |
| 查询性能 | 快(内存) | 很快 | 快 | 快 |
| 适用场景 | 原型/测试 | 企业生产 | 中小项目 | 免运维需求 |
常见错误: 在生产环境使用 InMemoryEmbeddingStore。它没有持久化,应用重启后数据全部丢失,仅适合开发测试。
4. Tool 和 MCP
一句话总结: Tool 让 LLM 调用外部函数获取实时数据或执行操作,MCP 是标准化的远程工具协议,二者共同构成 Agent 的"手和脚"。
关键 API:
// @Tool 本地工具定义
public class WeatherTool {
@Tool("查询指定城市的当前天气信息")
public String getWeather(@P("城市名称") String city) {
// 调用天气API
return weatherApi.query(city);
}
}
// 注册到 AI Service
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.tools(new WeatherTool())
.build();
// MCP 远程工具(通过 MCP Client)
McpClient mcpClient = McpClient.builder()
.transport(new StdioTransport("npx", "-y", "@modelcontextprotocol/server-github"))
.build();
四种扩展模式对比:
| 模式 | 定义方式 | 通信协议 | 适用场景 |
|---|---|---|---|
| @Tool 注解 | Java方法 | 进程内调用 | 简单本地功能 |
| ToolSpecification | 动态构建 | 进程内调用 | 运行时动态注册 |
| MCP stdio | JSON-RPC | 标准输入/输出 | 本地进程间通信 |
| MCP HTTP/SSE | JSON-RPC | HTTP协议 | 远程服务调用 |
常见错误: @Tool 注解的描述写得太简略或太模糊。描述质量直接影响模型是否能正确选择和调用工具,务必写清楚功能、参数含义和返回值。
5. 多Agent协作
一句话总结: 多Agent协作将复杂任务分解给多个专职 Agent,通过协作模式(协调者/流水线/辩论/群聊)实现单一 Agent 无法完成的复杂推理。
关键 API:
// 定义专职 Agent
interface ResearchAgent {
@SystemMessage("你是一个专业的资料研究员,负责搜集和整理信息。")
String research(@UserMessage String topic);
}
interface WriterAgent {
@SystemMessage("你是一个专业的技术写手,负责将研究内容写成文章。")
String write(@UserMessage String material);
}
// 协调者模式:由主Agent调度子Agent
interface CoordinatorAgent {
@SystemMessage("""
你是一个任务协调者。根据用户需求:
1. 先调用research工具搜集资料
2. 再调用write工具撰写文章
""")
String coordinate(@UserMessage String request);
}
四种协作模式:
| 模式 | 特点 | Token消耗 | 适用场景 |
|---|---|---|---|
| 协调者模式 | 一个主Agent调度多个子Agent | 中等 | 任务分发型工作流 |
| 流水线模式 | Agent串行处理,逐步精化 | 较低 | 线性处理流程 |
| 辩论模式 | 多Agent互相质疑和改进 | 较高 | 需要高质量决策 |
| 群聊模式 | 多Agent自由讨论 | 最高 | 开放式创意探索 |
Token 成本估算:
- 单Agent调用:1次LLM请求
- 协调者模式:1 + N次(N=子Agent数量)
- 辩论模式:N x R次(N=参与者,R=轮次)
- 群聊模式:不可预测,需设置上限
常见错误: 没有设置 maxRounds 或最大迭代次数,导致 Agent 陷入无限循环,Token 成本失控。生产环境必须设置合理的上限(通常3-5轮)。
🔗 概念关系图
┌─────────────────────────────────────────┐
│ 用户提问(Query) │
└──────────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Agent(智能体决策中心) │
│ - 理解意图 │
│ - 决定使用哪些工具 │
│ - 编排多步骤执行 │
└───┬──────────┬──────────┬───────────────┘
│ │ │
┌─────────▼──┐ ┌───▼────┐ ┌──▼──────────┐
│ RAG 检索 │ │ @Tool │ │ MCP 远程工具 │
│ Pipeline │ │ 本地工具│ │ 协议调用 │
└─────┬──────┘ └────────┘ └─────────────┘
│
┌────────▼────────┐
│ Embedding模型 │
│ 文本 → 向量转换 │
└────────┬────────┘
│
┌────────▼────────┐
│ 向量数据库 │
│ 存储 & 相似度检索 │
└─────────────────┘
┌──────────────────────────────────────────────────┐
│ 多Agent协作层(可选) │
│ │
│ Agent A ◄──协调──► Agent B ◄──协调──► Agent C │
│ (研究员) (分析师) (写手) │
│ │
│ 协作模式:协调者 / 流水线 / 辩论 / 群聊 │
└──────────────────────────────────────────────────┘
关系说明:
- Agent 是决策中心,统一调度 RAG、Tool、MCP
- RAG 依赖 Embedding 模型做向量化,依赖向量数据库做存储和检索
- Tool 和 MCP 扩展 Agent 的能力边界(本地/远程)
- 多Agent协作是在单Agent基础上的架构升级,处理更复杂的任务
❓ Week 3 常见问题 Q&A
Q1: RAG 和 Fine-tuning 什么时候该用哪个?
A: 关键判断标准是知识的"变化频率"和"专有程度":
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 企业内部文档问答 | RAG | 文档频繁更新,RAG实时检索 |
| 特定领域术语理解 | Fine-tuning | 需要模型内化专业知识 |
| 客户FAQ系统 | RAG | 答案库经常变动 |
| 代码风格统一 | Fine-tuning | 需要持久的风格偏好 |
| 混合需求 | RAG + Fine-tuning | 先微调基础能力,再RAG补充时效性知识 |
经验法则: 如果知识会频繁变化,优先 RAG;如果需要改变模型的"行为方式",考虑 Fine-tuning。
Q2: @Tool 和 MCP 怎么选?
A: 根据工具的位置和复用需求选择:
- 用 @Tool -- 工具逻辑简单、与应用紧密耦合、仅当前项目使用
- 用 MCP -- 工具需要跨项目复用、由独立团队维护、涉及远程服务调用
简单场景:@Tool 注解 → 最快上手
复用场景:MCP stdio → 本地进程间通信
远程场景:MCP HTTP/SSE → 跨网络调用
动态场景:ToolSpecification → 运行时动态注册
Q3: 多Agent成本如何控制?
A: 三个核心策略:
- 设置 maxRounds 上限 -- 每个Agent最多执行N轮(建议3-5轮)
- 选择合适的协作模式 -- 流水线模式成本最低,群聊模式成本最高
- 子Agent使用小模型 -- 协调者用GPT-4,子Agent用GPT-3.5或本地模型
// 成本控制示例
AiServices.builder(MyAgent.class)
.chatLanguageModel(gpt4Model) // 主Agent用强模型
.tools(subAgentTool) // 子Agent可以用弱模型
.build();
// 子Agent内部
AiServices.builder(SubAgent.class)
.chatLanguageModel(gpt35Model) // 降低成本
.build();
预算估算公式:
总成本 = 主Agent调用数 x 主模型单价 + 子Agent调用总数 x 子模型单价
Q4: RAG 检索不准怎么办?
A: 分层优化,逐步排查:
- 检查 Chunk 策略 -- chunk 太大丢失精度,太小丢失上下文。推荐 300-500 token,overlap 50-100 token
- 优化 Embedding 模型 -- 升级到更强的模型(如 text-embedding-3-large)
- 添加 Reranking -- 初筛后用 Cross-Encoder 重排序,大幅提升精度
- 调整 minScore 阈值 -- 过滤低相关性结果
- 增加元数据过滤 -- 结合文档类型、时间、来源等维度预过滤
// Reranking 示例
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
.embeddingStore(store)
.embeddingModel(embeddingModel)
.maxResults(20) // 初筛多取一些
.minScore(0.5) // 初筛阈值放宽
.build();
// 配合 ReRanking 过滤器精选
ReRankingContentAggregator aggregator = ReRankingContentAggregator.builder()
.scoringModel(scoringModel)
.maxResults(5) // 最终只取Top 5
.build();
Q5: Agent 循环太多次怎么办?
A: 常见原因和对策:
| 原因 | 解决方案 |
|---|---|
| Tool描述不清晰 | 改善@Tool注解的description |
| 模型能力不足 | 升级到更强的模型 |
| 任务过于复杂 | 拆分为多个子任务/子Agent |
| 缺少终止条件 | 设置maxRounds和超时时间 |
// 设置最大轮次
AiServices.builder(MyAgent.class)
.chatLanguageModel(model)
.tools(myTools)
// 通过自定义逻辑控制最大轮次
.build();
实用建议: 如果Agent在3轮内无法完成任务,大概率是工具描述或任务拆分有问题,不要一味增加轮次。
Q6: Embedding 模型怎么选?
A: 按场景选择:
| 场景 | 推荐模型 | 维度 | 特点 |
|---|---|---|---|
| 快速原型 | text-embedding-3-small | 1536 | 成本低、速度快 |
| 生产环境 | text-embedding-3-large | 3072 | 精度高、效果好 |
| 数据敏感 | ONNX本地模型 | 384-768 | 数据不出域 |
| 中文优化 | BGE/M3E系列 | 768-1024 | 中文语义理解强 |
选型要点:
- 维度越高,精度越好,但存储和计算成本也越高
- 中文场景优先考虑中文优化模型(如 BGE-large-zh)
- 一旦选定模型,已有数据的向量需要全部重新生成
Q7: 向量数据库数据量大了以后检索变慢怎么办?
A: 三个优化方向:
- 索引优化 -- 使用 HNSW 或 IVF_FLAT 等高效索引算法
- 分区策略 -- 按业务维度分区(如按文档类别、时间范围)
- 硬件扩展 -- 增加内存、使用 GPU 加速检索
在 Milvus 中配置索引示例:
collection.createIndex("embedding", IndexType.HNSW,
MetricType.COSINE,
Map.of("M", "16", "efConstruction", "256"));
Q8: 如何评估 RAG 系统的效果?
A: 建立三层评估体系:
- 检索质量 -- Precision@K、Recall@K、MRR(平均倒数排名)
- 生成质量 -- 忠实度(是否基于检索内容)、相关性(是否回答了问题)
- 端到端效果 -- 用户满意度、任务完成率
实用做法: 构建 50-100 条标注测试集(问题 + 标准答案 + 相关文档),自动化评估每次改动的效果变化。
✅ 最佳实践清单
RAG 最佳实践
- Chunk 大小控制在 300-500 token
- 设置 50-100 token 的 overlap 避免语义断裂
- 始终配置
minScore阈值过滤低质量结果 - 生产环境引入 Reranking 提升检索精度
- 为文档添加元数据(来源、时间、类型)辅助过滤
- 定期更新向量库中的文档数据
Tool 最佳实践
-
@Tool描述写清楚功能、参数含义、返回值格式 - 所有 Tool 方法必须有完善的异常处理
- Tool 返回值要简洁,避免返回过多无关信息
- 敏感操作(删除、支付)需要二次确认机制
- 为 Tool 添加日志记录,便于调试
Agent 最佳实践
- 设置
maxRounds防止无限循环 - 使用合理的 SystemMessage 明确 Agent 职责边界
- 配置超时机制,避免长时间挂起
- Memory 管理:限制历史消息数量或 Token 数
- 关键操作前进行参数校验
Multi-Agent 最佳实践
- 优先选择最简单的协作模式(流水线 > 协调者 > 辩论 > 群聊)
- 子Agent使用小模型降低成本
- 每个Agent职责单一明确,避免职责重叠
- 设置全局Token预算和超时限制
- 记录每个Agent的调用链路,便于问题排查
📈 学习效果评估
技能检查清单
请根据自身掌握程度打勾:
| 序号 | 技能项 | 入门 | 熟练 | 精通 |
|---|---|---|---|---|
| 1 | 理解RAG两阶段架构原理 | [ ] | [ ] | [ ] |
| 2 | 能独立搭建完整RAG流水线 | [ ] | [ ] | [ ] |
| 3 | 理解Embedding向量化原理 | [ ] | [ ] | [ ] |
| 4 | 能根据场景选择Embedding模型 | [ ] | [ ] | [ ] |
| 5 | 能根据需求选择合适的向量数据库 | [ ] | [ ] | [ ] |
| 6 | 能使用@Tool定义本地工具 | [ ] | [ ] | [ ] |
| 7 | 理解MCP协议并能集成远程工具 | [ ] | [ ] | [ ] |
| 8 | 能设计多Agent协作架构 | [ ] | [ ] | [ ] |
| 9 | 能评估和控制多Agent Token成本 | [ ] | [ ] | [ ] |
| 10 | 能实现RAG+Agent融合系统 | [ ] | [ ] | [ ] |
| 11 | 能排查RAG检索不准的问题 | [ ] | [ ] | [ ] |
| 12 | 能为Agent设置合理的安全边界 | [ ] | [ ] | [ ] |
自我评估标准
入门级(4项以上打勾"入门"):
- 理解基本概念和术语
- 能跟着示例代码跑通
- 知道各组件的用途
中级(6项以上打勾"熟练"):
- 能独立搭建和调试各个模块
- 理解不同方案的优劣取舍
- 能根据需求选择合适的技术方案
高级(8项以上打勾"精通"):
- 能设计完整的生产级架构
- 能优化性能和控制成本
- 能排查复杂问题并给出解决方案
- 能指导团队成员学习和使用
🚀 Week 4 预告
最后一周,我们将从"功能实现"进入"生产就绪"阶段,系统掌握让 LangChain4J 应用在真实生产环境中稳定运行的关键知识。
Week 4 日程安排
| 天数 | 主题 | 关注点 |
|---|---|---|
| Day 22 | 框架设计深度解析 | 源码级理解核心架构 |
| Day 23 | 错误处理和容错 | 重试、降级、熔断策略 |
| Day 24 | 性能优化 | 延迟优化、并发处理、缓存 |
| Day 25 | 可观测性和监控 | 日志、指标、链路追踪 |
| Day 26 | 成本优化 | Token预算、模型混用、缓存 |
| Day 27-28 | 项目整合和最终发布 | 完整项目实战+28天总结 |
Week 4 你将获得的能力
- 框架源码理解 -- 知其然更知其所以然,遇到问题能从源码层面定位
- 生产级容错 -- 让应用在LLM服务不稳定时依然可用
- 性能调优 -- 将响应延迟从秒级优化到百毫秒级
- 全链路可观测 -- 出了问题能快速定位到具体环节
- 成本控制 -- 在保证效果的前提下将API成本降低50%以上
- 完整项目经验 -- 一个可以写在简历上的生产级 AI 应用
Week 4 的核心理念: 写出能跑的代码只是开始,写出能在生产环境稳定运行、高效运行、经济运行的代码,才是真正的工程能力。
推荐阅读顺序
如果你跳过了某些文章,建议按以下优先级补课:
- 必读 -- Day 15 (RAG) 和 Day 18 (Tool/MCP),这是最基础的两个能力
- 重要 -- Day 16 (Embedding) 和 Day 17 (向量数据库),RAG的底层支撑
- 进阶 -- Day 19 (多Agent) 和 Day 20 (融合架构),复杂系统设计
回顾往期总结
- [[07-Week1完整总结和周发布]] -- 基础入门:LLM概念、HelloWorld、Prompt、Token、流式输出
- [[14-Week2完整总结和周发布]] -- 核心能力:模型集成、Chain设计、Memory管理、Agent基础
Week 3 学习感悟: 第三周是从"会用框架"到"会设计系统"的关键跨越。RAG、Tool、Agent 不再是孤立的功能点,而是构建智能应用的三大支柱。理解它们各自的定位和协作方式,才能在面对真实需求时做出合理的架构决策。下周我们将带着这些能力进入生产实战,让代码从"能跑"进化到"能用"。