AI Agent 面试
AI Agent 面试
基础概念与核心组件
【简单】什么是 AI Agent?它和直接调用大模型 API 有什么区别?⭐⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 基础概念
💎 关键结论
AI Agent(智能体)是以大语言模型(LLM)为"大脑"的自主智能系统,以"用户目标 → Agent 规划 → Agent 执行 → 结果反馈"的闭环自主完成复杂任务。它与直接调用大模型 API 的本质区别在于:API 调用是单次、被动、无状态的文本生成;Agent 能自主拆解目标、动态调用工具、具备记忆并反思优化,实现从"被动应答"到"主动解决问题"的跨越。工程上 Agent 永远不是默认选项——能用直接调用或固定工作流解决的,就不要上 Agent。
⚡记忆卡片
- 口诀:一大脑四肢循环,规划执行加反思;路径可枚举走工作流,不得不自求才自主
- 关键词:LLM 大脑 / 自主循环 / 工具调用 / 记忆 / 方案权衡
- 链路:用户目标 → Agent 规划 → 工具执行 → 结果反馈 → 迭代直至达成目标
📖 核心知识
与直接调用大模型 API 的核心区别:
| 维度 | AI Agent | 直接调用 LLM API |
|---|---|---|
| 交互模式 | 多步骤自主循环(规划→执行→反思) | 单次问答(指令→生成→用户执行) |
| 工具能力 | 自主调用外部工具(搜索、API 等) | 仅生成文本,无法执行操作 |
| 记忆能力 | 具备短期/长期记忆,持续学习适应 | 无状态,每次独立交互 |
| 自主性 | 主动拆解目标、动态调整计划 | 被动应答,依赖用户逐步指令 |
方案权衡:Agent 不是默认选项:
| 方案 | 决策特征 | 适用边界 | 失效场景 |
|---|---|---|---|
| 直接 API 调用 | 单次请求-响应,路径固定 | 分类、抽取、改写等封闭任务 | 需要外部数据或多步操作时无能为力 |
| 固定工作流 | 开发者预定义节点与分支,LLM 只在节点内发挥 | 流程可预测、要求高确定性的业务 | 开放式任务、路径无法预先枚举 |
| 自主 Agent | LLM 自主决定路径和工具调用 | 任务路径无法预先枚举 | 非确定性、成本高、易循环失控 |
实测参考:内部客服场景同一"查询物流状态"任务,工作流方案成功率 94%、平均 Token 约 1.2k;Agent 自主方案成功率 81%、平均 Token 约 6.8k——路径封闭时,工作流在成功率和成本上双优。
真实踩坑案例:Agent 循环失控
- 现象:客服 Agent 部分提问 P95 延迟达 47 秒,频繁超时。
- 排查:Trace 回放发现 Agent 连续调用"订单查询"工具 3~5 次,每次参数略有差异,返回结果几乎相同。
- 根因:工具描述只写了"查询订单",未说明返回字段与终止语义,LLM 无法判断结果是否满足需求,于是反复重试。
- 修复:① 重写工具描述,明确返回内容和"无需重复调用"的条件;② 增加重复检测——连续两轮调用同一工具且 Observation 相似度 > 0.95 时强制进入总结。修复后 P95 延迟降至 9 秒。
场景示例:保险报价 Agent 报价不稳定
背景:团队开发的"保险报价 Agent"接收用户信息后自主查询费率表、计算保费并输出报价。上线后同样的问题每次报价都不一样,偶尔保费偏差超过 30%。
参考思路:
- 应急处理:先把报价链路降级为"Agent 收集信息 + 规则引擎计算"止损;用 Trace 平台回放线上会话,筛出报价差异明显的 Case。
- 根因分析:通常是两层问题叠加——① 路径非确定性:Agent 每次收集信息的顺序和完整度不同,漏问关键字段(如免赔额、投保年限);② 数值计算交给了 LLM"心算",Token 生成本身就容易算错。通过 Trace 比对每次调用费率工具的入参即可定位。
- 长期方案:按"Agent 管理解、确定性组件管计算"重构——信息收集保留 Agent 循环但加必填字段清单(收齐才放行);所有数值计算改为工具调用;报价结果附带来源追溯(费率表版本号 + 参数快照)。
- 权衡:全流程工作流化成功率最高,但会失去多轮交互的灵活性,只在收集环节保留 Agent;核心原则是把非确定性放在出错代价最小的环节。
总结:Agent 与传统 AI 的本质差异在于——传统 AI 执行预定义规则的单点任务,Agent 能理解自然语言指令,自主将复杂目标拆解为子任务,动态调用工具并反思优化。工程上永远先问一句:这个任务能不能用直接调用或固定工作流解决?Agent 应该是最后的手段,而不是第一选择。
🔬 扩展知识
扩展知识
- 【L3】三级方案的本质是"路径确定性"光谱:直接调用是零路径决策,工作流把决策权留在开发者手里,Agent 把路径决策权交给模型。每让渡一级决策权就多一个出错点,所以选型的判据从来不是"任务难不难",而是"路径能不能枚举"。
- 【L3】Agent 的成本结构是非线性的:每次循环迭代都要重传完整上下文,Token 消耗随迭代轮数近似平方级增长,且延迟由最坏路径(最大迭代次数)决定——这就是同一任务 Agent 方案平均 Token 数倍于工作流方案的根因。
- 【L4】护栏(Guardrails)是 Agent 上生产的入场券:最大迭代次数、工具白名单、预算上限(Token/时间)与重复调用检测缺一不可;没有护栏的 Agent 在开放任务上迟早复现"循环失控"类事故。
🔀 发散问题
- Q:Agent 循环为什么必须把工具执行结果注入回上下文? → 因为 LLM 无法"感知"外部世界,工具结果是它获得环境反馈的唯一通道。不注入 Observation,循环退化为自说自话,模型只能凭先验知识编造工具结果,这是幻觉的常见来源之一。
- Q:什么情况下 Agent 模式的成功率反而低于单次 API 调用? → 任务路径封闭可枚举时。Agent 的每个自主决策点都是一次出错机会,错误概率随步数复合放大——单步准确率 95% 的决策链,走 5 步后整体准确率只剩约 77%。此时固定工作流或单次调用成功率更高、成本更低。
- Q:新需求来了,如何在 Agent、工作流、直接 API 调用之间做决策? → 三问定位法:① 路径能否预先枚举(能→工作流);② 是否需要外部数据或操作(不需要→直接调用即可);③ 业务能否容忍非确定性(金融、审批等高一致场景慎用 Agent)。原则是"能约束就约束,不得不自主才自主",即使用 Agent 也要配最大迭代次数、工具白名单等护栏。
【中等】AI Agent 的核心架构有哪些组成部分?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 架构
💎 关键结论
AI Agent 遵循"感知-规划-行动-反思"的闭环设计,由四大核心模块构成:感知模块(接收多模态输入)、推理与决策模块(LLM 大脑)、执行模块(Function Calling 调用工具)、记忆模块(短期上下文 + 长期向量/图谱)。一句话公式:LLM Agent = LLM 核心 + 提示词工程层 + 工具层 + 记忆层 + 规划层。
⚡记忆卡片
- 口诀:感知收输入,LLM 做决策,FC 干实事,记忆存短长
- 关键词:感知 / 推理决策 / 执行 / 记忆 / 感知-规划-行动-反思
- 链路:感知输入 → LLM 推理决策 → 工具执行 → 结果反馈 → 记忆沉淀
📖 核心知识
AI Agent 由四大核心模块构成:
- 感知模块(感官):接收用户指令和外部环境信息,支持文本、语音、图像等多模态输入。
- 推理与决策模块(大脑):由 LLM 驱动,通过
System Prompt定义角色和约束,使用 CoT、ReAct 等策略进行任务分解与决策。 - 执行模块(手脚):通过
Function Calling机制调用外部工具(搜索引擎、API、代码解释器、数据库等)。 - 记忆模块(认知存储):
- 短期记忆:当前对话上下文,由 LLM 上下文窗口直接承载。
- 长期记忆:历史经验、用户偏好,通过向量数据库/知识图谱持久化存储。
常见功能:自主任务规划与分解、多轮对话上下文管理、外部工具/API 调用、代码生成与执行、文件读写与数据处理、网页搜索与信息检索、多模态理解、自我反思与错误修正、多 Agent 协作编排等。
总结:LLM Agent = LLM 核心(推理引擎)+ 提示词工程层(角色/约束/工作流)+ 工具层(Function Calling)+ 记忆层(短期上下文 + 长期向量/图谱)+ 规划层(任务分解 + 推理策略)。
🔬 扩展知识
扩展知识
- 【L3】为什么"推理"与"执行"必须分离:LLM 本身不执行任何工具,只表达调用意图(生成结构化参数),真正执行由应用层完成。这一分工是权限控制、审计日志和沙箱隔离的前提——所有副作用操作都收口在应用层,才有拦截和校验的机会。
- 【L3】四层架构与工程实现的映射:感知层对应多模态解析与输入护栏;决策层对应 System Prompt + 推理策略(ReAct/Plan-and-Solve);执行层对应 Function Calling/MCP 工具注册;记忆层对应上下文窗口 + 向量库/知识图谱。调试 Agent 异常时,先定位是哪一层失效,再决定修 Prompt、修工具还是修记忆。
- 【L4】规划层为什么常独立于决策层:复杂任务需要显式的任务状态对象(子任务列表 + 完成状态),才能支持断点恢复、Replan 和进度判断;只靠对话流承载状态,长任务会因窗口溢出丢失计划上下文。
🔀 发散问题
- Q:记忆为什么必须分短期和长期两层? → 短期记忆由上下文窗口承载,会话结束即消失且受窗口容量限制;长期记忆持久化到向量库/知识图谱,跨会话可用。不分层就无法同时满足"当前任务即时上下文"和"跨会话经验积累"两种需求。
- Q:四大模块与 Agent Loop 的四个阶段如何对应? → 感知对应"构建 Prompt",推理决策对应"模型推理",执行对应"工具调用",反思对应"结果反馈与达标检查"。四模块是静态结构,Agent Loop 是它们的动态运转方式,可参考本文档『什么是 Agent Loop(智能体循环)?Agent 的工作过程是怎样的?』。
- Q:如果只能砍掉一个模块,哪个影响最小? → 感知模块的多模态部分——纯文本 Agent 只损失输入形态,不影响核心闭环;而记忆、执行、决策任一缺失,Agent 都退化为单次问答。
【中等】市面上有哪些主流的 LLM Agent 框架?各自的特点是什么?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 框架选型
💎 关键结论
主流框架按定位分四类:LangChain/LangGraph(生态最全、显式图编排)、AutoGen/CrewAI(对话式多 Agent 协作)、Google ADK(Google 生态、原生 A2A)、Spring AI(Java 企业级)。选型本质是控制粒度 vs 开发速度的权衡:生产级要可控选 LangGraph,PoC 求快选 CrewAI/AutoGen,强控制需求可自研轻量 Loop。比框架选型更重要的是:把核心链路的评测集和版本回归抓在自己手里。
⚡记忆卡片
- 口诀:生产图编排,快跑对话式,Java 选 Spring,生态看谷歌
- 关键词:LangGraph / AutoGen / CrewAI / Spring AI / 控制粒度 vs 开发速度
- 链路:明确场景 → 评估控制需求 → 匹配框架形态 → 建评测集回归门禁
📖 核心知识
| 框架 | 核心特点 | 适用场景 |
|---|---|---|
| LangChain / LangGraph | 生态最完善,链式调用、工具集成、图形化多 Agent 工作流 | 复杂工作流、生产级应用 |
| AutoGen(微软) | 轻量级消息列表记忆,侧重多 Agent 对话式协作 | 快速开发、多 Agent 协同 |
| CrewAI | 角色化设计,内置多种记忆类型(短期 RAG、长期 SQLite) | 分工明确的多 Agent 系统 |
| Google ADK | Google 官方 Agent 开发工具包,原生支持 A2A 协议 | Google 生态集成 |
| Spring AI | Java 生态,通过 @Tool 注解和 FunctionCallback 实现工具调用 | 企业级 Java 应用 |
选型背后的权衡:控制粒度 vs 开发速度:
| 方案 | 优势 | 代价与失效场景 |
|---|---|---|
| LangGraph(显式图/状态机) | 状态可持久化、支持中断恢复(HITL)、每步可回放 | 图定义样板代码多,简单任务显得笨重 |
| AutoGen/CrewAI(对话式编排) | 几十行代码搭起多 Agent 协作,上手极快 | 流程靠对话涌现难以控制,生产调试和回归困难 |
| 自研轻量 Agent Loop | 完全可控,无抽象泄漏,Prompt/重试都在自己手里 | 需自建 Trace、重试、持久化等基础设施,周期长 |
经验数据:需要人工审批(HITL)的任务,用 LangGraph checkpoint 机制断点恢复平均 12 秒,而无状态方案需从头重跑,平均 4 分钟以上;但纯 PoC 验证阶段,CrewAI 的搭建速度可达 LangGraph 的 3~5 倍。
真实踩坑案例:框架升级破坏性变更
- 现象:LangChain 从 0.1 升到 0.3 后,离线评测 Recall@5 从 0.86 跌到 0.61,且无任何告警。
- 排查:二分定位到 Retriever 接口默认行为变化(返回格式从
Document列表变为含元数据的新结构),兼容层把异常静默吞掉。 - 根因:框架升级没有回归门禁,依赖了框架的隐式默认行为。
- 修复:① 锁死依赖版本,升级走专项分支;② 为核心链路建立 200 条 Golden Set 回归测试,任何升级先跑回归再合入。此后两次大版本升级都在 CI 阶段拦住了类似问题。
场景示例:多 Agent 代码审查系统选型
背景:用 Python 构建多 Agent 代码审查系统(代码分析 Agent → 审查意见 Agent → 人工确认 → 修复建议 Agent),要求支持人工确认环节的等待与失败步骤的重跑。
参考思路:
- 选型:首选 LangGraph——人工确认环节需要"中断 + 状态持久化 + 恢复",这正是图状态机 + checkpointer 的强项;AutoGen/CrewAI 的对话式编排难以可靠地暂停等待人工输入。
- 根因预防:① 每个 Agent 节点定义清晰的输入输出 Schema,避免自由文本传递导致信息失真;② 人工确认结果也作为状态写入,保证审计可追溯;③ 失败重试要幂等——审查意见生成可以重跑,但"提交评论到代码仓库"这类副作用操作必须去重。
- 长期方案:核心链路建 Golden Set(50~100 个历史 MR + 人工标注的应发现缺陷),每次 Prompt/模型/框架变更都跑回归;接入 Langfuse/LangSmith 记录全链路 Trace。
- 权衡:PoC 阶段可先用 CrewAI 验证协作模式,但生产版本必须切到可控编排——"用快框架验证想法,用稳框架交付系统"。
总结:选型关键看生态和语言栈——Python 生态首选 LangChain/LangGraph,Java 生态选 Spring AI,多 Agent 协作场景看 CrewAI/AutoGen,Google 生态用 ADK。但比框架选型更重要的是:把核心链路的评测集和版本回归抓在自己手里,框架只是执行层,评测集才是你的护城河。
🔬 扩展知识
扩展知识
- 【L3】LangGraph 为什么把 Agent 执行建模成显式图(状态机):显式图把非确定的黑盒循环变成可枚举的状态转移,每个节点的输入输出、当前状态都可持久化和回放,天然支持断点恢复、人工介入和分支重试;出问题时能定位到"哪个节点、哪个状态",而不是对着一段对话日志猜。
- 【L3】什么情况下引入框架反而成为负担:① 框架抽象泄漏——出问题必须深入框架内部 Prompt 和重试逻辑才能定位;② 破坏性升级频繁,兼容成本超过自研成本;③ 框架包办了 Prompt 组装,无法精细控制注入内容。当团队对链路控制力的需求超过对开发速度的需求时,就该考虑自研轻量 Loop。
- 【L4】企业级选型的隐性成本:框架的学习曲线、社区活跃度、与现有监控/权限体系的集成成本,往往比功能差异影响更大;Java 团队选 Spring AI(或 LangChain4j)可复用已有 Bean、权限与监控体系,工具接入成本远低于换语言栈。
🔀 发散问题
- Q:一个 5 人 Java 团队要在 3 个月内交付企业内部知识 Agent,如何选型? → 优先 Spring AI(或 LangChain4j):与现有 Spring Boot 服务、权限体系、监控体系同栈,工具接入复用已有 Bean;用固定工作流 + 少量 Agent 循环的混合架构控制风险;不追多 Agent 等时髦特性,把预算留给评测集和可观测建设。
- Q:对话式编排(AutoGen/CrewAI)为什么难以支撑人工审批环节? → 流程靠对话涌现,没有显式状态可持久化,无法可靠地"暂停等人、再恢复执行";而图/状态机模型把等待点建模为状态节点,天然支持中断恢复。
- Q:框架版本升级如何防止静默降级? → 锁版本 + 专项分支升级 + 核心链路 Golden Set 回归门禁,任何升级先跑评测集再合入;依赖框架隐式默认行为是静默降级的最大来源。
【中等】什么是 RAG(检索增强生成)?它在 Agent 中扮演什么角色?⭐⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / RAG
💎 关键结论
RAG 是"先检索、后生成"的技术范式:从知识库检索与问题相关的文档片段,注入 Prompt 引导 LLM 基于真实数据生成回答,流程为索引 → 检索 → 生成三步。它在 Agent 中扮演三重角色:知识增强(补领域知识)、减少幻觉(有据可依)、工具集成(知识库查询工具)。记住:RAG 只能把幻觉从"无据编造"转为"有据可依",前提是检索真的召回了——必须配套拒答机制。
⚡记忆卡片
- 口诀:切块向量化,检索注上下文,有据才回答,没据就拒答
- 关键词:索引 / 检索 / 生成 / 知识增强 / 拒答机制
- 链路:文档切块 → Embedding 入库 → 查询向量化 → 语义检索 Top-K → 注入 Prompt → 生成回答
📖 核心知识
RAG(Retrieval-Augmented Generation) 是一种将外部知识检索与LLM 生成相结合的技术范式:先从知识库中检索与问题相关的文档片段,再将检索结果作为上下文注入 Prompt,引导 LLM 基于真实数据生成回答。
RAG 的核心流程:
- 索引阶段:将文档切分为 Chunk,通过 Embedding 模型转为向量,存入向量数据库。
- 检索阶段:用户提问时,将问题向量化,通过语义相似度检索 Top-K 相关片段。
- 生成阶段:将检索结果 + 用户问题一起注入 LLM,生成基于事实的回答。
方案权衡:RAG vs 微调 vs 长上下文:
| 方案 | 优势 | 代价与失效场景 |
|---|---|---|
| RAG | 知识可实时更新、可溯源、成本可控 | 检索失败时生成质量崩塌;需要维护索引管线 |
| 微调 | 风格/格式内化好,推理时无检索开销 | 知识更新需重训、无法溯源、有灾难性遗忘风险 |
| 长上下文 | 无需切块检索,直接塞全文 | 成本随长度线性涨,且存在 Lost in the Middle 注意力衰减 |
选型边界:知识频繁更新、需要引用溯源→RAG;风格/格式/领域语感→微调;文档量小(< 10 万字)且查询低频→长上下文直塞更简单。
RAG 在 Agent 中的角色:
- 知识增强:为 Agent 提供领域专有知识,弥补 LLM 训练数据的局限性。
- 减少幻觉:回答基于检索到的真实文档,而非 LLM 凭空生成。
- 工具集成:RAG 本身可作为 Agent 的一个工具(如"知识库查询工具"),Agent 在推理链中按需调用;相比固化在管线里,工具化的 RAG 让 Agent 自主决定"要不要查、查什么、查几次"。
真实踩坑案例:检索不相关时幻觉被放大
- 现象:客服知识库 RAG 上线后,用户问"退款失败怎么办",Agent 自信地给出了一套操作步骤,但全是错的,引发投诉。
- 排查:回放发现 Top-1 命中的是"退款成功流程"文档,相似度 0.81 但语义极性相反;模型基于不相关上下文"硬答",编造了具体步骤。
- 根因:Embedding 模型对肯定/否定极性不敏感,且系统没有拒答机制——检索到什么就基于什么答,检索失败时幻觉比不检索更加危险(错误答案带着"权威感")。
- 修复:① 换用 BGE-M3 并加查询指令前缀;② 增加拒答阈值——Rerank 后 Top-1 分数 < 0.35 时走转人工/拒答分支。同类问题幻觉投诉从 11% 降到 2%。
场景示例:3000 份 PDF 说明书的智能问答 MVP
背景:公司要把 3000 份 PDF 产品说明书变成"智能问答",预算有限、要求 6 周上线。
参考思路:
- MVP 架构:PDF 解析(优先保留标题层级和表格)→ 结构感知分块(256~512 Token)→ BGE 类中文 Embedding + 向量库(如 Elasticsearch/Milvus)→ BM25 + 向量混合召回 + 开源 Reranker → 生成时强制引用来源;先用固定管线而非 Agent,控制复杂度。
- 最先预防的三个坑:① PDF 解析坑——双栏、页眉页脚、表格解析错乱是最大脏数据源,上线前抽 50 份人工目检;② 分块坑——表格/步骤列表被拦腰切断,需结构感知 + 小块检索大块返回;③ 拒答坑——知识库里没有的问题必须有拒答分支,否则模型会基于相似但不相关的文档编造。
- 验证方式:上线前用真实用户问题(从客服工单抽样 100 条)建评测集,跑 Recall@5、faithfulness、答案相关性三个指标,设定上线门槛(如 Recall@5 ≥ 0.85)。
- 权衡:6 周预算下不上 GraphRAG、不自训 Embedding、不做多模态,把力气花在解析质量和拒答兜底上——这两个决定了用户的第一印象。
总结:RAG = 检索(给 LLM 提供真实上下文)+ 生成(基于上下文产出精准回答),是 Agent 连接私有知识库、减少幻觉的核心桥梁。但要记住:检索失败时的"硬答"比直接说不知道危害更大,必须配套拒答机制。
🔬 扩展知识
扩展知识
- 【L3】RAG、微调、长上下文的能力边界:不完全可替代——RAG 解决"事实性知识的注入与更新",微调解决"行为模式与风格的内化",长上下文只是"上下文窗口的物理扩展"。实践中常见组合是 RAG 提供事实 + 微调对齐风格;知识每天变的场景微调基本出局,重训成本追不上更新频率。
- 【L3】检索不相关时为什么"硬答"比拒答危害更大:基于错误上下文的生成带着"有据可依"的自信,用户无法分辨,而拒答至少把问题暴露出来。架构兜底三道闸门:① 检索侧设相关性阈值(Rerank 分数),低于阈值不注入;② 生成侧要求引用来源,无引用则拒答;③ 低置信查询路由到人工。
- 【L4】RAG 工具化 vs 固化管线的选择:固定问答场景(知识库机器人)固化管线更可控,每次必检索、质量稳定可评测;开放任务 Agent 则应工具化,让 Agent 自己决定何时检索、检索什么,避免无谓检索引入噪声,代价是行为非确定,需要额外的调用日志和评测覆盖。
🔀 发散问题
- Q:RAG 的分块策略有哪些?怎么选? → 固定大小、语义、结构感知、递归、父子分块五类;经验起点 256~512 Token + 10%~20% overlap,有结构文档优先结构感知,详见本文档『RAG 的分块策略(Chunking)有哪些?如何选择合适的分块方式?』。
- Q:只靠向量检索够吗? → 不够。向量对精确标识符(错误码、单号、型号)不敏感,生产级 RAG 的标准配置是"BM25 + 向量混合召回 + Cross-Encoder 精排",详见本文档『RAG 中的混合检索(Hybrid Search)和重排序(Rerank)是什么?为什么需要它们?』。
- Q:RAG 效果差时先查哪里? → 分段归因:先判断是检索没召回(优化分块/混合检索)还是生成没用好(优化 Prompt/Rerank),再决定优化方向,详见本文档『RAG 系统如何评估?有哪些核心指标?』。
RAG 深度
【中等】RAG 的分块策略(Chunking)有哪些?如何选择合适的分块方式?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / RAG
💎 关键结论
分块是 RAG 索引阶段的核心环节,本质是"检索粒度与语义完整性的博弈"。五种主流策略:固定大小、语义、结构感知、递归、父子分块。经验起点:256~512 Token + 10%~20% overlap;有结构的文档优先结构感知,表格密集场景务必整表保留;没有万能参数,必须基于评估集(召回率指标)按文档类型实验调优。
⚡记忆卡片
- 口诀:二百五到五百块,一成重叠防切断;结构优先表格整,小块检索大块还
- 关键词:固定分块 / 语义分块 / 结构感知 / 父子分块 / Overlap
- 链路:文档解析 → 选择分块策略 → 切块加元数据 → Embedding 入库 → 评估集验证召回
📖 核心知识
常见分块策略:
| 策略 | 原理 | 适用场景 |
|---|---|---|
| 固定大小分块 | 按固定 Token 数切分,相邻块保留重叠(Overlap) | 快速落地,通用文档 |
| 语义分块 | 按 Embedding 相似度变化点切分,保持语义完整 | 段落语义差异大的文档 |
| 结构感知分块 | 按 Markdown 标题、HTML 标签等文档结构切分 | 技术文档、Wiki、法规条款 |
| 递归分块 | 按分隔符优先级(段落→句子→词)递归切分 | LangChain 默认策略,较通用 |
| 父子分块/小块检索 | 用小块做检索匹配,命中后返回所属大块上下文 | 兼顾检索精度与上下文完整性 |
方案权衡:固定分块 vs 语义分块 vs 结构感知:
| 方案 | 优势 | 失效场景 |
|---|---|---|
| 固定大小分块 | 实现简单、行为可预测 | 无视语义边界,表格/列表/跨段论述是天然受害者 |
| 语义分块 | 语义完整性好 | 依赖 Embedding 质量;语义均匀的长文(如法律条文)找不到明显断点,反而切得更碎 |
| 结构感知分块 | 利用文档自身结构,可解释 | 依赖解析质量,无结构文档(纯扫描件 OCR)无法使用 |
选择要点:
- 块大小权衡:太小(<128 Token)语义碎片化,太大(>1024 Token)检索精度下降,经验区间 200~500 Token 起步(256~512 最常用)。
- 重叠设置:Overlap 一般取块大小的 10%~20%,避免关键信息被切断在边界。
- 元数据增强:为每个 Chunk 附加标题、章节路径等元数据,检索时一并参与匹配(即"上下文丰富化",如 LlamaIndex 的 Sentence Window 和 Auto-Merging)。
真实踩坑案例:512 Token 切断表格
- 现象:财报问答中用户问"去年各子公司经营性现金流",回答总缺某个子公司的列,且数字张冠李戴。
- 排查:回放检索发现该表格被 512 Token 固定分块切成 3 块,表头与表体分属不同 Chunk,模型不知道每行数字对应哪列。
- 根因:固定分块不感知文档结构,表格、代码块、有序列表这类"结构内聚单元"是天然受害者。
- 修复:改为结构感知分块(表格整体保留,超长时连同表头一起切分)+ 小块检索大块返回;相关问题的 Recall@5 从 43% 提升到 91%。
场景示例:法律合同模板的分块与检索设计
背景:法律合同模板条款互相引用("按第 5.2 条执行")、单条款很长、用户提问经常跨条款。
参考思路:
- 应急/验证:先抽 50 个真实用户问题标注应命中的条款,建评测集,避免凭感觉调参。
- 分块设计:结构感知分块,以"条款(如 5.2)"为最小单元而非固定 Token;超长条款内部再按句切分但保留条款号元数据;跨条款引用在索引时把被引用条款一并追加到当前 Chunk 的上下文中(引用展开)。
- 检索设计:小块(句子级)检索 + 大块(整条款)返回的父子分块;对包含条款号的查询走 BM25 精确匹配("5.2"这类编号向量检索基本召不回)。
- 权衡:引用展开会增大索引体积和构建时间,但法律场景错误答案的代价极高,值得;全局性问题("这份合同的整体风险")可预生成合同级摘要单独索引。
- 量化验证:目标 Recall@5 ≥ 0.9(法律场景门槛应高于一般知识库),上线后持续监控未命中查询占比。
总结:分块的本质是"检索粒度与语义完整性的博弈"——没有万能参数,应基于评估集针对不同文档类型实验调优。经验起点:256~512 Token + 10%~20% overlap,有结构的文档优先结构感知,表格密集场景务必整表保留。
🔬 扩展知识
扩展知识
- 【L3】块大小如何影响"召回精度 vs 上下文完整性"的权衡:块越小,向量表达越聚焦,检索精度越高,但单块承载不了完整论述;块越大上下文越完整,但向量被多种语义稀释,相似度信号变弱。200~500 Token 大致是"一个完整论点/段落"的长度,且主流 Embedding 模型(512 Token 窗口)在这个区间编码质量最佳。
- 【L3】语义分块的"语义断点"如何判定:典型做法是对相邻句子计算 Embedding 相似度,相似度跌破阈值(或出现局部谷值)处切分。失效于语义均匀的长文:法律条文、流水式会议记录全文相似度都很高,找不到断点,退化为按最大长度硬切,甚至因阈值扰动切得更碎。
- 【L4】分块变更如何安全上线:分块变更会重建整个索引,必须灰度——① 固定评测集(真实问题 + 标注命中文档);② 新旧索引并行跑 Recall@K/MRR 对比,新策略不劣于旧策略才切流;③ 保留旧索引可回滚。切忌"改了参数直接重建上线",分块效果的回归往往是静默的。
🔀 发散问题
- Q:父子分块(小块检索大块返回)解决什么问题? → 小块向量聚焦、检索精度高,但上下文不完整;命中小块后返回其所属大块,兼得精度与完整性,是表格、条款类文档的常用组合。
- Q:Overlap 设多大合适?为什么? → 一般取块大小的 10%~20%。太小起不到衔接作用,关键信息仍可能被切断在边界;太大会显著增加索引体积和冗余。
- Q:分块效果如何量化验证? → 建"真实问题 + 应命中文档"的评测集,跑 Recall@K/MRR 对比新旧策略;分块效果的回归往往是静默的,必须数据驱动,详见本文档『RAG 系统如何评估?有哪些核心指标?』。
【中等】RAG 中的混合检索(Hybrid Search)和重排序(Rerank)是什么?为什么需要它们?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / RAG
💎 关键结论
混合检索 = 向量(语义召回)+ BM25(精确匹配) 双路并行、用 RRF 融合,解决"召回全不全";Rerank = 用 Cross-Encoder 对粗排候选逐对精排,解决"排序准不准"。"BM25 + 向量混合召回 + Cross-Encoder 精排"是生产级 RAG 的标准配置。失效边界:查询极短(1~2 词)时两路信号都弱,此时更应做查询改写/扩展。
⚡记忆卡片
- 口诀:向量管语义,BM25 管精确,RRF 来融合,重排定先后
- 关键词:稠密检索 / 稀疏检索 / RRF / Cross-Encoder / 两段式
- 链路:查询 → 双路召回 Top-K → RRF 融合 → Cross-Encoder 精排 → 取 Top-N 注入 Prompt
📖 核心知识
混合检索是同时使用多种检索方式并融合结果的策略:
| 检索方式 | 优势 | 劣势 |
|---|---|---|
| 向量检索(稠密) | 语义理解强,能匹配同义改写 | 对精确关键词、编号、代码不敏感 |
| 关键词检索(稀疏,如 BM25) | 精确匹配专有名词、数字、错误码 | 无法理解语义相似 |
混合检索通常用 RRF(Reciprocal Rank Fusion) 或加权分数归一化融合两路结果,兼得语义召回与精确匹配。
方案权衡:纯向量检索 vs 混合检索:
| 方案 | 适用边界 | 失效场景 |
|---|---|---|
| 纯向量 | 查询以自然语言为主、无精确标识符的通用问答 | 错误码/单号/型号/生僻专有名词查询召回崩塌 |
| 混合检索 | 查询中混合语义描述与精确标识符(企业知识库常态) | 多一路索引的存储与运维成本;融合权重需调优 |
重排序(Rerank):第一阶段检索召回 Top-K(如 50 条)候选后,用 Cross-Encoder 重排模型(如 BGE-Reranker、Cohere Rerank)对"查询-文档"逐对精细打分,重新排序后取 Top-N(如 5 条)注入 Prompt。
为什么需要 Rerank:
- 向量检索用 Bi-Encoder(查询与文档独立编码),速度快但打分粗糙;Cross-Encoder 联合编码精度高但慢,只适合小候选集精排。
- 两段式架构(粗排 + 精排)能在延迟可控的前提下显著提升最终注入上下文的相关性,直接提升回答质量。
- 量化收益参考:在内部知识库评测中,仅向量检索 MRR@5 约 0.52,加 BM25 + RRF 后升至 0.63,再叠加 Cross-Encoder 重排后达 0.71(相对提升约 37%);P95 延迟增加约 380ms,在可接受范围内。
真实踩坑案例:错误码查询召回失灵
- 现象:运维知识库问答中,用户问"ERROR-4012 数据库连接超时",回答总是泛泛的排查思路,无法给出针对性方案。
- 排查:回放发现专门讲解 4012 的文档排在第 7 位未进 Top-5,而 Top-1 是一篇泛泛的"超时问题概览"——两篇向量相似度只差 0.03。
- 根因:Embedding 对数字/代码类精确标识符不敏感,"4012"在向量空间里几乎没有区分度。
- 修复:增加 BM25 路并用 RRF 融合(k=60),4012 文档升到 Top-1;叠加 rerank 后同类问题回答满意度从 58% 升至 86%。
场景示例:长尾专有名词几乎全错的排查优化
背景:企业 RAG 上线后,常见问题回答很准,但长尾专有名词(产品型号、客户编号、内部术语)几乎全错。
参考思路:
- 应急处理:收集 30~50 个错误 Case,按查询类型分类(型号/编号/术语/普通语义),先确认错误集中在哪类;对已知错误查询可临时加入查询改写规则止损。
- 根因分析:逐 Case 回放检索:若目标文档在索引中但排名靠后→召回问题(向量对精确标识符不敏感);若根本不在索引→分块/解析问题。长尾专有名词错误大概率是前者:单路向量检索的固有盲区。
- 长期方案:① 加 BM25 混合检索 + RRF 融合;② 叠加 rerank 提升排序精度;③ 对编号类查询加查询分类,直接走精确匹配路径;④ 用这批 Bad Case 建评测集,量化改造前后 MRR@5 变化。
- 权衡:若 Bad Case 只集中在极少数模式(如纯编号查询),用一条查询路由规则(正则识别编号→走 BM25)成本远低于全量混合检索改造——先用最小代价方案验证收益,再决定要不要全量铺开。
总结:混合检索解决"召回全不全",Rerank 解决"排序准不准"——"BM25 + 向量混合召回 + Cross-Encoder 精排"是生产级 RAG 的标准配置。失效边界:查询极短(1~2 词)时两路信号都弱,rerank 也难救;此时更应做查询改写/扩展。
🔬 扩展知识
扩展知识
- 【L3】RRF 融合的原理:只用排名不用分数,score(d) = Σ 1/(k + rank_i(d)),k 通常取 60。直接加权分数的问题是 BM25 分数无上界、向量相似度有界,两者分布形态完全不同,归一化对离群值敏感且跨查询不稳定;RRF 免调参、鲁棒,是默认首选。
- 【L3】为什么不直接用 Cross-Encoder 做一阶检索:Cross-Encoder 需要对每个文档与查询联合前向传播,无法预计算索引,全库扫描延迟不可接受(万级文档就是万级推理)。经验参数:召回 K 取 50~100(可用 Recall@K 验证目标文档在候选内),精排 N 取 3~8(受注入 Token 预算约束);K 太小精排无米下锅,N 太大注入噪声且涨延迟。
- 【L4】Rerank 超时或宕机如何降级:Rerank 是同步串行环节,直接叠加在 P99 上,必须设超时(如 500ms)和降级开关,超时后回退为按混合检索分数排序取 Top-N;同时监控"降级率",若长期 > 1% 说明 rerank 服务容量不足,需扩容而非一直裸奔。
🔀 发散问题
- Q:为什么向量检索对错误码、单号这类标识符不敏感? → Embedding 把文本压缩为语义向量,数字/代码类标识符在语义空间里几乎没有区分度,"4012" 与 "4013" 的向量可能非常接近,必须靠 BM25 精确匹配补齐。
- Q:Bi-Encoder 和 Cross-Encoder 的本质区别是什么? → Bi-Encoder 查询与文档独立编码、可预计算,速度快但打分粗;Cross-Encoder 联合编码、逐对打分,精度高但无法预计算,只能用于小候选集精排。
- Q:混合检索加了之后存储成本怎么算? → 多一路倒排索引(BM25),存储与运维成本上升;可用 Elasticsearch/OpenSearch 这类同时支持两种检索的引擎降低运维复杂度。
【困难】RAG 系统如何评估?有哪些核心指标?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / RAG
💎 关键结论
RAG 评估必须分段归因:检索侧看 Recall@K、Precision@K、MRR/NDCG、上下文相关性;生成侧看忠实度(Faithfulness)、答案相关性、答案正确性。工具选 RAGAS/TruLens/DeepEval,日常迭代用 LLM-as-a-Judge 做门禁、定期人工校准。评测集的分布比指标算法更重要——指标必须定期与真实用户反馈对齐。
⚡记忆卡片
- 口诀:检索看召回,生成看忠实,裁判可自动,人工定期校
- 关键词:Recall@K / MRR / Faithfulness / Answer Relevance / RAGAS
- 链路:建真实分布评测集 → 分段跑指标 → LLM 裁判门禁 → 人工抽样校准 → Bad Case 回流
📖 核心知识
RAG 评估需拆解为检索质量和生成质量两个环节分别度量:
检索侧指标:
| 指标 | 含义 |
|---|---|
| 召回率(Recall@K) | 相关文档被检索进 Top-K 的比例 |
| 精确率(Precision@K) | Top-K 中相关文档的占比 |
| MRR / NDCG | 相关文档排序位置的质量 |
| 上下文相关性(Context Relevance) | 检索片段与问题的相关程度 |
生成侧指标:
| 指标 | 含义 |
|---|---|
| 忠实度(Faithfulness) | 回答是否忠于检索到的上下文,不编造(防幻觉) |
| 答案相关性(Answer Relevance) | 回答与用户问题的匹配程度 |
| 答案正确性 | 与标准答案(Ground Truth)的一致性 |
主流评估框架:
- RAGAS:最流行的 RAG 评估框架,内置 Faithfulness、Context Relevance 等指标,支持 LLM-as-a-Judge 自动评分。
- TruLens:提供 RAG Triad(上下文相关性、答案接地性、答案相关性)评估和可观测追踪。
- DeepEval:通用 LLM 评估框架,支持 RAG 指标和自定义断言。
方案权衡:自动评估(LLM-as-a-Judge)vs 人工评估:
| 方案 | 优势 | 代价与失效场景 |
|---|---|---|
| LLM-as-a-Judge | 可规模化、可回归、成本可控 | 偏爱长答案、偏袒同源模型;与真实体验可能脱节 |
| 人工评估 | 金标准,能捕捉体验类问题 | 贵且慢,无法每次变更都跑;标注者间一致性需控制 |
实践姿势:日常迭代用自动评估做门禁,定期(如双周)抽样人工校准,监控两者一致性;经验上生产 RAG 的 faithfulness 应 ≥ 0.85,低于此线不建议放量。
场景示例:如何向领导汇报 RAG 优化的收益
背景:领导问"上个月做的 RAG 优化(换 Embedding 模型 + 加 rerank),到底提升了多少?"
参考思路:
- 有评测集的情况:直接给出对照实验数据——同一评测集上新旧管线的 Recall@5、MRR、faithfulness、answer relevance 四个指标对比(如 Recall@5:0.72 → 0.85),再叠加线上指标(点踩率、转人工率)验证离线收益是否传导到体验,最后附成本变化(rerank 增加的延迟与费用)。
- 没评测集的补救:① 从线上日志抽 200 条真实查询,人工标注应命中文档和参考答案(约 2~3 人天);② 旧管线可回滚重建,在新评测集上重跑旧管线得到基线;③ 若旧管线已无法复现,至少用线上历史指标做前后对比,并明确标注"非严格对照"。
- 长期机制:把评测集建设纳入变更门禁——任何检索/生成链路变更必须附评测报告才能上线;评测集每月从线上 Bad Case 增补,保持分布鲜活。
- 权衡:事后补评测集的结论可信度不如事前对照实验(存在标注者被新答案锚定的风险),补救方案要主动说明局限性——这比硬给一个精确数字更专业。
总结:RAG 评估的关键是"分段归因"——回答差先判断是检索没召回(优化分块/混合检索)还是生成没用好(优化 Prompt/Rerank),用 RAGAS 等框架建立指标基线后才能数据驱动地调优。但永远记住:评测集的分布比指标算法更重要。
🔬 扩展知识
扩展知识
- 【L3】RAGAS 的 faithfulness 如何计算:先把答案拆成原子声明(claims),再逐条判断能否被检索上下文支撑,得分 = 被支撑声明占比。与人工不一致的原因:① 拆分粒度影响结果,模糊表述可能被误判为"可支撑";② 它只查"有无依据"不查"依据本身对不对"——检索到的文档本身过时/错误时,faithfulness 照样满分。
- 【L3】LLM-as-a-Judge 的已知偏差与缓解:偏爱长答案、偏袒同家族模型的输出、对格式敏感(列表/加粗易得高分)。缓解:① 归一化长度后评估或用长度受控的参考答案;② 用与被评系统不同家族的模型当裁判;③ 定期用人工标注样本校准裁判,一致性(如 Cohen's Kappa)低于 0.6 就换裁判方案。
- 【L4】开放问题如何构造 Ground Truth:① 用 rubric(评分细则)代替标准答案,按维度打分;② 构造"必要事实清单",测答案覆盖率;③ 两两对比(pairwise)新旧版本输出,只判相对优劣不判绝对分,适合版本迭代回归。
🏭 实战场景
实战案例:指标好看但用户不买账
- 现象:RAGAS faithfulness 评到 0.92,但线上用户点踩率仍有 15%。
- 排查:人工抽查 100 条点踩 Case,发现大多是"回答忠实但完全没答到点上"——评测集的问题是开发者自己编的,与真实用户问题分布严重偏离。
- 根因:评测集分布偏差 + 只测了 faithfulness 没测 answer relevance,指标优化方向与用户体验脱节。
- 修复:从线上真实日志分层抽样 200+ 问题重建评测集,并增加 answer relevance 门禁(≥ 0.8);调整后离线指标与点踩率的相关性从弱相关变为显著(点踩率降至 6%)。
- 启示:评测集必须来自真实用户问题分布,且指标要覆盖"忠实"与"相关"两个维度,单指标优化必然顾此失彼。
⚠️ 常见误区
常见误区
- ❌ "faithfulness 高就说明 RAG 质量好" → 错。faithfulness 只衡量"回答是否忠于检索内容",检索内容本身过时、错误或答非所问时照样满分,必须配合 answer relevance 与检索侧指标一起看。
- ❌ "评测集建一次就够用" → 错。用户问题分布随业务持续漂移,评测集不按月从线上 Bad Case 增补,指标就会与真实体验脱节。
- ❌ "LLM-as-a-Judge 可以完全替代人工" → 错。裁判模型有偏爱长答案、偏袒同源模型等系统性偏差,必须定期用人工标注样本校准一致性。
🔀 发散问题
- Q:回答质量差时,如何快速判断是检索问题还是生成问题? → 看检索返回的上下文里有没有正确答案:有但回答没用上→生成侧问题(优化 Prompt/Rerank);根本没有→检索侧问题(优化分块/混合检索/查询改写)。
- Q:检索侧指标里 Recall@K 和 MRR 分别回答什么问题? → Recall@K 回答"相关文档有没有进候选",MRR 回答"相关文档排得够不够靠前";前者是召回兜底,后者直接影响注入上下文的质量。
- Q:生产 RAG 的 faithfulness 上线门槛设多少合适? → 经验上 ≥ 0.85 才建议放量,高风险场景(政策、金融)应更高,并叠加人工抽样校准。
【中等】什么是 GraphRAG?它和传统向量 RAG 有什么区别?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / RAG
💎 关键结论
GraphRAG(微软 2024 年提出)把知识图谱引入 RAG:先从文档抽取实体和关系构建图谱,检索时利用图结构做多跳推理和全局聚合。它弥补向量 RAG"只见树木不见森林"的缺陷,擅长回答"这批文档的整体主题"类全局性问题,但索引成本高。简单问答用向量 RAG,实体关系密集的领域(金融、法律、医疗、尽调)才值得上 GraphRAG。
⚡记忆卡片
- 口诀:向量查片段,图谱推关系;局部问向量,全局上图谱
- 关键词:实体关系 / 多跳推理 / 社区摘要 / Local Search / Global Search
- 链路:文档 → LLM 抽取实体关系 → 构建图谱 → 社区检测 → 社区摘要 → Local/Global Search → 生成
📖 核心知识
与传统向量 RAG 的区别:
| 维度 | 向量 RAG(Naive RAG) | GraphRAG |
|---|---|---|
| 知识表示 | 离散的文本 Chunk + 向量 | 实体-关系图谱 + 社区聚类 |
| 检索能力 | 单跳语义相似度匹配 | 支持多跳关系推理(A→B→C 的间接关联) |
| 全局问题 | 无法回答"这批文档的整体主题"类问题 | 通过社区摘要(Community Summary)支持全局性问题 |
| 构建成本 | 低,切块 + 向量化即可 | 高,需 LLM 抽取实体关系,索引成本大 |
| 适用场景 | 局部事实问答,文档量大而结构松散 | 实体关系密集的领域(金融、法律、医疗、尽调) |
典型流程:文档 → LLM 抽取实体/关系 → 构建图谱 → Leiden 算法社区检测 → 为每个社区生成摘要 → 查询时选择 Local Search(实体邻域)或 Global Search(社区摘要 Map-Reduce 聚合)。
总结:GraphRAG 用"关系结构"弥补向量 RAG"只见树木不见森林"的缺陷,擅长多跳推理和全局性问题,但索引成本高——简单问答用向量 RAG,关系密集型知识才值得上 GraphRAG。
🔬 扩展知识
扩展知识
- 【L3】为什么需要社区摘要:全局性问题("这批文档讲了什么")的答案不落在任何一个 Chunk 上,向量检索无从下手;GraphRAG 用 Leiden 算法把图谱划分为语义社区并预生成摘要,查询时通过 Map-Reduce 聚合社区摘要回答,把"全局理解"前置到索引阶段。
- 【L3】Local Search 与 Global Search 的分工:Local Search 从查询命中的实体出发遍历邻域,适合"某实体及其关联"类问题;Global Search 基于社区摘要聚合,适合主题概览类问题。路由错用会显著影响答案质量与成本。
- 【L4】GraphRAG 的成本边界:索引阶段需要 LLM 对全量文档做实体关系抽取,Token 成本与文档量成正比,且知识更新需重建子图;因此它适合"文档量中等、关系密集、查询价值高"的场景,海量松散文档上性价比为负。
🔀 发散问题
- Q:什么问题向量 RAG 答不了、GraphRAG 能答? → 两类:多跳问题("A 公司的供应商的竞争对手是谁",需 A→B→C 关系推理)和全局问题("这批尽调材料的整体风险画像",需社区摘要聚合)。
- Q:GraphRAG 能不能完全替代向量 RAG? → 不能也不必要。局部事实问答向量 RAG 又快又便宜,GraphRAG 只在其擅长的关系密集场景有价值,实践中常见两者并存、按查询路由。
- Q:已有向量 RAG,想引入图谱能力的最小改造是什么? → 先对高价值文档子集做实体关系抽取试点,用多跳问题评测集验证收益,再决定是否扩大;切忌全量重建索引。
【简单】什么是 LLM 的幻觉问题?Agent 如何缓解幻觉?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 幻觉
💎 关键结论
幻觉是 LLM 生成内容看似流畅合理、实际与事实不符或缺乏依据的现象,根源在于 LLM"预测下一个 token"而非"查证事实"。Agent 架构层有四道防线:RAG 事实锚定、工具调用结果校验、自我反思、多 Agent 交叉验证。共同前提是:任何一环失效都要有明确的降级路径(拒答/转人工),而不是让模型"自由发挥"。
⚡记忆卡片
- 口诀:锚定靠检索,数据靠工具,反思查依据,交叉防共错
- 关键词:RAG 锚定 / 工具校验 / 自我反思 / 交叉验证 / 拒答降级
- 链路:检索锚定事实 → 工具获取数据 → 反思对照证据 → 高风险交叉验证 → 失效即拒答
📖 核心知识
幻觉(Hallucination) 是指 LLM 生成的内容看似流畅合理,但实际上与事实不符或缺乏依据的现象。主要表现为:捏造不存在的事实、引用虚假来源、逻辑推理错误等。本题聚焦 Agent 架构层的缓解手段(提示词层面的技巧与工程检测管线属于另两个话题,此处不展开)。
Agent 架构层的四道防线:
| 防线 | 机制 | 成本与失效场景 |
|---|---|---|
| RAG 事实锚定 | 检索真实文档作为上下文,强制引用来源,无引用则拒答 | 检索失败时幻觉被放大("硬答"比拒答更危险) |
| 工具调用结果校验 | 用 API/数据库返回的真实数据替代模型记忆;对返回做 Schema 校验 | 工具失败后若无硬约束,模型会自由发挥 |
| 自我反思(Reflection/Self-Refine) | 生成后用评审 Prompt 检查一致性/依据,不合格则重新推理 | 多一轮推理延迟 +50%~100%;可能对错误结论过度自信 |
| 多 Agent 交叉验证 | 多个 Agent(或多次采样)独立作答,不一致时触发仲裁 | 成本 3~5 倍;同基座模型可能犯相关性错误 |
方案权衡:反思是性价比最高的单点手段(一轮推理成本换显著降幻觉);多 Agent 交叉验证适合金融/医疗等高风险关键路径,全量使用成本不可接受——实践中的姿势是"全量 RAG 锚定 + 全量工具校验 + 高风险意图才走反思/交叉验证"的分层防御。
真实踩坑案例:工具失败后的客服事故
- 现象:客服 Agent 告诉用户"您的情况可以无条件全额退款",引发批量投诉,用户到平台引用该承诺要求兑现。
- 排查:Trace 回放发现 Agent 调用了退款政策工具,但工具报错(库存服务超时),Agent 没有告知错误,而是凭自己的"常识"给出了对用户有利的承诺。
- 根因:工具失败缺乏硬约束——LLM 把"没有结果"当成"可以自由回答",架构上没有拦截这一分支。
- 修复:① 工具调用失败强制进入拒答/转人工分支,不给模型自由发挥空间;② 工具结果做 Schema 校验,生成时缺少关键字段即触发反思重试;③ 退款/赔付等高风险意图增加审核 Agent 交叉验证。政策类幻觉投诉降为零。
场景示例:售后政策类幻觉治理方案
背景:客服 Agent 在"售后政策"类问题上约 3‰ 的回答存在幻觉,已发生两起用户投诉。
参考思路:
- 应急处理:① 售后政策类问题临时降级为"检索 FAQ 精确匹配 + 无匹配转人工";② 把两起投诉 Case 完整回放,确认幻觉发生的具体环节。
- 根因分析:通过 Trace 逐环节检查:检索是否召回正确政策文档;工具是否报错后被模型自由发挥;生成是否超出上下文编造细节。实践中往往三者叠加:召回不准 + 工具失败无拦截 + 无引用约束。
- 长期方案(按四防线落地):① RAG 锚定:政策文档高优先级索引 + 强制引用,无引用拒答;② 工具校验:政策查询工具失败即转人工,Schema 校验关键字段;③ 反思:政策类回答生成后增加一轮"逐句对照文档"检查;④ 交叉验证:赔付承诺等高风险输出由审核 Agent 复核。上线门槛:政策类评测集幻觉率 < 0.5‰。
- 权衡:分级开启防御——普通政策咨询只开 ①②,涉及赔付承诺才开 ③④;同时接受"拒答率适度上升"作为代价——用户等几秒转人工,远好过拿到一个错误承诺。
总结:幻觉的根源是 LLM 的概率生成本质。Agent 架构层的防线是:用 RAG 把生成锚定在真实文档上,用工具调用获取实时数据并硬校验结果,用反思机制自我纠错,用多 Agent 交叉验证兜住高风险路径——四道防线的共同前提是:任何一环失效都要有明确的降级路径(拒答/转人工),而不是让模型"自由发挥"。
🔬 扩展知识
扩展知识
- 【L3】幻觉可分为事实性幻觉与忠实性幻觉两类:前者输出与外部事实不符,后者输出与给定上下文(检索文档、工具返回值)不符。RAG 只能缓解前者,即使检索命中,模型仍可能生成偏离文档的内容,因此"强制引用 + 逐句对照检查"要同时覆盖两类。
- 【L3】四道防线存在明确的成本梯度:RAG 与工具校验可全量开启;反思以一轮额外推理为代价,适合中风险路径;多 Agent 交叉验证成本数倍增长,只应部署在错误代价最高的关键路径——防御深度应与风险等级挂钩,而非一刀切。
- 【L4】幻觉治理的可运营形态是"评测集 + 事故库"闭环:用领域评测集设定幻觉率上线门槛并纳入模型/Prompt 变更的回归门禁,把每一起幻觉事故回放进 Trace 定位失效环节,持续把防御预算投向失效频率最高的地方。
🔀 发散问题
- Q:自我反思为什么有时不仅纠错,反而"强化"错误? → 生成和评审用的是同一个模型,若错误源于模型的系统性偏差,自查时会得出同样结论,甚至因重复生成更自信。生效条件:评审时提供外部依据(检索结果/工具返回值),让反思变成"对照证据检查"而非"凭感觉自查",并要求逐条列出依据。
- Q:多 Agent 交叉验证在什么情况下会失效? → 当多个 Agent 用同一基座模型、同一知识源时,错误是相关的——会"异口同声地犯同一个错"。降低相关性:异构基座、异源知识、不同推理路径,代价是成本线性增长,只用在错误代价最高的路径上。
- Q:高风险场景如何权衡校验成本与幻觉风险? → 按风险分级投入防御:低风险闲聊不校验;事实查询加 RAG 引用;高风险决策(用药、交易、赔付)叠加反思 + 异构交叉验证 + 人工审批。同时建幻觉事故库,把预算投向失效频率最高的环节。
记忆、工具与规划
【困难】AI Agent 的记忆机制有哪些类型?如何实现长短期记忆?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 记忆
💎 关键结论
Agent 记忆分四类:工作记忆(上下文窗口)、短期记忆(近期对话向量化)、长期记忆(向量库 + 知识图谱)、程序记忆(固化的 Prompt/工具链)。核心思想是分层:当前信息留窗口、近期信息存向量、长期价值沉淀图谱。警惕:没有衰减、冲突消解和注入门槛的记忆系统,最终会变成污染上下文的噪声源——记忆不是越多越好。
⚡记忆卡片
- 口诀:当前留窗口,近期存向量,长期沉图谱,注入设门槛
- 关键词:工作记忆 / 短期记忆 / 长期记忆 / 程序记忆 / 冲突消解
- 链路:对话抽取事实 → 去重冲突检测 → 混合存储 → 按需检索 → 评分达标才注入
📖 核心知识
AI Agent 的记忆分为四种类型:
| 记忆类型 | 定义 | 实现方案 |
|---|---|---|
| 工作记忆 | 当前任务的即时上下文 | LLM 上下文窗口直接承载 |
| 短期记忆 | 近期对话历史和中间推理结果 | 向量数据库存储最近 N 轮对话的语义关联 |
| 长期记忆 | 用户偏好、历史经验、领域知识 | 向量数据库(语义检索)+ 知识图谱(关系推理) |
| 程序记忆 | 编码化的操作流程和技能 | 固化为 Prompt 模板或工具调用链 |
方案权衡:全量上下文 vs 向量记忆检索 vs 摘要压缩:
| 方案 | 优势 | 失效场景 |
|---|---|---|
| 全量塞上下文窗口 | 零实现成本、信息无损 | Token 成本线性增长;长对话 Lost in the Middle |
| 向量记忆检索 | 跨会话持久、按需取用 | 检索引入噪声:取回过时/矛盾记忆污染上下文 |
| 会话摘要压缩 | 上下文精简、保留主线 | 细节丢失;摘要本身可能失真 |
生产常见组合:窗口内保留近 N 轮原文 + 更早历史摘要化 + 跨会话事实提取为记忆条目(而非存原始对话)。
长短期记忆的分层架构:
- 工作记忆层:当前任务信息留在上下文窗口内。
- 短期记忆层:近期重要信息存入向量数据库,支持 10~20 轮对话的语义关联检索。
- 长期记忆层:经验证的长期价值沉淀为知识图谱/图数据库。
- 永久记忆层:进一步固化为可进化的用户档案。
主流实现方案:
- Mem0:专为 Agent 设计的开源记忆层,采用向量数据库 + 知识图谱 + 键值数据库的混合存储架构,支持智能提取、去重、合并和冲突解决,引入时序权重衰减模拟人类遗忘机制。
- LangGraph:支持短期(运行时上下文)与长期记忆(向量数据库),同时提供实体记忆功能。
- 混合检索策略:结合向量相似度检索和结构化查询,降低漏检风险。
关键工程步骤:① 使用 LLM 从对话中自动抽取结构化事实与偏好 → ② 存入混合存储(向量库 + 图数据库)→ ③ 检索时并行查询多种存储,通过评分层综合排序 → ④ 定期执行记忆去重、冲突解决和衰减清理。
场景示例:个人助理 Agent 的记忆架构设计
背景:构建"个人助理 Agent",要求跨会话记住用户习惯(如"我不喝咖啡""周报用表格格式")。
参考思路:
- 架构设计:三层——① 会话内:近 10 轮原文留窗口,更早历史摘要化;② 记忆写入:每轮结束后由小模型抽取"稳定事实/偏好"候选(过滤掉临时性表述),经去重/冲突检测后写入;③ 记忆读取:新会话开始时不预加载,而是按当前查询语义检索相关记忆,评分达标才注入。
- 记忆分类存储:稳定偏好("不喝咖啡")存结构化键值 + 长半衰期;一次性上下文("今天开会用中文")只留会话级;事实关系(用户所在团队/项目)存图谱便于查询。
- 质量指标:① 记忆准确率(抽样人工核查抽取出事实的正确率,目标 ≥ 95%);② 记忆命中率(用户提及过的偏好在后续会话中被正确使用的比例);③ 矛盾记忆率(冲突检测告警数/记忆总数);④ 体验指标:用户纠正"你记错了"的频率。
- 权衡:写入时多花一次小模型抽取的成本,换来存储干净与检索精准;宁缺毋滥——漏记一条偏好只是体验瑕疵,记错一条偏好会持续污染所有后续会话。
总结:记忆系统的核心思想是分层——当前信息留窗口、近期信息存向量、长期价值沉淀图谱,通过混合检索策略在相关性和开销之间取得平衡。但要警惕:没有衰减、冲突消解和注入门槛的记忆系统,最终会变成污染上下文的噪声源。
🔬 扩展知识
扩展知识
- 【L3】"全量历史塞上下文"和真正的记忆系统的本质区别:全量塞窗口是被动的、无选择的,所有信息平权占据注意力,成本随会话长度线性增长,且模型对中段信息注意力衰减。真正的记忆系统包含"写入筛选(提取什么)+ 存储组织(怎么存)+ 检索注入门槛(什么时候用)"三个主动决策,本质是把无限历史压缩为高密度、可检索的事实。
- 【L3】长期记忆何时从助力变成"毒源":三种典型失效——① 过时记忆(用户偏好已变但旧偏好仍注入);② 矛盾记忆同时注入导致回答自相矛盾;③ 低相关记忆挤占上下文预算,稀释真正重要的信息。门槛设计:检索相似度阈值 + 时间衰减加权 + 冲突检测三道闸,宁可不注入也不注入可疑记忆。
- 【L4】Mem0、Zep 这类专用记忆层和自建方案怎么选:看三点——① 是否需要自定义记忆 Schema 与业务实体绑定(需要→自建或深度定制);② 数据合规(用户记忆必须私有化部署时,优先支持自托管的方案);③ 记忆治理能力(去重、冲突解决、衰减是否内置)。起步阶段用成熟方案验证价值,记忆成为核心竞争力后再考虑自建。
🏭 实战场景
实战案例:长期记忆引入噪声
- 现象:个性化推荐 Agent 上线长期记忆后,用户反馈"它记得的东西都是错的",推荐内容牛头不对马嘴。
- 排查:发现用户三个月前随口说"最近在学日语",被提取为持久偏好持续注入;同时"不吃辣"和"点过麻辣小龙虾"两条矛盾记忆被同时注入,导致回答自相矛盾。
- 根因:记忆只进不管——无时间衰减、无冲突消解、无注入门槛,记忆库变成了噪声源。
- 修复:① 引入时间权重衰减(偏好类记忆半衰期 30 天);② 冲突检测:新旧记忆矛盾时由 LLM 仲裁保留最新;③ 注入设评分门槛(检索分低于阈值不注入)。记忆相关点踩下降 70%。
- 启示:记忆系统上线容易,治理难——衰减、冲突消解、注入门槛三件套必须与写入机制同时设计,而不是事后补救。
⚠️ 常见误区
常见误区
- ❌ "把全量对话历史塞进上下文窗口就等于有记忆" → 错。那是被动的上下文承载,无写入筛选、无检索注入门槛,成本随会话线性增长且中段信息注意力衰减;真正的记忆系统是"提取-存储-按需注入"的主动决策链。
- ❌ "记得越多越好,记忆条目只进不出" → 错。没有衰减和冲突消解的记忆库会变成噪声源:过时偏好持续注入、矛盾记忆同时生效,反而污染每一次后续回答。
- ❌ "新会话开始时把用户所有记忆预加载进 Prompt" → 错。应按当前查询语义检索相关记忆、评分达标才注入;全量预加载既浪费 Token 预算,又稀释真正重要的信息。
🔀 发散问题
- Q:记忆机制和上下文压缩是什么关系? → 一体两面:压缩解决"窗口放不下"(截断、摘要、卸载),记忆解决"会话结束就忘"(跨会话持久化)。生产组合通常是窗口内保留近期原文 + 更早历史摘要化 + 跨会话事实提取为记忆条目。
- Q:用户说"你记错了",系统层面应该怎么闭环? → 把用户纠正作为最高优先级信号:定位冲突记忆条目 → LLM 仲裁更新 → 该 Bad Case 回流评测集,防止同类抽取错误复发。
- Q:程序记忆和前三种记忆有什么本质不同? → 前三种存的是"事实与经验",程序记忆存的是"怎么做"——固化为 Prompt 模板或工具调用链,本质是把验证过的操作技能沉淀为可复用的流程。
【中等】什么是 AI Agent 中的工具调用(Tool Calling)?它的基本流程是怎样的?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 工具调用
💎 关键结论
Tool Calling 的本质是"LLM 决策 + 应用执行"的分工:LLM 本身不执行工具,只表达调用意图(生成结构化参数),由应用程序代为执行并回传结果。基本流程四步:定义工具 → AI 决策 → 执行工具 → 结果返回。框架层(Spring AI、LangChain)负责中间的桥接和编排。
⚡记忆卡片
- 口诀:模型出意图,应用去执行,结果回上下文,回答再整合
- 关键词:工具定义 / JSON Schema / 调用意图 / 结果回传 / Function Calling
- 链路:声明工具 Schema → LLM 生成调用请求 → 应用执行工具 → 结果注入上下文 → 生成最终回复
📖 核心知识
Tool Calling 是 AI Agent 的核心能力,允许 LLM 在需要时调用外部工具/函数来获取实时数据或执行操作。LLM 本身不执行工具,而是表达调用意图,由应用程序代为执行并返回结果。
基本流程:
- 定义工具:声明工具的名称、描述和参数 Schema(JSON Schema)。
- AI 决策:模型分析用户意图,判断是否需要调用工具,生成结构化的工具调用请求。
- 执行工具:应用程序分发并执行对应的工具方法。
- 结果返回:将工具执行结果传回模型,模型整合结果生成最终回复。
Spring AI 的三种工具定义方式:
| 方式 | 特点 | 适用场景 |
|---|---|---|
注解式 @Tool | 最常用,方法加注解即可 | 常规业务工具 |
函数式 Function/BiFunction | 基于 JDK 函数式接口,代码极简 | 轻量工具 |
编程式 ToolCallback | 手动构建工具元信息,最灵活 | 动态工具、插件化 |
总结:Tool Calling 的本质是"LLM 决策 + 应用执行"的分工——LLM 负责理解意图和生成调用参数,应用层负责实际执行和结果回传,框架层(Spring AI、LangChain)负责中间的桥接和编排。
🔬 扩展知识
扩展知识
- 【L3】为什么"LLM 只表达意图、不执行工具"的分工如此重要:所有副作用操作收口在应用层,才有权限校验、参数审计、沙箱隔离和失败拦截的机会;若模型直接执行,安全边界将无从建立。这也是 Guardrails 中"工具护栏"能够生效的架构前提。
- 【L3】工具描述的质量直接决定调用准确率:名称、描述和参数说明是模型选择工具的唯一依据,描述含糊会导致误调用和重复调用。生产上应把工具描述当 Prompt 一样打磨,并配调用成功率监控。
- 【L4】工具调用失败的处理必须显式设计:失败后若无硬约束,模型会"自由发挥"编造结果(幻觉的常见来源);正确姿势是失败强制进入拒答/重试/转人工分支,并对返回结果做 Schema 校验。
🔀 发散问题
- Q:Tool Calling 和 Function Calling 是一回事吗? → 基本同义,Function Calling 常特指模型提供商的原生能力,Tool Calling 是更通用的概念;两者的协议化、跨模型复用形态是 MCP,详见本文档『Agent 系统中的 Function Calling 和 MCP 有什么区别?』。
- Q:模型生成的工具参数不合法怎么办? → 应用层必须先做 Schema 校验再执行,非法参数触发重试(带错误信息回注)或降级,绝不能把非法参数直接透传给下游系统。
- Q:为什么工具执行结果必须回注上下文? → 工具结果是模型获得环境反馈的唯一通道,不回注则模型只能凭先验知识编造结果;回注前还应做截断/摘要,防止超大结果淹没推理,详见本文档『AI Agent 如何处理工具调用返回超大结果的问题?』。
【困难】Agent 的任务规划有哪些常见策略?Plan-and-Solve 和 ReAct 各自适合什么场景?⭐⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 任务规划
💎 关键结论
任务规划没有万能策略:结构化任务用 Plan-and-Solve(先规划后执行,全局视野),探索性任务用 ReAct(边想边做,实时纠错),实践中通常混合使用——Plan-and-Solve 定高层计划,子任务内部用 ReAct 即时调整。无论哪种策略,都必须配最大迭代次数、重复检测和预算兜底——自主性必须关在笼子里。
⚡记忆卡片
- 口诀:结构先规划,探索边想边,骨架加循环,笼子管自主
- 关键词:Plan-and-Solve / ReAct / Reflexion / Replan / 迭代预算
- 链路:目标 → Planner 产出计划 → Executor 逐项执行 → ReAct 子循环 → 失败触发 Replan → 达标终止
📖 核心知识
常见规划策略:
| 策略 | 原理 | 优势 | 劣势 |
|---|---|---|---|
| Plan-and-Solve | 先完整制定计划,再逐步执行 | 全局视野,结构清晰 | 计划可能因信息不足而错误 |
| ReAct | 思考→行动→观察交替进行,边做边调整 | 灵活适应,实时纠错 | 缺乏全局规划 |
| Reflexion | 在 ReAct 基础上增加评估和反思,跨任务学习 | 持续优化 | 需要多次试错 |
| Tree-of-Thought | 将推理展开为树结构,搜索最优路径 | 探索空间大 | 计算开销高 |
| LATS | 结合蒙特卡洛树搜索和 LLM 反思 | 平衡探索与利用 | 实现复杂 |
注:CoT 属于纯提示词推理技巧,不涉及工具执行与状态管理,此处不展开;本题聚焦执行框架层面。
从执行框架视角对比(循环结构/工具时机/状态管理/失败重试):
| 维度 | ReAct | Plan-and-Solve | 纯工作流 |
|---|---|---|---|
| 循环结构 | 单层循环:Thought→Action→Observation 直到产出 Final Answer | 双层:Planner 产出计划,Executor 逐项执行,可触发 Replan | 无循环,固定 DAG |
| 工具调用时机 | 每轮由模型即时决定,无全局预算 | 计划阶段预见所需工具,可按子任务并行调用 | 节点位置写死 |
| 状态管理 | 全部历史堆在上下文里,长任务易窗口溢出 | 计划+子任务状态显式存储,可持久化/断点恢复 | 状态结构化,最可控 |
| 失败重试 | 靠模型看到错误 Observation 后自行调整,不可靠 | 子任务粒度重试,失败可跳过/重排/上报 | 节点级重试策略可配置 |
Plan-and-Solve vs ReAct 的选择:
- Plan-and-Solve 适合:任务结构清晰、步骤明确的场景(如"写一份报告:先调研→再分析→最后总结")。
- ReAct 适合:需要根据中间结果动态调整策略的场景(如"帮我查某公司的最新财务状况"——每一步搜索的结果决定下一步方向)。
- 实际工程中:通常混合使用——先用 Plan-and-Solve 制定高层计划,执行每个子任务时用 ReAct 进行即时推理和调整。
真实踩坑案例:纯 ReAct 循环失控
- 现象:调研 Agent 用纯 ReAct 跑"竞品分析"任务,单次跑了 38 轮、消耗 14 美元 Token,最终产出大量重复内容。
- 排查:Trace 显示 Agent 反复"搜索→发现新线索→再搜索",在两个信息源之间打转,没有任何全局进度判断。
- 根因:ReAct 只有局部视野——每一步只看当前 Observation,无人回答"信息是否已经够",缺乏全局状态和预算约束。
- 修复:改为 Plan-and-Solve 骨架(先列大纲,每个子任务标记完成状态)+ 子任务内部用 ReAct + 最大迭代预算 10 轮。同类任务平均 7 轮完成,成本下降 76%。
场景示例:编码 Agent 的规划设计
背景:构建"读需求文档→写代码→跑测试→改 Bug"的编码 Agent,需设计规划策略、状态管理和终止条件。
参考思路:
- 规划策略:混合式——Plan-and-Solve 骨架:先解析需求产出任务计划(理解需求→定位代码→实现→测试→修复→总结),每个子任务内部用 ReAct 循环(写代码→跑测试→看报错→再改)。编码任务天然需要"试错-观察-修正"的局部循环,但全局顺序必须受控。
- 状态管理:计划以结构化状态存储(子任务列表 + 状态 + 产物路径),每轮只把当前子任务相关的上下文(当前文件、最近一次测试输出)注入窗口,而非全量历史;测试报错只保留关键堆栈,避免信息洪水。
- 终止条件:① 全部测试通过 + 计划全部标记完成→正常结束;② 最大迭代预算(如修复循环 ≤ 5 轮、总轮次 ≤ 15 轮);③ 重复检测(连续两轮代码 diff 几乎相同且测试仍失败→判定僵局,上报人工);④ 超时/Token 预算兜底,优雅退出时输出已完成部分和问题清单。
- 权衡:全自动自主探索上限高但成本和不可控性也高;生产方案应把"修不好就上报"作为一等公民设计——Agent 承认失败并给出诊断,比硬跑 30 轮后交一份错误代码价值高得多。
总结:没有"万能"的规划策略——结构化任务用 Plan-and-Solve 先规划后执行,探索性任务用 ReAct 边想边做,高可靠性场景叠加 Reflexion 反思机制,实践中往往混合使用。关键工程约束:无论哪种策略,都必须配最大迭代次数、重复检测和预算兜底。
🔬 扩展知识
扩展知识
- 【L3】ReAct 为什么必须把 Observation 写回上下文:Observation 是模型感知外部世界的唯一通道,不写回就无法基于事实决策。但全部历史堆在上下文里,长任务会遇到窗口溢出、Lost in the Middle 导致早期观察被忽略、成本随轮数线性增长。工程上需要定期压缩历史、显式维护任务状态对象,而不是只靠原始对话流。
- 【L3】Plan-and-Solve 的初始计划错了怎么办:需要显式的 Replan 机制——子任务执行失败超过重试上限、Observation 与计划假设冲突、已完成结果推翻了后续步骤的前提,三者任一命中就携带已有结果回到 Planner 重新规划。关键是计划要以结构化状态存储(子任务列表 + 完成状态),而不是只存在于一段自然语言里,否则无法判断"哪里变了"。
- 【L4】确定性业务流程为什么不该用自主规划:审批流、下单流这类流程的正确性要求是 100%,而自主规划每一步都有非零出错概率,步数一多整体可靠性必然下降;且合规审计需要可解释、可复现的执行路径。正确姿势是用固定工作流,只在意图理解、异常判断等少数节点嵌入 LLM。
🏭 实战场景
实战案例:纯 ReAct 调研任务循环失控
- 现象:调研 Agent 用纯 ReAct 跑"竞品分析"任务,单次跑了 38 轮、消耗 14 美元 Token,最终产出大量重复内容。
- 排查:Trace 显示 Agent 反复"搜索→发现新线索→再搜索",在两个信息源之间打转,没有任何全局进度判断。
- 根因:ReAct 只有局部视野,无人回答"信息是否已经够",缺乏全局状态和预算约束。
- 修复:改为 Plan-and-Solve 骨架 + 子任务内部 ReAct + 最大迭代预算 10 轮。同类任务平均 7 轮完成,成本下降 76%。
- 启示:规划策略的选型直接决定成本上限——没有全局进度判断的局部循环,是最常见的烧钱陷阱。
⚠️ 常见误区
常见误区
- ❌ "ReAct 最灵活,所以所有 Agent 任务都该用它" → 错。ReAct 只有局部视野,无全局进度判断和预算约束,长任务极易循环打转、成本失控;结构化任务应优先 Plan-and-Solve 骨架。
- ❌ "计划制定好就按计划执行,不需要 Replan" → 错。初始计划常因信息不足而错误,必须设计显式 Replan 触发条件(失败超限、假设冲突、前提被推翻),且计划要以结构化状态存储才能判断"哪里变了"。
- ❌ "审批流、下单流这类确定性流程也可以用自主规划" → 错。这类流程要求 100% 正确性和可审计路径,自主规划的每一步都是出错机会;应用固定工作流,只在少数节点嵌入 LLM。
🔀 发散问题
- Q:Reflexion 相对 ReAct 增加了什么? → 增加了 Evaluator(评估)与 Self-Reflection(反思),把失败经验以语言形式存入记忆指导后续任务,实现跨任务学习,详见本文档『什么是 Reflexion?它和 ReAct 有什么区别?』。
- Q:规划循环如何防止死循环? → 多重保险:最大迭代次数、重复检测(相同 Action + 相同 Observation)、Token/时间预算兜底,详见本文档『Agent 系统中如何设计终止条件?如何解决死循环问题?』。
- Q:Tree-of-Thought、LATS 适合什么场景? → 需要显式探索多条推理路径并择优的场景(如复杂规划、博弈式决策),代价是计算开销高、实现复杂,生产上要严格评估收益再引入。
【中等】什么是 Reflexion?它和 ReAct 有什么区别?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 任务规划
💎 关键结论
Reflexion(Shinn et al., 2023)= ReAct + 评估(Evaluator)+ 自我反思(Self-Reflection)。ReAct 解决"当下怎么想怎么做",Reflexion 解决"这次失败了下次怎么改进"——失败时由 Evaluator 判断原因,Self-Reflection 生成文本反思存入滑动窗口记忆(最多 3 条),下次执行时作为上下文指导行动,实现从即时推理到跨任务学习的进化。
⚡记忆卡片
- 口诀:ReAct 管当下,反思记失败,经验存窗口,下次不再踩
- 关键词:Evaluator / Self-Reflection / 滑动窗口记忆 / 跨任务学习
- 链路:行动 → 失败 → Evaluator 判因 → 生成文本反思 → 存入记忆 → 下轮指导行动
📖 核心知识
与 ReAct 的核心区别:
| 维度 | ReAct | Reflexion |
|---|---|---|
| 关注范围 | 单次任务的即时推理-行动循环 | 跨任务的持续优化 |
| 经验保留 | 不保留跨任务经验 | 将失败经验以语言形式存入记忆 |
| 纠错能力 | 仅依赖当前轮次的观察进行调整 | Evaluator 判断失败原因,生成反思指导下次 |
自我纠错机制:当 Agent 失败时 → Evaluator 判断失败原因 → Self-Reflection 生成文本反思(如"上次用冷水无效,因为油渍需要热分解")→ 存入滑动窗口记忆(最多保留 3 条)→ 下次执行时作为上下文指导行动。
总结:ReAct 解决"当下怎么想怎么做",Reflexion 解决"这次失败了下次怎么改进"——Reflexion = ReAct + 评估 + 反思记忆,实现了从即时推理到跨任务学习的进化。
🔬 扩展知识
扩展知识
- 【L3】反思记忆为什么用"语言形式"而非参数更新:LLM 权重不可在线微调,把失败教训写成自然语言存入上下文,是当前唯一可行的"经验积累"方式;滑动窗口限制 3 条是为了防止反思文本挤占任务上下文预算。
- 【L4】Reflexion 与幻觉防线的关系:自我反思也是 Agent 缓解幻觉的防线之一,但要真正生效必须"对照证据检查"(提供检索结果/工具返回值作为评审依据),否则同一模型自查会强化系统性偏差。
🔀 发散问题
- Q:Reflexion 的反思记忆和长期记忆机制有什么关系? → 反思文本本质是一种特殊的长期记忆写入——来源是失败归因而非用户对话,同样需要容量控制(滑动窗口 3 条)和相关性筛选,否则一样会污染上下文。
- Q:Reflexion 需要多次试错,成本怎么控制? → 只在错误代价高、任务可重放的场景启用,并设最大试错轮次;低风险任务用单次 ReAct 即可,不必为反思多付几倍成本。
- Q:什么信号触发 Evaluator 判定失败? → 外部可验证信号优先(测试未通过、工具报错、输出不满足验收 Schema),其次是模型自评;没有可验证信号时反思质量会显著下降。
【简单】AutoGPT 如何实现自主决策?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 自主决策
💎 关键结论
AutoGPT 是 Agent 自主决策的典型代表,核心模式是"目标驱动 + 工具赋能 + 记忆持续 + 循环迭代":以 LLM 为决策核心接收高层目标并自主分解为子任务,循环执行"思考→规划→调用工具→观察结果→调整计划",通过短期记忆(上下文窗口)和长期记忆(向量数据库)维持任务状态,全程无需人类逐步指令。
⚡记忆卡片
- 口诀:给个大目标,自己拆任务,工具加记忆,循环到完成
- 关键词:目标分解 / 自主循环 / 工具集成 / 记忆维持
- 链路:高层目标 → 分解子任务 → 思考规划 → 调用工具 → 观察调整 → 循环迭代
📖 核心知识
AutoGPT 通过以下机制实现自主决策:
- 目标分解:以 LLM 为决策核心,接收高层目标后自主分解为子任务序列。
- 自主循环:循环执行"思考→规划→调用工具→观察结果→调整计划",无需人类逐步指令。
- 工具集成:集成网络搜索、文件读写、代码执行等工具。
- 记忆维持:通过短期记忆(上下文窗口)和长期记忆(向量数据库)维持任务状态。
总结:AutoGPT 是 Agent 自主决策的典型代表,其核心模式是"目标驱动 + 工具赋能 + 记忆持续 + 循环迭代"。
🔀 发散问题
- Q:AutoGPT 的自主循环和 Agent Loop 是什么关系? → AutoGPT 的循环就是 Agent Loop 的早期实现——"Prompt → 推理 → 行动 → 反馈"的无限循环直到目标达成或被外部终止,详见本文档『什么是 Agent Loop(智能体循环)?Agent 的工作过程是怎样的?』。
- Q:AutoGPT 这类全自主 Agent 在生产中最大的风险是什么? → 缺乏全局进度判断和预算约束,容易循环打转、成本失控;必须配最大迭代次数、重复检测和 Token 预算兜底。
- Q:为什么全自主模式后来让位于"规划 + 受控循环"的混合架构? → 纯自主每一步都是出错机会,错误随步数复合放大,且不可审计;混合架构用计划约束全局、用循环保留局部灵活性,是成功率与可控性的平衡点。
【中等】LLM Agent 在多模态任务中如何执行推理?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 多模态
💎 关键结论
多模态推理的核心是"统一理解 + 分步处理":Agent 通过多模态感知系统接收文本、图像、音频等输入,由 LLM 统一理解后,按 ReAct 等范式进行任务分解和工具调用。典型流程:接收图像 → OCR/视觉模型识别内容 → 调用搜索工具验证 → 整合信息生成结论。关键挑战是把多模态信息统一编码为 LLM 可理解的表示,并在推理链中协调不同模态的处理步骤。
⚡记忆卡片
- 口诀:模态统一懂,任务分步做,工具按模态,结论再整合
- 关键词:多模态感知 / 统一理解 / OCR / 视觉模型 / ReAct
- 链路:多模态输入 → LLM 统一理解 → 任务分解 → 按模态调用工具 → 整合生成结论
📖 核心知识
LLM Agent 通过多模态感知系统接收文本、图像、音频等不同模态的输入,由 LLM 统一理解后,按照 ReAct 等推理范式进行任务分解和工具调用。
典型流程:接收图像 → OCR/视觉模型识别内容 → 调用搜索工具验证 → 整合信息生成结论。
关键挑战:将多模态信息统一编码为 LLM 可理解的表示,并在推理链中协调不同模态的处理步骤。
总结:多模态推理的核心在于"统一理解 + 分步处理"——LLM 作为统一的理解层,根据输入模态动态选择处理工具和推理路径。
🔬 扩展知识
扩展知识
- 【L3】"统一理解"的两种实现路线:① 原生多模态大模型直接接收图像/音频输入;② 管线式——先用 OCR/视觉/语音模型把非文本模态转成文本描述,再交给 LLM 推理。管线式可控性强、每步可审计,原生式端到端体验更好但黑盒程度高。
- 【L4】多模态工具协调的难点:不同模态工具的输出格式与置信度差异大(OCR 有字符级置信度、视觉描述是自由文本),推理链需要设计统一的中间表示和校验环节,否则错误会在模态间传递放大。
🔀 发散问题
- Q:图像输入为什么常先过 OCR/视觉模型再交给 LLM? → 把像素信息转成文本表示,让推理链每一步可审计、可校验,也便于与搜索等文本工具衔接;直接端到端处理则牺牲了中间可解释性。
- Q:多模态任务和纯文本任务的 Agent 循环有区别吗? → 循环结构相同(感知→规划→执行→反思),区别在感知层多了模态识别与编码环节,执行层多了模态专属工具(OCR、视觉、语音)。
- Q:多模态推理中的幻觉有什么特殊性? → 模型可能"看图说话"式编造图像中不存在的细节;缓解手段与文本一致但更依赖工具校验——关键事实用 OCR/结构化识别结果锚定,而非信任视觉描述。
上下文管理与约束
【中等】什么是 Agent 的上下文窗口?为什么它是 Agent 工程中最核心的约束?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 上下文管理
💎 关键结论
上下文窗口是模型在一次交互中能处理的最大 Token 数量(输入 Prompt + 输出 Completion)。它是 Agent 工程的"物理天花板",原因有四:容量有限(要同时容纳指令、工具定义、历史、结果)、成本递增(注意力计算 O(n²))、超窗截断丢信息、窗口内还有 Lost in the Middle 注意力衰减。所有架构设计(记忆分层、上下文压缩、工具结果处理)本质上都在与这个约束博弈。
⚡记忆卡片
- 口诀:窗口是天花板,越长越贵越慢,中段还会衰减
- 关键词:Token 上限 / O(n²) / 截断 / Lost in the Middle
- 链路:窗口约束 → 容量/成本/丢失/衰减四重压力 → 记忆分层 + 压缩 + 结果处理应对
📖 核心知识
上下文窗口是模型在一次交互中能处理的最大 Token 数量(包含输入 Prompt + 输出 Completion)。
它是最核心约束的原因:
- 容量有限:Agent 需在窗口内同时容纳系统指令、工具定义、对话历史、工具返回结果和推理过程。
- 成本递增:窗口越长,推理延迟和计算成本越高(注意力计算为 O(n²))。
- 信息丢失:超出窗口的内容会被截断,导致关键信息丢失。
- 注意力衰减:即使在窗口范围内,模型对中间信息的注意力也可能下降("Lost in the Middle" 现象)。
总结:上下文窗口是 Agent 工程的"物理天花板"——所有架构设计(记忆分层、上下文压缩、工具结果处理)本质上都在与这个约束博弈。
🔬 扩展知识
扩展知识
- 【L3】为什么"窗口变大了就不用管理上下文"是误区:窗口增大只缓解容量问题,成本(随长度线性甚至更高)、延迟(O(n²) 注意力)和 Lost in the Middle 依然存在;长窗口反而容易诱导"全量塞入"的懒惰设计,放大中段信息被忽略的风险。
- 【L3】窗口预算应该怎么分配:生产上通常显式划分预算——系统指令与工具定义(常驻)、当前任务上下文(动态)、历史与工具结果(可压缩区),并为每部分设上限,防止单一来源(如超大工具结果)挤占全局。
- 【L4】窗口约束如何反向塑造架构:记忆分层(短期留窗口、长期进向量库)、上下文压缩(截断/摘要/卸载)、工具结果"先筛后注",这些模式的共同目标都是在固定预算内最大化信息密度。
🔀 发散问题
- Q:对话历史超出窗口怎么办? → 按"保重要、压次要、卸完整"组合使用截断、摘要压缩、上下文卸载、分层保护等策略,详见本文档『当对话历史超出上下文窗口时,有哪些上下文压缩策略?』。
- Q:工具返回了一个 50k Token 的 JSON,直接注入可以吗? → 不可以,会瞬间击穿窗口预算并淹没推理;应截断/分页、摘要化或卸载到外部文件只留引用。
- Q:Lost in the Middle 对 Agent 设计有什么实际影响? → 关键信息(任务目标、最新工具结果、约束规则)应放在上下文首尾两端,探索过程的中间噪音应压缩或卸载,否则早期观察容易被模型忽略。
【中等】当对话历史超出上下文窗口时,有哪些上下文压缩策略?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 上下文管理
💎 关键结论
上下文压缩的核心原则是"保重要、压次要、卸完整":关键信息留在窗口内,次要信息压缩为摘要,完整数据卸载到外部存储按需读取。五种策略按代价从低到高:截断、摘要压缩、上下文卸载、分层保护、滑动窗口 + 重要性评分,生产中通常组合使用而非单选。
⚡记忆卡片
- 口诀:保重要,压次要,卸完整,按需取
- 关键词:截断 / 摘要压缩 / 上下文卸载 / 分层保护 / 重要性评分
- 链路:检测窗口压力 → 标记关键内容 → 压缩探索噪音 → 完整数据卸载留引用 → 按需回读
📖 核心知识
| 策略 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 截断(Truncation) | 直接丢弃早期对话 | 简单高效 | 可能丢失关键信息 |
| 摘要压缩 | 调用 LLM 将长对话压缩为摘要 | 保留核心语义 | 压缩消耗 Token,丢失细节 |
| 上下文卸载 | 完整信息保存到外部文件,窗口中仅保留摘要和路径 | 信息不丢失,Token 节省最高 61% | 需额外文件读取 |
| 分层保护 | 标记关键内容为不可裁剪,仅压缩探索过程噪音 | 关键信息有保障 | 标记策略设计复杂 |
| 滑动窗口 + 重要性评分 | 根据信息的重要性和时效性动态选择保留内容 | 动态适应 | 评分模型需调优 |
总结:上下文压缩的核心原则是"保重要、压次要、卸完整"——关键信息留在窗口内,次要信息压缩为摘要,完整数据卸载到外部存储按需读取。
🔬 扩展知识
扩展知识
- 【L3】摘要压缩的隐性成本与风险:摘要本身消耗一次 LLM 调用(Token 成本 + 延迟),且摘要可能失真、丢细节;因此摘要应只在逼近窗口阈值时触发,并优先保留结构化事实(决策、参数、待办)而非叙述性内容。
- 【L3】上下文卸载为什么是信息无损方案:完整数据落盘后窗口只留"摘要 + 路径",模型需要时再通过文件读取工具回读,兼顾 Token 节省与信息完整性;代价是多一次工具往返,适合体积大但访问频率低的中间产物。
- 【L4】压缩策略与记忆系统的衔接:被压缩/截断丢弃的历史不应真正"消失"——有价值的事实应抽取进长期记忆(向量库),压缩解决窗口问题,记忆解决遗忘问题,两者配合才构成完整的上下文生命周期管理。
🔀 发散问题
- Q:五种策略如何组合使用? → 常见组合:分层保护先圈定不可裁剪内容 → 早期历史摘要化 → 大体积中间产物卸载留引用 → 实在仍超限时按重要性评分截断;顺序从信息损失小的手段开始。
- Q:压缩会不会把关键信息压丢? → 会,这是压缩的本质代价。缓解靠两点:压缩前标记关键内容(分层保护)、压缩后校验关键事实仍在摘要中(如任务目标、未完成的子任务)。
- Q:工具返回的超大结果也算对话历史吗? → 它同样占据窗口预算,处理思路一致但更强调"先筛后注",详见本文档『AI Agent 如何处理工具调用返回超大结果的问题?』。
【中等】AI Agent 如何处理工具调用返回超大结果的问题?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 上下文管理
💎 关键结论
处理超大工具结果的核心思路是"先筛后注":通过截断/分页、摘要化、上下文卸载、结构化提取、分层处理,把海量数据压缩到上下文可承载的密度,避免"信息洪水"淹没 Agent 的推理能力。绝不能把原始大结果直接注入——那会击穿窗口预算、稀释注意力、推高成本。
⚡记忆卡片
- 口诀:先筛后注入,大数卸出去,只留相关字段
- 关键词:截断分页 / 摘要化 / 上下文卸载 / 结构化提取 / 分层处理
- 链路:工具返回大结果 → 规则/轻量模型预筛 → 提取相关字段或摘要 → 完整数据卸载留路径 → 注入窗口
📖 核心知识
| 方案 | 原理 |
|---|---|
| 结果截断/分页 | 对超大返回结果截断或分页,只注入最相关的部分 |
| 摘要化 | 用 LLM 对工具返回的大结果进行摘要,注入摘要而非原始数据 |
| 上下文卸载 | 完整结果保存到外部文件,窗口中仅保留摘要和文件路径 |
| 结构化提取 | 从大结果中只提取与当前任务相关的关键字段 |
| 分层处理 | 先用轻量模型/规则筛选,再用 LLM 处理筛选后的结果 |
总结:处理超大结果的核心思路是"先筛后注"——通过截断、摘要、提取等手段将海量数据压缩到上下文可承载的密度,避免"信息洪水"淹没 Agent 的推理能力。
🔬 扩展知识
扩展知识
- 【L3】为什么工具 Schema 设计阶段就要预防超大返回:在工具描述中约定返回上限(如"最多返回 20 条,超出提示分页"),让模型知道结果边界;事后压缩是补救,事前约定才是治本。
- 【L3】结构化提取优先于摘要:对 JSON/表格类结果,按当前任务需要提取关键字段是确定性操作、零幻觉风险;摘要化是生成操作、有失真风险,应作为无结构数据(长文本、日志)的兜底手段。
- 【L4】超大结果与死循环的关联:注入未压缩的大结果会稀释模型注意力,导致其误判"信息不足"而重复调用同一工具——工具结果治理同时也是循环失控的预防措施。
🔀 发散问题
- Q:分页和截断怎么选? → 数据有明确排序/游标语义(如搜索结果)用分页,让模型按需翻页;无序大块数据用截断 + 摘要,避免模型在多页间反复横跳。
- Q:摘要化工具结果会不会引入幻觉? → 会,摘要本身是生成操作,可能失真;因此高准确性场景优先结构化提取(确定性),摘要仅用于探索性任务,并在关键决策处回读原文校验。
- Q:这套思路和对话历史压缩有什么关系? → 同源——都是在固定窗口预算内最大化信息密度,区别在于工具结果更适合"先筛后注"(注入前处理),而对话历史多在超限后压缩,详见本文档『当对话历史超出上下文窗口时,有哪些上下文压缩策略?』。
【中等】什么是 Agent 的 Guardrails(护栏)?如何设计安全边界?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 护栏
💎 关键结论
Guardrails(护栏)是 Agent 系统中的安全约束和防护机制,确保行为在预期范围内。设计要覆盖五个层次:输入护栏(防注入)、输出护栏(防有害内容)、工具护栏(防越权)、流程护栏(最大迭代/超时/预算)、人工审核 HITL(高风险操作确认)。多层防护叠加,才能确保 Agent 在生产环境中安全可控。
⚡记忆卡片
- 口诀:输入防注入,输出防有害,工具防越权,流程防失控,高危人工审
- 关键词:输入护栏 / 输出护栏 / 工具护栏 / 流程护栏 / HITL
- 链路:用户输入 → 输入护栏过滤 → Agent 执行(工具护栏 + 流程护栏)→ 输出护栏检查 → 高危操作 HITL 确认
📖 核心知识
Guardrails 的设计层次:
| 层次 | 机制 | 示例 |
|---|---|---|
| 输入护栏 | 过滤和验证用户输入 | 拒绝注入攻击、敏感话题过滤 |
| 输出护栏 | 检查 Agent 生成的内容 | 有害内容检测、事实一致性校验 |
| 工具护栏 | 限制工具调用的权限和范围 | 禁止删除操作、限制文件访问路径 |
| 流程护栏 | 约束 Agent 的执行流程 | 最大迭代次数、超时机制、Token 预算 |
| 人工审核(HITL) | 关键操作需人工确认 | 高风险操作前的确认审批 |
主流框架:
- NeMo Guardrails(NVIDIA):通过 Colang 语言定义对话流和安全规则,支持输入/输出检查、话题限制。
- Guardrails AI:提供
Guard和Validator机制,对 LLM 输出进行结构化验证和修正。
总结:Guardrails 是 Agent 系统的"安全网"——输入端防注入、输出端防有害、工具端防越权、流程端防失控,多层防护确保 Agent 在生产环境中安全可控。
🔬 扩展知识
扩展知识
- 【L3】护栏设计为什么必须分层而非单点:攻击与故障的入口是多样的——注入攻击打输入层、幻觉打输出层、越权打工具层、死循环打流程层,任何单点护栏都会被绕过;分层防御让每类风险都有专属拦截点,一层失效还有其他层兜底。
- 【L3】流程护栏是成本与稳定性的最后防线:最大迭代次数、Token 预算、超时机制不针对"内容安全",而是针对"资源安全"——防止 Agent 循环失控烧钱或阻塞服务,是任何自主 Agent 的必配项。
- 【L4】护栏与用户体验的权衡:护栏越严误拦率越高,应按风险分级——低风险场景轻护栏保体验,高风险场景(资金、删除、对外发布)重护栏加 HITL;同时监控护栏触发率,持续调优阈值。
🔀 发散问题
- Q:输入护栏主要防什么? → 提示词注入攻击(用户输入或外部文档中夹带恶意指令)、敏感话题与越权请求;它是第一道闸门,失效后攻击会顺着推理链放大。
- Q:工具护栏和工具权限控制是什么关系? → 工具护栏是护栏视角的拦截机制(白名单、路径限制、操作类型禁止),权限控制是更完整的授权体系(最小权限、分级授权、审计),两者互为表里,详见本文档『如何设计 AI Agent 的工具权限控制?』。
- Q:NeMo Guardrails 和 Guardrails AI 的定位差异? → NeMo Guardrails 侧重对话流与安全规则(Colang 定义话题边界),Guardrails AI 侧重输出结构化验证与修正(Validator 校验格式/事实),一个管"说什么",一个管"输出合不合格"。
协议、标准与生态 (MCP & A2A)
【中等】MCP 协议是什么?它在 AI Agent 系统中解决了什么问题?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / MCP
💎 关键结论
MCP(Model Context Protocol)是 Anthropic 发布的开放标准,为 LLM 应用与外部工具/数据源提供统一连接接口,解决 M×N 集成困境——每个应用和工具各实现一次标准协议,集成复杂度从 M×N 降为 M+N。它用 Tools/Resources/Prompts 三原语统一能力暴露,基于 JSON-RPC 2.0、支持 stdio 与 Streamable HTTP 传输。但它不是银弹:工具列表治理、Server 质量与安全审计,才是接入后真正的运维难点。
⚡记忆卡片
- 口诀:一协议两边接,M 乘 N 变 M 加 N,三原语曝能力
- 关键词:M×N / Tools / Resources / Prompts / JSON-RPC 2.0
- 链路:应用与工具各自实现一次协议 → 三原语暴露能力 → JSON-RPC 通信 → 即插即用
📖 核心知识
MCP(Model Context Protocol,模型上下文协议) 是由 Anthropic 发布的开放标准,旨在为 LLM 应用与外部工具/数据源之间提供统一的连接接口。本题聚焦 Agent-to-Tool 连接层。
解决的核心问题:M×N 集成困境。传统集成依赖硬编码 API 连接:M 个应用要接 N 个工具就需要 M×N 套适配器,每接入一个新工具都要定制开发。MCP 让每个应用和每个工具只实现一次标准协议,集成复杂度从 M×N 降为 M+N,实现"即插即用"。
三原语:MCP Server 向应用暴露的三类能力:
| 原语 | 控制方 | 语义 |
|---|---|---|
| Tools | 模型控制 | 可调用的操作(有副作用),如"发送邮件""查数据库" |
| Resources | 应用控制 | 只读上下文数据,如文件内容、数据库记录、日志 |
| Prompts | 用户控制 | Server 提供的可复用提示模板/工作流模板 |
传输层:基于 JSON-RPC 2.0,支持 stdio(本地进程,零网络开销)和 Streamable HTTP(远程,支持流式响应)两种传输模式,本地工具和云服务可用同一套语义接入。
方案权衡:MCP vs 直接 Function Calling / 自包装 REST:
| 方案 | 适用边界 | 失效场景 |
|---|---|---|
| 直接 Function Calling | 单模型、少量内部工具的简单场景 | 多模型/多应用共享工具时需重复适配,格式不统一 |
| MCP | 多应用多工具、需跨模型复用、第三方工具生态 | 多一层 Server 部署运维;Server 质量参差时工具描述差导致误调用 |
真实踩坑案例:工具列表膨胀
- 现象:接入 12 个内部系统后,Agent 选错工具的比例明显上升,简单问题也要思考很久。
- 排查:统计发现全量 200+ 工具的 Schema 描述占了约 18k Token 上下文,模型在海量工具里"选择困难",且工具描述互相干扰。
- 根因:MCP 解决了"怎么接",但没解决"接多少"——把接入等同于全量暴露,上下文膨胀反过来压垮了工具选择准确率。
- 修复:加意图路由层,先对用户请求分类,再动态只注入相关 Server 的工具(单次 ≤ 15 个);工具选择准确率从 78% 回升到 93%,新工具接入工时从平均 3 人天降到 0.5 人天。
场景示例:20 个遗留系统统一接入 Agent 平台
背景:公司有 20 个遗留内部系统(部分连 OpenAPI 文档都没有),要统一接入 Agent 平台。
参考思路:
- 分批接入策略:按"价值×改造成本"排序——第一批选 3~5 个有现成 API 的高价值系统(如工单、知识库、审批),用官方 SDK 包一层 MCP Server 验证端到端;无 API 的遗留系统放在第二批,先评估补建 API 还是用数据库直连/RPA 过渡。
- 规范先行:制定内部 MCP Server 开发规范——工具命名/描述写作指南(描述质量直接决定调用准确率)、参数 Schema 要求、错误码约定、权限声明;配套接入验收测试(每个工具至少 10 条调用用例)。
- 风险预案:① 上下文膨胀:从第一天就上意图路由 + 工具子集注入,不要等 200 个工具接完再治理;② 安全:写操作类 Server 必须支持审计日志和权限校验,敏感数据类 Resources 走脱敏层;③ Server 质量参差:建立工具调用成功率监控,成功率低的工具下线整改而非勉强用。
- 权衡:全量一次性接入周期长且风险集中,分批能持续交付价值但需要维护新老两套过渡;量化目标建议:单个系统接入 ≤ 1 人天、工具选择准确率 ≥ 90% 才允许接入下一批。
总结:MCP 之于 AI Agent,犹如 USB 之于外设——一个标准化接口,把 M×N 的集成地狱降为 M+N,用 Tools/Resources/Prompts 三原语统一能力暴露方式。但它不是银弹:工具列表治理、Server 质量与安全审计,是接入后真正的运维难点。
🔬 扩展知识
扩展知识
- 【L3】三原语的定位差异在控制权与副作用:Resources 是应用按需读取的只读数据(无副作用、可预加载),Tools 是模型决策调用的操作(有副作用、需授权审计),Prompts 是面向用户的模板。区分只读与可执行直接决定安全策略:读可以宽松预取,写必须最小权限 + 审计,这是权限模型设计的基础。
- 【L3】MCP 解决 M×N 问题的边界:它解决的是"接口标准化",解决不了——① 工具语义质量(描述写得差,模型照样误调用);② 工具数量治理(全量注入会压垮上下文);③ 业务级权限(协议层鉴权不能替代数据级权限控制)。这些都需要应用层自建能力配套。
- 【L4】工具列表上下文膨胀的三级治理:① 意图路由:先分类再动态选择相关 Server,只注入子集(单次 ≤ 15 个工具);② 工具描述瘦身:只保留名称 + 一句话用途,详细参数说明改为模型选中后再加载;③ 分层暴露:高频工具常驻,低频工具通过"工具目录查询工具"按需发现。
🔀 发散问题
- Q:MCP 的架构由哪些组件构成? → Host(运行 LLM 的应用)、Client(通信代理)、Server(工具/数据源适配器)三层,详见本文档『MCP 协议的架构包含哪些核心组件?』。
- Q:MCP 和 Function Calling 是竞争关系吗? → 不是,是层次关系:Function Calling 是模型内置的工具接口,MCP 是独立于模型的标准协议,生产系统常用 MCP 统一管理工具、再经 Function Calling 交给模型决策。
- Q:MCP 的安全性靠什么保障? → 访问隔离、OAuth 2.1 授权、Root 机制、Sampling 审查、传输加密五个层面,详见本文档『MCP 协议安全性设计包含哪些层面?』。
【中等】MCP 协议的架构包含哪些核心组件?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / MCP
💎 关键结论
MCP 采用客户端-服务器架构,三大核心组件:MCP Host(运行 LLM 的应用,管理 Client 生命周期)、MCP Client(与 Server 保持一对一连接的通信代理)、MCP Server(连接具体工具/数据源的功能适配器)。通信基于 JSON-RPC 2.0,支持 stdio(本地)和 HTTP/SSE(远程)两种传输。三层架构实现 LLM 与工具的彻底解耦。
⚡记忆卡片
- 口诀:Host 管应用,Client 管通信,Server 管工具,一对一连接
- 关键词:Host / Client / Server / JSON-RPC 2.0 / stdio / HTTP
- 链路:Host 运行 LLM → Client 封装标准化请求 → Server 执行操作返回结果
📖 核心知识
| 组件 | 职责 |
|---|---|
| MCP Host | 运行 LLM 的应用(如 Claude Desktop、IDE),管理 Client 生命周期 |
| MCP Client | Host 内的通信代理,与 Server 保持一对一连接,封装/转发标准化请求 |
| MCP Server | 连接具体工具/数据源的功能适配器,接收请求、执行操作、返回结果 |
通信基于 JSON-RPC 2.0,支持 stdio(本地)和 HTTP/SSE(远程)两种传输模式。
总结:MCP 的 Host-Client-Server 三层架构实现了 LLM 与工具的解耦——Host 管 LLM 集成,Client 管通信协议,Server 管工具适配。
🔬 扩展知识
扩展知识
- 【L3】为什么 Client 与 Server 是一对一连接:一对一让每个连接的能力协商、权限边界和生命周期独立管理,某个 Server 故障不影响其他连接;Host 需要多工具时通过管理多个 Client 实现,隔离性优于共享连接池。
- 【L3】stdio 与 HTTP/SSE 的选型边界:stdio 适合本地工具(CLI、本地脚本),零网络开销但要求与 Host 同机部署;HTTP/SSE 适合远程云服务,支持流式响应和多客户端接入,但需要处理鉴权与网络可靠性。
- 【L4】三层解耦的工程收益:替换 LLM(换 Host 内模型)不动 Server,替换工具(换 Server)不动 Host,这是"集成复杂度从 M×N 降为 M+N"在架构层面的直接体现。
🔀 发散问题
- Q:Host 和 Client 为什么要分开? → Host 是应用整体(可能含 UI、多个会话),Client 是协议通信代理;分开后一个 Host 可管理多个 Client 分别对接不同 Server,生命周期与权限各自独立。
- Q:一个 MCP Server 能同时服务多个应用吗? → 远程 HTTP/SSE 模式下可以(多客户端接入),stdio 模式下则是单 Host 单连接;这也是两种传输模式的本质差异之一。
- Q:Server 质量参差会带来什么问题? → 工具描述差会导致模型误调用、重复调用;接入前应规范工具命名与描述写作,并配调用成功率监控,成功率低的工具下线整改。
【简单】MCP 的工作流程是什么?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / MCP
💎 关键结论
MCP 工作流分三阶段:初始化(Client 与 Server 交换协商能力、确认协议版本)→ 操作(用户请求 → LLM 生成结构化调用意图 → JSON-RPC 发送 Server 执行 → 结果回传 → LLM 评估后响应或继续调用)→ 关闭(连接优雅关闭)。核心是 LLM 决策 + JSON-RPC 通信 + Server 执行的三方协作。
⚡记忆卡片
- 口诀:先握手协商,再循环调用,最后优雅关
- 关键词:初始化 / 能力协商 / JSON-RPC / 调用循环 / 优雅关闭
- 链路:初始化握手 → 请求-调用-返回循环 → 优雅关闭
📖 核心知识
MCP 的典型工作流分三个阶段:
- 初始化:Client 和 Server 交换并协商能力,就协议版本达成一致。
- 操作:用户发起请求 → Host 将上下文和工具清单提供给 LLM → LLM 生成结构化 JSON 调用意图 → Client 通过 JSON-RPC 发送至 Server → Server 执行操作 → 结果回传 → LLM 评估后生成最终响应或继续下一轮调用。
- 关闭:连接优雅关闭。
总结:MCP 工作流 = 初始化握手 → 请求-调用-返回循环 → 优雅关闭,核心是 LLM 决策 + JSON-RPC 通信 + Server 执行的三方协作。
🔀 发散问题
- Q:初始化阶段协商什么? → 协议版本与双方支持的能力(如是否支持 Sampling、Resources 订阅等),协商失败则连接不建立,这是避免运行时能力不匹配的前置闸门。
- Q:操作阶段为什么可能多轮循环? → LLM 评估工具结果后若判断任务未完成,会发起下一轮调用——这正是 Agent Loop 在 MCP 上的体现,直到任务完成或被终止条件拦截。
- Q:LLM 在流程中到底执行了什么? → 只做两件事:决定"调不调、调哪个、传什么参数",以及拿到结果后评估是否继续;真正的执行始终在 Server 侧,这一分工是权限与审计的基础。
【中等】MCP 协议安全性设计包含哪些层面?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / MCP
💎 关键结论
MCP 安全设计的核心思想是"LLM 不碰底层",涵盖五个层面:访问隔离(所有操作经 Server 中转)、授权认证(OAuth 2.1)、Root 机制(限制 Server 可访问的文件目录范围)、Sampling 审查(用户审查批准后才传递给 LLM)、传输加密(HTTPS/TLS)。三层隔离确保工具调用安全可控。
⚡记忆卡片
- 口诀:中转隔离,OAuth 认证,Root 限目录,采样要审批,传输加 TLS
- 关键词:访问隔离 / OAuth 2.1 / Root 机制 / Sampling 审查 / TLS
- 链路:LLM 请求 → Server 中转执行 → 权限与范围约束 → 高危操作人工审查 → 加密回传
📖 核心知识
MCP 的安全性设计涵盖五个层面:
- 访问隔离:LLM 不直接访问系统资源,所有操作经 MCP Server 中转,控制数据边界。
- 授权认证:支持 OAuth 2.1 进行授权认证。
- Root 机制:限制 Server 可访问的文件和目录范围。
- Sampling 审查:Sampling 功能要求用户审查和批准后才能传递给 LLM。
- 传输加密:支持 HTTPS/TLS 加密传输。
总结:MCP 安全设计的核心思想是"LLM 不碰底层"——通过 Server 中转、权限限制、人工审查三层隔离,确保 Agent 的工具调用安全可控。
🔬 扩展知识
扩展知识
- 【L3】协议层安全与应用层安全的边界:MCP 提供的是通道级安全(传输加密、授权、访问范围),但业务级数据权限(某用户能否查某条数据)必须在 Server 内部实现——协议层鉴权不能替代数据级权限控制,这是最常见的安全误区。
- 【L3】Sampling 审查为什么重要:Sampling 是 Server 反向请求 LLM 能力的通道,若不设用户审查,恶意或被注入的 Server 可能借 LLM 扩大攻击面;人工批准把这条反向通道的控制权留在用户手里。
- 【L4】写操作类 Server 的额外要求:除协议机制外,生产上应要求审计日志(谁、何时、调了什么、参数与结果)与最小权限凭证(不用宿主凭据、按 Server 单独授权),与工具权限控制体系打通。
🔀 发散问题
- Q:Root 机制防的是什么? → 防 Server 越权访问文件系统——把可访问范围限定在声明的目录内,即使 Server 被诱导执行文件操作,损害也被限制在圈定范围内。
- Q:为什么用 OAuth 2.1 而不是自定义鉴权? → OAuth 2.1 是成熟的授权标准,支持令牌生命周期管理与撤销,避免各 Server 自造鉴权轮子带来的实现缺陷,也便于与企业身份体系集成。
- Q:这些机制能防提示词注入吗? → 不能完全防——注入属于输入层攻击,需要输入护栏配合;MCP 安全机制的价值在于即使注入发生,越权操作仍会被权限边界和审查机制拦截,降低爆炸半径。
【中等】如何将已有的应用转换成 MCP 服务?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / MCP
💎 关键结论
已有应用接入 MCP 的关键是"包一层标准协议"——内部逻辑不变,对外暴露符合 MCP 规范的工具接口。四步走:实现接口规范(名称、描述、参数 Schema)→ 选择传输方式(本地 stdio / 远程 HTTP)→ 用官方 SDK 封装(Python/TypeScript/Java 等)→ 在 Host 中注册 Server。其中工具描述的质量直接决定模型调用准确率,是最值得投入的一环。
⚡记忆卡片
- 口诀:定义好接口,选对传输路,SDK 包一层,注册进 Host
- 关键词:工具 Schema / 传输方式 / 官方 SDK / fastmcp / Server 注册
- 链路:梳理已有能力 → 定义工具 Schema → SDK 封装为 Server → 选择传输 → 注册接入
📖 核心知识
将已有应用转换为 MCP Server 的步骤:
- 实现接口规范:定义工具的名称、描述和参数 Schema。
- 选择传输方式:本地 stdio 或远程 HTTP/SSE。
- 封装已有功能:使用官方 SDK(Python、TypeScript、Java 等)封装。
- 注册 Server:在 MCP Host 中注册 Server 地址。
Anthropic 提供了官方 SDK,社区也有 fastmcp 等便捷实现。
总结:已有应用接入 MCP 的关键是"包一层标准协议"——内部逻辑不变,对外暴露符合 MCP 规范的工具接口。
🔬 扩展知识
扩展知识
- 【L3】工具描述写作是转换工作的核心:模型选工具、传参数全靠名称、描述和 Schema 说明。好的描述应包含"何时用、返回什么、什么情况下无需重复调用";描述含糊是接入后误调用、重复调用的头号根因。
- 【L3】传输方式按部署形态选择:工具与 Host 同机(CLI、本地脚本)选 stdio,零网络开销;跨服务、多应用共享选 HTTP/SSE,并配齐鉴权;同一工具可以两种形态各封装一次,语义保持一致。
- 【L4】转换时的错误处理约定:应把下游错误映射为结构化错误信息返回(而非抛裸异常),让模型能理解"失败了、为什么、要不要重试";同时约定幂等语义,防止 Agent 重试造成重复副作用。
🔀 发散问题
- Q:没有 API 的遗留系统怎么转 MCP? → 先评估补建 API;短期可用数据库直连(只读查询)或 RPA 过渡,包成 MCP Server 时同样要写清工具描述与权限边界。
- Q:转换后如何验证质量? → 每个工具准备调用用例(建议至少 10 条)做接入验收,上线后监控调用成功率与误调用率,不达标的工具下线整改。
- Q:接入越多越好吗? → 不是。全量暴露工具会膨胀上下文、压垮工具选择准确率,应配意图路由 + 工具子集注入,按场景动态暴露相关工具。
【中等】什么是 A2A 协议?它和 MCP 协议有什么区别?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
A2A(Agent-to-Agent)是 Google 发起、50+ 合作伙伴贡献的开源通信标准,让不同厂商、不同框架的 Agent 能协同工作。MCP 是纵向连接(Agent ↔ 工具),A2A 是横向协作(Agent ↔ Agent),二者互补。A2A 的两个核心机制:Agent Card(发布在 /.well-known/agent.json 的能力名片,实现服务发现)与任务生命周期(Task 状态机 + SSE 推送,支持跨小时级异步协作)。落地难点不在协议本身,而在能力声明的真实性验证和任务异常处理。
⚡记忆卡片
- 口诀:MCP 管手,A2A 管嘴;名片先发现,任务走状态
- 关键词:Agent Card / Task 状态机 / SSE / 不透明代理 / 互补
- 链路:发布 Agent Card → 编排 Agent 发现匹配 → 派发 Task → 状态推送 → Artifact 交付
📖 核心知识
A2A(Agent-to-Agent)协议是由 Google 发起、50+ 合作伙伴共同贡献的开源通信标准,旨在让不同厂商、不同框架构建的 AI Agent 能够协同工作。本题聚焦 Agent-to-Agent 协作层(工具连接层的细节见 MCP 相关题目,此处不重复)。
与 MCP 的定位差异:
| 维度 | MCP | A2A |
|---|---|---|
| 连接方向 | 纵向:Agent ↔ 工具/数据源 | 横向:Agent ↔ Agent |
| 解决问题 | Agent 如何使用外部工具 | Agent 之间如何协作 |
| 比喻 | Agent 的"手"(连接工具) | Agent 之间的"语言"(协作通信) |
| 关系 | 两者互补,一个完整的 Agent 系统通常同时使用两者 |
A2A 协作的两个核心机制:
- Agent Card(服务发现):每个 Agent 发布在
/.well-known/agent.json的机器可读名片,声明身份、能力(Skills)、端点和安全要求,让编排 Agent 能自动发现"谁能干这个活"。 - 任务生命周期(状态管理):Task 是协作的最小调度单元,状态机为:已提交→处理中→需输入→已完成/失败/已取消,长任务通过 SSE 实时推送状态,天然支持跨小时甚至跨天的异步协作。
方案权衡:A2A 协议协作 vs 单框架内多 Agent 编排:
| 方案 | 适用边界 | 失效场景 |
|---|---|---|
| 单框架内编排(如 LangGraph) | 同一团队、同一技术栈、需要共享状态的多 Agent | 跨团队/跨厂商协作时需共享内部实现,耦合严重 |
| A2A 协议协作 | 跨团队、跨框架、跨组织的 Agent 互操作 | 同团队内部使用则协议开销大于收益;Agent Card 自报能力可能失真 |
真实踩坑案例:Agent Card 能力虚报导致误派发
- 现象:跨团队协作中,编排 Agent 把"合同风险审查"任务派给了"法务问答 Agent",产出牛头不对马嘴但状态显示"已完成"。
- 排查:该 Agent 的 Agent Card 描述里含"合同"关键词,但实际只做法律常识问答,从未做过审查任务;调度只做了关键词匹配。
- 根因:Agent Card 能力是自报的且无验证机制,调度端只看描述不看实证。
- 修复:① Agent Card 规范化:结构化技能清单 + 附带能力测试用例;② 任务结果附置信度自评,低置信触发复核;③ 编排端抽样 5% 任务产出质检。误派率从 9% 降到 1%。
场景示例:三个事业部的"一句话报销"协作架构
背景:集团三个事业部各自建设了 Agent(报销、审批、财务,技术栈各异),要提供统一入口"一句话报销"。
参考思路:
- 架构设计:编排 Agent(Orchestrator)作为统一入口:① 三个事业部 Agent 各自发布 Agent Card,声明技能与鉴权方式;② 编排 Agent 解析用户请求后按能力匹配派发子任务;③ 子任务间有依赖(报销单创建→审批跟踪→付款查询),编排端维护任务 DAG 串行/并行调度;④ 结果以 Artifact 结构化返回,编排 Agent 汇总后回复用户。
- 关键机制:① 任务 ID 全链路透传,支持端到端追踪;② 长审批任务用 SSE 状态推送,用户可随时问"我的报销到哪了";③ 任一子任务失败时编排 Agent 明确告知失败环节,而不是静默吞掉。
- 风险与预案:① 能力虚报:Agent Card 上线需附验收用例;② 责任边界:跨部门数据需在各 Agent 侧做权限校验,编排 Agent 不代理鉴权;③ 版本演进:Agent Card 能力变更需兼容旧版或显式升版本。
- 权衡:三系统同公司也可以强行统一技术栈后框架内编排——但改造成本和跨部门协调成本远高于接入 A2A;协议层解耦的本质是"用标准化接口换组织协作成本"。
总结:MCP 解决"Agent 怎么用工具",A2A 解决"Agent 怎么合作"——MCP 是纵向连接,A2A 是横向协作,二者互补构成完整的 Agent 生态。A2A 的落地难点不在协议本身,而在能力声明的真实性验证和任务生命周期的异常处理。
🔬 扩展知识
扩展知识
- 【L3】A2A 为什么强调"不透明代理":协作只依赖"能力声明 + 任务交付"两个接口,内部实现完全黑盒。这让不同厂商、不同框架、甚至互为竞争对手的 Agent 也能协作——不用交换内部状态就没有数据泄露和商业机密问题,代价是协作粒度只能到任务级,无法做细粒度的中间状态协同。
- 【L3】长任务为什么需要"需输入"状态和 SSE 推送:同步等待意味着连接长开、网关超时(通常 30~60 秒)、客户端崩溃即任务丢失。状态机 + SSE 把协作变成异步:任务提交后立即返回任务 ID,进度通过 SSE 推送,中途需要补充信息时转入"需输入"状态等客户端回注,任务状态服务端持久化,客户端随时可重连查询——这是数小时级任务能可靠运行的前提。
- 【L4】公司内部自研 Agent 还需要 A2A 吗:看组织边界而非技术边界——同一团队同一技术栈用框架内编排更简单;分属不同部门、各自迭代发布时 A2A 把"跨团队协作接口"标准化,避免两两定制对接。判断标准是"对接数量是否随团队数平方增长"。
🔀 发散问题
- Q:A2A 的 Agent Card 里都有什么? → 唯一身份标识、功能描述(Skills)、端点 URL、支持的交互模态、安全需求声明,详见本文档『A2A 协议中的 Agent Card 是什么?』。
- Q:A2A 的任务是怎么流转的? → 已提交→处理中→需输入→已完成/失败/已取消,长任务通过 SSE 实时推送,详见本文档『A2A 协议的工作流程是怎样的?』。
- Q:为什么说 Agent Card 能力可能"失真"? → 能力是自报的且协议本身不做验证,调度端只看描述会误派发;工程上要用结构化技能清单 + 验收用例 + 产出质检来兜底。
【中等】A2A 协议中的 Agent Card 是什么?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
Agent Card 是每个 A2A Agent 的"数字名片"——发布在已知路径(如 /.well-known/agent.json)的 JSON 文件,包含身份标识、功能描述(Skills)、端点 URL、交互模态、安全需求声明。它让客户端 Agent 能自动发现并评估哪个远程 Agent 适合处理特定任务,是多 Agent 协作中的"服务发现"机制,如同 DNS 之于互联网。
⚡记忆卡片
- 口诀:名片放好 known 路径,能力身份加端点,发现评估全靠它
- 关键词:数字名片 / /.well-known/agent.json / Skills / 服务发现
- 链路:Agent 发布 Card → 编排 Agent 读取 → 能力匹配 → 派发任务
📖 核心知识
Agent Card 是每个 A2A Agent 的"数字名片",是发布在已知路径(如 /.well-known/agent.json)的 JSON 文件。
包含内容:Agent 的唯一身份标识、功能描述(Skills)、访问端点 URL、支持的交互模态、安全需求声明等。
作用:让客户端 Agent 能够自动发现并评估哪个远程 Agent 适合处理特定任务,是多 Agent 协作中的"服务发现"机制。
总结:Agent Card 之于 A2A,如同 DNS 之于互联网——通过标准化的"名片"让 Agent 能被自动发现和识别。
🔬 扩展知识
扩展知识
- 【L3】为什么用固定已知路径发布:
/.well-known/是 Web 标准的约定路径,发现方无需额外注册中心即可按地址直接获取名片,实现去中心化的服务发现;代价是需要配套机制保证 Card 内容真实可信。 - 【L3】能力虚报的治理手段:Agent Card 是自报的,协议不验证。工程实践:结构化技能清单(而非自由文本描述)、附能力测试用例、任务结果附置信度自评、编排端抽样质检——用验证机制弥补声明的不可信。
- 【L4】Agent Card 的版本治理:能力变更必须兼容旧版或显式升版本,否则编排逻辑会被静默破坏;Card 变更应走与 API 变更同等级别的评审与通知流程。
🔀 发散问题
- Q:Agent Card 和微服务的注册中心有什么区别? → 注册中心是中心化目录,Agent Card 是去中心化的"按约定路径自发布";前者依赖基础设施可用性,后者更简单但需要额外解决发现入口和真实性验证。
- Q:编排 Agent 如何基于 Card 做派发决策? → 读取技能清单与任务需求做能力匹配,再结合鉴权要求、端点可用性筛选;只靠关键词匹配容易误派,应配结构化技能与验收用例。
- Q:Card 中的"安全需求声明"有什么用? → 告诉调用方该 Agent 要求的认证方式(API Key/OAuth2/mTLS 等),让编排端在派发前完成鉴权准备,避免任务执行到一半因权限失败。
【中等】A2A 协议的核心架构及主要组件有哪些?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
A2A 采用客户端-服务器架构,四大核心数据模型构成完整任务生命周期:Agent Card 负责发现、Task 负责调度(最小可调度单元,状态机管理生命周期)、Message 负责通信(统一承载文本/文件/数据/表单)、Artifact 负责交付(结构化输出物)。一句话:发现→调度→通信→交付,四组件各司其职。
⚡记忆卡片
- 口诀:卡片管发现,任务管调度,消息管通信,工件管交付
- 关键词:Agent Card / Task / Message / Artifact
- 链路:Agent Card 发现 → Task 创建调度 → Message 承载交互 → Artifact 输出交付
📖 核心知识
| 组件 | 定义 |
|---|---|
| Agent Card | Agent 的机器可读名片,包含身份、能力、端点等信息 |
| Task(任务) | 最小可调度单元,生命周期:已提交→处理中→需输入→已完成/失败/已取消 |
| Message(消息) | Task 内所有交互消息的统一载体(文本、文件、数据、表单等) |
| Artifact(工件) | Task 完成后的结构化输出物,确保输出的一致性和易用性 |
总结:A2A 的四大组件构成完整的任务生命周期——Agent Card 负责发现,Task 负责调度,Message 负责通信,Artifact 负责交付。
🔬 扩展知识
扩展知识
- 【L3】Task 为什么是"最小可调度单元":把协作粒度锚定在任务级(而非消息级或状态级),配合状态机实现可查询、可取消、可恢复的调度;这也是"不透明代理"原则的体现——双方只在任务边界交换信息。
- 【L3】Message 统一载体的价值:文本、文件、数据、表单用同一结构承载,避免为每种数据类型定义独立通道;跨模态协作(如传一份表格 + 一段说明)无需额外协议扩展。
- 【L4】Artifact 为什么强调"结构化":输出物是下游 Agent 或人的直接消费对象,结构化(Schema 化)保证跨 Agent 解析一致性;自由文本交付会让下游再做一次解析,信息失真随链路传递放大。
🔀 发散问题
- Q:Message 和 Artifact 的边界在哪? → Message 是过程中的交互内容(含中间补充、追问),Artifact 是任务完成后的最终交付物;过程信息进 Message,结论产物进 Artifact。
- Q:Task 状态"需输入"解决什么问题? → 长任务执行中需要调用方补充信息时,不必失败重来——转入"需输入"状态等待回注后继续,这是跨小时任务能可靠推进的关键。
- Q:四大组件和 MCP 三原语能对应吗? → 不能直接对应:MCP 三原语描述"工具能力的暴露方式",A2A 四组件描述"任务协作的生命周期",一个管纵向能力接入,一个管横向任务流转,详见本文档『A2A 协议与 MCP 协议如何协同工作?』。
【简单】A2A 协议有哪五大设计原则?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
A2A 的设计哲学是"能力透明、内部黑盒",五大原则:① 关注 Agent 能力(不透明代理);② 采用通用 Web 标准(HTTP、SSE、JSON-RPC 2.0);③ 内置安全性(API Key、OAuth2、OIDC、mTLS);④ 支持长时间任务(数小时甚至数天 + 实时状态更新);⑤ 处理多样化数据类型(文本、音频、视频、交互表单)。只暴露"能做什么"和"怎么通信",不暴露"怎么做"。
⚡记忆卡片
- 口诀:能力透明内部黑盒,Web 标准安全内置,长任务多模态
- 关键词:不透明代理 / Web 标准 / 内置安全 / 长任务 / 多模态
- 链路:能力声明 → 标准通信 → 安全认证 → 长任务状态推送 → 多模态交付
📖 核心知识
- 关注 Agent 能力(不透明代理):Agent 之间无需共享内部记忆、逻辑或工具,只关注"对话内容"和"任务交付"。
- 采用通用 Web 标准:基于 HTTP、SSE、JSON-RPC 2.0 等成熟标准,降低集成门槛。
- 内置安全性:原生支持 API Key、OAuth2、OpenID Connect、mTLS 等认证方案。
- 支持长时间任务:能处理耗时数小时甚至数天的任务,提供实时状态更新。
- 处理多样化数据类型:原生支持文本、音频、视频和交互式表单等多模态数据。
总结:A2A 的设计哲学是"能力透明、内部黑盒"——只暴露"能做什么"和"怎么通信",不暴露"怎么做"。
🔀 发散问题
- Q:"不透明代理"原则的代价是什么? → 协作粒度只能到任务级,无法做细粒度中间状态协同;换来的是跨厂商、跨框架甚至竞争对手之间也能安全协作。
- Q:为什么坚持用通用 Web 标准而不是新造协议? → HTTP/SSE/JSON-RPC 生态成熟、网关与鉴权基础设施现成,集成门槛低;新造协议会让每个接入方都承担额外的学习与运维成本。
- Q:长任务原则靠什么机制落地? → Task 状态机 + SSE 实时推送 + "需输入"状态,让数小时级任务可异步推进、可断线重连,详见本文档『A2A 协议的工作流程是怎样的?』。
【中等】A2A 协议的工作流程是怎样的?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
A2A 遵循客户端-服务器模型,本质是标准化的"请求-执行-交付"异步协作模式:Agent Card 发现 → SendMessage 发起任务 → 执行 + GetTask 查询/SSE 推送 → Artifact 交付 →(必要时)CancelTask 终止。角色可在对话中互换——这次当客户端,下次可以当服务器。
⚡记忆卡片
- 口诀:先看名片再派活,消息发起状态推,工件交付可取消
- 关键词:服务发现 / SendMessage / GetTask / SSE / Artifact / CancelTask
- 链路:检查 Agent Card → 发起任务 → 处理中状态推送 → Artifact 返回 → 终止或完成
📖 核心知识
A2A 遵循客户端-服务器模型,一个 Agent(客户端)请求执行任务,另一个 Agent(服务器)执行任务,角色可在对话中互换。
具体工作流:
- 服务发现:客户端 Agent 检查远程 Agent 的 Agent Card,确认能力匹配。
- 任务发起:通过
SendMessage或SendStreamingMessage发起任务请求。 - 任务执行:远程 Agent 接收任务,状态变为"处理中",执行过程中可通过
GetTask查询进度。 - 实时推送:对于长任务,通过 SSE 实时推送状态更新。
- 结果返回:任务完成后,远程 Agent 以 Artifact 格式返回结构化结果。
- 任务终止:如需终止,可调用
CancelTask。
总结:A2A 工作流 = Agent Card 发现 → 任务创建 → 执行+状态推送 → Artifact 交付,本质上是标准化的"请求-执行-交付"异步协作模式。
🔬 扩展知识
扩展知识
- 【L3】GetTask 轮询与 SSE 推送的分工:短任务用 GetTask 按需查询即可,长任务必须用 SSE 主动推送——否则客户端要么频繁轮询浪费资源,要么同步等待撞网关超时;两者配合覆盖不同任务时长。
- 【L3】角色可互换的工程含义:同一 Agent 在 A 协作中当服务器、在 B 协作中当客户端,意味着每个 Agent 都要同时实现两端能力;部署架构上需要区分"对外服务端点"与"对外发起请求的客户端凭据"。
- 【L4】失败与异常的显式处理:CancelTask 只是终止通道,生产上还要处理超时(任务卡在"处理中")、部分完成(返回已有 Artifact + 失败原因)与重试幂等,异常路径的完备度决定协作系统的可靠性。
🔀 发散问题
- Q:SendMessage 和 SendStreamingMessage 怎么选? → 结果一次性可交付用前者;需要流式过程反馈(如边执行边推送中间状态)用后者,本质是对 SSE 通道的主动启用。
- Q:客户端崩溃了任务怎么办? → 任务状态在服务端持久化,客户端重连后用任务 ID 通过 GetTask 恢复查询——这正是异步状态机设计相对同步等待的核心优势。
- Q:这个流程和 MCP 工作流的关键差异? → MCP 是低延迟的"调用-返回"工具循环,A2A 是支持跨小时的任务生命周期协作;前者同步紧凑,后者异步持久,详见本文档『A2A 协议与 MCP 协议如何协同工作?』。
【中等】A2A 协议与 MCP 协议如何协同工作?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / A2A
💎 关键结论
MCP 与 A2A 是互补关系:MCP 纵向连接(Agent ↔ 工具),A2A 横向协作(Agent ↔ Agent)。多 Agent 系统的标准架构:Agent 内部用 MCP 连各自的工具集,Agent 之间用 A2A 协作,编排层的主 Agent 通过 A2A 发现并调度专业 Agent。MCP 让每个 Agent"手中有工具",A2A 让多个 Agent"协同有语言"。
⚡记忆卡片
- 口诀:内用 MCP 接工具,外用 A2A 连同伴,编排 Agent 总调度
- 关键词:纵向连接 / 横向协作 / 编排层 / Agent Card / Artifact
- 链路:用户请求 → 编排 Agent → A2A 派发专业 Agent → 各专业 Agent 经 MCP 调工具 → Artifact 汇总 → 最终响应
📖 核心知识
两者是互补关系,解决不同层面的问题:
- MCP:纵向连接——Agent ↔ 工具/数据源,解决"Agent 如何使用工具"。
- A2A:横向协作——Agent ↔ Agent,解决"Agent 之间如何协作"。
多 Agent 系统架构设计:
- Agent 内部:每个 Agent 通过 MCP 连接各自的工具集(数据库、搜索引擎、文件系统等)。
- Agent 之间:通过 A2A 进行横向协作,每个 Agent 发布 Agent Card 声明能力。
- 编排层:主 Agent(Orchestrator)通过 A2A 发现并调度专业 Agent。
示例:用户问"分析竞品并生成报告"→ 编排 Agent 通过 A2A 分发给"搜索 Agent"(MCP 连接搜索引擎)和"数据分析 Agent"(MCP 连接数据库)→ 各自完成后通过 A2A Artifact 返回结果 → 编排 Agent 汇总生成报告。
总结:MCP 让每个 Agent"手中有工具",A2A 让多个 Agent"协同有语言"——一个完整的 Agent 生态需要同时具备纵向工具连接和横向协作通信。
🔬 扩展知识
扩展知识
- 【L3】为什么不能用一个协议同时解决两个问题:工具连接要求低延迟、细粒度、强类型的能力调用;Agent 协作要求任务级、异步、跨组织的能力交换,两者的生命周期、安全模型和容错要求完全不同,强行合并会让协议两边都不好用。
- 【L3】编排层的职责边界:编排 Agent 负责意图解析、能力匹配、任务 DAG 调度与结果汇总,但不代理鉴权——跨系统数据的权限校验必须在各专业 Agent 侧完成,编排层只传任务不越权。
- 【L4】混合架构的故障隔离:A2A 的任务级隔离天然提供故障边界——某个专业 Agent 失败只影响对应子任务,编排端明确告知失败环节即可;而 MCP 侧的工具失败要在 Agent 内部用拒答/重试策略消化,两层错误处理策略不应混用。
🔀 发散问题
- Q:一个小系统只用 MCP 不用 A2A 可以吗? → 可以。单 Agent + 多工具场景 MCP 足够;只有出现跨团队/跨框架/跨组织的 Agent 互操作需求时,A2A 的价值才显现。
- Q:编排 Agent 自己需要工具吗? → 通常需要——汇总、格式化、用户交互等能力可通过 MCP 接入工具;编排 Agent 本身也是"内部 MCP + 对外 A2A"的完整 Agent。
- Q:两个协议的治理重点有何不同? → MCP 侧重工具列表治理(防上下文膨胀)与工具描述质量;A2A 侧重能力声明真实性(防误派发)与任务生命周期异常处理。
系统架构、安全与工程化
【中等】什么是 Agent Loop(智能体循环)?Agent 的工作过程是怎样的?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / Agent Loop
💎 关键结论
Agent Loop 是将用户意图、模型大脑和执行工具串联成闭环的核心架构(OpenAI Codex 的核心架构),工作过程遵循"感知→规划→执行→反思"四阶闭环:构建 Prompt → 模型推理决策 → 工具调用 → 结果反馈检查 → 未达标则回到推理,直到任务完成或被外部终止。所有 Agent 框架的核心都是这个循环的不同实现。
⚡记忆卡片
- 口诀:组装提示词,推理做决策,工具去执行,反馈定去留
- 关键词:感知 / 规划 / 执行 / 反思 / 循环终止
- 链路:构建 Prompt → LLM 推理 → 工具执行 → 结果注入 → 达标输出或继续循环
📖 核心知识
Agent Loop 是 OpenAI Codex 核心架构,是将用户意图、模型大脑和执行工具串联成闭环的系统。Agent 的工作过程遵循"感知→规划→执行→反思"的四阶闭环:
- 构建 Prompt(感知):将用户输入、系统指令、工具定义、历史上下文组装为完整 Prompt。
- 模型推理(规划):LLM 分析意图,决定下一步行动(直接回复或调用工具)。
- 工具调用(执行):若需调用工具,执行对应的 API/函数,获取结果。
- 结果反馈(反思):将工具返回结果注入上下文,检查是否达标。若未达标则调整计划,回到步骤 2 继续推理。
- 循环终止:当 LLM 判断任务完成,生成最终响应。
整个过程由 LLM 驱动,记忆模块持续存储相关信息,规划模块根据执行情况动态调整。
总结:Agent Loop 的本质是"Prompt → 推理 → 行动 → 反馈"的无限循环,直到 LLM 认为任务完成或被外部终止——所有 Agent 框架的核心都是这个循环的不同实现。
🔬 扩展知识
扩展知识
- 【L3】循环中的非确定性集中在哪一步:推理决策步——同样的上下文模型可能做出不同选择,这是 Agent 行为不可复现的根源;工程上通过固定种子(若支持)、记录完整 Trace、结构化状态存储来降低影响。
- 【L3】"LLM 判断任务完成"为什么不可全信:模型可能过早宣布完成(漏做步骤)或永不完成(循环打转),所以循环终止必须叠加外部机制——最大迭代次数、重复检测、预算兜底,详见本文档『Agent 系统中如何设计终止条件?如何解决死循环问题?』。
- 【L4】Agent Loop 与规划策略的关系:裸 Loop 是 ReAct 式单层循环;叠加 Planner 后变成"计划 + 子循环"的双层结构(Plan-and-Solve 骨架),全局进度可控性显著提升,详见本文档『Agent 的任务规划有哪些常见策略?Plan-and-Solve 和 ReAct 各自适合什么场景?』。
🔀 发散问题
- Q:Agent Loop 每一轮都要带上全部历史吗? → 不必也不应该。长任务应按需注入当前子任务相关上下文,历史过长要压缩/卸载,否则窗口溢出、成本失控,详见本文档『当对话历史超出上下文窗口时,有哪些上下文压缩策略?』。
- Q:ReAct 范式和 Agent Loop 是什么关系? → ReAct 是 Agent Loop 的一种推理组织方式——用 Thought→Action→Observation 的显式结构组织每轮循环;循环是骨架,ReAct 是骨架上的一种"思考姿势"。
- Q:循环中工具失败了怎么办? → 失败信息也是一种 Observation,应回注上下文让模型决策重试或换路径;但必须有重试上限,失败超限走拒答/转人工,防止无限重试。
【中等】Agent 系统中如何设计终止条件?如何解决死循环问题?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / Agent Loop
💎 关键结论
终止条件设计的关键是"多重保险":任务完成判定为主、最大迭代次数为底、重复检测为辅、Token/时间预算兜底,确保 Agent 在任何情况下都能优雅退出。死循环的典型场景是两个方案间反复横跳、或反复调用同一工具得到相同结果;解决靠硬性上限、重复检测、反思介入和预算兜底四招组合。
⚡记忆卡片
- 口诀:完成判定为主,迭代上限为底,重复检测为辅,预算超时兜底
- 关键词:任务完成判定 / 最大迭代次数 / 重复检测 / 平台期检测 / Token 预算
- 链路:每轮检查完成信号 → 未达标查重复与进度 → 触发任一保险 → 优雅退出并返回部分结果
📖 核心知识
常见终止条件:
| 策略 | 原理 |
|---|---|
| 任务完成判定 | LLM 明确输出"任务完成"标记或 Final Answer |
| 最大迭代次数 | 设置硬性上限(如 5-10 轮),防止无限循环 |
| 重复检测 | 同一 Action 连续出现且 Observation 不变,判定为陷入僵局 |
| 平台期检测 | 连续 N 轮未发现新问题且老问题未减少,判定为收敛 |
| Token 预算 | 设置 Token 消耗上限,超出后强制终止 |
| 超时机制 | 设置时间上限 |
死循环的典型场景:Agent 在两个方案间反复横跳,或反复调用同一工具得到相同结果。
解决策略:
- 硬性上限:设置最大迭代次数(如 10 轮)。
- 重复检测:连续执行相同 Action 且 Observation 不变,强制终止。
- 反思介入:让 Agent 意识到自己在重复,主动切换策略。
- 预算兜底:Token/时间预算超出后强制退出并返回部分结果。
总结:终止条件设计的关键是"多重保险"——完成判定为主、迭代次数为底、重复检测为辅、预算超时兜底,确保 Agent 在任何情况下都能优雅退出。
🔬 扩展知识
扩展知识
- 【L3】为什么不能只靠"LLM 判断完成":模型没有全局进度视野,可能过早宣布完成或陷入自我确认的循环;完成判定必须与外部硬约束(迭代数、预算)叠加,前者保证质量退出,后者保证必然退出。
- 【L3】重复检测的工程实现要点:比较连续两轮的 Action 与 Observation 相似度(如相似度 > 0.95 判重复),命中后可先触发反思介入(提示模型"你在重复"),再犯则强制终止——给一次自救机会但不无限给。
- 【L4】优雅退出的设计:被预算/超时终止时应返回"已完成部分 + 未完成清单 + 失败原因",而不是空手而归;这让上层(用户或编排 Agent)能决定人工接管还是重派任务。
🔀 发散问题
- Q:最大迭代次数设多少合适? → 按任务类型定:工具查询类 5~10 轮,编码修复类可到 15 轮左右;宁小勿大,触顶后走上报人工比硬跑更省钱更安全。
- Q:平台期检测和重复检测有什么区别? → 重复检测抓"完全相同的动作循环",平台期检测抓"还在动但没有进展"(连续 N 轮无新问题、老问题不减少);后者更隐蔽,需要显式维护问题清单才能判断。
- Q:终止条件和成本控制是什么关系? → 终止条件就是成本的第一道闸门——Token 预算与超时直接决定单次任务的最大开销,配合模型路由、缓存等手段构成完整的成本控制体系,详见本文档『如何控制 Agent 的运行成本?有哪些 Token 优化手段?』。
【中等】多 Agent 协作有哪些常见的编排模式?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 多 Agent
💎 关键结论
四种常见编排模式按任务依赖关系选择:顺序编排(串行依赖,A 的输出进 B)、并行编排(独立子任务同时跑)、层级编排(主 Agent 分配、子 Agent 汇报)、辩论/投票模式(多 Agent 独立作答求共识)。选型口诀:串行依赖用顺序、独立子任务用并行、层级分解用层级、需要共识用投票。
⚡记忆卡片
- 口诀:依赖串着走,独立并行跑,分解找主管,共识靠投票
- 关键词:顺序编排 / 并行编排 / 层级编排 / 辩论投票
- 链路:分析任务依赖 → 选择编排模式 → 定义 Agent 间接口 → 汇总结果
📖 核心知识
| 编排模式 | 原理 | 适用场景 |
|---|---|---|
| 顺序编排(Sequential) | Agent A 的输出作为 Agent B 的输入 | 流水线任务(研究→写作→审校) |
| 并行编排(Parallel) | 多个 Agent 同时处理独立子任务 | 可并行的场景(同时搜索多数据源) |
| 层级编排(Hierarchical) | 主 Agent 分配任务给子 Agent,完成后汇报 | 复杂多步骤任务 |
| 辩论/投票模式 | 多个 Agent 对同一问题给出答案,投票达成共识 | 需要高准确性的决策场景 |
总结:编排模式的选择取决于任务的依赖关系——串行依赖用顺序、独立子任务用并行、层级分解用层级、需要共识用投票。
🔬 扩展知识
扩展知识
- 【L3】编排模式可以组合使用:生产系统常见"层级为骨架、并行提速度、关键节点投票"的混合形态——主 Agent 分解任务后并行派发子 Agent,高风险输出再加一轮辩论验证;组合的依据始终是依赖关系与错误代价。
- 【L3】投票模式的成本与前提:成本是单 Agent 的 N 倍,且投票有效的前提是错误不相关——同基座同知识源的多个 Agent 会"异口同声犯同一个错",需要异构基座或异源知识才有共识价值。
- 【L4】编排模式与协议的对应:团队内部编排用框架能力(如 LangGraph)即可;跨团队/跨厂商时层级编排天然对应 A2A 的编排 Agent + Agent Card 发现模式,编排粒度到任务级。
🔀 发散问题
- Q:顺序编排最大的风险是什么? → 错误沿链路传递放大——上游 Agent 的一个错误输出会成为下游所有 Agent 的"事实";关键节点应加校验或投票,或改为工件传递 + 下游独立核实。
- Q:并行编排如何控制成本? → 只对真正独立的子任务并行,并给每个分支设预算上限;并行不是免费的,N 个分支就是 N 倍 Token。
- Q:层级编排里主 Agent 该接收子 Agent 的完整推理过程吗? → 不该。只接收结果摘要(结论 + 关键事实),完整过程留在子 Agent 侧,这是上下文隔离的基本原则,详见本文档『多 Agent 系统中如何管理 Agent 间的上下文传递?』。
【中等】子 Agent(Subagent)模式有什么优势和挑战?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 多 Agent
💎 关键结论
子 Agent 模式的核心价值是"分治"——任务隔离(专注单一职责)、上下文精简(只接收任务相关信息)、可复用性(被不同父 Agent 复用)。代价是四类挑战:通信开销、状态同步、错误传播、权限边界(子 Agent 工具权限应 ≤ 父 Agent,最小权限原则)。
⚡记忆卡片
- 口诀:分治降复杂,隔离净上下文,权限不超父,错误要拦传
- 关键词:任务隔离 / 上下文精简 / 可复用 / 错误传播 / 最小权限
- 链路:父 Agent 派任务 → 子 Agent 隔离执行 → 摘要回传 → 父 Agent 决策
📖 核心知识
优势:
- 任务隔离:每个子 Agent 专注单一职责,降低复杂度。
- 上下文精简:子 Agent 只接收与其任务相关的信息,避免上下文污染。
- 可复用性:子 Agent 可被不同父 Agent 复用。
挑战与边界问题:
| 问题 | 说明 |
|---|---|
| 通信开销 | 父子 Agent 间的信息传递消耗额外 Token |
| 状态同步 | 子 Agent 的执行状态需要反馈给父 Agent |
| 错误传播 | 子 Agent 的错误可能影响父 Agent 的决策 |
| 权限边界 | 子 Agent 的工具权限应 ≤ 父 Agent(最小权限原则) |
总结:子 Agent 模式的核心价值是"分治"——隔离复杂度、精简上下文、提升复用性,但要警惕通信开销、错误传播和权限越界。
🔬 扩展知识
扩展知识
- 【L3】子 Agent 什么时候值得引入:当单个 Agent 的上下文被多职责稀释(工具太多、目标混杂)导致选择准确率下降时,拆子 Agent 的收益才成立;职责简单的场景拆分只会徒增通信开销。
- 【L3】错误传播的拦截设计:子 Agent 返回结果应附置信度自评与来源引用,父 Agent 对低置信结果触发复核而非直接采信;关键决策可换异构子 Agent 交叉验证。
- 【L4】权限继承的工程实现:父 Agent 派发任务时应显式下发"本次任务允许的工具子集",而不是让子 Agent 继承全量权限——动态最小权限比静态配置更能防止越权,详见本文档『如何设计 AI Agent 的工具权限控制?』。
🔀 发散问题
- Q:子 Agent 和 A2A 里的远程 Agent 是一回事吗? → 不一定。子 Agent 通常是同系统内部的层级分解,可共享框架与状态;A2A 远程 Agent 是跨团队/跨组织的黑盒协作,只通过任务接口交互。
- Q:通信开销怎么优化? → 传结论不传过程、传引用不传全文——子 Agent 只回传结构化摘要与大体积产物的引用,避免把完整推理过程塞回父 Agent。
- Q:状态同步失败(子 Agent 卡住)怎么办? → 给子任务设超时与心跳,超时后父 Agent 明确标记失败环节并决定重试/换路/上报,绝不静默等待。
【中等】Agent 系统中的 Function Calling 和 MCP 有什么区别?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 工具调用
💎 关键结论
Function Calling 是"模型内置的工具接口"——简单直接但工具与模型强耦合、格式不统一;MCP 是"独立的工具标准协议"——统一接口、工具可跨模型复用、支持动态发现,但需部署维护 Server、架构更复杂。前者简单但耦合,后者复杂但解耦,生产级系统通常用 MCP 统一管理工具。
⚡记忆卡片
- 口诀:FC 内置随模型,MCP 标准跨模型;简单选 FC,复用上 MCP
- 关键词:模型原生 / 标准协议 / 强耦合 / 跨模型复用 / 动态发现
- 链路:少量内部工具 → Function Calling;多应用多工具共享 → MCP Server 统一接入
📖 核心知识
| 维度 | Function Calling | MCP |
|---|---|---|
| 定义 | 模型原生能力,由模型提供商定义 | 标准化协议层,独立于模型 |
| 工具定义 | 直接嵌入 API 请求中 | 通过 MCP Server 独立部署 |
| 优点 | 简单直接,无需额外基础设施 | 统一接口,工具可跨模型复用,支持动态发现 |
| 缺点 | 工具与模型强耦合,不同模型格式不统一 | 需部署和维护 MCP Server,架构更复杂 |
总结:Function Calling 是"模型内置的工具接口",MCP 是"独立的工具标准协议"——前者简单但耦合,后者复杂但解耦,生产级系统通常用 MCP 统一管理工具。
🔬 扩展知识
扩展知识
- 【L3】两者在生产架构中的协作关系:不是二选一——MCP Server 提供标准化工具接入与发现,应用层把 MCP 工具清单转换模型能理解的格式,最终仍通过 Function Calling 机制交给模型决策;MCP 管"工具从哪来",FC 管"模型怎么调"。
- 【L3】切换模型时差异最痛的地方:Function Calling 的工具定义格式各家不同,换模型要重写适配;MCP 工具定义在 Server 侧与模型无关,换模型只需换适配层,这是"跨模型复用"的实际含义。
- 【L4】何时不该上 MCP:单模型、少量内部工具、无共享需求的简单场景,直接 Function Calling 更快——多一层 Server 的部署运维成本没有收益;工具数量增长或出现第二个消费方时再迁移。
🔀 发散问题
- Q:MCP 的"动态发现"指什么? → 应用可在运行时向 Server 查询可用工具清单(Tools 列表),无需把工具定义硬编码进请求;新增工具对模型侧透明,这是 FC 静态嵌入做不到的。
- Q:不同模型的 FC 格式差异有多大? → 参数 Schema 大同小异,但调用消息结构、并行调用支持、结果回传格式各有差异,多模型系统需要适配层屏蔽这些差异。
- Q:工具调用准确率差,该优化 FC 还是 MCP? → 两边都不背锅——准确率首先取决于工具描述质量与数量治理(上下文膨胀会压垮选择),先修描述、做路由,再谈协议层改造。
【困难】如何设计 AI Agent 的工具权限控制?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 权限安全
💎 关键结论
工具权限控制的核心是"最小权限 + 分级授权 + 关键操作人工审批":每个 Agent 只授予完成任务所需的最小工具集;读操作宽松、写操作严格;代码执行进沙箱;全量审计留痕;资金转账、数据删除等高风险操作必须 HITL 确认。目标是确保 Agent 有能力完成任务但不越权。
⚡记忆卡片
- 口诀:最小权限分级授,读宽写严控,高危人工审,沙箱加审计
- 关键词:最小权限 / 分级授权 / 沙箱隔离 / 审计日志 / HITL
- 链路:任务分析 → 授予最小工具集 → 读写分级 → 高危 HITL 审批 → 全程审计
📖 核心知识
设计原则:
- 最小权限原则:每个 Agent 只授予完成其任务所需的最小工具集。
- 分级授权:读操作(查询)权限宽松,写操作(修改/删除)权限严格,需人工审批。
- 沙箱隔离:代码执行类工具在沙箱中运行,限制文件系统访问范围。
- 审计日志:记录所有工具调用行为,支持事后追溯和异常检测。
- 人工审核(HITL):高风险操作(如资金转账、数据删除)需人工确认后方可执行。
总结:工具权限控制的核心是"最小权限 + 分级授权 + 关键操作人工审批",确保 Agent 有能力完成任务但不越权。
🔬 扩展知识
扩展知识
- 【L3】分级授权的落地细节:按副作用把工具分为只读(查询,可自由调用)、受控写(修改,需参数校验 + 审计)、高危写(删除/转账/对外发布,强制 HITL)三级;分级写进工具元信息,由执行层强制,而不是靠 Prompt 约束模型"自觉"——Prompt 约束可被注入绕过,架构拦截不会。
- 【L3】审计日志的最小字段集:调用者(哪个 Agent/会话)、工具名、入参摘要、返回状态、时间戳、关联任务 ID;支持事后按任务链路回放,也是异常检测(如短时间高频调用同一写工具)的数据基础。
- 【L4】动态最小权限:父 Agent 派发子任务时只下发该任务所需的工具子集,任务结束即回收,比静态配置更贴合最小权限原则;这与子 Agent 的"权限 ≤ 父 Agent"约束是同一原则的两个落点。
🏭 实战场景
实战案例:工具全量暴露导致的越权风险治理(示例)
- 现象:Agent 平台接入了 200+ 工具且默认全量可用,安全巡检发现:一个只应做查询的客服 Agent 拥有删除类工具的调用权限,且写操作调用缺少审计字段。
- 排查:权限配置是"按平台统一授权"而非"按任务授权",工具上线时默认对所有 Agent 可见;审计日志只记录了部分调用。
- 根因:把"接入"当成"全员可用",最小权限和审计在工具数量增长后没有跟上。
- 修复:① 按 Agent 职责重建工具白名单(示例:客服 Agent 从 200+ 收缩到单场景 ≤ 15 个相关工具);② 写操作全部补齐审计字段并接入异常检测;③ 删除/资金类工具强制 HITL 审批后方可执行。
- 启示:权限治理要与工具接入同步演进——每接入一个新工具都要回答"谁能调、调了记不记录、出事能不能回滚"三个问题。
⚠️ 常见误区
常见误区
- ❌ "给 Agent 配齐所有工具,效率更高" → 错。工具越多上下文越膨胀、误调用与越权面越大;最小权限既是安全要求也是准确率要求,应按任务授予最小工具集。
- ❌ "读操作没有风险,可以完全放开" → 错。读操作同样可能泄露敏感数据(批量导出、越权查询他人数据),需要数据级权限控制与调用审计,读宽松≠读无限。
- ❌ "在 Prompt 里写明禁止删除,模型就会遵守" → 错。Prompt 约束可被提示词注入绕过;高危操作必须在执行层做架构级拦截(白名单 + HITL),不能依赖模型自觉。
🔀 发散问题
- Q:工具权限和 Guardrails 里的工具护栏是什么关系? → 权限控制是授权体系(谁能调什么),工具护栏是运行时拦截机制(白名单外的一律拒);授权决定"允许集",护栏保证"越界即拦",两者缺一不可,详见本文档『什么是 Agent 的 Guardrails(护栏)?如何设计安全边界?』。
- Q:代码执行工具的权限有什么特殊性? → 它的副作用边界远超普通 API(文件、网络、进程),必须在沙箱中运行并限制文件系统与网络访问,详见本文档『Agent 执行代码等高风险操作时,沙箱(Sandbox)安全如何设计?』。
- Q:HITL 审批会不会拖垮体验? → 只对高危操作启用(资金、删除、对外发布),普通操作不介入;用户等一次确认,远好过一次不可逆事故,分级是关键。
【困难】如何评估 Agent 系统的效果?有哪些评估指标和框架?⭐⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 评估
💎 关键结论
Agent 评估要覆盖六个维度:任务完成率、推理质量、工具使用准确性、幻觉率、延迟与成本、安全与合规。方法上:离线基准做变更门禁,线上指标(采纳率/点踩率)做北极星,人工抽样定期校准。主流框架:AgentBench、GAIA、SWE-bench、LangSmith。记住:公开基准只是起点,与业务目标对齐的私有评测集 + 线上北极星指标才是真正的裁判。
⚡记忆卡片
- 口诀:六维看效果,离线做门禁,线上定北极,人工定期校
- 关键词:任务完成率 / 工具准确性 / 幻觉率 / AgentBench / SWE-bench / 北极星指标
- 链路:建私有评测集 → 离线分层评测 → 变更门禁 → 灰度上线 → 线上北极星 → Bad Case 回流
📖 核心知识
Agent 系统评估是一个多维度问题,需要覆盖从单步推理到端到端任务完成的全链路。
核心评估维度:
| 维度 | 评估内容 | 常用指标 |
|---|---|---|
| 任务完成率 | Agent 是否成功完成用户指定的任务 | 成功率(Success Rate) |
| 推理质量 | 推理链的逻辑正确性和效率 | 步骤准确率、推理步数 |
| 工具使用准确性 | 是否选择了正确的工具并传入正确参数 | 工具选择准确率、参数准确率 |
| 幻觉率 | 输出中是否包含与事实不符的内容 | 幻觉率(Faithfulness Score) |
| 延迟与成本 | 端到端响应时间和 Token 消耗 | P50/P95 延迟、Token 成本 |
| 安全与合规 | 是否触发 Guardrails、是否有越权操作 | 违规率、护栏触发率 |
方案权衡:离线基准评测 vs 线上评估;自动裁判 vs 人工评估:
| 方案 | 优势 | 代价与失效场景 |
|---|---|---|
| 离线基准评测 | 可复现、可回归、变更门禁 | 数据污染/饱和后与真实能力脱节;覆盖不了长尾分布 |
| 线上评估 | 真实分布、真实代价信号 | 反馈稀疏(多数用户不点赞踩)、归因难 |
| LLM-as-a-Judge | 可规模化评开放式产出 | 偏爱长答案、偏袒同源模型 |
| 人工评估 | 金标准 | 贵且慢,只能抽样 |
实践姿势:离线基准做变更门禁,线上指标(采纳率/点踩率)做北极星,人工抽样定期校准两者一致性。
主流评估框架:
- AgentBench:涵盖操作系统、数据库、知识图谱等 8 个环境的综合评测。
- GAIA:评估通用 AI 助手解决现实世界问题的能力。
- SWE-bench:评估 Agent 在真实 GitHub Issue 上的代码修复能力。
- LangSmith(LangChain):提供 trace 分析、评测数据集和 A/B 测试功能。
场景示例:客服 Agent 上线前的评估方案
背景:公司客服 Agent 还有 1 个月上线,领导要求给出"能不能上线"的评估结论。
参考思路:
- 评测集建设(第 1 周):从历史客服工单分层抽样 200~300 条真实问题(高频咨询/长尾问题/高风险问题如退款投诉各占比例),标注参考答案与可接受行为(如"应转人工"),关键样本双人标注。
- 分层评估(第 2~3 周):① 意图识别准确率(门槛 ≥ 95%);② 工具/检索链路:工具选择准确率、知识检索 Recall@5;③ 端到端:任务完成率、幻觉率(高风险类需 < 0.5‰)、拒答合理性;④ 安全:注入攻击、越权查询、敏感信息泄露的红队测试;⑤ 成本延迟:P95 延迟、单会话 Token 成本。
- 上线门槛与分级:定义硬性门槛(安全测试零容忍、高风险幻觉率达标)与软性门槛(体验类指标达标 80% 即可);不达硬门槛的功能降级(如退款类直接转人工)而非阻塞整体上线。
- 上线后闭环:小流量灰度 + 线上指标监控(自助解决率、转人工率、点踩率),Bad Case 持续回流评测集;评估不是一次性的上线门禁,而是持续运营的质量体系。
- 权衡:采用"自动裁判全量 + 人工抽样 20% 校准"的组合;结论报告必须分层呈现(哪些能力可上、哪些需降级、风险在哪),而不是一个简单的"能/不能"。
总结:Agent 评估不能只看"最终答案对不对"——需要从任务完成率、推理质量、工具准确性、幻觉率、成本效率、安全合规六个维度全面衡量,并用标准化框架(AgentBench/SWE-bench)进行可复现的评测。但公开基准只是起点,与业务目标对齐的私有评测集 + 线上北极星指标才是真正的裁判。
🔬 扩展知识
扩展知识
- 【L3】为什么需要"轨迹级(trajectory)"评估:只看结果是黑盒——同样成功的任务,可能一个 3 步直达、另一个 20 步乱试,成本和稳定性天壤之别;同样失败的任务,失败在第一步选错工具和失败在最后一步总结错误,修复方向完全不同。步骤级评估(工具选择准确率、参数准确率、每步必要性)能定位优化方向,也是回归时区分"能力退化"还是"路径漂移"的唯一手段。
- 【L3】公开基准的数据污染和饱和怎么处理:污染——① 优先用发布时间晚于模型训练截止日的新基准;② 自建 holdout 集并严格不进训练管线;③ 对可疑题目做消融验证。饱和——基准分数普遍 90+ 时区分度已丧失,应切换到更难的任务集或自建业务评测集,不要在被刷爆的基准上继续调优。
- 【L4】业务私有评测集从 0 到 1 怎么建:① 从线上真实日志抽样 100~300 条任务(分层覆盖高频/长尾/高风险);② 标注期望结果或评分细则(rubric),关键任务双人标注校验一致性;③ 先跑当前版本得到基线,再定改进目标。北极星选择原则:与业务价值直接挂钩且可度量——客服 Agent 选"自助解决率"而非"回答流畅度",代码 Agent 选"采纳率"而非"过测试率"。
🏭 实战场景
实战案例:离线高分、线上翻车
- 现象:代码 Agent 在内部 SWE-bench 子集上 pass@1 达 34%,上线后开发者满意度只有 20%。
- 排查:两个原因——① 评测用的历史 Issue 可能在模型训练数据中出现过类似修复(数据污染),离线分数虚高;② 离线只测"补丁能否过测试",不测"补丁是否可采纳"——很多补丁能过测试但风格糟糕、改动面失控,开发者根本不会合入。
- 根因:评测目标(过测试)与业务目标(开发者采纳)错位 + 基准污染。
- 修复:① 自建回归集:150 个新 Issue + 严格隔离训练数据;② 增加人工评审维度(补丁可采纳性);③ 北极星指标切换为"开发者采纳率",上线后从 20% 逐步提到 55%。
- 启示:评测目标必须与业务目标对齐——"能跑通"和"有人用"是两个指标,选错北极星,优化越努力离用户越远。
⚠️ 常见误区
常见误区
- ❌ "任务完成率就是评估的全部" → 错。同样"完成"的任务,3 步直达与 20 步乱试的成本和稳定性天壤之别;必须叠加推理步数、工具准确性、成本、安全等维度,否则优化方向会跑偏。
- ❌ "公开基准分数高就说明能力强" → 错。公开基准存在数据污染(题目进过训练数据)和饱和(分数刷爆后失去区分度)问题,只能作参考,业务私有评测集才是可靠裁判。
- ❌ "离线指标涨了,线上一定更好" → 错。评测集分布偏离真实用户、评测目标偏离业务目标(如测"过测试"而非"可采纳")时,离线收益无法传导到线上;必须用线上北极星指标验证并定期校准。
🔀 发散问题
- Q:RAG 子链路和 Agent 端到端的评估指标能互通吗? → 部分互通:检索 Recall@K、faithfulness 在两边都用;但 Agent 还要加任务完成率、工具准确性、轮次成本等执行维度,RAG 指标解释不了"检索对了但任务失败"的情况。
- Q:线上反馈稀疏(没人点赞踩)怎么办? → 用隐式信号补充:转人工率、会话放弃率、重复提问率;同时抽样人工标注校准,不能完全依赖显式反馈。
- Q:安全与合规怎么量化评估? → 建红队测试集(注入攻击、越权查询、敏感信息诱导),以"攻击成功率"为指标,上线门槛通常是零容忍;日常监控护栏触发率与违规率。
【中等】Agent 系统上线后面临哪些工程化挑战?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 工程化
💎 关键结论
Agent 工程化的核心挑战是"从 Demo 到 Production 的鸿沟"——Demo 只关心"能不能做",生产系统还必须解决六大问题:可观测性(黑盒定位)、成本控制(Token 消耗)、延迟优化(多轮推理慢)、错误恢复(工具失败容错)、版本管理(Prompt/模型变更一致性)、安全合规(隐私与权限)。
⚡记忆卡片
- 口诀:看得见,控住钱,跑得快,错能恢,变更稳,守合规
- 关键词:可观测性 / 成本控制 / 延迟优化 / 错误恢复 / 版本管理 / 安全合规
- 链路:Demo 验证 → 全链路 Trace → 成本与延迟治理 → 容错降级 → 变更回归 → 安全门禁
📖 核心知识
| 挑战 | 具体问题 | 应对策略 |
|---|---|---|
| 可观测性 | Agent 行为是黑盒,难以定位问题 | 全链路 trace 日志、推理过程可视化 |
| 成本控制 | LLM 调用成本高,多步推理 Token 消耗大 | Token 预算管理、缓存复用、轻量模型分流 |
| 延迟优化 | 多轮推理 + 工具调用导致响应慢 | 并行工具调用、结果缓存、流式输出 |
| 错误恢复 | 工具调用失败、LLM 输出异常时的容错 | 重试机制、降级策略、人工兜底 |
| 版本管理 | Prompt 变更、模型升级可能导致行为不一致 | Prompt 版本控制、A/B 测试、回归测试 |
| 安全合规 | 数据隐私、输出安全、权限管控 | Guardrails、审计日志、数据脱敏 |
总结:Agent 工程化的核心挑战是"从 Demo 到 Production"的鸿沟——Demo 只关心"能不能做",生产系统还必须解决可观测性、成本控制、延迟优化、错误恢复和安全合规等工程问题。
🔬 扩展知识
扩展知识
- 【L3】六大挑战的优先级排序:可观测性必须第一——没有全链路 Trace,成本控制不知道钱花在哪、错误恢复不知道错在哪、版本管理不知道变更影响了什么;观测先行,其余治理才有数据依据。
- 【L3】版本管理为什么是 Agent 特有的难题:传统软件变更是确定性的代码 diff,Agent 的"变更"包括 Prompt 措辞、模型版本、工具描述,任何一个都可能静默改变行为且难以 code review;必须靠评测集回归(变更前跑 Golden Set)而非人工审查兜底。
- 【L4】错误恢复的降级阶梯设计:工具失败→重试(限次数)→换替代工具→降级为规则/缓存结果→拒答转人工;每一级都有明确触发条件,避免"失败即裸奔"让模型自由发挥。
🔀 发散问题
- Q:可观测性具体怎么建? → 以 Trace 为核心观测对象,记录每次 LLM 调用与工具调用的输入输出,配合 LangSmith/Langfuse 回放分析,详见本文档『Agent 系统的可观测性如何建设?如何调试 Agent 的异常行为?』。
- Q:成本失控最常见的根因是什么? → 循环失控(无终止约束的重复调用)和上下文膨胀(全量历史 + 全量工具注入);先上迭代预算与工具路由,再谈模型降级和缓存。
- Q:Prompt 变更怎么做回归? → 维护 Golden Set 评测集,任何 Prompt/模型/工具描述变更先在评测集上跑对比,不劣于基线才合入,与框架升级回归是同一套门禁。
【困难】Agent 系统的可观测性如何建设?如何调试 Agent 的异常行为?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 可观测性
💎 关键结论
Agent 调试的钥匙是"全链路 Trace":把一次任务执行展开为树状结构,分层记录 Session、Agent Run、LLM 调用、工具调用、护栏触发的输入/输出/耗时/Token。配合 LangSmith/Langfuse 等工具回放分析,按"复现 → 归因 → 固化"三步法调试——trace 回放定位异常、区分推理/工具/上下文三类根因、Bad Case 沉淀为回归测试集,把黑盒变成白盒。
⚡记忆卡片
- 口诀:全链路留痕,树状看追踪,复现归因再固化
- 关键词:Trace / Session / LLM 调用 / 工具调用 / LangSmith / Langfuse
- 链路:全链路 Trace 记录 → 回放异常 Run → 归因(推理/工具/上下文)→ Bad Case 入回归集
📖 核心知识
Agent 的行为是多步、非确定性的,传统的日志排查难以定位问题,需要专门的可观测体系:
核心观测对象——Trace(追踪链):将一次任务执行展开为树状结构,记录每个节点的输入/输出/耗时/Token 消耗:
| 观测层级 | 记录内容 |
|---|---|
| Session | 用户会话级别的完整交互记录 |
| Agent Run | 一次任务的完整执行链路 |
| LLM 调用 | 每次推理的完整 Prompt、模型输出、Token 数、延迟 |
| 工具调用 | 工具名、入参、返回值、成功/失败状态 |
| 护栏触发 | Guardrails 拦截事件和原因 |
主流工具:
- LangSmith:LangChain 官方平台,支持 trace 可视化、回放(Replay)、评测集管理。
- Langfuse:开源 LLM 可观测平台,支持自部署,提供 trace、评分、成本统计。
- Phoenix(Arize):侧重 LLM 评估和 embedding 可视化分析。
调试方法论:
- 复现:通过 trace 回放找到异常 Run,逐层检查每步的 Prompt 和输出。
- 归因:区分是 LLM 推理错误、工具返回异常、还是上下文缺失导致的失败。
- 固化:将 Bad Case 沉淀为回归测试集,防止同类问题复发。
总结:Agent 调试的钥匙是"全链路 Trace"——把每一步的输入输出完整记录下来,配合 LangSmith/Langfuse 等工具回放分析,将黑盒变成白盒。
🔬 扩展知识
扩展知识
- 【L3】Trace 为什么必须是树状而非平铺日志:Agent 执行天然有层级(Run 内含多次 LLM 调用,每次调用可能触发工具,工具结果又引发新调用),树状结构能还原"谁导致了谁"的因果链;平铺日志只能看到时间序列,归因时要在海量行里人肉拼接。
- 【L3】归因三分类的实际判断方法:看异常发生的那一步——模型输出逻辑错误但输入正确→推理问题(改 Prompt/模型);输入里缺少关键信息→上下文问题(改注入策略/记忆);工具报错或返回脏数据→工具问题(改工具/加校验)。三类根因的修复手段完全不同,归因错则修复白做。
- 【L4】可观测与评测的闭环:Trace 中发现的 Bad Case 应自动进入评测集候选池,标注后成为回归用例——观测系统不只用于救火,还是评测集分布保持鲜活的供给源。
🏭 实战场景
实战案例:Trace 回放定位循环失控(示例复盘)
- 现象:客服 Agent 部分提问 P95 延迟达 47 秒,频繁超时,传统日志只能看到"调用慢",无法定位原因。
- 排查:在全链路 Trace 中筛出超时 Run 回放,发现 Agent 连续调用"订单查询"工具 3~5 次,每次参数略有差异、返回几乎相同——树状视图直接展示了重复调用的因果链,分钟级完成定位。
- 根因:工具描述未说明返回字段与终止语义,LLM 无法判断结果是否满足需求,反复重试。
- 修复:① 重写工具描述,明确返回内容与"无需重复调用"条件;② 增加重复检测(连续两轮同工具且 Observation 相似度 > 0.95 强制进入总结)。P95 延迟降至 9 秒。
- 启示:没有 Trace 时这类问题只能靠猜;有了树状追踪链,多步非确定行为的归因从"小时级人肉拼日志"变成"分钟级回放"。
⚠️ 常见误区
常见误区
- ❌ "普通应用日志(INFO/ERROR)就够调试 Agent 了" → 错。Agent 异常往往不是报错而是"答错了/绕圈了",必须记录每步完整 Prompt 与输出的树状 Trace,普通日志还原不了推理因果链。
- ❌ "只记录最终回答,中间步骤不用存" → 错。最终结果相同不代表过程健康(3 步直达 vs 20 步乱试成本差数倍),且没有中间步骤就无法归因,Bad Case 也无法沉淀为回归用例。
- ❌ "可观测等出问题再建" → 错。Trace 采集必须从第一天接入,否则事故时没有历史数据可回放;观测还是成本控制(钱花在哪一步)和评测集建设的数据源。
🔀 发散问题
- Q:Trace 数据量很大,存储成本怎么控? → 分层采样:全量记录关键字段(耗时、Token、状态),完整 Prompt/输出按采样率或异常优先保留;Bad Case 与高风险会话全量保留。
- Q:非确定性导致"复现不了"怎么办? → 不追求逐字复现,而是复现"路径模式"——用 Trace 回放确认异常发生在哪类输入与哪一步决策上,把该模式抽象成评测用例,比单次复现更有价值。
- Q:LangSmith 和 Langfuse 怎么选? → LangSmith 与 LangChain 生态深度集成、评测功能完整;Langfuse 开源可自部署,适合数据合规要求高的团队;核心需求(trace、回放、评分、成本)两者都覆盖。
【中等】如何控制 Agent 的运行成本?有哪些 Token 优化手段?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 成本优化
💎 关键结论
Agent 的多步推理会成倍放大 Token 消耗,成本控制的核心思路是"能不调就不调、能小模型就不大模型、能缓存就不重算":模型分级路由 + Prompt 缓存 + 预算兜底是性价比最高的三板斧。优化的前提是度量先行——先统计每次任务的 Token 消耗分布(哪一步最贵),再针对性优化。
⚡记忆卡片
- 口诀:能不调就不调,能小就不大,能缓存就不重算
- 关键词:模型分级路由 / Prompt 缓存 / 语义缓存 / 上下文精简 / 迭代预算
- 链路:度量消耗分布 → 路由分流 → 缓存复用 → 上下文精简 → 预算兜底
📖 核心知识
| 手段 | 原理 |
|---|---|
| 模型分级路由 | 简单任务用小模型(如 GPT-4o-mini),复杂任务才调用旗舰模型 |
| Prompt 缓存 | 利用 OpenAI/Anthropic 的 Prompt Caching,对重复前缀(系统提示词、工具定义)计费打折 |
| 结果缓存 | 对相同/相似查询命中缓存(语义缓存,如 GPTCache),跳过 LLM 调用 |
| 上下文精简 | 对话历史摘要化、工具结果按需注入,减少每轮输入 Token |
| 限制迭代次数 | 设置最大轮次和 Token 预算,防止失控循环烧钱 |
| 减少推理链冗余 | 简单任务关闭 CoT,或用轻量模型做路由/分类等子任务 |
度量先行:先通过可观测平台统计每次任务的 Token 消耗分布(哪一步最贵),再针对性优化。
总结:Agent 成本控制的核心思路是"能不调就不调、能小模型就不大模型、能缓存就不重算"——模型路由 + Prompt 缓存 + 预算兜底是性价比最高的三板斧。
🔬 扩展知识
扩展知识
- 【L3】成本失控的两大结构性根因:① 循环失控——无终止约束的重复调用,一次任务烧掉几十轮 Token;② 上下文膨胀——全量历史 + 全量工具定义每轮重复计费。两者都靠架构约束(迭代预算、工具路由、历史压缩)解决,模型降价和缓存只是锦上添花。
- 【L3】模型分级路由的关键在"路由准确性":分流器把复杂任务误判为简单任务会导致质量崩塌,因此路由规则要从评测集标定(哪类任务小模型能胜任),并对分流结果做质量抽检,而不是拍脑袋定规则。
- 【L4】缓存策略的正确性边界:Prompt 缓存(重复前缀打折)无正确性风险,可全量开启;语义缓存(相似查询复用答案)有时效性与个性化风险,只适合事实稳定、无用户差异的查询,命中策略要保守。
🔀 发散问题
- Q:Token 消耗分布通常长什么样? → 常见大头是重复注入的历史上下文与工具定义(每轮都算),以及少数超长工具结果;这正是"上下文精简 + Prompt 缓存"优先于"换便宜模型"的原因。
- Q:降本会不会伤质量? → 会,所以必须配评测门禁:任何降本改造(路由、压缩、关 CoT)都在评测集上验证不劣于基线再上线,降本与质量要一起度量。
- Q:成本指标该进评估体系吗? → 应该。延迟与成本本就是 Agent 评估六维度之一,P95 延迟与单任务 Token 成本应和完成率一起看,否则"用 10 倍成本换 2% 提升"的优化也会被误判为好优化。
【中等】Agent 执行代码等高风险操作时,沙箱(Sandbox)安全如何设计?⭐⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 沙箱安全
💎 关键结论
沙箱的核心原则是"默认不可信 + 隔离执行 + 资源限额"——把 Agent 当作不可信的第三方代码对待,宁可限制能力也不开放边界。设计覆盖五个维度:执行隔离(容器/microVM/Wasm)、文件系统限制(只准工作目录、敏感路径只读)、网络限制(默认禁外网、白名单放行)、资源限额(CPU/内存/时间/输出)、权限最小化(非特权用户、不挂宿主凭据)。
⚡记忆卡片
- 口诀:默认不可信,隔离加限额,凭据不进门
- 关键词:执行隔离 / 文件系统 / 网络白名单 / 资源限额 / 权限最小化
- 链路:代码进沙箱 → 容器/microVM 隔离 → 文件网络资源三重限制 → 非特权执行 → 结果出沙箱
📖 核心知识
Agent 具备代码执行、文件操作等能力后,必须用沙箱隔离防止恶意或意外行为破坏宿主环境。
核心威胁:
- 执行恶意代码(注入攻击诱导 Agent 运行危险命令)。
- 越权访问(读取敏感文件、访问内网资源)。
- 资源耗尽(无限循环、海量请求)。
沙箱设计要点:
| 维度 | 措施 |
|---|---|
| 执行隔离 | 代码在容器(Docker)、microVM(如 gVisor/Firecracker)或 WebAssembly 中运行,与宿主隔离 |
| 文件系统 | 限制只能访问指定的工作目录,只读挂载敏感路径 |
| 网络限制 | 默认禁止外网访问,或白名单制放行特定域名 |
| 资源限额 | CPU、内存、执行时间、输出大小设置上限 |
| 权限最小化 | 沙箱内以非特权用户运行,不提供 root、不挂载宿主任何凭据 |
典型实现:E2B(云端代码沙箱)、Docker + 资源限制、浏览器 Agent 用隔离的无头浏览器会话。
总结:沙箱的核心原则是"默认不可信 + 隔离执行 + 资源限额"——把 Agent 当作不可信的第三方代码对待,宁可限制能力也不开放边界。
🔬 扩展知识
扩展知识
- 【L3】隔离强度的梯度选择:容器(Docker)共享内核、隔离弱但开销小;microVM(gVisor/Firecracker)虚拟化内核、隔离强,适合执行不可信代码;Wasm 沙箱启动最快、适合轻量计算。执行内容越不可信(如运行用户上传/网络抓取的代码),隔离等级要越高。
- 【L3】为什么"不挂载宿主凭据"是铁律:沙箱内代码一旦被注入攻击控制,凭据就是横向移动的钥匙;沙箱需要访问外部服务时应通过代理层按次授权,而不是常驻凭据。
- 【L4】沙箱与提示词注入的联动防御:注入攻击可能诱导 Agent 生成危险命令,沙箱是最后一道物理边界——即使模型被骗,爆炸半径也被限制在沙箱内;因此输入护栏(防注入)与沙箱(限损害)必须同时建设,互为纵深。
🔀 发散问题
- Q:浏览器 Agent 的沙箱有什么不同? → 核心是隔离的无头浏览器会话(独立 profile、无宿主 Cookie),并限制可访问域名,防止跨站点数据泄露与 CSRF 类风险。
- Q:资源限额中哪项最容易被忽略? → 输出大小与执行时间——无限循环好防(超时),但海量输出灌爆日志/上下文、高频请求打垮下游 API 这类"非崩溃式耗尽"常被漏掉。
- Q:沙箱和工具权限控制是什么关系? → 权限控制管"能不能调这个工具",沙箱管"调了以后能造成多大破坏";对代码执行类工具两者都要上,详见本文档『如何设计 AI Agent 的工具权限控制?』。
【中等】多 Agent 系统中如何管理 Agent 间的上下文传递?⭐⭐
🎯 目标等级:L2 | ⏱ 建议用时:10 min | 🏷 标签:AI Agent / 多 Agent
💎 关键结论
多 Agent 上下文传递的核心矛盾:传递太少丢信息,传递太多污染上下文且成本飙升。解法是"传结论不传过程、传引用不传全文":默认"摘要 + 工件"组合(关键结论进摘要,大体积数据进共享存储按需读取),消息定义统一 Schema,主 Agent 只收子 Agent 的结果摘要不收完整推理过程。
⚡记忆卡片
- 口诀:传结论不传过程,传引用不传全文
- 关键词:全量传递 / 摘要传递 / 工件传递 / 黑板模式 / Schema
- 链路:上游产出 → 结论入摘要 + 大体积入共享存储 → 传引用与 Schema → 下游按需读取
📖 核心知识
多 Agent 协作时,上下文传递是效率和正确性的关键矛盾:传递太少导致信息丢失,传递太多导致上下文污染和成本飙升。
常见模式:
| 模式 | 原理 | 优劣 |
|---|---|---|
| 全量传递 | 将完整对话历史传给下一个 Agent | 信息完整,但上下文膨胀快、成本高 |
| 摘要传递 | 上游 Agent 生成结构化摘要(结论 + 关键事实),下游只接收摘要 | 上下文精简,但可能丢失细节 |
| 工件传递 | 结果写入共享存储(文件/数据库),仅传递引用(如 A2A Artifact) | 上下文最精简,适合大体积产出物 |
| 黑板模式 | 所有 Agent 读写共享的"黑板"(Blackboard)状态空间 | 解耦彻底,需设计并发读写规则 |
实践建议:
- 默认用"摘要 + 工件"组合:关键结论进摘要,大体积数据进共享存储按需读取。
- 为 Agent 间消息定义统一的 Schema(如 A2A 的 Message/Artifact),避免自由文本传递造成信息失真。
- 主 Agent 只接收子 Agent 的结果摘要,不接收其完整推理过程(上下文隔离)。
总结:多 Agent 上下文管理的核心是"传结论不传过程、传引用不传全文"——用结构化交接替代全量历史,既控成本又保信息密度。
🔬 扩展知识
扩展知识
- 【L3】摘要传递的失真风险与对策:摘要由 LLM 生成,可能丢细节或引入偏差;对策是结构化摘要(固定字段:结论、关键事实、置信度、未完成项)而非自由文本,下游对关键决策可凭工件引用回读原文核验。
- 【L3】黑板模式的并发治理:多 Agent 读写共享状态需要约定读写顺序与冲突解决(如版本号、按 Agent 分区写入),否则会出现覆盖写与脏读;适合协作紧密、状态共享需求强的场景,松散协作还是消息传递更简单。
- 【L4】上下文传递与权限的交叉:传递内容本身就是数据流动,跨团队 Agent 间传摘要也要过权限审查(财务数据不能进无权限 Agent 的上下文);A2A 场景下鉴权在各 Agent 侧执行,编排层不代理。
🔀 发散问题
- Q:四种模式怎么选? → 看产出物体积与下游需求:小结论用摘要、大产出用工件传递、强状态共享用黑板、只有调试或短链路才考虑全量传递。
- Q:为什么主 Agent 不该看子 Agent 的完整推理过程? → 推理过程体积大且含大量无关探索,注入主 Agent 会稀释其注意力、推高成本;子 Agent 的过程细节留在自己的 Trace 里供调试即可。
- Q:A2A 的 Artifact 属于哪种模式? → 工件传递的标准化形态——结构化输出物写入交付接口、下游按 Schema 消费,正是"传引用不传全文"的协议级实现。