给编程智能体足够的调试上下文,不必把一切都塞进去

使用 AI 辅助编写与复核。

本文目录

给调试智能体的材料,应足以区分下一步几个合理的解释:出错输入、预期行为及其依据、相关环境,以及把输入与故障连接起来的代码或日志。根据材料能回答的问题,选择是否补充。没有固定的理想材料包大小,上下文更短也不自动意味着更好。

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 的会话路由步骤,请参阅确认预期会话。将关键证据放进任务本身或可访问的引用文件,并要求智能体说明它实际读过什么。