LangChain Blog更新于

Numan 如何使用 LangGraph 和 LangSmith 构建评估优先的 AI 健康教练

英国数字健康公司Numan分享了基于LangGraph图架构(监督者协调领域专家子代理)和LangSmith构建AI健康教练Nu的评测实践。他们发现单轮静态评测和脚本化多轮对话均失效,改用按类别打分的主题数据集、图内安全守卫节点、每日人工抽检,以及用更廉价模型扮演患者的仿真多轮评测来探测越狱场景,并强调评测标准需临床医生签批后才能作为发布门槛。

Nu responding to an out-of-scope question with a safe-completion
配图来源 · LangChain Blog

Numan 是一家英国数字健康公司,帮助患者管理体重、激素和性健康方面的长期状况。我们的许多患者正在参加减重计划,并每天使用该应用来追踪进展。

在构建我们的 AI 健康教练 Nu 时,我们的设计挑战之一是在不越界进行医学诊断、开处方或做出临床决策的前提下提供高质量的健康教练服务——这些都是我们高度受监管的医疗领域中 Agent 的严格边界。虽然我们最初专注于 Agent 及其周围的自动化,但最终最重要的却是我们评估标准的质量。这就是我们如何开发和改进评估标准,以在提供高质量用户体验的同时避开受监管领域的故事。

标准评估方法为何在 Nu 上失灵

我们从大多数团队的起点开始:一个包含输入和预期输出的数据集,以及一个为每条回复打分的 LLM 裁判。虽然这套打法对问答 Agent 效果很好,但教练服务是一场对话,而不是一个答案。每一种预先固定 Nu 回复的方法都以两种方式失败了:

1. 基于静态样本的单轮评估 (一个固定的输入、一个固定的预期输出,以及一个为单条回复独立打分的裁判)。行为教练很少对某个提示只有一个正确答案,而一条回复是否安全也取决于其周围的对话。Nu 需要在一整段对话中理解患者的障碍所在,然后才提供建议,并在患者推进时守住正确的边界。

对整个数据集取单一分数的平均值掩盖了 Nu 失败的地方。少数糟糕的回复几乎不会改变数字,因此对话看起来合规,实际上并非如此。固定样本还导致了第二个问题。在一次运行中,一组低分结果证明是评估本身的问题,而不是 Nu 的问题。评估标准要求在两轮交互中同时展现同理心、探索 和 建议,而人类教练会在整段对话中逐步安排这些内容。Nu 的教练方式其实是正确的,但狭窄、固定的评估却错误地给出了失败信号。

2. 脚本化的多轮对话。 针对单轮固定样本的显而易见的解决办法,是预先写出患者预期的一系列回复。有了这个"脚本",将一个场景的若干轮对话逐一喂给 Nu,裁判便可在最后为完整对话记录打分。虽然这给了裁判比单条回复更大的空间,但评估仍以同样的方式崩溃。当患者的第二轮回复是预先写好的时,测试就忽略了 Nu 在第一轮实际说了什么。一旦 Nu 说出脚本没有预料到的内容,之后每一轮都是在回复一段从未发生过的对话。

这 2 种失败模式塑造了我们此后构建的一切。

我们如今运行的评估框架

Nu 是一个 LangGraph 图。一个监督者模型负责协调到领域专家子 Agent 的交接,每个子 Agent 专注于一个教练领域,拥有自己的提示词和工具。这种组合模型使得新增一个专家的成本很低,更重要的是,它让评估面在所有专家之间保持统一。

Nu 必须做对的某些事情 是 可以从单条回复中判定的。例如,监督者是否路由到了正确的专家、药物问题是否得到了安全的回答,或者安全防护是否捕获了它应该捕获的内容。针对这些,我们运行了涵盖教练质量、安全、药物查询、路由和摘要的主题数据集。与我们最初的单轮评估不同,我们改变了两个地方:1) 每个数据集都由 LLM 裁判按类别打分,而不是取一个平均值,因此即使其余类别看起来健康,某一类别中的一组失败仍然可见。2) 每条评估标准只询问单条回复能够体现的内容,因此裁判不再因为 Nu 像教练那样安排对话节奏而惩罚它。

固定样本无法覆盖的一切(即需要完整对话形态的内容)都有各自的专属层级,如下所述。因为 Nu 是一个图,评估可以针对整个系统或单个子 Agent,而新专家会自动继承这个评估面。

"我们发布的东西就是我们测试的东西"

构建评估的简单方法是使用一个单独的测试工具,复制 Agent 的提示词并直接调用模型……但一旦测试工具与生产环境发生漂移,它就会失效。我们没有单独的测试工具,而是遵循一条原则: 我们发布的东西就是我们测试的东西。每次评估都通过与患者对话的同一个 LangGraph 图来运行,因此我们打分的对象就是患者所面对的对象。

随着规模扩大,我们开始思考是否应该为每个 Agent 使用同一个提供商,因为监督者和领域专家执行的是不同的认知工作。Nu 如今运行在两个前沿提供商之上,按 Agent 分别选择:监督者用一个,专家们用另一个。由于我们的评估套件是以开放的、按主题组织的数据集构建的,具有可移植性,可以指向任意配置,我们在不同提供商之间运行了相同的数据集,并排阅读结果。一次通常需要数周手工测试的前沿提供商之间的迁移,只花了一天时间。

守住监管边界的行为测试

根据 MHRA 指南,具有医疗用途的软件产品(提供临床建议、诊断或推荐治疗)即成为医疗器械。Nu 的设计定位是用于生活方式教练和教育的健康产品,而非临床护理。

让 Nu 保持在这一范围内是我们在每次变更时都会检查的事情。安全探针作为按类别计算的指标运行,并对发布进行把关:一旦出现回归,会自动阻止变更发布。我们朝着 安全补全(safe-completion) 方向调优,即一种既能守住底线、又仍听起来像教练的重定向,这样提出超出范围问题的患者会得到温暖、有用的回答,而不是生硬的拒绝。

Nu responding to an out-of-scope question with a safe-completion

除了测试之外,守护节点在图中的每一次对话中运行。安全守护会在患者看到回复之前,依据一组固定的临床安全规则审查每一条发出的回复。不安全的草稿会被送回监督者重新生成。如果反复失败,该消息会被替换为安全的后备内容,而不是发送不安全的回复。而且由于守护位于图中,它们处于同一个评估面内——我们的一个主题数据集专门用于测试安全守护能否捕获应当捕获的问题。此外,健康教练每天会审阅一部分真实对话,并标记任何看起来像安全疏漏的内容,因此人类领域专家可以校准什么才算安全。

用模拟对话代替脚本化对话

我们最新的这一层目前处于原型阶段,它模拟对话而不是为其编写脚本。我们给评估提供患者画像、一个场景、Nu 应当探明的关键问题,以及回合上限。一个更便宜的模型扮演患者,与真实代理进行多轮对话,并对 Nu 说的任何内容作出反应。然后由一个评判者按类别对整份对话记录打分。因为患者是生成的而非固定的,我们可以探测对抗性案例(专门设计用来让临床请求绕过教练的措辞、伪装成普通问题的操纵),并捕获固有用例永远不会遇到的失败。例如,Nu 不像教练应该做的那样调查情况,而是急于给出答案。

这种通过模拟对话进行的提示加固,减少了针对监管边界的越狱场景中的严重越界行为。我们运行了并行的用药查询评估作为回归门控,确保提示的改进不会破坏我们已然信任的行为。

在利用模拟对话层进行持续改进而不引入回归这件事上,与其说它是工程问题,不如说是评分标准问题。当我们最初为这一层起草标准时,两个我们认为兼容的主题在漏服药物处理上相互矛盾:一个说 拒绝并提供转诊至临床医生的指引,另一个说 使用患者信息手册中的一般事实进行安全补全。一个提示无法同时满足两者。这个提示冲突的例子让我们认识到, 稀缺而宝贵的资产不是提示——一个能力强的模型凭借有限的上下文就能把提示写得很好;真正稀缺的是评估标准。 而在受监管的边界上,这些标准必须由一位同时理解监管红线、由临床医生撰写并签字批准,而不是由工程师来写。Nu 模拟对话的结果是按照工程师起草的标准评判的,这正是为什么在临床医生签字批准评分标准之前,这一层不会阻碍发布,也不会支持任何安全声明(正是这一点让产品保持在红线的健康这一侧)。

技术栈:LangGraph 和 LangSmith

Diagram of Nu's eval stack: real and simulated conversations run through the same LangGraph agent, measured in LangSmith
真实对话和模拟对话都经过同一个 LangGraph 代理;LangSmith 对两者都进行度量。由临床医生主导的评分标准驱动评判者,边界回归会阻止发布。虚线 = 原型或方向。

LangGraph 和 LangSmith 作为一个系统协同工作,构成了我们的代理开发技术栈。

LangGraph 是代理本身。 一个监督者触发领域专家,每个专家都有自己的提示和工具。

评估通过同一个图运行。 固用例评估层和模拟对话评估层都会触达真实代理,并且可以针对整个系统或单个子代理。

LangSmith 是一切被度量的地方。 每一段对话,无论模拟还是真实,都会以追踪记录的形式落地。评审者对这些追踪进行标注,从而启动持续质量改进循环。数据集和实验也存在那里。例如,支持我们一天迁移的供应商并排比较数据就是直接从 LangSmith 中读取的。

LangGraph 与 LangSmith 的集成使评估运行起来成本低廉。不需要用胶水代码把三个互不相连的工具拼接在一起。我们交付的东西和我们测试的东西是同一个图,由同一个平台监控。

我们的前进方向:扩展的是标准,而不仅仅是代理

教练质量取决于两件事:1)撰写决定一段对话是否优秀的标准,以及 2)扩大这些标准所覆盖的测试范围。因此我们专注于测试更多对抗性画像和场景,在构建更多专家的同时增加更多主题,并在任何涉及安全或范围的地方扩展由临床医生参与的评分标准。评审者继续在 LangSmith 中阅读真实对话,工程师仍然会提出每一次提示变更。

到目前为止描述的一切都是离线的,在变更发布之前证明它能守住监管红线。下一步是在线评估器,当真实对话进入 LangSmith 时,持续使用同样的评分标准对它们进行评分,评价 Nu 在对话中的那一侧。人类评审者将从评估器已经标记的对话入手,而不是像今天教练审阅的每日抽样那样——以便观察边界在生产环境中是否守得住,并在误报时打磨评分标准。

我们还从早期实验中看到了令人鼓舞的结果,这些实验旨在自动化遵循可信评分标准的工作流——包括把已评审的对话分类为按优先级排序的待办清单,以及针对固定基准调优提示。最近,一个指向单一行为基准的离线提示优化循环,在没有人工调优的情况下显著提高了得分……这支持了我们的假设:只要标准定对了,其余一切都可以自动化。

在监管红线附近构建 AI 教练

如果你正在构建一个靠近监管红线的对话代理,以下是我们的建议:

  • 固定的数据集无法覆盖整段对话。 为单条回复能展现的内容保留固有用例,对其余部分进行对话模拟,并按类别打分,而不是追求一个聚合分数。
  • 把边界变成一个探针。 在每次变更时运行它,让回归阻止发布,并把同样的评估标准用于生产环境。
  • 在受监管的边界上,评估标准应属于临床医生。 由工程人员起草的标准足以让测试框架跑起来,但不足以作为安全性声明的把关。
  • 把你的大部分精力投入到评估标准上。 下游的一切都源于评估标准:更好的辅导、可辩护的边界,以及最终你能信任的自动化。

随着标准和自动化的成熟,我们会再次撰写更新。

Nu 基于 LangGraph 和 LangSmith构建。Numan 的 AI 系统处理跨多个健康领域的健康辅导对话。Nu 被设计为作为健康产品而非医疗器械运行。它提供辅导和健康教育,不进行诊断、开处方、监测疾病,也不做出或影响临床决策。

原始出处

LangChain Blog

内容说明

原始发布及相关权利归来源方。

机器翻译 · 请以原文为准