作者在用LLM重写研究摘要的开发循环中,因reviewer认证过期,意义检查被静默跳过,所有测试看似通过实则无效,暴露了自动化质量检查的脆弱性。
本文面向希望将开发循环引入自己写作(而不仅仅是代码开发)的开发者和写作者。这是一个重写文本同时观察测试是否通过的循环。有三个要点。第一个是筛选标准:去掉那些在不查看上下文的情况下强制执行时会误判的检查。第二个是一种三值设计,将无法运行审查的状态与质量的通过/失败判断分开。第三个是一个失败案例:当时对每个断言都不加区分地判定失败,导致文本充满了回避性表述,没有任何主张能够成立,我是如何修复的。材料是这一机制在一个研究摘要和研究操作的代码仓库中运行两周多的操作记录。
写代码时,测试在写完的瞬间就会返回通过或失败。这一次的主题是:这种开发循环能否也被引入长的自然语言文本,比如论文、规范和提案。我的目标是研究摘要。测试定义存在于 YAML 中,构建在 pytest 之上的测试运行器通过参数化将一个条目展开为一个测试,一种重写直到测试通过的工作方式已经开始成型。
让我先说明一点:这些测试不是代替我写作的工具。我只是把我实际对摘要所做的评论逐一转化为规则,然后再转化为检查,所以机器能复现的只是那些过去的评论,决定写什么仍然是作者的工作。
有一条单一的轴线,将我丢弃的检查与我保留的检查区分开来。我丢弃了那些即使在孤立地强制执行而不查看上下文时也会误判合法用法的检查;而我保留了那些不会误判的检查,因为被检查的值——比如字符数或出现次数——可以携带一个范围。最初我只设置了僵化的、强制风格的检查:强制单句长度、严格强制段落数量、在孤立地不查看上下文的情况下拒绝禁用词。但它们甚至会误判那些只有在有上下文之后才有意义的写作,并且剥夺了写作的自由,所以在构建一次之后,我把它们从运行器中移出,并作为旧实现删除了。
这种筛选的基础是一项政策:不假定论文的评估可以仅由确定性检查来承担,而是要重视对意义和逻辑的判断。我只将那些可以不查看上下文就能判断的项目——比如排除空白和排版命令的字符数范围、某个指定词是否存在、正则表达式匹配及其计数——移到作为运行器内部本地函数实现的确定性检查中,而将意义、逻辑和章节结构的一致性留给通过 CLI 调用 LLM 作为审查者的那一层。快速而廉价的判断交给确定性检查,需要上下文的判断交给审查者,两者共存于同一个运行器中。
我给审查者一个固定指令:只使用我给出的标准来判断通过或失败,列出每一个违规且无遗漏,并将响应强制转换为判断、位置和原因的结构化数据。这样做是为了防止在逐个指出违规的过程中修复工作拖得太长。当排版反斜杠混入响应时,解析结构化输出会失败,所以我还添加了一个步骤来纠正它们并重新运行解析。
三值中的第三个值——error,指的是由于认证过期、超时或响应解析失败而导致审查者根本无法运行的状态。我将其与文本的质量判断分开,不将其混入 fail。如果失败增加而我无法判断问题是出在文本上还是基础设施上,这个循环就失去了它的用途。这是我的观点。
实际上,我遇到了一次事故:审查者的认证过期了,每个审查者都被作为错误跳过,尽管测试看起来都通过了,但意义检查一次都没有运行。这一点变得明确的教训是:即使所有测试都通过了,也不能推断意义检查实际上已经运行了。
在判断的各个维度中,断言的处理需要最多的调整。在我无差别地失败任何没有考虑观察规模就做出的断言的那段时间里,文本变成了满是回避性表述,没有任何主张能够成立。所以我把观察到的规模——比如多少人、多少案例——放入了审查者的指令中,只失败那些超出该范围的概括,并重新设计使得在范围内的合理断言能够原样通过。与此同时,在失败时我总是让审查者告诉我究竟是哪种情况:是措辞上的修改就足够了,还是我应该回去收集数据。
为了抑制审查者的方差,我实现了这样的机制:如果第一次运行通过就停止在那里,只有在不是通过的情况下才再判断两次,然后对三次运行取多数票。尽管如此,这是一个偏向速度的折中方案,我没有测量过在最多三次尝试中获得相同判断的可重复性对于实际使用是否足够好。我确实看到有人指出,单次审查者运行在判断上有方差,稳定的共识需要反复尝试,但我还没有能够确认所需尝试次数的主要文献。关于尝试次数的问题,我现在只能说是在速度和可重复性之间取得了平衡。
从介绍到实际可用本质上花了两天,在那之后的大约两周里,我根据关于如何写论文的主要文献和根据我自己的反馈逐步添加了检查。因为按章节的检查会遗漏章节之间的空白,后来我还添加了一个全篇测试,读取所有章节以查看是否有一条线索从问题贯穿到结论。
我也决定了运行的分界。只有确定性检查每次在 CI 中自动运行,而处理意义判断的审查者保留在我手动运行的循环中。我在一个摘要上构建了这个机制,并将其扩展到了不同主题的摘要上。
现在我已经运行到了这一步,机器能承担的范围已经显现出来。机器能做的仅止于作为供判断的材料——那些我反复做出的评论。测试驱动的工作是否提高了摘要本身的质量,我无法断言,因为我还没有关于失败次数如何随时间变化的主要数据。这就是运行它所能揭示的范围,对于工具的效果,我拒绝声明超出这个范围的东西。
可以留给机器的判断和只能由人做出的判断之间的界限,肯定会从这里继续移动,我能移动多远,是我想要在继续运行这个操作的过程中弄清楚的。
最初发表于 The Future of Humans, AI, and the Web,该站点记录了由人类和 AI 对我的研究和开发进行的分析和评价。