Skip to content

fix(refine): 改写内置 AI 预设的润色提示词,不再遗漏口述里的要求、条件和例外 - #226

Merged
sunerpy merged 2 commits into
mainfrom
fix/refine-prompts
Nov 7, 2026
Merged

sunerpy merged 2 commits into
mainfrom
fix/refine-prompts

Conversation

@sunerpy

@sunerpy sunerpy commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

审视并改写内置 AI 预设的润色提示词,让润色结果不再遗漏口述里的诉求(要求、条件、限制、列举项、例外、数字和专有名词),每个预设的用途不变。改动前后的效果用一次性的手动评测集在 Amazon Bedrock 上验证,模型与内置服务相同。

清单与处理

位置 处理 修改前评测发现的问题
校对 改写 「三十天不对是四十五天」原样留着;路径里留着「斜杠」;tsc杠杠strict 写成 tsc //strict;型号丢位、证券代码多位;口述的安装步骤被改成列表
提示词优化 改写 丢背景(下周、给客户、二十分钟);丢「不需要后端」;直接列出了十个名字;把提问改成「请帮我判断……」
意图整理 改写 例外被拆成单独一项
口语聊天 改写 改口前的时间留在结果里
中英互译 改写 改口前后两个时间都译出;「下个版本」译成「未来某个版本」
要点纪要 改写 编造负责人;「涨了百分之十五」写成「十五个百分点」;改口把负责人对调
只加标点 不改 修改前两个模型都没有遗漏;它要求一字不改,加规则只会让模型更想改字
书面语 改写 「提前一天预约」变成例外的条件;「需要准备投影仪」改成了提问
6 个带补充要求的内置场景(编程开发、办公写作、法律、医疗、金融、学术) 不改 场景样例的遗漏都来自它们使用的预设(校对、书面语),已在预设里修正;已有用户的 scenes.json 保存着补充要求的文字,改场景模板只影响新安装和「恢复默认」
即时聊天场景 不适用 没有补充要求,按口语聊天预设测
输出约定、语言一行、应用上下文、场景要求、用户词典这几段共用提示词 不改 没有找到由它们造成的遗漏;输出约定也接在用户自定义预设后面

每条新规则由 presets.rs 的新测试 each_preset_keeps_every_part_of_what_was_said 锁定。内置预设的正文在请求时从代码取,已有用户升级后直接用新提示词;以前「复制为自定义」的预设保留复制时的文字。站点「AI 润色与预设」页的预设表中英文同步更新。详细说明见 docs/refine-eval.md「2026-11-07 的修改」。

修改前后的遗漏

86 条合成口述样例、315 个要点,覆盖 8 个内置预设和 6 个带补充要求的内置场景;每条样例每个模型生成 3 次。判定模型是 us.anthropic.claude-opus-5-5,同一条样例修改前和修改后的结果放在同一次判定里,顺序打乱,不注明来自哪一版。

模型 遗漏(修改前 → 修改后) 违背用途 每个预设和场景
openai.gpt-oss-120b-1:0(主) 28 → 2 22 → 11 都不多于修改前
openai.gpt-oss-20b-1:0(候补) 45 → 26 36 → 15 都不多于修改前

主模型仍有遗漏的两条样例(prompt-03 改口落在例外里、prompt-08 省掉「不需要后端」,各是 3 次里 1 次)和候补模型的剩余遗漏,原因都写在报告里。人工抽查 40 个要点:判定模型决定的 25 个全部与人工一致;机械检查与判定共同决定的 15 个,最终结果全部一致。完整报告:docs/refine-eval/report.md。

评测只手动运行,CI 只检查提示词有没有改

  • 评测用 make refine-eval 手动运行(说明见 docs/refine-eval.md),不在 GitHub Actions 里运行,也不在 make verify 里。scripts/verify-all.sh 新增的 refine-eval-helpers 只跑评测脚本的离线单测,不发送请求。
  • 评测按应用实际发送的内容组装请求:crates/voltip-refine-eval 调用新的 voltip_refine::refine_request,测试保证它与 RefineClient::refine_with 发出的请求体逐字节相同;脚本只把模型名换成 Bedrock 的。
  • docs/refine-eval/prompt-digests.json 记下最近一次评测测量的每个预设和场景的请求摘要。crates/voltip-refine-eval/tests/record.rs 的 the_last_evaluation_measured_the_prompts_the_app_sends 在 CI 里重新计算摘要,预设、场景要求、共用提示词、术语包、请求参数或样例改过而没有重新评测时失败,并写明变了哪些单元、要运行 make refine-eval。

调用次数与花费

全部运行合计 2656 次 Bedrock 调用(gpt-oss-120b 1016、gpt-oss-20b 1014、判定 626,失败 0 次),按 2026-11 的公开价估算约 9.03 美元,其中判定 8.74 美元。另有 4 次确认调用权限的探测,花费可忽略。评测没有调用内置服务。

验证

  • make verify:变基到 f0001e28 没有冲突,IPC 契约夹具没有变化;本 PR 的 head c75b334a 上 overall_exit=0(dirty_paths=0,23 个门禁全部通过,Rust 行覆盖率 92.93%)。
  • Windows 原生:cargo clippy --workspace --all-targets -- -D warnings 通过;cargo test --workspace --all-targets 只有与本改动无关、此前已登记的两处失败(voltip-relay --test socket、voltip-transport --test link),voltip-refine 56 个、voltip-refine-eval 12 个测试都通过。
  • 检测确实生效:临时把口语聊天预设或法律场景的补充要求改一个字,record.rs 的测试失败并提示运行 make refine-eval;恢复后通过。把预设文字换回修改前、保留新测试,each_preset_keeps_every_part_of_what_was_said 失败。

需要在真机上确认

评测直接调用 Bedrock 上的同系列模型,没有经过内置服务。下面这些在真机上用内置服务各说一两次即可:

  • 电脑,提示词优化:一段带背景、条件、「不要用 A,用 B」和一个例外的需求,每一点都写进结果;「你觉得……可行吗」这类提问保持为提问,不被回答。
  • 电脑,校对:「跑一下 docker compose up 杠 d」写成 docker compose up -d,「git 杠杠 version」写成 git --version;「三十天不对是四十五天」只留「四十五天」。
  • 电脑,要点纪要:原文没说负责人时不出现负责人;说到要做的事仍列在「待办:」下。
  • 手机:用任意一个预设说一次,润色正常。

校对、提示词优化、意图整理、口语聊天、中英互译、要点纪要和书面语七个内置预设改写:
口述里的每一点都保留,包括背景、条件、偏好、限制(「不要」「不需要」「……就行」)、
例外、数字和名称;改口只保留改口后的说法,只换掉改了的那部分;不编造负责人,不换算
数字;提示词优化把真正的提问整理成问句,用问句说的请求仍整理成要求,不回答、不执行。
只加标点不改。每条新规则由 each_preset_keeps_every_part_of_what_was_said 锁定。

修改前后的效果见同一分支上的评测(docs/refine-eval/report.md)。
voltip-refine-eval 按应用的做法组装每条样例的润色请求(voltip_refine::refine_request,
与 RefineClient::refine_with 发出的请求体逐字节一致),scripts/refine-eval 在 Amazon
Bedrock 上用内置服务的模型(gpt-oss-120b,候补 20b)生成结果,由判定模型配对判定修改前后
的结果,写出 docs/refine-eval/report.md。86 条合成样例、315 个要点,覆盖 8 个内置预设和
6 个带补充要求的内置场景。评测只通过 make refine-eval 手动运行,不在 CI 和 make verify 里。

修改前后(每条样例每个模型生成 3 次):120b 遗漏 28 → 2,20b 遗漏 45 → 26,每个预设和
场景都不多于修改前。

docs/refine-eval/prompt-digests.json 记下最近一次评测测量的每个单元的请求摘要;
record.rs 的测试在 CI 里重新计算摘要,提示词、场景要求、术语包、请求参数或样例改过而没有
重新评测时失败,并写明要运行 make refine-eval。
@codecov

codecov Bot commented Nov 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.43750% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
crates/voltip-refine-eval/src/lib.rs 97.88% 6 Missing ⚠️

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #226      +/-   ##
==========================================
+ Coverage   93.51%   93.54%   +0.02%     
==========================================
  Files         482      483       +1     
  Lines       83995    84354     +359     
  Branches     4899     4899              
==========================================
+ Hits        78551    78910     +359     
  Misses       4775     4775              
  Partials      669      669              
Flag Coverage Δ
rust 93.78% <98.43%> (+0.03%) ⬆️
web 92.37% <ø> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
crates/voltip-refine/src/client.rs 99.31% <100.00%> (+0.02%) ⬆️
crates/voltip-refine/src/presets.rs 94.73% <100.00%> (+1.59%) ⬆️
crates/voltip-refine-eval/src/lib.rs 97.88% <97.88%> (ø)

... and 13 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@sunerpy
sunerpy merged commit ba17069 into main Nov 7, 2026
39 of 43 checks passed
@sunerpy
sunerpy deleted the fix/refine-prompts branch November 7, 2026 12:25
@github-actions github-actions Bot mentioned this pull request Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant