Appearance
Q45 · 工具返回的结果太大时,Agent 怎么处理?
用户问客服 Agent:“订单 A123 现在能自动退款吗?”Agent 调用售后政策工具,工具却一次返回近两年的 240 条政策记录,包括已经失效的旧版本、无关的换货流程和各类例外。若把整份结果原样塞给模型,可能超出它这次调用可处理的容量;若只保留文本开头,又可能留下“7 天内可退”,剪掉后面的“未拆封才可自动退款”,从而得出错误结论。
正确思路是把完整结果留在工具侧,由应用或受控处理步骤先按问题、日期和来源缩小范围,再把少量、带出处且保留关键条件的证据送入模型。必要时让 Agent 继续请求某个具体页面或段落。模型看到的内容必须有明确的完整性标记,不能把“只看了第一页”误当成“所有记录都看完了”。OpenAI 当前上下文窗口文档说明单次请求的输入、输出以及部分模型的推理都受到容量约束;其工具编排文档也建议对可程序化处理的大量结果先筛选、去重和聚合。OpenAI 对话状态、Programmatic Tool Calling
本题沿用一个教学假设,不代表现实商家政策:今天是 2026 年 9 月 25 日;A123 于 9 月 20 日签收,订单系统确认已拆封。现行政策 v3 从 9 月 1 日生效,规定“签收后 7 天内且未拆封,可自动退款;已拆封需人工核验”。因此本例只能回答“不能自动退款,需人工核验”,不能直接执行退款。旧政策 v2 已于 8 月 31 日失效,其中“签收后 7 天内可申请自动退款”的片段不应支撑今天的结论。
术语与符号
| 词或符号 | 直白解释 | A123 例子中的对应物 |
|---|---|---|
| Agent | 能依据当前问题与结果决定下一步工具动作的应用流程;工具仍由应用执行 | 决定是再取政策段落还是回答 |
| 工具结果 | 工具执行后返回给 Agent 的数据或状态 | 240 条售后政策记录 |
| token | 模型计量输入输出的单位,不等于汉字数 | 政策文本与消息占用的容量 |
| 上下文窗口 | 单次模型调用能够容纳的内容总量,具体规则随模型变化 | 当前问题、历史、工具结果与答复共用的空间 |
| 输入预算 | 这次调用还能放多少输入内容,同时要给答复留空间 | 只允许送入少量政策证据 |
| 分页 | 一次只取结果的一部分,后续可用页码或游标继续取 | 240 条记录,每页 20 条,共 12 页 |
| 游标 | 服务端给出的下一页位置标识 | 继续读取下一批政策记录的 next_cursor |
| 筛选 | 按结构化条件减少候选 | 只取 2026-09-25 生效的退款政策 |
| 检索 | 按问题找到相关文档或段落 | 找 v3 中自动退款与拆封条件 |
| 摘要 | 把较长材料压缩成短说明;可能遗漏细节 | “7 天内且未拆封;已拆封转人工” |
| 来源标识 | 能回到原文的版本、文档 ID 和段落位置 | policy-v3 的退款条件段 |
| 截断 | 一部分数据因长度限制被丢掉 | 只保留前 4000 字,丢失拆封例外 |
has_more | 工具返回的布尔标记,表示后面是否还有页 | 第一页结果后仍有其他政策记录 |
本文的 next_cursor 和 has_more 只是常见的分页字段名,用来说明“还没取完”,并非所有工具的固定 API。模型也不应自己猜页数、猜政策版本;应用要给它明确的状态、来源与后续可请求的定位方式。
为什么不能直接把结果塞给模型

图左侧的厚纸堆代表工具持有的全部政策记录,里面既有旧政策,也有关键的拆封例外。中间的筛选与分页步骤先找到当前有效、与自动退款有关的段落;右侧交给模型的文件夹只保留“7 天内且未拆封”“已拆封需人工”两条决定性条件和 v3 来源。图没有把其余原文画成“删除”:它们仍应可在授权的存储或工具中回查,只是不占本次模型输入。
一次工具调用与下一次模型调用之间,结果往往会作为新的输入内容提供给模型。它不是无限免费的“后台附件”。如果应用把 240 条 JSON 直接拼进消息,工具字段名、重复段落、无关政策也会占用 token;再加上对话历史、工具定义与回答空间,可能导致请求报错、输入被截或输出未完成。超限的具体行为取决于模型和 API 配置,不应假定所有服务都会安全地替你裁掉无关部分。OpenAI 对话状态、OpenAI 计数 token
用一组已按目标模型计数、仅供教学的假设数字说明:本次窗口容量为 8,000 token;当前问题、应用规则、历史和工具定义已占 2,500;希望为答复预留 1,200,因此工具结果最多还可占约 4,300。原始政策结果是 6,500 token,合计要 10,200,装不下。筛选后的证据若是 700 token,合计约 4,400,便留出了空间。这些数字不是任何真实模型的规格,中文字符也不能直接换算成 token。真实项目应按所用模型与完整请求结构计数,并留有余量;OpenAI 当前计数接口可把消息、工具定义、文件等一起计入输入估算。OpenAI 计数 token
从 240 条记录到可以答 A123 的证据
**先在数据源缩小集合。**政策查询最好接受“主题=自动退款、生效日=2026-09-25、状态=现行”等参数,由服务端或数据库先过滤。这样通常比取回 240 条后在提示词里要求模型“自己找最新”更可控。结果仍应返回政策版本、有效期、文档 ID、章节位置与原文片段;只返回一句“可退款”会丢掉判断条件。
**再用分页控制传输量。**假设旧接口只能分页,每页 20 条,共 12 页。应用可从第一页读取元数据,按生效日期和主题继续请求需要的页,或改造接口支持服务端筛选。has_more=true 时,第一页绝不能被称为“完整检索结果”。分页只是分批取数;如果最后把 12 页全部拼回同一个提示词,输入仍然过大。工具可返回 status=partial、next_cursor 和已覆盖范围,让 Agent 知道还有内容,决定是否需要再取。LangChain Agent 上下文工程文档
**按问题定位相关段落。**检索词可包含“自动退款、已拆封、2026-09”;结合文档版本与生效日期过滤,取 v3 的条件段和拆封处理段。只取搜索排名前一条也有风险:它可能只写“7 天内”,而例外放在相邻段。对会改变结论的政策,需检查同一章节的限制、例外与有效期;必要时通过文档 ID 再取前后段,而非无限扩大结果数。对 A123,还要从订单工具取签收日与拆封状态,政策工具本身不能代替订单事实。
**最后才做摘要或结构化抽取。**可以把选中的两段整理成 auto_refund_conditions=[7天内,未拆封]、opened_handling=人工核验、source=policy-v3,再连同能回查的原文短引交给模型。这些字段在业务上必须能从原文逐项核对;模型生成的摘要只是一个压缩结果,不能因为语气肯定就成为政策真相。对高风险判定,保留精确条款、条件之间的“且/或”关系和来源,比追求最短文本更重要。OpenAI 的程序化工具编排文档建议在可预测的阶段用代码过滤、合并、去重和验证,再返回较小的结构化结果;需要语义判断或必须保留原始引用时应继续保留相应证据路径。OpenAI Programmatic Tool Calling
此时 Agent 手上是:订单 A123 已签收 5 天、已拆封;v3 要求 7 天内且未拆封;已拆封需人工。它可以答“不能自动退款,需人工核验”,并标明依据来自现行 v3 与订单记录。完整 240 条政策仍留在工具侧,后续若用户追问某个例外,Agent 可以凭文档 ID 申请更具体的段落,不需要把全部内容持续带在对话里。
截断、摘要和检索都会有失败路径
最危险的简化是 result[:4000] 这样的按字符从头截取。假设前半段恰好有旧 v2 的“7 天内”,现行 v3 的“未拆封”限制在后面;模型只看截断版,就可能答“可以自动退款”。即使截取长度换成 token、或者改成“前几条结果”,仍不能保证保留了决定性例外。正确处理是先验证版本与覆盖范围,再按条件选片段,并把 partial、has_more 等不完整信号显式传给后续步骤。
摘要也可能把“7 天内且未拆封”压缩成“7 天内可退款”,或把“已拆封需人工”省略。应用应把抽出的条件与原文逐项对照,尤其检查否定词、范围、日期、“且/或”关系与例外。若来源文档互相冲突,不要随便挑最短摘要;标记冲突并请求核实。长上下文本身也不保证模型一定能正确找到被埋在大量资料里的关键条款;选择相关证据仍然有价值。Google Gemini 长上下文说明
检索可能漏召回:关键词只找“自动退款”,没有找到“拆封商品处理”。这时可以扩大到同一政策章节、改写查询或让人工复核。若政策服务超时、分页游标失效,或者在规定次数和时限内仍拿不到现行条款,Agent 应说“暂无法核实自动退款资格”,不能用已过期的 v2 替代。给分页次数、可送入模型的片段数、总 token、总耗时设置上限,可以防止为了“查全”无限调用。外部工具文字只能作为数据处理,不能因为其中写了“忽略规则”就改变工具权限。LangChain Agent 上下文工程文档
实践中可以在轨迹里记录原始结果的条数与大小、实际选入的文档 ID、过滤理由、是否有未读页、送模 token 数、最终引用、是否完整以及拒答原因。评测集要包含“例外条款靠后”“旧政策排名靠前”“第一页无关键段”“摘要漏掉否定词”“分页中途失败”等案例。只监控“请求没有超限”是不够的;还要证明缩短后关键条件仍在。
面试时可以这样回答
工具结果太大时,我先把它视为一次模型输入预算问题,而不是简单裁掉后半段。应用会尽量在数据源按主题、时间和权限筛选;需要分批取数时分页,并把是否还有下一页标清楚;随后按当前问题检索或抽取少量相关段落,保留来源 ID、生效时间以及会改变结论的限制和例外。再用目标模型的计数方法检查完整请求,给回答留空间。原始结果留在受控存储里,Agent 可以按需回查。如果证据被截断、摘要漏条件或服务失败,就标记不完整并停止资格判断,不能让模型把局部结果当全量事实。
如果追问“分页后是否就解决上下文问题”,应回答:分页只减少单次传输量,把所有页重新拼入模型仍会超限。如果追问“摘要是不是越短越好”,应回答:不是;对退款资格,少掉“未拆封”四个字就会改变结论,必须能回到原文核查条件与来源。