聊一聊一些 Agent 项目的亮点(进阶)
引言
大部分人简历上写的 Agent 项目,技术链路是这样的:接收用户输入 → 调 LLM → 解析工具调用 → 执行工具 → 返回结果。这是 Agent 的"最小可用版本",能跑通,但没有任何区分度——2026 年了,跟着任何一个教程都能搭出来。
尤其 RAG 相关的大家已经觉得烂大街了,评论区也有同学吐槽
真正让面试官觉得"这个人做过真东西"的,是那些教程里不会教、但生产中必须解决的进阶问题。以下逐个拆解。
一、Agent Harness:Agent 不是一个模型调用,是一个运行时
是什么:
Agent Harness 是 Agent 的"执行骨架"——它不是 LLM 本身,而是围绕 LLM 构建的整个运行时系统。包括:循环控制、工具注册与调度、上下文管理、状态维护、错误处理、超时控制、并发管理等。
为什么重要:
大部分人把注意力放在"选什么模型""怎么写 prompt"上,但决定 Agent 是否能上生产的,是 Harness 的质量。同一个模型、同一套 prompt,跑在不同质量的 Harness 上,可靠性可以差一个数量级。
进阶亮点怎么体现:
你的 Agent 不只是 while True: call_llm() 的死循环,而是一个有完整生命周期管理的运行时:
- 可配置的循环策略:最大步数、单步超时、总超时、Token 预算上限,这些都是可配置的参数而不是硬编码的常量。不同任务可以用不同的资源预算。
- 优雅的终止机制:不只是到了最大步数就强制停止。Agent 在接近预算上限时被注入提示"你即将用尽执行步数,请尽快给出最终结论",让它有机会体面收尾而不是被强杀在中间状态。
- 状态快照与恢复:长任务执行过程中可以对 Agent 的状态做快照(当前上下文、已调用的工具、中间结果)。如果进程意外中断,可以从快照恢复继续执行,而不是从头开始。
面试中怎么讲:
"我的 Agent 有一个独立的 Harness 层,和 LLM 调用层解耦。Harness 负责循环控制、资源预算、异常兜底,LLM 层只负责推理和决策。这意味着我可以在不改任何 prompt 的情况下,换掉底层模型、调整循环策略、或者增加新的中间件(比如日志、鉴权)。这个设计参考了 Web 框架中间件的思路——Harness 就是 Agent 的中间件管道。"
二、可观测性(Observability):你的 Agent 不是黑盒
是什么:
可观测性是指你能在 Agent 运行时和运行后,完整地了解它"做了什么、为什么这么做、花了多少资源"。包括 Trace(链路追踪)、Metrics(指标监控)、Logging(结构化日志)三大支柱。
为什么重要:
Agent 的行为是概率性的、多步骤的、涉及外部工具调用的。出了问题,你面对的不是"某一行代码报错",而是"Agent 在第 7 步选了一个错误的工具,导致第 8 步拿到错误数据,第 9 步基于错误数据得出了错误结论"。没有可观测性,这类问题的排查纯靠玄学。
进阶亮点怎么体现:
Trace 层面:
每次 Agent 执行生成一条完整的 Trace,包含每一步的:LLM 的原始推理输出(Thought)、选择的工具和参数(Action)、工具的返回结果(Observation)、本步的 Token 消耗和延迟。Trace 之间支持父子关系——如果一个 Agent 调用了另一个子 Agent,子 Agent 的 Trace 自动挂在父 Trace 下面,形成完整的调用树。
Metrics 层面:
不是只统计"成功 / 失败",而是有分层指标:
- 任务维度:完成率、平均步数、平均 Token 消耗、端到端延迟的 P50/P90/P99
- 工具维度:每个工具的调用频次、成功率、平均延迟。如果某个工具的失败率突然飙升,告警应该在分钟级触发
- 模型维度:每个模型的调用量、Token 消耗、首 Token 延迟。用于成本核算和模型选型决策
日志层面:
结构化日志而不是 print("debug: xxx")。每条日志带有 trace_id、step_number、tool_name、token_count 等结构化字段,可以用来做聚合查询——"过去一小时所有失败任务中,最常见的失败工具是哪个?"
面试中怎么讲:
"我给 Agent 系统做了三层可观测性。Trace 层记录完整的推理链路,支持按 trace_id 回溯任何一次执行的全过程。Metrics 层有任务、工具、模型三个维度的实时监控。有一次上线后发现任务完成率从 85% 突然降到 70%,通过 Metrics 定位到是某个外部 API 的延迟从 200ms 飙升到 3 秒导致大量超时,而不是模型或 prompt 的问题。没有这套可观测性,这个问题的排查可能要花好几天。"
三、Agent 评测(Eval):不是"跑几个 case 看看"
是什么:
Agent 评测是一套系统化的方法来量化 Agent 的能力、发现回归、指导优化方向。不同于传统测试的"通过/失败"二元判断,Agent 评测需要处理概率性行为和多维度质量指标。
为什么重要:
没有评测体系,你对 Agent 的每次修改都是盲改——改了 prompt 觉得"好像好了",但不知道好了多少、有没有在其他场景变差。这在个人项目中还能忍,在团队协作和生产环境中完全不可接受。
进阶亮点怎么体现:
评测数据集的构建:
不是随便凑几十个 case。一个有设计的评测集需要覆盖:
- 难度梯度:简单(单工具单步)、中等(多工具串行)、困难(多步推理+错误恢复)
- 场景覆盖:正常场景、边界场景(工具返回空结果)、异常场景(工具超时/报错)、对抗场景(输入中嵌入误导性信息)
- 标注质量:每个 case 不只有"正确答案",还有"预期的工具调用序列""可接受的替代路径""不可接受的行为"
评测指标的分层设计:
- 结果指标:最终答案是否正确/完整。可以用精确匹配、语义相似度、或 LLM-as-Judge 来评估
- 过程指标:用了几步完成、有没有冗余步骤、有没有走弯路后自我纠正。两个 Agent 都答对了,但一个 3 步完成另一个 15 步,过程指标能区分它们
- 鲁棒性指标:同一个 case 跑 N 次,成功率是多少。如果某个 case 有时成功有时失败,说明 Agent 在这类任务上不稳定
- 成本指标:完成每个 case 的平均 Token 消耗和延迟
回归检测机制:
每次改动(prompt 变更、工具描述更新、模型切换)后自动跑全量评测集,和基线版本对比。如果任何维度的指标下降超过阈值,标记为回归并阻止上线。这和传统软件的 CI/CD 流程是一样的逻辑——只不过"测试"变成了"评测"。
面试中怎么讲:
"我构建了一个包含 150 个 case 的评测集,覆盖了三个难度等级和四类场景。每个 case 标注了预期的工具调用路径和多个可接受的替代路径。每次 prompt 变更后自动跑评测,对比结果正确率、平均步数和 Token 消耗。有一次我优化了工具描述想提升准确率,评测发现正确率确实从 78% 提升到了 84%,但平均步数从 3.5 步增加到了 5.2 步——模型变得更'谨慎'了,每次都多做一步验证。最终我保留了这次修改,因为准确率的提升值得多花那 1.7 步的成本。"
四、Agent Loop 设计:不只是"循环调 LLM"
是什么:
Agent Loop 是 Agent 运行的核心状态机——定义了 Agent 在不同状态之间的转移规则、每个状态下的行为、以及异常情况的处理。
为什么重要:
初级实现通常是一个简单的 while 循环——"调 LLM,如果返回工具调用就执行,如果返回最终答案就停止"。这在 happy path 上没问题,但遇到工具超时、LLM 输出格式错误、循环检测、并行工具调用、中途取消等场景就全乱了。一个设计良好的 Agent Loop 是一个正式的状态机,每个状态和转移都有明确定义。
进阶亮点怎么体现:
显式的状态定义:
Agent 不是"在运行 / 没在运行"两个状态,而是有清晰的状态枚举:
- 初始化(Initializing):加载工具描述、注入系统提示词、检索长期记忆
- 推理中(Reasoning):等待 LLM 响应
- 工具执行中(Executing):工具正在运行,可能是异步的
- 等待确认(Awaiting Confirmation):高风险操作需要人工确认
- 恢复中(Recovering):工具失败后正在走恢复逻辑
- 收尾中(Finalizing):接近资源上限,正在生成最终总结
- 已完成(Completed) / 已失败(Failed) / 已取消(Cancelled)
每个状态之间的转移有明确条件,不会出现"不知道 Agent 现在在干什么"的情况。
中断与恢复机制:
用户可以在 Agent 执行过程中发送新的指令("停下来,改方向")或取消任务。Agent 需要能在安全点暂停、保存当前状态、根据新指令调整行为或优雅终止。不能出现"工具正在执行删除操作,这时候收到取消指令,但删除已经提交了"的尴尬情况——高风险工具操作必须是原子化的,要么完成要么回滚。
并行工具调度:
当 LLM 一次推理输出多个独立的工具调用时,Agent Loop 需要并行调度它们、收集所有结果、然后一并作为 Observation 回传。这里有多个工程细节需要处理:部分工具成功部分失败怎么办?所有工具都超时了怎么办?并行结果的顺序是否影响 LLM 的下一步推理?
面试中怎么讲:
"我把 Agent 的运行逻辑建模为一个显式状态机,有 8 个状态和明确的转移规则。最有意思的设计是'等待确认'状态——当 Agent 要执行高风险操作(比如删除文件、发送请求)时,Loop 会自动暂停进入等待状态,直到用户确认后才继续。这个设计让 Agent 在自主性和安全性之间找到了平衡——低风险操作全自动,高风险操作人工把关。"
五、Human-in-the-Loop:不是"出了错找人兜底"
是什么:
Human-in-the-Loop(HITL)是在 Agent 的执行流程中有意识地引入人类参与节点。不是 Agent 失败了才找人,而是在设计阶段就明确定义了"哪些环节需要人类介入"。
为什么重要:
完全自主的 Agent 在当前技术水平下是不可靠的——它可能做出错误判断、执行不可逆操作、或者在安全边界上犯错。但完全不自主的 Agent 又失去了意义——每步都要人确认就等于人在操作 Agent 只是跑腿。HITL 设计的核心是找到自主和控制之间的最优平衡点。
进阶亮点怎么体现:
分级审批机制:
不是所有操作都同等对待。按风险等级分类:
- 低风险(自动执行):读取文件、搜索代码、查询数据库(只读)
- 中风险(执行后通知):修改文件内容、安装依赖。Agent 自动执行但立即通知用户,用户可以 undo
- 高风险(执行前审批):删除文件、修改数据库数据、发送外部请求、执行部署操作。Agent 必须暂停等待用户确认
风险等级可以全局配置,也可以按场景动态调整——比如在"调试"模式下放宽权限,在"生产操作"模式下收紧权限。
有效的审批交互设计:
人类审批不是简单弹一个"确认/取消"对话框。Agent 在请求审批时需要提供足够的决策上下文:"我准备执行 XX 操作,原因是 YY,预期影响是 ZZ,如果不执行的替代方案是 WW"。给人类做决策提供充分信息,而不是让人在没有上下文的情况下盲目点确认。
自信度驱动的介入策略:
更高级的设计是让 Agent 自己评估"我对这个决策有多大把握"。如果自信度高(比如工具调用模式和之前成功的 case 完全一致),自动执行。如果自信度低(比如遇到了从未处理过的场景、或者多个工具都可能合适但无法确定),主动请求人类介入。这让 HITL 不是静态的规则配置,而是动态的自适应行为。
面试中怎么讲:
"我设计了三级审批机制:只读操作自动放行,文件修改执行后通知支持撤销,删除和外部请求必须人工确认。有意思的是确认请求的信息设计——Agent 不是简单说'要删除这个文件,确认吗?',而是说'我要删除 config.old.json,因为用户要求清理旧配置文件,这个文件最后修改时间是 6 个月前且没有被任何代码引用'。这种带上下文的审批请求让人类能在 3 秒内做出准确判断,而不是还要自己去调查这个文件是什么。"
六、Streaming 与用户体验:Agent 不该让用户干等
是什么:
Agent 执行一个复杂任务可能要 30 秒甚至几分钟。如果用户在这段时间里只看到一个加载动画,体验是灾难性的。Streaming 设计是让 Agent 的执行过程实时可见——用户能看到 Agent 正在想什么、正在做什么、做到第几步了。
为什么重要:
同样是等 30 秒,"看着 Agent 一步步工作"和"盯着一个转圈的图标"的心理感受完全不同。前者让用户觉得"它在认真干活",后者让用户觉得"它是不是卡死了"。更实际的价值是:如果用户能实时看到 Agent 的推理过程,就能在 Agent 走偏的早期就介入纠正,而不是等它跑完才发现结果不对。
进阶亮点怎么体现:
多层级的 Streaming:
- Token 级流式:LLM 的输出 token by token 实时展示(最基本的)
- 步骤级流式:每完成一个推理-行动-观察循环,立即把这一步的摘要推送给用户:"正在搜索相关文件... 找到了 3 个相关文件 → 正在分析依赖关系..."
- 进度级流式:如果 Agent 有执行计划,实时展示"计划 5 步,当前第 3 步"的进度信息
可折叠的思维过程:
Agent 的完整推理过程可能很冗长。给用户的展示应该是分层的——默认展示每步的一句话摘要("正在搜索代码库"),用户感兴趣可以展开看完整的推理内容和工具调用详情。这样既不打扰不想看细节的用户,又满足想深入了解的用户。
面试中怎么讲:
"我实现了步骤级的实时 Streaming。用户看到的不是一个等待动画,而是 Agent 每一步在做什么的实时摘要。这个设计带来了一个意外的好处——有几次用户在 Agent 第二步就发现方向不对,立即介入纠正,避免了后续 5-6 步的无效执行。如果没有 Streaming,用户要等 Agent 全部跑完才能发现问题,浪费的时间和 Token 是实时干预的好几倍。"
七、成本控制:Agent 的隐藏杀手
是什么:
Agent 的成本不是一次 LLM 调用的费用,而是多轮调用 × 上下文膨胀的乘积。一个跑了 15 轮循环的 Agent,后几轮的上下文可能已经膨胀到接近窗口上限,每轮的 Token 消耗远大于前几轮。
为什么重要:
Demo 阶段没人在意成本——反正是自己的 API Key。但当你需要向面试官(或老板)证明"这个 Agent 可以上线服务真实用户"时,成本控制就是绕不过去的话题。一个完成率 90% 但每次请求花 2 美元的 Agent,商业上可能是不可行的。
进阶亮点怎么体现:
Token 预算管理:
每次 Agent 执行有一个总 Token 预算。Harness 层实时追踪已消耗的 Token,在接近预算上限时触发收尾策略(注入"请总结当前结论"的提示),超出预算则强制终止。预算可以按任务类型差异化配置——简单查询给 5K,复杂分析给 50K。
上下文压缩策略的成本效益分析:
压缩上下文(做摘要)本身也要花 Token——你需要调一次 LLM 来做摘要。什么时候压缩是"赚"的?只有当后续步骤节省的 Token 大于压缩本身的消耗时才值得。比如上下文已经 8K 了,后面预估还有 5 步,每步都会带着这 8K 的历史。压缩到 2K 花费 1K 的压缩成本,但后续 5 步每步省 6K,总共省 29K(30K - 1K)。这个成本效益计算应该是自动化的,而不是凭经验拍脑袋。
模型降级策略:
不是所有步骤都需要最强的模型。工具选择这种相对简单的决策用小模型就够了,只有复杂推理步骤才需要大模型。在循环中动态切换模型——简单步骤用便宜模型、关键步骤用强模型——可以在不影响效果的前提下降低 30-50% 的成本。
面试中怎么讲:
"我做了 Token 预算管理和动态模型降级。具体来说,Agent 的前几步主要是信息收集(搜索文件、读取代码),这些步骤的工具选择决策相对简单,用小模型就够了。只有到了后面的分析和方案生成阶段,才切换到大模型做深度推理。实测下来,这种混合模型策略的任务完成率和全程用大模型几乎一样,但平均 Token 成本降低了约 40%。"
总结:一张图看进阶项目的区分度
┌─────────────────────────────────────────────────────┐
│ 大多数人的 Agent 项目 │
│ 调 LLM → 解析工具调用 → 执行 → 返回结果 │
│ (能跑通,但没有区分度) │
└────────────────────┬────────────────────────────────┘
│ 以下每一层都是区分度
▼
┌─────────────────────────────────────────────────────┐
│ Agent Harness │ 不只是 while 循环,是完整的运行时 │
├────────────────────┼────────────────────────────────┤
│ 可观测性 │ Trace + Metrics + 结构化日志 │
├────────────────────┼────────────────────────────────┤
│ 评测体系 │ 分层评测集 + 回归检测 + 多维指标 │
├────────────────────┼────────────────────────────────┤
│ Agent Loop │ 显式状态机 + 中断恢复 + 并行调度 │
├────────────────────┼────────────────────────────────┤
│ Human-in-the-Loop │ 分级审批 + 上下文化确认请求 │
├────────────────────┼────────────────────────────────┤
│ Streaming │ 多层级实时展示 + 用户早期干预 │
├────────────────────┼────────────────────────────────┤
│ 成本控制 │ Token 预算 + 模型降级 + 压缩决策 │
└─────────────────────────────────────────────────────┘
你不需要在一个项目里全部做到。能在上面七个方向中认真做深两到三个,并且在面试中讲清楚"为什么这么设计、有什么取舍、实际效果如何",就已经超过了 90% 的候选人。
关键不是做了多少,而是你做的每一个选择背后都有清晰的理由。
#简历中的项目经历要怎么写##面试##AI时代,哪个岗位还有“活路”##AI求职记录##AI面会问哪些问题?#
查看19道真题和解析