Agent 开发工程师一面面经
完整信息
本篇目录
1. 请做一下自我介绍
2. Agent 中的 Workflow、Planner 和策略模型分别解决什么问题?
答案:Workflow 是预定义控制流,节点和转移条件基本确定,适合审批、申报等要求稳定和可审计的任务。Planner 根据当前状态动态分解任务,适合开放目标,但计划可能不可执行。策略模型则直接决定下一步动作,本质上是在状态空间上学习策略。
生产系统通常不是三选一,而是让 Workflow 规定权限边界和不可跳过的检查,让 Planner 生成局部计划,再由策略模型选择具体工具。高风险操作必须回到确定性节点校验,不能把终止权、支付权或数据删除权完全交给语言模型。
3. 多轮 Agent 的记忆全部放进上下文会出现什么问题?应该如何设计分层记忆?
答案:全部拼接会造成上下文成本线性增长、关键信息被淹没、旧指令污染当前决策,还可能把工具输出中的恶意文本长期保留下来。更严重的是,摘要会逐轮压缩并累积事实偏差,最终形成“记忆漂移”。
可以划分为工作记忆、情节记忆、语义记忆和审计日志。工作记忆只保存当前任务状态;情节记忆保存可检索的历史轨迹;语义记忆保存经过验证的稳定事实;审计日志保持不可变但不直接注入模型。写入前做事实抽取、来源绑定、置信度判断和敏感信息过滤,读取时结合相关性、时效性、权限与可信度重排。记忆内容不能覆盖系统指令,用户纠正与模型推断也必须分开存储。
4. MCP 的 Host、Client、Server 如何协作?协议层为什么不能自动解决安全问题?
答案:Host 承载 Agent 应用并管理权限、上下文和多个 Client;每个 Client 与对应 MCP Server 建立会话;Server 暴露 tools、resources 和 prompts 等能力。协议负责能力发现、参数描述和消息交换,但不会证明某个工具值得信任,也不会自动限制工具的真实副作用。
安全边界应由 Host 建立:Server 身份校验、工具白名单、参数 Schema、最小权限令牌、超时、速率限制和人工确认。资源返回值仍属于不可信输入,必须防范间接提示注入。工具列表变化也要版本化,否则同名工具被替换后,模型可能在无感知的情况下执行不同操作。
5. 为什么 Self-Attention 比 RNN 更适合大规模并行训练,但不意味着它在所有场景都更优?
答案:RNN 的隐藏状态满足递归依赖,第 t 步必须等待第 t-1 步,训练难以沿序列维并行。Self-Attention 可以一次计算所有位置的 Q、K、V 和相关性矩阵,适合 GPU 的大规模矩阵乘法,也让任意两个位置之间只有一跳信息路径。
代价是标准注意力对序列长度具有二次计算和显存复杂度。流式传感器、极低延迟端侧设备或需要无限状态递推的场景中,状态空间模型和 RNN 变体可能更合适。比较时不能只看表达能力,还要看训练并行性、推理状态大小、上下文长度和硬件利用率。
6. Few-shot 示例为什么有时会让效果变差?如何选择和排列示例?
答案:Few-shot 不一定提供正确归纳偏置。示例与问题分布不一致、标签比例失衡、格式冲突或包含偶然特征时,模型可能模仿错误模式。长示例还会占用注意力预算,并产生明显的近因偏差和顺序敏感性。
示例选择应同时考虑语义相关性、任务覆盖、难度和标签平衡,不能只取向量最相似的若干条。可以先召回候选,再用交叉编码器或任务模型重排,并去除高度重复项。排列上通常将最相关或约束最强的示例放在靠近待回答问题的位置,同时通过多种排列做稳定性测试。
7. 如何为一个会调用外部工具的 Agent 建立可复现评测?
答案:评测单位不能只有最终答案,还要包含任务环境、初始状态、工具版本、随机种子、完整轨迹和终止原因。外部 API 应使用固定快照或可控模拟器,否则汇率、库存和搜索结果变化后无法复现。
指标至少覆盖任务成功率、参数正确率、无效调用率、调用成本、恢复能力、越权率和证据一致性。轨迹评分不能机械要求与标准轨迹完全一致,因为同一目标可能存在多条合法路径;应验证关键状态是否达成、约束是否违反以及副作用是否正确。对模型裁判还应做盲测、位置交换和人工标定。
8. Agent 怎样抵御工具返回内容中的间接提示注入?
答案:核心原则是把工具输出当作数据而不是指令。网页、邮件和文档中的“忽略此前要求”没有控制权,模型只能从中提取任务所需字段。系统需要标记数据来源和信任级别,将控制指令与外部内容放入不同通道,并限制外部内容进入长期记忆。
执行层要做能力隔离:读取网页的工具不应天然拥有发送邮件或转账权限;敏感工具调用需要基于原始用户意图重新授权;参数必须通过结构化 Schema 和策略引擎检查。仅在 Prompt 中声明“不要被注入”并不足以形成安全边界。
9. ReAct Agent 为什么容易陷入循环?如何在不误杀正常重试的情况下终止循环?
答案:循环通常来自状态没有真实变化、工具错误缺少结构化反馈、模型反复改写等价参数,或者观察结果没有被正确压缩。只限制最大步数虽然能止损,却无法区分合理重试与无效循环。
可以对动作名称、规范化参数和关键状态生成指纹,检测周期性重复;同时记录每一步的信息增益、错误类别和资源消耗。瞬时网络错误允许指数退避重试,确定性参数错误则必须修改参数;若连续动作没有改变任务状态,应触发反思、切换方案或升级人工处理。
import json, hashlib
def action_fingerprint(tool: str, args: dict, state_version: str) -> str:
payload = {"tool": tool, "args": args, "state": state_version}
raw = json.dumps(payload, sort_keys=True, ensure_ascii=True)
return hashlib.sha256(raw.encode()).hexdigest()
def has_cycle(history: list[str], max_period: int = 4) -> bool:
for period in range(1, max_period + 1):
if len(history) >= period * 3:
tail = history[-period:]
if history[-2*period:-period] == tail and history[-3*period:-2*period] == tail:
return True
return False
10. Tool Calling 的参数约束为什么不能只
本篇目录
- 01
请做一下自我介绍
- 02
Agent 中的 Workflow、Planner 和策略模型分别解决什么问题?
- 03
多轮 Agent 的记忆全部放进上下文会出现什么问题?应该如何设计分层记忆?
- 04
MCP 的 Host、Client、Server 如何协作?协议层为什么不能自动解决安全问题?
- 05
为什么 Self-Attention 比 RNN 更适合大规模并行训练,但不意味着它在所有场景都更优?
- 06
Few-shot 示例为什么有时会让效果变差?如何选择和排列示例?
- 07
如何为一个会调用外部工具的 Agent 建立可复现评测?
- 08
Agent 怎样抵御工具返回内容中的间接提示注入?
- 09
ReAct Agent 为什么容易陷入循环?如何在不误杀正常重试的情况下终止循环?
