给编程智能体足够的调试上下文,不必把一切都塞进去
本文目录
给调试智能体的材料,应足以区分下一步几个合理的解释:出错输入、预期行为及其依据、相关环境,以及把输入与故障连接起来的代码或日志。根据材料能回答的问题,选择是否补充。没有固定的理想材料包大小,上下文更短也不自动意味着更好。
GitHub 的任务指南建议明确范围、验收条件,并指向相关文件。Anthropic 的上下文工程文章讨论了在有限上下文窗口中选择有用信息,同时指出最小必要上下文不一定很短。下面的材料筛选练习,将这些思路用于一个虚构的解析问题。
先定义边界,再选择附件
设想一个先导出报表、再导入文件的流程。当标签包含分号时,某个导出文件无法导入。调查问题是:“导入器能否保留引号字段内部的分号?”这个问题决定了哪些字节、设置和源码片段有用。
下文所有名称、输入、代码、需求和记录,都是原创虚构教学材料。没有复制客户文件,没有测量智能体诊断结果,也没有执行任何示例代码。
虚构的格式说明 EX-7 规定:
列:id;label
分隔符:分号(U+003B)。
字段可以用双引号(U+0022)包围。
引号字段内部的分号属于该字段。
本次调查只覆盖一条数据行,不包含字段内换行。
出错示例文件 fixtures/quoted-label.txt 的精确内容是:
id;label
x;"North; West"
它表示一条数据记录,其标签为 North; West。相邻的对照示例将该行替换为 x;North West,其中没有字段内分隔符。对照只改变一项相关特征,没有引入真实客户数据。
src/read-export.js 中的相关片段是:
// Excerpt: header parsing and later row construction are omitted.
const expectedFields = headers.length;
const fields = line.split(";");
if (fields.length !== expectedFields) {
throw new Error(
`row=${rowNumber}; expected=${expectedFields}; actual=${fields.length}`
);
}
一份虚构事件笔记记录了消息 row=2; expected=2; actual=3。这条消息是练习的一部分,不是捕获的终端输出。人工阅读表明,按分隔符拆分的位置值得调查,但选择修复前,仍需检查周围的解析器和调用路径。
比较三种材料包
材料包 A:信息太少,无法选择下一项检查
导入坏了。它说列不对。请修复解析器。
这里缺少输入、格式规则、精确消息和代码路径。智能体无法判断是数据行格式错误、分隔符设置错误,还是实现对引号处理不正确。它也不知道怎样才算“修好了”。
缺少的材料很具体。在添加整个仓库压缩包之前,先补上两行示例输入、EX-7、精确错误笔记和相关解析器片段。
材料包 B:足以调查这项边界
问题:据报告,导入 quoted-label.txt 时,第2行数据被拒绝。
预期:遵循 EX-7,得到一条 id 为 x、label 为 North; West 的记录。
输入:上文提供的 quoted-label.txt 精确两行示例。
对照:同样的表头,数据行改为 x;North West。
格式规则:分号分隔;双引号字段内部的分号属于字段。
本次调查不包含字段内换行。
代码:src/read-export.js 中拆分行字段和核对字段数量的片段。
调用方:src/import-report.js 将所选输入文本传给 readExport;
完整调用方和解析器可供只读检查。
环境笔记:虚构 Table Importer 修订版 EXAMPLE-P6;
UTF-8 示例,LF 换行,已选择分号格式。
JS 运行时版本未记录,如与行为有关,需要核对。
事件笔记:row=2; expected=2; actual=3。
执行状态:作为虚构记录提供;此处未运行任何命令。
请求:先调查;说明有证据支持的最小修复。
这份材料包包含提出聚焦问题所需的证据,也承认运行时信息缺失。完整调用方是下一项明确指向的来源,不能假定智能体已经读过。
材料包 C:材料更多,问题却没有更清楚
材料包 B 的全部内容,另外加上:
- 含有数千条无关记录的完整生产导出文件;
- 该账户的完整环境配置;
- 过去一个月的全部应用日志;
- 仪表盘截图和无关的渲染故障;
- 关于未来可能采用某种文件格式的旧对话;
- 全部数据库表清单和所有依赖文件。
对于当前问题,这些新增材料都没有说明诊断用途。它们还可能带入个人信息、凭据和过时假设。不要把它们放进初始材料包。如果聚焦调查发现了编码、配置或依赖问题,再取得那部分范围明确的相关证据。
每一项纳入材料都要有理由
| 材料 | 本次材料包的决定 | 理由 |
|---|---|---|
| 精确的两行出错输入 | 纳入 | 保留分隔符、引号、空格、表头和行边界 |
虚构格式说明 EX-7 |
纳入 | 确立引号内部的分号是有效输入 |
| 精确错误笔记 | 纳入,并标为报告内容 | 把故障与字段数量检查联系起来,不编造堆栈信息 |
| 字段拆分源码片段 | 纳入 | 展示与该数量最直接相关的转换 |
| 调用方路径 | 作为来源指针纳入 | 让智能体核实文本和设置如何到达解析器 |
| 字段内没有分号的相邻输入 | 纳入 | 提供只改变一项相关输入特征的对照 |
| 编码和换行符 | 纳入 | 定义示例的表示方式,不猜测客户文件 |
| 运行时版本 | 标为未知 | 避免编造环境;如果行为依赖它,再取得 |
| 完整生产导出文件 | 初始排除 | 所选边界不需要更多行 |
| 完整环境配置 | 排除 | 任务需要选定设置,不需要凭据或每一个变量 |
| 一个月的应用日志 | 初始排除 | 这些无关事件与选定数据行之间没有已知联系 |
| 仪表盘截图 | 排除 | 可视布局无法解释所展示的解析器转换 |
| 旧的未来格式讨论 | 排除 | 它不是当前需求;混入可能改变预期行为 |
| 依赖文件 | 仅在需要时取得 | 提议引入解析库或检查现有库时相关,但目前还不是扩大材料包的理由 |
决定可以改变。如果在获授权的复现中,最小化示例不再出现报告的问题,不要坚持说它已经足够。沿下一项相关边界与原件比较:编码、引号、换行符、调用方式或配置。将原始证据保留在获准位置,只分享调查需要的内容。
复制这份调查请求
编辑代码之前,调查一个引号内分隔符的导入问题。
需求 EX-7:
文件包含 id;label 两列,用分号分隔。双引号字段可以包含分号。
本例只有一条数据行,不包含字段内换行。
精确输入:
id;label
x;"North; West"
预期解析记录:
{"id":"x","label":"North; West"}
对照输入:
id;label
x;North West
报告的错误笔记:
row=2; expected=2; actual=3
这是一条用于说明的给定记录,不是新的执行结果。
src/read-export.js 中已知的源码片段:
const expectedFields = headers.length;
const fields = line.split(";");
其后的分支在数量不同时抛出错误。
下一步阅读:
完整 src/read-export.js 及其调用方 src/import-report.js。
核实表头处理、引号处理、实际输入转换,以及实际生效的分隔符选择。
明确报告缺失文件。
已知环境:
修订标签 EXAMPLE-P6;UTF-8 示例;LF;已选择分号格式。
没有提供运行时版本或真实复现结果。
范围:
只读调查。不安装软件包、不执行应用代码、不访问生产导出文件、
不改写格式,也不修改文件。
返回:
有证据支持、带文件/符号引用的解释;必要时,给出最小的补充检查;
以及保留 EX-7 的有明确边界的修复建议。
将给定材料中的观察与预测分开。
每请求一项额外材料,都说明它要回答什么问题。
在仍不确定的边界处扩展
如果智能体发现完整解析器已经处理引号,而片段属于未使用的路径,下一项正确材料就是真实调用路径。如果解析器收到经过转换的文本,就检查该转换。如果方案增加或改变某个库,再在那时引入其当前文档和相关依赖文件。
有用的上下文,是支持下一项决定的材料。本例中,示例输入、规则、转换和数量应放在一起。其余材料通过精确引用保留为可取得的来源,直到某个问题确实需要它们。
关于 CueSpec 的会话路由步骤,请参阅确认预期会话。将关键证据放进任务本身或可访问的引用文件,并要求智能体说明它实际读过什么。