简介:本教程系统讲解Agent-计算机交互(ACI)的设计方法:如何从任务建模出发,为Agent定制工具描述、错误信息与返回结构,搭建人类与Agent共用的双通道接口,并分层设计语义、情景、程序三类记忆。读者将获得可落地的实施步骤、配置要点、验证指标与排查思路,显著提升Agent在真实业务中的任务完成率与执行稳定性。
本教程的目标是:让你能够从零设计一套面向Agent优化的计算机交互层(Agent-Computer Interface,ACI),并把它接入到已有的业务系统与工具中,使一个通用大模型驱动的智能体能够在真实业务环境里稳定地”从推理走到行动”。
早期一次经典访谈中提出过一个后来被反复验证的判断:决定Agent上限的关键往往不是规划算法的复杂度,而是它与计算机之间的交互界面设计得好不好。同样的模型,换一套为Agent定制的工具描述和错误反馈,任务成功率就可能出现数量级差异;反过来,再精巧的多层规划框架,也救不回一个只会返回”请求失败”的接口。
本教程会把这一判断拆解成可执行的工程动作,最终产出包括:
适用场景:企业内部流程自动化(工单、审批、对账)、数据分析与报表问答、运维排障助手、客服与订单履约、代码仓库操作、跨系统信息聚合。
适用读者:负责搭建Agent应用的开发者、负责工具与API治理的架构师、需要评估落地成本的技术负责人,以及要把内部系统”开放给Agent调用”的业务平台方。若你所在团队正在把一批内部接口包装成工具给Agent用,本教程的前五步基本就是你要做的事。
在动手前需要理解三个前提,它们决定了后面每一步的设计取舍。
1)Agent的失败大多发生在”手脚”,而不是”大脑”。 模型推理错了当然会失败,但工程实践中更高频的失败模式是:调了错的工具、参数填错、返回体太大被截断、看不懂错误信息于是反复重试同一个动作。这些都属于交互层问题。
2)人类界面不能直接搬给Agent。 人类与机器在记忆方式和信息处理能力上有根本差异:人类界面依赖视觉排版、隐含约定、可点击的兜底路径,且假设用户能长期记住系统状态;Agent没有持久心智模型,一次会话结束后状态即丢失,它的”注意力”由上下文窗口决定,任何一次几千字的噪声返回都可能挤掉关键信息。因此界面应当为Agent单独设计,而不是复用人类视图。
3)”智能”与”知识”很难完全分离。 我们既希望模型具备通用推理能力,又希望它掌握特定领域的上下文。纯粹的分离在工程上难以实现,但业界提供了一条折中路径:通用智能保持在通用模型侧,特定上下文以外部注入或轻量领域适配的方式挂载(例如低秩适配这类轻量微调手段,可以把通用能力与特定场景偏好做相对解耦,终端侧也已有把这类轻量适配模块下发到设备的实践)。本教程第七步会展开这条路径的取舍。
知识准备:了解HTTP接口与JSON Schema的基本写法、了解主流大模型的工具调用(function calling / tool use)机制、了解向量检索的基本流程。不需要精通规划算法。
环境准备:
数据准备(最容易被跳过、但最关键):整理一份任务评测集,20~50条真实业务请求即可起步,每条包含自然语言诉求、期望的最终结果、以及可接受的调用路径。没有评测集,后面所有优化都只能靠感觉判断。
做什么:把业务目标拆解为可判定”已完成”的动作集合,形成工具清单。对每个工具明确:输入、输出、副作用、幂等性。
为什么做:动作空间与真实环境不匹配是Agent失败的头号原因。粒度太细,Agent每一步都要问人;粒度太粗,一个工具包办一切,参数爆炸且无法复用。
注意:工具数量建议控制在单个Agent 10~20个以内;超过就应按业务域拆分子Agent。同名或近义工具必须合并(例如 get_user 与 query_user_info 并存,几乎必然导致误选)。所有工具必须声明是否为只读,只读工具才允许并行调用。
做什么:为每个工具编写面向模型的自然语言说明,而不只是给人看的接口文档。说明中必须回答四件事:这个工具做什么、什么时候该用它、什么时候不该用它、参数的取值范围与单位。
为什么做:模型选择工具靠的就是这段文本。人类开发者会写”查询用户”,但对Agent来说”当用户提供手机号或用户ID且无歧义时使用;若只有一个昵称,先调用 clarify”这种边界描述才是真正的决策依据。
注意:显式写出反例(”不要用于批量导出,那属于另一个工具”)往往比正面描述更有效。参数尽量避免”可选参数过多”的堆叠,可选参数超过5个就考虑拆成两个工具。
做什么:把所有错误按可恢复性分为三类,并为每类设计固定结构:
结构化字段至少包含:code(机器可读错误码)、retryable(是否可重试)、message(人类可读说明)、details(出错字段与实际值)、hint(修复建议)、next_actions(建议的下一步动作)。
为什么做:只返回 500 Internal Error 的接口,等于让Agent在黑暗里猜。给出出错字段与期望格式,模型几乎总能一次修正。
注意:hint 里要显式约束行为边界,例如”不要猜测或截断订单号”,否则模型会自行编造一个”看起来合理”的值继续往下走,这种失败比直接报错更难排查。
做什么:同一份业务能力,对外提供两种视图。人类视图可以保留分页控件、富文本、跳转链接;Agent视图返回稳定结构、精简字段、明确的枚举值与引用ID。不要直接把渲染好的HTML或人类页面结构喂给Agent。
为什么做:人类视图的很多设计(比如把状态写成”处理中(预计3天)”这样的混合文本)对人是友好的,对模型则是需要额外解析的噪声。同时,Agent视图可以独立演进而不影响人类界面。
注意:两个通道必须共享同一套底层业务校验与权限控制,避免”Agent通道成为绕过校验的后门”。
做什么:为Agent返回体设置裁剪规则:字段白名单、分页上限、嵌套深度上限、大对象”引用化”(先返回ID与摘要,Agent需要细节时再单独取)。
同时把上下文窗口当成预算来管理,明确划分:系统提示、工具描述、历史对话、单次观测、记忆注入、预留输出。
为什么做:上下文是Agent最稀缺的资源。一次返回200条完整订单记录,可能在两步之内就把窗口占满,导致早期的任务目标被”挤出”记忆。
注意:所有列表类返回必须强制分页并显式告知”是否还有下一页”,否则Agent会误以为数据已经取全。
做什么:把Agent记忆拆成三层,分别选型与实现:
每层都要定义四件事:写入触发条件、检索方式、压缩/遗忘策略、冲突消解规则。
为什么做:智能体记忆目前仍是未解难题——不同任务需要不同类型的记忆,且实现方式应当灵活多样,强行统一到一种存储引擎通常两头不讨好。分层的好处是每层可以独立替换实现。
注意:情景记忆必须设保留窗口与摘要机制,否则会无限膨胀。程序记忆要有版本号,流程变更时能追踪是哪一版行为发生了变化。
做什么:按”提示工程 → 检索增强 → 轻量领域适配(如低秩适配)→ 领域专用模型”的顺序逐级加码,只在低一级被证明不足时才升级。
为什么做:把领域知识硬塞进模型参数会引发灾难性遗忘与更新困难;而完全依赖提示注入又受上下文限制。把”通用智能”放在通用模型侧、把”特定上下文”通过外挂或轻量适配模块挂载,是工程上性价比最高的折中——终端侧下发的轻量适配模块也是这个思路的一种体现。
注意:一旦引入微调,必须保留原有评测集做回归,确认通用能力没有退化。
以下配置项属于业界通用做法,具体字段名以你的实现为准,这里说明的是取值逻辑与风险。
code + hint,敏感信息在服务端日志中留存。面向Agent的工具声明(通用伪代码,与具体平台无关):
tool = {"name": "query_order_status","description": ("查询指定订单的履约状态。仅在用户已提供订单号,""或上下文中存在唯一确定的订单时使用。若订单号缺失或存在多个候选,""不要猜测,先调用 clarify 工具向用户确认。""本工具为只读,可用于批量场景,但单次最多20个订单。"),"parameters": {"order_ids": {"type": "array", "max_items": 20,"items": {"type": "string", "pattern": "^[A-Z]{2}[0-9]{10}$"}},"fields": {"type": "array","items": {"enum": ["status", "eta", "carrier"]},"default": ["status", "eta"]}},"read_only": True,"idempotent": True,"timeout_ms": 3000,"response": {"page_size": 20, "large_object_mode": "reference"}}
结构化的可恢复错误返回:
{"ok": false,"code": "PARAM_PATTERN_INVALID","retryable": false,"message": "order_ids 中存在格式不合法的订单号:应为2位大写字母+10位数字","details": {"index": 0, "received": "ab123", "expected": "^[A-Z]{2}[0-9]{10}$"},"hint": "请使用用户提供的完整订单号重试;不要猜测、补全或截断订单号。","next_actions": ["clarify", "abort"]}
上下文预算与返回裁剪配置(YAML风格,通用示意):
agent_runtime:context_budget:system_prompt: 1500tool_schema: 2000history: 6000observation: 4000memory: 1500reserve_output:1500history_policy: {keep_recent_turns: 8, summarize_beyond: 12}observation_policy: {page_size: 20, max_depth: 2, large_object_mode: reference}error_policy: {include_details: true, max_retries: 2, backoff: exponential}memory_policy:semantic: {store: knowledge_base, refresh: daily}episodic: {store: vector_index, ttl_days: 90, min_score: 0.75}procedural:{store: template_registry, versioned: true}
用四类指标判断改造是否成功,全部基于第五节的评测集:
必须做两组对照实验:
建议把上述指标做成可重复执行的回归任务,任何工具描述或错误信息的修改都要过一遍回归,否则极易出现”修好一个场景、退化三个场景”。
| 现象 | 常见原因 | 排查思路 |
|---|---|---|
| 反复重试同一个失败调用 | 错误未标注 retryable,或缺 hint |
查看链路日志中错误码与重试次数,补全可恢复性字段 |
| 调用了不存在的工具或编造参数 | 工具描述含混、存在近义工具、参数未强约束 | 合并近义工具,补充反例描述,收紧参数枚举与正则 |
| 上下文很快超限、成本飙升 | 返回体过大、历史无摘要、记忆无限增长 | 按环节统计token占比,逐项设置预算与分页 |
| 多步任务中途”忘记”目标 | 任务状态未外化,只存在于历史对话中 | 引入任务卡(目标/约束/已完成/待办)并每轮注入 |
| 越权或误执行不可逆动作 | 权限过宽、无二次确认 | 工具绑定最小权限,危险动作加确认节点与幂等键 |
| 改动工具后行为莫名退化 | 工具契约无版本、无回归 | 工具schema版本化 + 契约测试 + 评测集回归 |
本教程的核心结论是:Agent的能力上限,很大程度上由它与计算机之间的接口质量决定。回顾关键步骤——收敛动作空间、为Agent重写工具描述、把错误设计成可恢复的结构、分离人机双通道、用预算治理上下文与返回体、分层实现语义/情景/程序三类记忆、按最小成本原则推进领域适配。
后续可以继续深入的方向有三个:一是多Agent协作下的工具可见性与权限隔离;二是记忆写入与遗忘策略的自动化(谁决定什么值得记住);三是把评测集建设成常态化流水线,让每一次接口调整都有量化依据。这些方向上,百度智能云提供的模型服务、日志服务、监控告警与对象存储等通用能力可以组合用来承载评测数据、链路追踪与记忆存储,具体选型仍以你的业务规模与合规要求为准。