- AI Agent 完整详解,覆盖范式、工具调用、规划、记忆、多 Agent 与工程落地
- 对应面试问答速查见 AI Agent(面试版)
- 相关主题:大模型基础、大模型训练与微调、RAG、LangChain 与 LangGraph
- 当前覆盖:Agent 概念、ReAct、Function Calling/Tool Use、工具调用细节、推理范式、规划、记忆系统、多 Agent 协作、MCP、框架对比、工程落地(loop/streaming/HITL/可观测/沙箱/持久化/死循环/token 预算/成本)、轨迹评估、可靠性、评估、落地难点、安全(prompt injection/越权)、coding agent、browser agent、Agent 与 Workflow 边界
什么是 AI Agent?它和单次 LLM 调用、Workflow 有什么区别?
定义
AI Agent 是以 LLM 为「大脑」的自主系统:LLM 不仅能生成文本,还能规划任务、调用工具、观察结果、迭代决策,在环境中自主完成目标。
核心四要素:感知(输入)→ 规划(Plan)→ 行动(调用工具)→ 记忆(上下文/状态)。
vs 单次 LLM 调用
- 单次调用:一问一答,无工具、无状态、无多步。
- Agent:多步循环,可调工具、可自我修正,直到完成目标。
vs Workflow
| 维度 | Workflow | Agent |
|---|---|---|
| 流程 | 预先编排的固定步骤(DAG) | LLM 动态决定下一步 |
| 灵活性 | 低,可预测 | 高,可应对未知 |
| 可控性 | 强 | 弱,可能跑偏 |
| 适用 | 明确、可复用流程 | 开放、需自主决策任务 |
- 实践:能 Workflow 固定就用 Workflow,确需动态决策才上 Agent(更可靠)。
定义「LLM 为大脑、可规划+调工具+记忆的自主系统」,并说清「Workflow 固定编排 vs Agent 动态决策」的选型判断。
ReAct 范式是什么?Thought/Action/Observation 各是什么?
ReAct
Reasoning + Acting:把「推理(Reason)」与「行动(Act)」交替进行,让 LLM 边想边做。
三要素
Thought: 我需要先查今天的天气,再决定穿什么
Action: search_weather(city="北京")
Observation: 北京今天 18°C,多云
Thought: 天气偏凉,建议穿外套
Final Answer: 建议穿一件薄外套- Thought:当前该怎么推理/计划(模型内部思考)。
- Action:调用哪个工具、传什么参数(结构化输出)。
- Observation:工具返回结果,作为下一步输入。
- 循环直到 Final Answer。
意义
- 把推理与外部工具结合,让模型能多步求解需要外部信息/计算的复杂任务。
- 是大多数 Agent 框架(LangChain Agent、AutoGPT)的底层范式。
写一个 ReAct 循环小例子,讲清「Thought→Action→Observation 循环直到 Final Answer」,点出「推理与行动交替」。
Function Calling / Tool Use 的原理是什么?如何实现?
原理
LLM 本身不能执行动作,Function Calling 让模型输出「要调哪个函数 + 参数」的结构化指令,由宿主程序真正执行,再把结果回传给模型。
实现步骤
- 定义工具 schema:用 JSON Schema 描述函数名、参数、说明。
- 模型生成调用指令:模型输出
{name: "get_weather", arguments: {city: "北京"}}。 - 宿主执行:程序按指令调用真实函数/API。
- 回传结果:结果拼进上下文,模型继续生成。
- 循环直至完成。
{"name": "get_weather", "arguments": {"city": "北京"}}关键点
- 工具描述要清晰(名称、用途、参数说明),直接影响模型能否正确选工具。
- 需处理调用失败、参数错误、重试。
- 支持多工具时,模型做「工具选择 + 参数抽取」。
讲清「模型只输出结构化调用指令,真正执行在宿主」,并强调「工具 schema 描述质量决定调用准确率」。
Agent 的规划能力如何实现?Plan-and-Execute 和反思有什么区别?
规划能力
让 Agent 对复杂任务拆解步骤、按序执行、动态调整,而不是一步到位。
主要方法
| 方法 | 思路 |
|---|---|
| Plan-and-Execute | 先规划完整步骤清单,再逐步执行,可中途改计划 |
| ReAct | 边推理边行动,逐步决策 |
| 反思(Reflexion) | 失败后回顾轨迹、总结教训再重试 |
| 自我纠正 | 生成后自我检查、修正错误 |
| 子目标分解 | 大任务拆成子任务逐个完成 |
Plan-and-Execute vs 反思
- Plan-and-Execute:事前规划,先出计划再执行,适合步骤明确的任务。
- 反思(Reflexion):事后复盘,失败时分析原因、改策略重试,适合需迭代的任务。
- 两者常组合:先规划,执行失败时反思调整。
区分「事前规划(Plan-and-Execute)」与「事后复盘(Reflexion)」,并说明常组合使用。
Agent 的记忆如何设计?短期记忆和长期记忆有什么区别?
记忆分类
| 类型 | 存储 | 用途 | 特点 |
|---|---|---|---|
| 短期记忆 | 上下文窗口 | 当前会话的多轮对话 | 快,受窗口限制,会话结束即失 |
| 长期记忆 | 向量库/数据库/摘要 | 跨会话持久信息 | 持久,需检索/管理 |
短期记忆设计
- 就是对话历史放进上下文;受上下文窗口限制,需截断/摘要/滑动窗口管理。
- 摘要式:把早期对话压缩成摘要,节省 token。
长期记忆设计
- 向量记忆:把重要信息 embedding 存入向量库,按需检索(类似 RAG 但存的是「经历」)。
- 结构化记忆:用户画像、偏好存数据库/知识图谱。
- 反思记忆:定期把会话提炼成长期要点(如 Generative Agents 的 memory stream)。
工程要点
- 记忆的写入时机、检索策略、遗忘机制都要设计;避免无关记忆污染上下文。
分清「短期=上下文(要截断/摘要)、长期=向量/结构化(要检索)」,并提「记忆写入、检索、遗忘」三设计点。
多 Agent 协作有哪些模式?常见框架有哪些?
协作模式
| 模式 | 结构 | 特点 |
|---|---|---|
| 顺序流水线 | A → B → C 接力 | 简单清晰 |
| 主管-下属(Supervisor) | 中央 Agent 分发任务 | 集中控制 |
| 辩论/投票 | 多 Agent 给方案再裁决 | 提升质量/容错 |
| 分层 | 规划层 + 执行层 | 复杂任务分解 |
| 群聊(AutoGen) | 多 Agent 自由对话协作 | 灵活 |
常见框架
- LangGraph:基于图的状态机,可编排多 Agent 与流程。
- AutoGen(微软):多 Agent 对话式协作。
- CrewAI:角色化团队(Role-based)协作。
- MetaGPT:模拟软件公司 SOP 的多 Agent。
何时用
- 单 Agent 能做就单 Agent;任务可拆解、需不同专长时才上多 Agent(成本与复杂度更高)。
报出「顺序/主管/辩论/分层」几种模式与 LangGraph/AutoGen/CrewAI,并强调「能单就不多」的务实判断。
什么是 MCP 协议?它解决什么问题?
定义
Model Context Protocol(MCP,Anthropic 提出):LLM/Agent 与外部工具、数据源之间的标准化协议,类似「AI 世界的 USB-C 接口」。
解决什么问题
- 此前每个模型要接入每个工具都需定制开发(M×N 集成)。
- MCP 统一了「工具/资源/提示」的调用规范:一个 MCP Server 可被任何支持 MCP 的客户端(Claude、IDE 等)复用(M+N 集成)。
组成
- MCP Server:暴露工具/资源的服务端。
- MCP Client:Agent/应用侧,发现并调用 server。
- 通过 JSON-RPC 通信,支持工具、资源、提示三类能力。
意义
- 工具生态互通、降低集成成本,是 Agent 工具标准化的方向。
用「USB-C 接口」类比讲清 MCP,点出「M×N 集成变 M+N」的核心价值,并说出 Server/Client/JSON-RPC 结构。
LangChain、LangGraph、AutoGen、CrewAI 这些框架有什么区别?
对比
| 框架 | 定位 | 特点 |
|---|---|---|
| LangChain | 组件库 | 提供 prompt/chain/tool/memory 等抽象,快速搭建 |
| LangGraph | 图状态机 | 用「节点+边」精确编排多步/多 Agent 流程,可控性强 |
| AutoGen | 多 Agent 对话 | 多 Agent 自由对话协作(微软) |
| CrewAI | 角色化团队 | Role/Goal 定义 Agent 团队协作 |
| LlamaIndex | 数据/RAG 框架 | 侧重检索与数据连接 |
选型
- 简单链式/原型 → LangChain。
- 复杂可控流程、需精确状态控制 → LangGraph。
- 多 Agent 协作 → AutoGen/CrewAI。
- 数据检索优先 → LlamaIndex。
一句话定位每个框架(LangChain 组件库、LangGraph 图编排、AutoGen 多 Agent 对话、CrewAI 角色团队),并按场景选型。
如何保证 Agent 的可靠性?如何避免死循环和失控?
常见问题
死循环(重复调同一工具)、跑偏、token 爆炸、错误累积。
保障手段
- 循环检测:限制最大步数、检测重复 Action 及时终止。
- 超时与预算:设单步/总超时、token 预算、成本上限。
- 错误重试与降级:工具失败重试 N 次后降级或转人工。
- 人工确认(Human-in-the-loop):关键操作(支付/删除)需人工批准。
- 结构化约束:工具调用用严格 schema、约束输出格式。
- 可观测与日志:记录轨迹,事后审计与调优。
- 沙箱与权限:工具限权、隔离执行环境。
给「限步数 + 超时/预算 + 重复检测 + 人工确认 + 日志审计」这套可靠性清单,体现工程化思维。
如何评估 Agent 的效果?
评估维度
- 任务成功率:端到端完成率(核心指标)。
- 轨迹质量:中间步骤是否合理、是否高效(步数、token 消耗)。
- 工具调用准确率:选对工具、参数正确。
- 鲁棒性:干扰/异常下的表现。
- 成本:token 与延迟预算。
评估方法
- 基准测试:如 WebArena、GAIA、AgentBench、SWE-bench(软件工程 Agent)。
- LLM-as-judge:用强模型评估轨迹/答案质量。
- 人工评估:复杂任务需人工判分。
- 分步评估:拆「规划质量、工具调用、最终结果」分别打点。
报出「任务成功率 + 轨迹质量 + 工具调用准确率」维度与 WebArena/GAIA/SWE-bench 代表基准,强调分步评估。
Agent 落地有哪些难点?为什么说 Agent 落地难?
难点
- 幻觉放大:多步推理中幻觉会逐级累积,一步错步步错。
- 工具不可靠:工具结果格式/语义不稳定,模型难以处理。
- 长程任务失败率高:步数越多,成功率指数下降。
- 成本与延迟:多步 + 长上下文,token 消耗大、慢。
- 可控性/安全:难保证行为边界,易出意外操作。
- 评估困难:开放任务难以自动评估,迭代慢。
为什么难
- 本质是「不确定的模型 + 不确定的环境 + 多步累积误差」三者叠加,可靠性难以保证。
- 生产常退化为「受限 Agent / 强约束 Workflow」来换取可控性。
归因「多步误差累积 + 工具不确定 + 成本延迟」三大根因,并点出「生产常退化为受限 Agent/Workflow」的现实判断。
Agent 有哪些安全风险?如何防护?
安全风险
- 提示注入(Prompt Injection):外部内容(网页/文档/工具返回)夹带恶意指令,诱导 Agent 执行。
- 越权操作:Agent 调用工具超出权限(删数据、转账)。
- 数据泄露:把敏感数据传给外部工具/模型。
- 工具滥用:被诱导调用危险工具。
防护手段
- 最小权限:工具按角色最小授权,不暴露危险能力。
- 人工确认:高危操作(支付/删除/发消息)需批准。
- 输入隔离:区分「指令」与「数据」,外部数据当数据不当指令。
- 输出过滤/沙箱:隔离执行、审计日志。
- 敏感数据脱敏:传外部工具前脱敏。
- 提示注入检测:检测并隔离外部可疑指令。
突出「提示注入」这个 Agent 特有风险,并给「最小权限 + 人工确认 + 数据/指令隔离 + 审计」防护体系。
如何设计工具(tool)的 schema?有哪些要点?
tool schema 设计
tool schema 用 JSON Schema 描述模型「看到的接口」:name(函数名)、description(做什么/何时用)、parameters(参数 schema)。
{
"name": "get_weather",
"description": "查询指定城市的实时天气,返回温度与天气状况",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名,如 '北京'"}},
"required": ["city"]
}
}description 写作要点
| 要点 | 说明 |
|---|---|
| 写清「何时用」 | 说明触发场景与边界,避免模型乱选 |
| 动词开头、具体 | 「查询」「创建」「删除」而非「处理」 |
| 给参数示例 | 参数 description 写格式与取值(含 enum) |
| 说明返回格式 | 让模型预期结果形态 |
| 避免歧义/重叠 | 多工具间职责要区分开 |
- 差:
description: "处理数据";好:"把 CSV 按某列聚合求和,返回 JSON 结果"。
记住「schema 是模型看到的唯一接口」,description 要写清「何时用 + 参数含义 + 返回格式」,并举例说明好/坏 description 对调用准确率的影响。
parallel function calling 是什么?如何实现?
定义
模型在一次响应中返回多个 tool call,宿主并行执行后一次性回传结果,减少多轮往返。
好处与机制
- 好处:把「查北京天气 → 查上海天气」这类无依赖的多个调用合并,降低延迟与 token。
- 机制:模型输出一个 tool_calls 数组;OpenAI 可用
parallel_tool_calls参数开关,Claude 默认支持。
用户: 查北京和上海的天气
模型: [get_weather(北京), get_weather(上海)] ← 一次返回两个调用注意
- 只有无依赖的工具才能并行;有依赖(A 的结果是 B 的输入)必须串行。
- 并行后需按
tool_call_id把结果一一对应回传。
答「一次响应多 tool call、并行执行省轮次」,并强调「无依赖才可并行、有依赖必须串行」,点出用 tool_call_id 对应回传。
工具调用失败如何处理?
失败类型
| 类型 | 示例 |
|---|---|
| 参数错误 | 缺参数、类型错、枚举越界 |
| 工具不存在 | 模型幻觉出未定义函数名 |
| 运行时异常 | 超时、网络错误、业务报错 |
| 返回格式错 | 工具返回非预期结构 |
处理流程
- 捕获错误并结构化回传:把 error message(含错误码/原因)作为 tool 结果喂回模型。
- 模型自纠重试:模型根据错误信息重新生成参数,通常能修正。
- 限次重试 + 降级:重试 N 次(如 3 次)仍失败则换工具/简化目标/转人工。
- 兜底提示:给模型明确失败信息而非吞掉错误。
- 关键:错误信息要回传,让模型「看到」失败原因才有机会修正。
讲清「错误要结构化回传 + 模型自纠 + 限次重试 + 降级转人工」这条链,并举例参数错误靠回传错误信息让模型重写。
工具结果如何回传给模型?有哪些方式?
回传结构
工具执行后,宿主把结果拼进消息列表,用 tool role 回传,并通过 tool_call_id 与模型发起的调用一一对应。
{"role": "tool", "tool_call_id": "call_123", "content": "{\"temp\": 18, \"weather\": \"多云\"}"}要点
- 必须带 tool_call_id:让模型知道这个结果回答的是哪次调用。
- 结果序列化:通常转 JSON 字符串;大结果需截断/摘要防止爆上下文。
- 标注来源/状态:可附
status: success/error与耗时元信息。 - 模型拿到结果后继续生成下一步(可能再调工具或给 Final Answer)。
答出「role=tool + tool_call_id 对应 + 内容序列化」,并强调「大结果要截断/压缩、失败要带错误状态回传」。
function calling 和 tool use 有什么区别?
区别
| 维度 | Function Calling | 通用 Tool Use |
|---|---|---|
| 提出方 | OpenAI 早期概念 | Anthropic/通用表述 |
| 范围 | 侧重「调用预定义函数」 | 更广:工具/资源/计算机操作等 |
| 本质 | 相同:模型输出结构化调用指令 | 相同 |
| 生态 | OpenAI 系 API 名词 | MCP、Claude tool use 等 |
结论
- 二者本质一致:都是「模型不直接执行,输出
{name, arguments}由宿主执行」。 - 区别主要在术语与生态:Function Calling 偏「函数」,Tool Use 泛指任意工具/能力(浏览器、代码、API)。
- 面试中可互换使用,但要点出「结构化指令 + 宿主执行」的共同内核。
明确「本质相同、术语不同」,Function Calling 偏函数调用、Tool Use 泛指工具能力,避免被术语带偏。
CoT 和 ReAct 有什么区别?
定义
- CoT(Chain-of-Thought):让模型逐步推理,把思考过程写出来,但不调用外部工具,纯「想」。
- ReAct:Reasoning + Acting,推理与「调用工具 + 观察结果」交替,边想边做。
对比
| 维度 | CoT | ReAct |
|---|---|---|
| 外部交互 | 无 | 有(调工具、观察) |
| 信息来源 | 仅模型内部知识 | 可获取外部实时/准确信息 |
| 适用 | 纯推理(数学/逻辑) | 需检索/计算/操作的任务 |
| 关系 | 可看作 ReAct 的「想」部分 | = CoT + Action/Observation |
联系
- ReAct 把 CoT 的「推理链」扩展为「推理-行动-观察」循环,解决 CoT 无法获取外部信息、易幻觉的问题。
一句话「CoT 只推理不行动,ReAct 推理+行动交替」,再补「ReAct = CoT + Action/Observation,补足 CoT 无外部信息的短板」。
什么是 ToT(Tree of Thoughts)?
定义
Tree of Thoughts(思维树):把推理过程建模成树状搜索——每一步生成多个候选「想法」,评估后选择/回溯,而不是 CoT 的单条链。
过程
- 分解:把问题拆成若干中间步骤。
- 生成候选:每步让模型给出多个候选想法。
- 评估:用打分模型/投票给候选打分。
- 搜索:用 BFS/DFS 扩展最有希望的节点,可回溯换分支。
vs CoT
| 维度 | CoT | ToT |
|---|---|---|
| 结构 | 单链 | 树(多分支) |
| 纠错 | 一错到底 | 可回溯探索 |
| 成本 | 低 | 高(多次采样+评估) |
- 适合数学、规划、搜索等可回溯任务;成本高,生产中少用。
讲清「树状搜索 + 生成候选 + 评估 + 回溯」,并对比 CoT「单链一错到底、ToT 可回溯但成本高」。
什么是 self-consistency?
定义
Self-Consistency(自一致性):对同一问题采样多条推理路径,取「多数投票」的结果作为最终答案,用于降低单次采样的随机错误。
原理
- 单次采样可能因随机性出错;但「正确答案往往会被多数采样命中」,投票可放大正确信号。
- 常与 CoT 搭配:先让模型生成多条思维链,再对最终答案投票。
参数与注意
- 采样次数:典型 5/10/40 次,越多越稳但成本线性上升。
- 只适合有唯一确定答案的任务(数学/逻辑/代码),开放式问答不适用。
- 与 ToT 区别:Self-Consistency 是「多链投票」,不主动回溯搜索。
答「多样本采样 + 多数投票」降低随机错误,点出「采样次数与成本线性相关、只适合确定答案任务」。
Reflexion 的完整流程是什么?
四阶段
1. Actor:生成一段轨迹(行动与观察)
2. Evaluator:评估结果(测试/打分),失败则进入反思
3. Self-Reflection:模型用自然语言总结「哪里错、怎么改」→ 得到 verbal reinforcement
4. Memory:把反思存入 episodic memory,下次重试时带上关键点
- 反思是语言形式的强化信号,而不是梯度更新——把「教训」写进下一轮的提示。
- 与 ReAct 关系:在 ReAct 循环之上,失败后多一层事后复盘。
- 反思内容模板:
上一次失败因为 X,改进策略:下次 Y。
效果
- 多次迭代后成功率逐步提升,适合代码生成、决策类任务。
完整背出「Actor→Evaluator→Self-Reflection→Memory」四步,并强调「反思是语言强化信号、存进记忆供下轮使用」。
计划如何修正?plan 修正有哪些策略?
初始规划
- 规划器(Planner)把任务拆成步骤列表:每步有描述、预期结果、依赖。
执行与修正
loop:
取下一个未完成步骤 → 执行 → 观察结果
if 结果与计划不符: 调用 replanner 重新生成剩余步骤
if 出现新信息/新子任务: 插入或改写步骤- replan 机制:每步执行后把「已完成 + 观察 + 原始计划」喂给模型,让它决定「继续/修改/终止」。
- 状态跟踪:步骤标记
pending/running/done/failed,失败步骤触发重试或改写。
工程要点
- 计划存成结构化对象(含依赖、状态),便于增量更新而非整体重排。
- LangGraph 中 Planner + Replanner 用两个节点 + 条件边实现。
讲出「执行一步 → 观察 → replanner 修正剩余步骤」的闭环,并强调计划要结构化存状态、增量更新。
子任务分解中的依赖关系如何处理?
分解方法
- 目标分解:大目标 → 子目标 → 可执行步骤(自上而下)。
- 任务树/DAG:把子任务组织成有向无环图,表达执行顺序。
依赖类型
| 依赖 | 含义 | 处理 |
|---|---|---|
| 顺序依赖 | B 需要 A 的结果 | 拓扑排序串行 |
| 并行依赖 | 互不依赖 | 并行执行 |
| 条件依赖 | 视结果决定 | 条件分支/重规划 |
管理手段
- 用任务列表(结构化为
{id, desc, deps, status})跟踪,执行前检查前置是否完成。 - 拓扑排序决定执行顺序;失败传播时只重跑受影响分支。
- 让 LLM 输出结构化子任务(带依赖字段),再由执行器调度。
答「任务树/DAG + 依赖字段 + 拓扑排序」,并能区分顺序/并行/条件三类依赖,讲清失败只重跑受影响分支。
什么是 self-correction?如何实现?
定义
Self-Correction:让模型检查自己的输出、发现并修正错误,形成「生成 → 批评 → 修正」的反馈回路。
实现方式
- 自我检查(Self-Refine):生成后用另一个 prompt 让模型 critic 自己的答案并改进。
- 外部信号驱动:用真实反馈(代码运行结果、测试、工具报错)驱动修正,比纯自评更可靠。
- 约束/校验:结构化校验(JSON 合法性)、重采样修正。
局限
- 纯「自我感觉」的检查可能失效(模型对自己错误盲视);最好有外部验证信号(执行结果、测试、检索比对)。
- 可配合 Reflexion:多轮失败后的反思是更强的 self-correction。
讲清「生成-批评-修正」回路,并主动点出局限——纯自评不可靠,需外部信号(测试/执行)驱动才有效。
短期记忆的窗口如何管理?
三种手段
| 手段 | 做法 | 特点 |
|---|---|---|
| 滑动窗口 | 只保留最近 N 轮对话 | 简单,丢早期信息 |
| 摘要 | 把早期对话压缩成摘要 | 省 token,可能丢细节 |
| 截断 | 超 token 上限硬截断 | 粗暴,可能切断关键信息 |
组合实践
- 滑动窗口 + 摘要:超出窗口的早期对话先摘要再丢弃,兼顾信息与成本。
- 参数:窗口大小(如最近 10~20 轮)、摘要触发阈值(如超 8k token 时压缩)。
- 保留「系统提示 + 关键约束 + 最近对话」三段式,确保目标不漂移。
答「滑动窗口/摘要/截断三手段 + 组合使用」,给出「窗口大小、摘要阈值」等可调参数,强调保留系统提示与关键约束。
长期记忆的写入、检索和遗忘如何设计?
写入(何时存)
- 事件驱动:重要决策、用户偏好、纠错教训(Reflexion 的反思)。
- 定期:会话结束把要点蒸馏入库;避免全量塞入噪声。
检索(何时取)
- 按相关性 + 时效 + 重要性打分排序,取 top-k 注入上下文。
- 参考 Generative Agents 三权重:
recency(新近)· importance(重要)· relevance(相关)。
遗忘(何时删)
- TTL 过期:超时删除或降权。
- 容量上限:超过上限淘汰低分记忆。
- 巩固/衰减:重要记忆反复调用强化,久未使用衰减。
完整答「写入时机 + 检索打分(recency/importance/relevance)+ 遗忘(TTL/淘汰/衰减)」三件套,引用 Generative Agents。
episodic memory 和 semantic memory 有什么区别?
区别
| 维度 | Episodic(情景记忆) | Semantic(语义记忆) |
|---|---|---|
| 内容 | 具体事件/经历(时间地点) | 抽象事实/概念/知识 |
| 例子 | 「昨天用户让我改过 X」 | 「用户偏好 JSON 输出」 |
| 结构 | 时间序列、带上下文 | 结构化、可泛化 |
| 用途 | 回顾历史决策、反思 | 用户画像、领域知识 |
在 Agent 中
- Episodic:会话轨迹、反思教训(memory stream 的事件流)。
- Semantic:提炼后的稳定知识(用户画像、领域规则)。
- 记忆系统常是两层:原始事件流 → 蒸馏成语义记忆。
用「事件 vs 知识」一句话区分,并映射到 Agent:episodic=轨迹/教训、semantic=画像/规则,说明两层协同。
什么是记忆蒸馏?
定义
记忆蒸馏:会话结束后,用 LLM 把冗长的原始对话提炼成结构化、可复用的长期记忆,丢弃噪声。
做法
- 取原始对话 → 让 LLM 抽取:关键事实、用户偏好、结论、待办。
- 结构化输出:
{entity, attribute, value, confidence}或自然语言要点。 - 写入长期记忆库(向量库/数据库),供后续检索。
时机与好处
- 时机:会话结束、定期批处理、事件触发。
- 好处:省 token(不再整段重放)、信息可检索复用、形成稳定画像。
讲清「用 LLM 把对话抽成结构化要点入库」,强调「降噪 + 省 token + 可检索」,并能给出结构化字段示例。
Agent 记忆和 RAG 有什么区别?
区别
| 维度 | RAG | Agent 记忆 |
|---|---|---|
| 数据来源 | 外部静态文档/知识库 | Agent 自身经历/用户交互 |
| 更新方式 | 文档更新(外部写入) | Agent 自动写入/蒸馏 |
| 内容 | 权威知识、参考资料 | 个性化、时效性状态 |
| 用途 | 回答需要外部知识的问题 | 维持上下文、记住偏好 |
联系
- 实现技术相似:都靠 embedding + 向量库 + 检索。
- Agent 记忆常被称作「给 Agent 自己用的 RAG」,检索对象从文档变成「记忆条目」。
答「数据来源不同(外部文档 vs 自身经历)+ 更新方式不同(外部写 vs 自动蒸馏)」,并点出「底层技术相通(向量检索)」。
supervisor 模式是如何工作的?
定义
Supervisor 模式:设置一个中央 supervisor agent,负责把任务分发给多个 worker agent,汇总结果,是「主管-下属」结构。
控制流
supervisor 判断 → 调用 worker_A → 收回结果 → 判断 → 调用 worker_B → ... → 汇总输出- supervisor 决定调用哪个 worker、何时结束,worker 只做具体子任务。
- LangGraph 实现:supervisor 节点 + 各 worker 节点 + 条件边(按 supervisor 输出路由)。
优缺点
| 优点 | 缺点 |
|---|---|
| 集中控制、易理解 | supervisor 成单点瓶颈 |
| 任务分发清晰 | 多一层调度开销 |
讲清「中央 supervisor 分发 + 条件路由 + 汇总」,并能说 LangGraph 的节点+条件边实现,点出单点瓶颈缺点。
hierarchical(分层)多 Agent 如何设计?
定义
Hierarchical Agent(分层 Agent):按层级组织,上层负责规划与调度,下层负责执行具体子任务,可多层嵌套。
结构
- 规划层:把高层目标拆成子任务、分配给执行层。
- 执行层:完成子任务并回报结果。
- 可继续细分:规划层下面再有子规划层(树状)。
与 supervisor 的关系
| 维度 | Supervisor | Hierarchical |
|---|---|---|
| 层次 | 单层主管+员工 | 可多层嵌套 |
| 控制 | 集中 | 分层分权 |
- supervisor 可看作 hierarchical 的单层特例;hierarchical 更强调整体「树状分权」。
答「规划层 + 执行层多层嵌套」,并说清「supervisor 是单层特例、hierarchical 是树状分权」,适用复杂任务。
多 Agent 之间的通信协议有哪些?
消息结构
- 通信本质是结构化消息:
{sender, receiver, type, content, metadata}。
协议类型
| 协议 | 说明 |
|---|---|
| 黑板(共享状态) | 多 agent 读写共享状态/消息总线,解耦 |
| 直接对话 | agent 间 point-to-point 消息(AutoGen 群聊) |
| 消息队列 | 异步解耦,事件驱动 |
| A2A(Agent2Agent) | Google 提出的 agent 互操作开放协议 |
| MCP | 工具/资源标准化协议(偏 agent↔工具) |
选择
- 少 agent 强协作 → 共享状态/直接对话;跨系统互操作 → A2A;接工具 → MCP。
报出「黑板/直接对话/消息队列/A2A/MCP」,区分「agent↔agent(A2A)与 agent↔工具(MCP)」,点出共享状态最常用。
什么是 debate(辩论)型多 Agent?reflection 型呢?
定义
Debate 型多 Agent:多个 agent 各自生成答案,然后互相批评/辩论,最后由裁判(judge)汇总,用「多视角碰撞」提升质量、降低幻觉。
流程
生成:Agent1、Agent2、... 各给方案
辩论:互相 critique 对方的问题
裁决:Judge 综合后给出最终答案优点/代价
| 优点 | 代价 |
|---|---|
| 降低单一模型偏见/幻觉 | 成本数倍(多 agent + 多轮) |
| 数学/推理/事实性提升 | 延迟高 |
- 常见形式:LLM-debate、多模型投票、reflexion 的多人版。
讲清「多 agent 生成 + 互相批判 + 裁判裁决」,点出「降低幻觉但成本数倍」,并联系 self-consistency 的多人版。
什么是 swarm(群集)多 Agent?
定义
Swarm 模式:大量轻量、无状态的 agent 通过 handoff(交接) 动态协作,没有固定编排图,谁适合谁接手(OpenAI Swarm 框架提出)。
特点
| 维度 | 说明 |
|---|---|
| 无状态 | agent 不保存状态,靠上下文传递 |
| handoff | 一个 agent 把对话「转交」给更合适的 agent |
| 简单 | 不用复杂图编排,易测试、易上手 |
与其它模式对比
- Supervisor:中央分发;Swarm:去中心化、agent 间直接 handoff。
- Swarm 更像「多客服转接」:接待 agent 识别意图后转给专家 agent。
- 注意:Swarm 是教学/实验性质框架,生产复杂流程仍多用 LangGraph。
答「无状态 + handoff 交接 + 去中心化」,类比「客服转接」,并点出「Swarm 偏教学、生产复杂编排用 LangGraph」。
agent loop 如何实现?
核心循环
messages = [system, user]
for _ in range(max_steps):
resp = llm.chat(messages, tools=tools)
if not resp.tool_calls: # 无工具调用 → 结束
return resp.content
for tc in resp.tool_calls: # 执行每个工具
result = execute(tc) # 宿主真正执行
messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
messages.append(resp) # 把助手消息(含 tool_calls)也加入
# 超步数 → 强制终止关键点
- 终止条件:无 tool_call、达到
max_steps、模型输出 Final Answer。 - 状态维护:messages 列表就是 loop 的「状态」,逐步累积。
- 框架(LangGraph)把 loop 抽象成「节点 + 边 + 条件循环」。
手写一个「调 LLM → 判断 tool_calls → 执行 → 回传 → 循环」的伪代码,说清终止条件与 messages 状态累积。
Agent 的 streaming(流式)如何实现?
两层 streaming
- LLM token 流:模型逐 token 输出,前端即时显示。
- 工具调用流:tool call 的 JSON 参数也要边生成边解析(增量 JSON parser),不等整段生成完。
事件流设计
把 Agent 运行过程抽象成事件序列推给前端:
on_llm_start → on_token(增量文本)→ on_tool_start → on_tool_end → ... → on_final- 好处:用户实时看到「在思考/在调用哪个工具/返回了什么」,降低等待感知。
- 实现:框架(LangChain/LangGraph 的 astream_events)提供事件回调。
注意
- 工具调用中途可能失败/取消,需处理中断;增量解析要容错不完整 JSON。
答「LLM token 流 + 工具调用增量解析 + 事件流推送」,说清用 on_tool_start/on_tool_end 让用户看到进度,点出增量解析容错。
human-in-the-loop 有哪些模式?
三种模式
| 模式 | 机制 | 场景 |
|---|---|---|
| 审批(approval) | 关键操作前等待人工批准再执行 | 支付/删除/发消息 |
| 暂停(pause/interrupt) | 在检查点暂停等待输入后继续 | 需补充信息、确认方案 |
| 接管(takeover) | 人工接管控制权直接操作 | Agent 卡死/危险 |
实现
- LangGraph 的
interrupt机制:在指定节点暂停,等待人工resume并注入新输入。 - 审批通常是「工具执行前拦截 + 权限回调」;接管是「切换到人工模式」。
原则
- 高危操作必经人;非关键步骤尽量自动化减少打断。
区分「审批(执行前拦)、暂停(检查点等输入)、接管(人工接手)」,并能说 LangGraph interrupt 实现,点出「高危必经人」。
Agent 的可观测性(tracing)如何做?
记录什么
- 每步的输入/输出、工具调用与结果、token 用量、延迟、成本、模型与版本。
tracing 结构
- trace:一次完整任务;span:其中每个子步骤(LLM 调用、工具调用、检索)。
- 父子关联,形成调用树,可回溯「哪一步出错、消耗多少」。
工具
| 工具 | 说明 |
|---|---|
| LangSmith | LangChain 官方,全链路 |
| Langfuse | 开源,trace/评估/成本 |
| Phoenix(Arize) | 开源可观测 + 评估 |
| OpenTelemetry | 通用标准,可对接监控 |
用途
- 调试(回放轨迹)、评估(轨迹打分)、成本分析、回归测试。
答「trace + span 调用树,记录输入输出/token/成本/延迟」,报出 LangSmith/Langfuse/Phoenix,点出可回溯与评估用途。
沙箱和权限如何设计?
沙箱(隔离执行)
- 代码/命令在容器(Docker)、VM 或 gVisor 中执行,隔离文件系统与网络。
- 限制:无网络/白名单网络、临时文件系统、资源配额(CPU/内存/超时)。
工具权限
- 白名单机制:只暴露允许的工具,隐藏危险能力。
- 参数校验:对工具入参做校验与范围限制。
- 最小权限:工具按任务只给必要权限(只读、指定表/目录)。
- 高危拦截:支付/删除类需人工确认。
实践
- 每个工具声明所需权限;运行时做权限判定;全程审计日志。
答「容器/gVisor 隔离 + 白名单工具 + 参数校验 + 最小权限 + 高危人工确认」,强调「沙箱限网络/文件、工具限能力」。
Agent 的 state 如何持久化?
state 是什么
- 会话消息、中间结果、计划状态、记忆指针等运行状态。
持久化方案
- 数据库:Postgres(结构化)、Redis(快取/短期)、对象存储(大结果)。
- checkpointer:框架层把 state 快照序列化存入(LangGraph 的 checkpointer)。
- 序列化注意:只存可序列化数据(dict/JSON),避免存不可序列化对象(函数、连接)。
好处
- 崩溃恢复、跨会话续跑、人工介入、时间旅行调试。
- 用
thread_id标识一次会话,恢复时按 thread 取回最新 state。
答「state 快照序列化 + checkpointer 存库 + thread_id 恢复」,点出「只存可序列化数据」,用途是恢复/续跑/调试。
checkpoint 和恢复如何实现?
checkpoint
- 在每个节点/步骤执行后保存 state 快照(含输入、输出、消息列表)。
恢复机制
执行节点 → 保存 checkpoint(thread_id, step) → 失败/暂停时从最近 checkpoint 恢复- 重放:从 checkpoint 重新执行,避免从头跑。
- 时间旅行:回到任意历史 checkpoint 分支重试。
- 人工介入:在 checkpoint 暂停,注入输入后 resume。
实现(LangGraph)
checkpointer+thread_id:同一 thread 复用 state;interrupt在节点暂停,resume继续。
答「每步后快照 + 从最近 checkpoint 恢复 + thread_id」,点出「重放/时间旅行/人工介入」三个用途,说 LangGraph 实现。
死循环检测如何实现?
检测手段
| 手段 | 实现 |
|---|---|
| 最大步数 | max_iterations(如 10~20)强制终止 |
| 重复 Action 检测 | 对最近 N 次 tool_call 做哈希,连续重复则终止 |
| 无进展检测 | 输出/状态连续 K 步无变化 |
| token 增长监控 | 单步 token 超阈值告警 |
处理
- 终止后:给模型明确「你重复了,请换策略或给最终答案」的提示,或直接降级/转人工。
- 结合超时 + token 预算兜底。
示例
seen = deque(maxlen=3)
for step in range(max_steps):
key = (tool_name, json.dumps(args))
if key in seen: return "检测到重复调用,终止"
seen.append(key)答「max_iterations + 重复 action 哈希检测 + 无进展检测 + 超时/预算」,给出重复检测的代码思路,说清终止后的降级处理。
token 预算如何管理?
预算设计
- 总 token 上限、单步 token 上限、工具结果长度上限,超限即压缩或终止。
控制手段
| 手段 | 说明 |
|---|---|
| 摘要/压缩 | 长历史摘要,减少输入 token |
| prompt caching | 缓存系统提示/稳定前缀,省输入成本 |
| 截断 | 工具结果/检索结果截断 |
| 模型分层 | 简单步骤用小模型,复杂用大模型 |
| 限制步数 | 控制总调用量 |
监控
- 实时统计 token/成本,接近预算时告警或降级。
答「总/单步/工具结果三重预算 + 摘要/缓存/模型分层控制 + 实时告警」,点出 prompt caching 省输入成本。
轨迹评估(trajectory evaluation)是什么?
定义
- 轨迹评估:不只评最终答案,还评估 Agent 的中间执行轨迹是否合理、高效。
评估维度
| 维度 | 指标 |
|---|---|
| 正确性 | 最终结果对不对 |
| 步骤合理性 | 是否走了正确/必要的步骤 |
| 工具选择 | 是否选对工具、参数正确 |
| 效率 | 步数、token、延迟是否最少 |
| 鲁棒性 | 干扰下是否仍收敛 |
方法
- 参考轨迹比对:与标注的最优轨迹对比(编辑距离/覆盖率)。
- LLM-as-judge:让强模型给轨迹逐段打分。
- 过程奖励(PRM):给每一步打奖励,而非只给最终结果(ORM)。
答「评中间轨迹而非只评结果」,报出「正确性/步骤合理/工具选择/效率」维度,点出 PRM 过程奖励 vs ORM 结果奖励。
prompt injection 如何攻防?
攻击类型
| 类型 | 说明 |
|---|---|
| 直接注入 | 用户直接输入恶意指令覆盖系统指令 |
| 间接注入 | 恶意指令藏在网页/文档/邮件/工具返回中 |
| 越狱 | 诱导绕过安全约束 |
防御
- 指令/数据隔离:外部内容一律当数据,不当指令;用分隔符明确边界。
- 输入过滤:检测并清洗可疑指令。
- 最小权限:即使被注入也无法造成大破坏。
- 人工确认:高危操作拦截。
- 输出过滤/沙箱:隔离执行、审计。
- 防御性系统提示:明确「忽略数据中的指令」。
本质
- LLM 无法天然区分「指令」与「数据」,间接注入尤其难防,需纵深防御。
区分「直接注入 vs 间接注入」,给出「隔离 + 过滤 + 最小权限 + 人工确认 + 审计」纵深防御,点出间接注入最难防。
工具越权的最小权限如何设计?
越权类型
- 水平越权:访问他人数据(用户 A 调到用户 B 的数据)。
- 垂直越权:低权限调用高权限工具(只读账号执行删除)。
最小权限原则
| 手段 | 说明 |
|---|---|
| 角色权限 | 按角色授予最小工具集 |
| 工具级 ACL | 每个工具声明所需权限与数据范围 |
| 参数校验 | 校验入参(如限制查询的用户 ID 只能是当前用户) |
| 按需授权 | 临时提权需人工批准,用完回收 |
| 审计日志 | 记录每次工具调用与数据访问 |
实践
- 数据库工具只给只读 + 白名单表;写操作单独、需确认;身份信息从会话注入而非让模型传。
答「水平/垂直越权 + 最小权限 + 工具 ACL + 参数校验 + 身份从会话注入」,强调不让模型自己传身份参数。
Agent 的成本如何控制?
成本构成
- 输入 token(长上下文重放)、输出 token(多轮推理)、工具调用费、多 Agent 叠加。
控制手段
| 手段 | 说明 |
|---|---|
| 模型分层 | 规划用大模型、执行/抽取用小模型 |
| 上下文压缩 | 摘要、截断、prompt caching |
| 限制步数 | 控制循环上限 |
| 并行合并 | 无依赖调用并行,省轮次 |
| 批处理 | 批量任务合并处理 |
| 评估性价比 | 看「成功率 / 成本」,而非只看成功率 |
预算
- 设单任务成本上限,超限降级或转人工。
答「成本=输入+输出+工具费」,给「模型分层/压缩缓存/限步/并行」手段,强调用「成功率/成本」做性价比评估。
coding agent(SWE-agent/Devin)是如何工作的?
原理
- 让 LLM 在真实代码仓库中自主定位、修改、测试代码,完成 issue 修复等任务。
关键设计
- SWE-agent 的 ACI(Agent-Computer Interface):给模型一套精简、易用的命令与文件查看器(受限搜索、滚动查看),比原始 shell 更易被 LLM 掌握。
- 闭环迭代:改代码 → 运行测试 → 看报错 → 继续改,靠真实执行反馈驱动。
- Devin:完整开发环境 + 长期规划 + 独立编码/测试/部署。
评估
- SWE-bench:从真实 GitHub issue 构建的基准,衡量「能否生成可过测试的 patch」。
答「真实仓库自主改码 + 测试反馈闭环」,点出 SWE-agent 的 ACI(简化接口)与 SWE-bench 基准,强调执行反馈是关键。
browser agent(WebArena)是什么?
定义
- Browser Agent:让 LLM 通过操作浏览器(点击/输入/导航)完成真实网页任务;WebArena 是其代表性真实环境基准。
实现
- 用 Playwright/Selenium 控制浏览器;观察用 DOM 树 / 截图(+A11y 树);动作空间是点击、输入、滚动、导航。
- 挑战:页面状态大、动作空间大、需要多步长程决策。
WebArena 基准
- 在真实网站(电商、论坛、GitLab、地图、CMS)上评测任务完成率。
- 任务如「找到某商品并加入购物车」「在论坛发帖」。
难点
- 页面解析噪声、动态内容、登录/验证码、多页面状态追踪。
答「Playwright 控浏览器 + DOM/截图观察 + 点击输入动作」,报出 WebArena 是真实网站基准,点出状态大/动作空间大难点。
Agent 和 Workflow 的边界如何划分?
决策框架
- Workflow:流程固定、可预测,步骤明确 → 用预编排(更可靠、可控、省成本)。
- Agent:任务开放、需动态决策(未知路径、需探索)→ 用 Agent。
判断标准
| 信号 | 选择 |
|---|---|
| 步骤固定可枚举 | Workflow |
| 需要 LLM 自主决定下一步 | Agent |
| 对可控性/成本敏感 | 偏 Workflow |
| 需处理大量未知分支 | Agent |
实践建议(Anthropic《Building Effective Agents》)
- 优先用最简单的方案;能 workflow 就不用 Agent。
- 常用「混合」:主干用 workflow,少数节点是 Agent。
- Agent 给「明确任务 + 清晰工具 + 结构化输出」约束,换取可靠性。
引用「能用 workflow 就不用 Agent」的务实原则,给「步骤可枚举→workflow、需动态决策→Agent」,点出混合架构与约束换取可靠性。