Reflection:对照资料检查并修订结果
正在读取学习记录…
1. 什么是结果复核
Reflection 是在初稿形成后,检查结果,再根据检查意见修订。一次复核需要原稿、检查依据、检查结果。答复写“14天内申请退款”,政策写“7天内提交”,检查器就能指出期限差异,修订器再改为7天。
可以把它理解成编辑改稿:作者写完,编辑对照事实和要求看一遍,再给具体意见。“第2句的期限与政策不同”比“再写好一点”更容易执行。
Agent 可以用程序检查数字、字段和格式,用模型或人工检查表达与遗漏。研究中的 Reflexion还会保存反馈供后续尝试使用。先把一次初稿、复核、修订之间的数据流理解清楚,就容易看懂这些扩展。
2. 运行一次有依据的修订
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-reflection" -Force
cd "F:\学习\l3-reflection"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
在新文件夹创建 reflection.py,写入完整代码:
先在 PowerShell 创建并进入学习目录:
mkdir "F:\学习\l3-reflection" -Force
cd "F:\学习\l3-reflection"保存下面的文件后,在这个终端运行 dir 核对文件名,再执行本节给出的运行命令。
"""对照资料检查答复中的退款期限,并做有依据的修订。"""
import json
def review(draft, evidence):
# evidence 是查到的资料;缺少资料时先补充查询。
if evidence is None:
return ["需要退款政策资料"]
issues = []
if draft["days"] != evidence["days"]:
issues.append("期限与资料不符")
if draft["source"] != evidence["source"]:
issues.append("引用来源与资料不符")
return issues
def revise(draft, evidence):
# 创建新答复,保留原稿,方便比较修订前后的变化。
if evidence is None:
return dict(draft)
return {"days": evidence["days"], "source": evidence["source"]}
if __name__ == "__main__":
draft = {"days": 14, "source": "policy"}
evidence = {"days": 7, "source": "policy"}
print(json.dumps({"issues": review(draft, evidence)}, ensure_ascii=False))
corrected = revise(draft, evidence)
print(json.dumps({"answer": corrected, "issues": review(corrected, evidence)},
ensure_ascii=False))ls
python reflection.py输出:
{"issues": ["期限与资料不符"]}
{"answer": {"days": 7, "source": "policy"}, "issues": []}第一行列出初稿的问题。第二行展示修订稿及复核结果,空的 issues 列表表示这两个字段已经与当前资料一致。
review 先判断资料是否存在,再分别比较期限和来源。revise 创建新字典,保留原稿,方便比较改前改后。原稿和修订稿分别存储,也有利于人工审核。
3. 改动期限和来源
把原稿的14改成7,第一行会变为 {"issues": []}。恢复14,再把来源改成 "other",会出现期限和来源两个问题。运行后对照列表中的问题。
最后把 evidence 改为 None,表示政策资料尚未查到。每次保存后运行 python reflection.py,检查意见变为“需要退款政策资料”,修订器保留原稿。下一步先查询资料或请人提供依据,等取得依据后再比较。观察结束后恢复原稿14天、来源policy和7天资料,再运行核对原输出。
4. 保留检查用例
同一目录创建 test_reflection.py:
下面的测试检查草稿与资料的差异,以及修订后能否与证据一致。
测试代码:test_reflection.py
"""检查reflection示例的正常路径和边界结果。"""
import unittest
from reflection import review, revise
class Tests(unittest.TestCase):
def test_fix(self):
draft={"days":14,"source":"policy"}
self.assertEqual(review(draft, {"days":7,"source":"policy"}), ["期限与资料不符"])
self.assertEqual(revise(draft, {"days":7,"source":"policy"})["days"],7)
def test_missing(self):
self.assertEqual(review({"days":7,"source":"policy"}, None), ["需要退款政策资料"])
if __name__ == "__main__":
unittest.main()python -m unittest test_reflection -v测试同时检查正常路径和改变条件后的结果。遇到导入错误时,先核对两个文件是否在同一目录;遇到断言失败时,比较预期值和实际值,再回到相应分支。
5. 为不同问题选择检查依据
| 检查目标 | 检查依据 | 检查方式 |
|---|---|---|
| 退款期限是否相同 | 当前政策字段 | 程序比较数字 |
| 是否回答金额问题 | 用户问题和答复 | 规则或模型检查 |
| 引用是否支持结论 | 原文片段及位置 | 资料对照 |
| 解释是否易读 | 句子与读者背景 | 编辑试读 |
| 退款是否到账 | 支付回执和状态查询 | 业务查询 |
检查器需要输入。只给初稿,能做措辞和内部一致性检查;核对外部事实时,需提供当前资料。若政策更新为14天,先更新查询结果,再检查原稿。资料还可保存文件编号、段落位置和版本,帮助读者回查。
6. 控制复核次数与反馈质量
一轮修订后仍有问题,可以再复核一次,同时比较问题是否减少。连续两轮意见相同,就检查修订器是否读取了意见、资料是否缺失。可设置“检查通过、达到预算、重复无进展”三个出口。编辑改稿也要下班,循环一样需要出口。
模型检查意见适合返回具体字段、原值、建议值和依据。程序先验证建议格式,再应用修订,保留改前改后版本。低风险文字整理可以自动复核;金额、权限和写入结果更适合明确字段校验与业务确认。
沿两轮检查,看每个字段怎样变化
| 时刻 | 原稿期限 | 资料期限 | 检查意见 | 下一动作 |
|---|---|---|---|---|
| 初稿形成 | 14 | 7 | 尚未检查 | 执行review |
| 第一轮复核 | 14 | 7 | 期限与资料不符 | 执行revise |
| 修订形成 | 7 | 7 | 尚未再次检查 | 执行review |
| 第二轮复核 | 7 | 7 | 空列表 | 返回修订稿 |
这个表里的数字来自同一份输入。复核器先读取原稿与资料,比较后产生意见;修订器读取资料,构造新结果。把检查意见和修订稿分别保存,可以发现“有意见但稿件没改”的程序问题。
增加检查字段时,要先明确依据。假如答复还包含退款金额,可以让资料提供amount,再比较两个数。语气友好则没有唯一数值,可列出可观察要求,例如先回答期限、再说明例外,最后给查询入口。把要求写具体,人工和模型检查才容易达成一致。
如果两份政策冲突,先整理来源与适用时间,再确定当前订单使用哪份;多做几轮语言改写无法解决资料选择。此时复核的产物可以是“待核对的差异列表”,等待有权限的人确认依据。
回顾与下一步
准备依据,检查差异,按意见修订,再次核对。下一篇 终止条件把复核的出口与整个任务的停止规则连接起来。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“Reflection 与结果复核”,哪种做法更稳妥?
对应知识点:L3-reflection
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L3-reflection
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L3-reflection
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L3-reflection
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。