21-Week3完整总结和周发布

4 阅读15分钟

经过第三周六天的深度学习,我们系统地掌握了 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 15RAG系统完全指南45分钟完整RAG流水线
Day 16向量化和Embedding40分钟Embedding模型集成
Day 17向量数据库选型40分钟数据库选型决策树
Day 18Tool定义和MCP45分钟工具链扩展方案
Day 19多智能体协作50分钟多Agent编排模式
Day 20RAG和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
);

选型五维度:

维度InMemoryMilvusChromaPinecone
数据规模<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 stdioJSON-RPC标准输入/输出本地进程间通信
MCP HTTP/SSEJSON-RPCHTTP协议远程服务调用

常见错误: @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 模型做向量化,依赖向量数据库做存储和检索
  • ToolMCP 扩展 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: 三个核心策略:

  1. 设置 maxRounds 上限 -- 每个Agent最多执行N轮(建议3-5轮)
  2. 选择合适的协作模式 -- 流水线模式成本最低,群聊模式成本最高
  3. 子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: 分层优化,逐步排查:

  1. 检查 Chunk 策略 -- chunk 太大丢失精度,太小丢失上下文。推荐 300-500 token,overlap 50-100 token
  2. 优化 Embedding 模型 -- 升级到更强的模型(如 text-embedding-3-large)
  3. 添加 Reranking -- 初筛后用 Cross-Encoder 重排序,大幅提升精度
  4. 调整 minScore 阈值 -- 过滤低相关性结果
  5. 增加元数据过滤 -- 结合文档类型、时间、来源等维度预过滤
// 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-small1536成本低、速度快
生产环境text-embedding-3-large3072精度高、效果好
数据敏感ONNX本地模型384-768数据不出域
中文优化BGE/M3E系列768-1024中文语义理解强

选型要点:

  • 维度越高,精度越好,但存储和计算成本也越高
  • 中文场景优先考虑中文优化模型(如 BGE-large-zh)
  • 一旦选定模型,已有数据的向量需要全部重新生成

Q7: 向量数据库数据量大了以后检索变慢怎么办?

A: 三个优化方向:

  1. 索引优化 -- 使用 HNSW 或 IVF_FLAT 等高效索引算法
  2. 分区策略 -- 按业务维度分区(如按文档类别、时间范围)
  3. 硬件扩展 -- 增加内存、使用 GPU 加速检索

在 Milvus 中配置索引示例:

collection.createIndex("embedding", IndexType.HNSW,
    MetricType.COSINE,
    Map.of("M", "16", "efConstruction", "256"));

Q8: 如何评估 RAG 系统的效果?

A: 建立三层评估体系:

  1. 检索质量 -- Precision@K、Recall@K、MRR(平均倒数排名)
  2. 生成质量 -- 忠实度(是否基于检索内容)、相关性(是否回答了问题)
  3. 端到端效果 -- 用户满意度、任务完成率

实用做法: 构建 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 你将获得的能力

  1. 框架源码理解 -- 知其然更知其所以然,遇到问题能从源码层面定位
  2. 生产级容错 -- 让应用在LLM服务不稳定时依然可用
  3. 性能调优 -- 将响应延迟从秒级优化到百毫秒级
  4. 全链路可观测 -- 出了问题能快速定位到具体环节
  5. 成本控制 -- 在保证效果的前提下将API成本降低50%以上
  6. 完整项目经验 -- 一个可以写在简历上的生产级 AI 应用

Week 4 的核心理念: 写出能跑的代码只是开始,写出能在生产环境稳定运行、高效运行、经济运行的代码,才是真正的工程能力。


推荐阅读顺序

如果你跳过了某些文章,建议按以下优先级补课:

  1. 必读 -- Day 15 (RAG) 和 Day 18 (Tool/MCP),这是最基础的两个能力
  2. 重要 -- Day 16 (Embedding) 和 Day 17 (向量数据库),RAG的底层支撑
  3. 进阶 -- Day 19 (多Agent) 和 Day 20 (融合架构),复杂系统设计

回顾往期总结

  • [[07-Week1完整总结和周发布]] -- 基础入门:LLM概念、HelloWorld、Prompt、Token、流式输出
  • [[14-Week2完整总结和周发布]] -- 核心能力:模型集成、Chain设计、Memory管理、Agent基础

Week 3 学习感悟: 第三周是从"会用框架"到"会设计系统"的关键跨越。RAG、Tool、Agent 不再是孤立的功能点,而是构建智能应用的三大支柱。理解它们各自的定位和协作方式,才能在面对真实需求时做出合理的架构决策。下周我们将带着这些能力进入生产实战,让代码从"能跑"进化到"能用"。