examples: add auditable evaluation optimization loop - #244
Conversation
Add an auditable baseline, optimization, replay, and gate pipeline with offline fake and trace modes.\n\nFixes trpc-group#91
AI Code Review很好,预期内容已填充。现在我有足够的上下文了。让我把剩余特定的担忧整理一下。让我再重新检查一个关键问题: 现在让我检查一个真正的正确性问题:在 等等——在 现在关键点是: 现在让我检查一个隐蔽的 Bug: 现在让我看看 让我再检查一下 现在检查 让我再验证一下 现在,让我验证一下关于 让我检查 现在让我检查 关键审查项: 我深入看一个潜在的真实 Bug: 现在让我核实一下 README/DESIGN 中关于 现在看 让我看看一个真正令人担忧的区域: 现在, 现在让我核实最具体的怀疑点——候选评估提示词的恢复以及测试。让我读一下流水线测试第 2781-2786 行。确实,它断言的是源文件未改变。由于源文件从未被修改,该测试是通过的,但没有验证恢复逻辑。中等价值的警告。 我还想检查 现在看 让我核实一下是否存在路径遍历/注入问题。 现在让我看看报告的 markdown 文件权限 让我最后检查一个正确性问题: 现在看 我认为主要的发现是测试有效性的警告。我还要确认 但等等—— 现在让我核实一下是否存在关键问题: 让我看看一个真正可疑的地方: 现在,关于 实际上,失败运行返回 0 是有问题的:用户无法通过退出代码检测流水线是否失败。设计预期是报告驱动的,但从 CI/脚本角度来看, 让我完成最终确认。## 发现的问题 🚨 Critical
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #244 +/- ##
==========================================
Coverage ? 88.18123%
==========================================
Files ? 482
Lines ? 45157
Branches ? 0
==========================================
Hits ? 39820
Misses ? 5337
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
| write_back=args.write_back, | ||
| ))) | ||
| print(f"{result.report.status}: {result.json_path}") | ||
| print(result.markdown_path) |
There was a problem hiding this comment.
管线失败时 CLI 仍返回退出码 0
run_pipeline 把所有异常吞为 status="REJECTED" 报告,而 main() 对 ACCEPTED/REJECTED 一律 return 0。真实模式崩溃、输入缺失、优化器异常等都以退出码 0 退出,CI 无法据退出码判定失败。建议对 _failure_result 产生的报告或含 failures 的 REJECTED 返回非零退出码。
AI Code Review我已经完成了审查,以下是我的审查结论。 发现的问题🚨 Critical
|
| model_name=options.model_name, | ||
| num_runs=1, | ||
| case_parallelism=options.case_parallelism, | ||
| python_version=platform.python_version(), |
There was a problem hiding this comment.
报告写入早于源回写,source_updated 恒为 false
_run_pipeline 先调用 write_reports(此时 source_updated 仍为构造时的 False),之后才执行 _maybe_write_back 并赋值给 report.source_updated。导致落盘的 optimization_report.json / .md 始终记录 source_updated=false,即使 --write-back 已实际改写源 prompt,审计闭环失真。修复方向:先执行 _maybe_write_back 得到 source_updated 再 write_reports,或回写成功后重写报告。
AI Code Review我已经审查了完整的 发现的问题
|
AI Code ReviewThe sandbox is blocking these commands. Let me just review the longer lines I've already seen visually. I have enough context now. Let me check a couple of the longer lines I noticed:
Let me verify the Looking at def _fake_judge_score(runs):
scores = []
for run in runs:
actual = _invocation_snapshots([run])[0]
expected = _invocation_snapshots([run])[1]
scores.append(float(bool(actual and expected and actual[0].final_text == expected[0].final_text)))
return _mean_optional(scores)
Now let me finalize the review. Let me verify the Let me check one more potential issue: the Now let me also verify: in Let me write the final review. Based on my thorough analysis, here is my review: 发现的问题🚨 Critical无。
|
AI Code Review审查完成。已读取 发现的问题
|
AI Code Review这确认了 现在让我验证一下最重要的担忧:转储的 config 包含 但这有一个实际的细微差别: 现在让我检查一下 PR 没有暴露的 让我检查最后一个真正的担忧: output.extend(part.text or "" for part in event.content.parts or [] if not part.thought)运算符优先级: 现在让我看看是否有实际的 Bug。让我重新检查 现在有一个真正的问题:在 让我检查候选评估 + 优化器之间的交互:优化器以真实模式运行真实评估,该评估会修改提示词工作副本。 如果 现在让我汇总实际的审查发现。让我重新检查 再检查一下 —— 现在让我仔细审视一个真正的正确性顾虑: 让我检查一下 现在是我想要确认的真正 Bug:在 但有一个细微的问题:如果 现在让我做最后的总结。让我重新检查一个看起来确实有问题的地方: 让我重新考虑安全问题: 现在, 让我检查测试 现在让我验证一个真正的问题: 我已经进行了彻底的分析。现在让我识别出真正值得报告的问题。老实说,这段代码相当健壮。让我重新考虑一下到底有没有什么实际的 Bug。 让我重新检查 hard_failure = not runs or scores.get(primary) is None or metric_not_evaluated or any(
run.final_eval_status == EvalStatus.NOT_EVALUATED or run.error_message for run in runs)
if fake_judge and scores[primary] is not None:
statuses[primary] = (...)
passed = scores[primary] >= primary_threshold
passed = passed and not hard_failure当 这感觉不是个 Bug。设计使然。 让我考虑一下是否存在并发/异步问题。 等等 —— 这里有一个潜在的真正问题: 我现在相当有信心代码是正确的。让我寻找真正可以报告的项目 —— 顶级的真正问题。 再检查一次 —— async def _evaluate_pair(prompt_path: Path, bundle: InputBundle, options: PipelineOptions, phase: str,)调用: 现在 让我检查一下是否存在未使用的 让我看看** 让我验证最后一个真正的担忧:示例 现在,让我做出最终决定。老实说,我没有发现明确的“Critical”问题。让我重新考虑值得提出的“Warning”级别的问题:
等等,实际上这里有一个细微的问题:在
实际上,这是一个合理的警告:在早期输入验证之后发生的流水线故障会丢失已计算的输入哈希和部分审计跟踪。但报告仍然会被写入。问题不大。
让我重新考虑什么才是真正有影响力的。让我检查** 现在让我检查最后一个真正的问题 —— 好的。让我做决定。我认为没有明确的 Critical 问题。有几个值得提出的 Warning 级别问题。让我把最重要的几个整理出来。 实际上,让我重新审视一个看起来确实是真正 Bug 的问题: 当 当 现在确实有一个微妙的情况: 好的,让我检查最具体的一个问题: 让我再验证一个 —— 我相信没有 Critical 问题。让我检查测试 很好 —— 证实了正确性。现在让我写下审查意见。我将报告几个 Warning 级别的项目,它们是真实存在且可定位的。 让我再重新考虑一下 让我再重新考虑一下 还有一件事 —— 在 让我重新考虑是否存在重复回写风险: 最终决定。让我再验证一个潜在的实际问题 —— 好的,让我写下审查意见。我将报告:
实际上,让我重新考虑权限那个问题 —— 提示词“IP”仅仅是系统提示词“你是一个支持队列分类器”(3 行)。并不敏感。报告中的 让我重新考虑在上下文中什么才是真正有价值的。查看指令:仅报告可验证的问题。不要堆砌低价值的建议。要直接。 让我重新考虑 让我验证在失败路径中 bundle 是否确实可用 —— 在 这确实是 diff 中的一个真正问题。Warning 级别。 让我也重新考虑一下: 让我再检查一次,看看是否有我可能遗漏的真正正确性 bug。让我看看 现在确实有一个潜在的真正问题:在真实模式下, 我认为代码很稳健。让我最后确定警告事项。为了彻底起见,让我通过检查 SDK 对 让我写下审查意见。 实际上,让我重新考虑一个我想确认的真正问题: 但这里有一个细微之处: 好的,我很有信心。让我写审查意见。 鉴于稳健性,我将报告:
让我重新考虑一下是否还有第二个真正的问题。让我重新检查 让我重新考虑指令:“如果没有发现明确问题,请直接说明”。但我确实发现了一个真正的问题( 让我再重新考虑一下这是否真的是一个“问题”,还是可接受的示例行为。DESIGN.md 明确指出审计字段(时间戳、git sha、python 版本)仅用于展示。输入哈希也是如此吗?DESIGN.md 说“报告 JSON/Markdown 保存输入 hash”。因此,输入哈希是预期交付的一部分。在失败路径中,它们被清空了。对于一个强调审计性和可重复性的示例,失败报告应该仍然包含输入哈希(在失败前已计算)。这确实是一个缺陷。Warning。 我将最终确定。I have thoroughly analyzed the diff and verified the key SDK call sites ( 发现的问题
|
AI Code Review发现的问题
|
|
@codex review |
这次做了什么
这个 PR 新增一个可审计的 Evaluation + Optimization 闭环示例,把
AgentEvaluator、AgentOptimizer和TargetPrompt组合起来,用训练集发现问题,用独立验证集判断候选 Prompt 是否真的可接受。示例覆盖 baseline 评测、失败归因、Prompt 优化、候选评测、Gate 判定、结构化报告和可选写回。默认 fake-model 模式不需要真实模型 API Key;trace 模式可以用预录制数据做离线回归;real 模式支持真实模型和显式
--write-back。Fixes #91
整体流程
flowchart LR A[Source Prompt] --> B[训练集 Baseline Eval] A --> C[验证集 Baseline Eval] B --> D[失败归因] D --> E[AgentOptimizer 生成候选 Prompt] E --> F[训练集 Candidate Eval] E --> G[验证集 Candidate Eval] C --> H{Gate} F --> H G --> H H -->|通过| I[接受 Candidate] H -->|拒绝| J[保留 Baseline] I --> K[可选写回 Prompt] J --> L[JSON / Markdown 报告] K --> L为什么这样设计
Prompt 优化不能只看训练集是否变好。一个候选 Prompt 可能修复训练失败,但同时引入验证集回归、关键 case 失败、成本上升或执行时间异常。
因此这个示例把训练和验证拆开:
示例能力
示例包含三条训练 case 和三条验证 case,覆盖:
报告会记录 baseline / candidate 分数、单 case delta、失败归因、Gate 决策、成本、耗时和复现元数据。Prompt 源文件只有在 real 模式显式开启
--write-back且候选通过 Gate 时才会更新;fake/trace 模式会拒绝写回。运行方式
默认离线运行:
real 模式读取
TRPC_AGENT_API_KEY、TRPC_AGENT_BASE_URL和TRPC_AGENT_MODEL_NAME,也可以用--model-name覆盖模型名。验证结果
建议重点 Review
希望维护者重点关注:
Release Notes
新增一个可审计的 Evaluation + Optimization 示例,支持离线回放、Prompt 优化、回归 Gate、可选写回和结构化报告。