跳到主内容
创建时间:最后更新:作者:白川

通过评估改进提示词与上下文

从失败提出假设,分别调整指令与信息组织,用保留任务验证改进是否泛化。

通过评估改进提示词与上下文

任务失败后不断追加“务必认真”“必须正确”,会让提示变长,却没有说明哪里缺少信息。调优应从失败证据提出可验证的假设,再改变对应部分。

如果报告总带代码围栏,先检查格式要求是否明确;如果模型没有读文件,先检查是否说明必须依赖实际工具结果;如果长历史中漏掉约束,则需要检查信息选择与保留,而非继续重复同一句话。

独立示例位于仓库 columns/coding-agent/examples/evaluation-optimization/,固定 Pi 相关依赖为 1.5.0。先在该目录执行 npm install,下文命令也从此处运行。离线样本不需要密钥;真实模型入口另行配置,不会由测试自动触发。

把修改写成可比较的配置

src/variants.ts 定义三个独立实验。选择 prompt 时只改变系统提示,选择 tool 时只改变工具描述,选择 context 时只移除无关练习资料。

ts
export type Experiment = "prompt" | "tool" | "context"
const prompt = "使用工具完成用户任务。检查报告包含 file、status、names 三个字段。"
const clearPrompt =
  prompt +
  "需要检查文件时先调用 inspect_file,再依据真实结果回答。" +
  "只匹配命名 function 声明,不把箭头函数当匹配,不推断安全性。" +
  "报告必须是纯 JSON,不加代码围栏;无需检查时遵循用户要求,不调用工具。"
const tool = "检查教学文件,返回 file、status、names。"
const clearTool =
  "读取允许的教学文件,返回命名 function 声明的名称。" +
  "参数 file 是白名单文件名;不存在时 status=missing;正则不分析箭头函数、注释和安全性。"
const noise = "练习资料:这个练习不涉及界面主题、按钮配色、营销文案或部署。\n".repeat(10)

export function variantConfig(experiment: Experiment, variant: "baseline" | "candidate") {
  const changed = variant === "candidate"
  return {
    systemPrompt: experiment === "prompt" && changed ? clearPrompt : prompt,
    toolDescription: experiment === "tool" && changed ? clearTool : tool,
    context: experiment === "context" && !changed ? noise : "",
  }
}

两组 prompt 都给出报告字段,candidate 进一步说明证据、能力范围和纯 JSON 输出。这里提出的是“明确约束可能减少误用”的假设,还没有真实模型分数证明它更优。

context 试验只删无关文本,不替模型补上 expected 名称。它是最小噪声干预,不代表已经实现长会话压缩、检索或记忆。需要评估这些机制时,应另外构造任务,检查关键证据是否被保留。

先看失败类型,再选择动作

失败证据调整假设必须同时检查
结果带多余格式
输出契约不清
其他任务是否需要解释
没读文件就下结论
证据要求不足
不需工具的任务仍不能误调用
箭头函数被误报
能力范围未说明
工具实际实现是否与描述一致
关键信息被噪声淹没
上下文选择不当
删除后有没有损失必要条件
历史压缩后忘记约束
保留策略失效
后续多轮任务,不只测当轮摘要

提示不能修复工具错误实现;明确说“准确扫描所有函数”也不能让正则变成编译器。先区分指令、数据和业务能力边界,再决定是否改提示。

开发集用于调,保留集用于检验

阅读失败轨迹、改配置、重复运行开发集是必要过程。问题在于把某份保留集的具体答案写进提示,再继续把它称为独立验证。

记录任务集与配置版本,新增任务时维护来源和标签。小样本可以帮助发现明显问题,但不能保证真实项目的文件规模、依赖、语言和会话长度都得到覆盖。四个教学用例必须明确保持其范围。

Skill 和上下文也能作为实验因素

Skill 说明、项目规则和工具结果都可能影响下一步行为。可以对比“有无任务流程说明”,但要记录发现路径、实际展开内容与活跃工具,避免把加载失败当作说明无效。

上下文工程的官方讨论强调关注实际可用信息,不只是提示措辞。本篇采用这个分析方向,不据此推断 Pi 已自动具备某种检索、压缩或记忆策略。

比较得失后再保留改动

bash
npm run eval:live -- prompt 1
npm run eval:live -- context 1

两条命令是独立实验,不应将其不同任务时刻的分数混成同一次对照。记录改善、退步、波动和指标缺失;若没有观察到收益,也应保留这项结论,而不是只换说法宣布“提示已经优化”。

依据与版本

官方本地快照为 8efd314fa,evals 包标记 1.3.0;本系列示例另按发布包 1.5.0 核验。官方 evals 是 private 工作区包,教程使用自定义教学协议,不冒充稳定公共评测 SDK。