游乐游手机版
首页/AI热点日报/热点详情

Candidly借助LangSmith构建状态感知型智能体Harness

类型:热点整理2026-07-04
设想这样一个场景:你刚与一位AI助手结束了一段对话。它回答了你的问题,你似乎解决了一个困惑,然后你关闭了页面。事后,平台会记录下这次对话的“结局”——用户是否得到了答案?任务是否完成?用户是否会再次访问、点击链接,或者采取下一步行动? 这是绝大多数对话式AI助手的评判方式:基于最终结果的事后评估。但

设想这样一个场景:你刚与一位AI助手结束了一段对话。它回答了你的问题,你似乎解决了一个困惑,然后你关闭了页面。事后,平台会记录下这次对话的“结局”——用户是否得到了答案?任务是否完成?用户是否会再次访问、点击链接,或者采取下一步行动?

这是绝大多数对话式AI助手的评判方式:基于最终结果的事后评估。但问题是,这种评估速度够快吗?在对话的每一轮互动中,AI都在实时采取行动,等到对话结束再回头审视,无疑会错过最佳干预时机。要想真正优化对话的“最终解决率”,AI的驱动引擎需要一种“回合级”视野——能够随时判断对话进行到哪一步,以及哪些响应按钮可以推动它向前推进。而构建这种视野的方法,就是读取对话的“部分轨迹”,推断用户当前的状态,并根据历史上类似对话的演变模式,选择最合适的响应策略。

以Candidly为例。这家公司帮助用户处理高风险的财务决策,比如债务偿还、储蓄、退休规划、福利选择和教育成本。Cait是他们的AI财务规划师,一个能够帮助用户比较储蓄策略、还款方案、理解截止日期、评估利弊,最终做出下一步决策的对话助手。日常的提问包括:

  • “我怎样才能在还清债务的同时,兼顾未来的储蓄?”
  • “如何在预算中挤出更多空间?能否在不牺牲退休计划的前提下,供孩子上大学?”
  • “我是否该暂停401(k)缴款,以更快地还清学生贷款?”

这篇文章基于一篇正式的研究论文,以及对数月真实Cait对话的分析。目标并非孤立地制造学术成果,而是将对话分析转化为Cait引擎可以实际落地的策略。研究的第一个问题是回溯性的:当一段与Cait的对话结束后,我们能否判断出,用户的问题是否被解决,还是被直接放弃了?

我们能预测对话的结局吗?

为了在规模上评估对话级别的结果,我们构建了一个混合标签流水线,应用于Cait的生产对话轨迹,并将生成的标签同步到LangSmith。确定性规则处理了边界清晰的案例:比如用户明确表达沮丧、在Cait发出第一条消息后用户无回应、或者用户完成了产品层面的后续动作(如关联账户或启动储蓄计划)。

对于模棱两可的案例,我们根据对话模式分流,交给“LLM-as-judge”评估器处理。每个判定结果都会作为反馈附加到对应的对话线程上。最终,我们将该流水线与人工标注的LangSmith数据集进行校准,达到了92.3%的一致率。

下一步,我们训练了一个模型,根据直接从对话轨迹中计算出的特征来预测这个最终标签。下面是一些特征示例,分为“Cait做了什么”和“用户如何回应”两部分:

Cait做了什么

  • 问答对齐度:Cait回应与用户提问之间的词汇重叠度。在我们的数据中,高对齐度是最终解决率最强的预测因子之一;而低对齐度则是失败状态的典型特征。
  • 话题连续性:Cait自身回应的语义持续性。对于第t轮的Cait回应,它衡量的是当前回应aₜ与上一轮回应aₜ₋₁之间的语义相似度。整个对话轨迹的连续性和一致性,是解决率的强力预测指标。

用户如何回应

  • 消息长度:用户消息越长,越有可能意味着问题正在被解决;短消息或单字回复则预示着用户即将离开。
  • 大写字母比例:用户消息中大写字母的占比(这是沮丧的信号,通常预示着对话终止)。

所有这些特征在运行时都是轻量级和确定性的,每轮对话只需进行几次字符串和嵌入操作,耗时毫秒级。

基于这些特征训练的梯度提升模型,能够以0.90的AUC值(0.5为随机,1.0为完美预测)将已解决对话与已放弃对话区分开来。这说明,对话的最终结局完全可以由轨迹中的信号来预测。

接下来的关键一步,是让这些信号在对话结束前就能被Cait利用:即进行回合级的状态推断,同时结合Cait可控的响应特征,并且每个回合都进行更新。后面的部分,将详细描述我们如何将这个闭环构建到Cait的驱动引擎中——从轨迹到状态,从状态到策略,从策略再到实验。

将轨迹转化为状态模型

我们关心的是建模用户、AI助手与对话上下文之间复杂的交互关系。预测结果已经告诉我们,对话的最终结果是可以从轨迹中习得的。要想在对话进行中利用这个信号,我们需要一个描述对话如何展开的模型。具体来说,它需要回答这些问题:可观测信号如何随着轮次累积?哪些模式会反复出现?Cait的哪些行为,与通向或背离最终解决有关?我们从轨迹中确定性且毫秒级地计算这些特征,然后将它们与用户消息、Cait的回应、推断出的状态以及最终的对话结果一起,存储在LangSmith中。

一个有用的模型需要做三件事:

  1. 将对话表示为一个有序的轨迹,使其可以被解读并据此采取行动。
  2. 区分用户侧信号和AI侧特征,因为它们扮演的角色不同。用户行为告诉我们对话正处于什么状态,而AI行为则是系统可以移动的杠杆。
  3. 从数据本身学习信号到状态的映射关系,让状态反映真实出现的模式,而不是我们预先设定的类别。

具备这些特性的模型提供的,远不止一个事后评分。它可以读取部分轨迹,总结对话目前所处的状态,并将这个读数与Cait可控的响应特征联系起来。这才是模型变得可操作的关键——它在结果还未定型之前,就能为AI提供可用的信息。

一种名为“输入-输出隐马尔可夫模型(IO-HMM)”恰好满足所有这三个要求。相比之下,更重的方案(如RNN或轨迹Transformer)要么牺牲了可解释性,要么缺失了清晰的实时干预路径。

IO-HMM内部

IO-HMM将每一轮对话拆分为两部分:

  • 用户侧信号是“发射量”。它们是我们可以用来推断用户当前互动状态的可观测行为。
  • AI侧特征是“转移输入”。它们是可控的响应特征,决定了对话下一步的走向。

该模型根据当前状态和AI刚刚做出的回应,估算对话下一步最可能的移动方向。

模型使用期望最大化算法在数千次对话上进行拟合。拟合过程同时学习两件事:(1)互动状态本身(跨对话用户行为中的重复模式);(2)转移函数(AI侧特征如何与状态之间的移动相关联)。我们最终确定了四个状态,以取得最佳的保留数据拟合、贝叶斯信息准则和稳定的可解释性。

更小的模型会模糊不同的互动模式,而包含五个状态的模型则无法恢复出一致且可用的状态体系。

这里最重要的设计选择是分离。用户行为用于读取对话状态,AI行为用于估计状态之间的转移。这种分离,让对话轨迹从一份“发生了什么”的记录,变成了一个“什么在驱动对话”的模型。

四种互动状态,以及均值如何掩盖它们

模型恢复了四种可解释的互动状态:

状态对话轮次占比特征结果特征
积极互动53%适度的、具体的一问一答;用户需求与Cait回应高度对齐最高解决率
细节探讨7%用户消息较长、结构清晰,包含实质性的财务背景信息高解决率
引导对话17%用户回复较短;Cait承担了大部分解释工作高解决率;对话最长
脱离中23%用户消息短,用户语言与Cait回应之间的对齐度弱最低解决率

这些状态在行为和结果上均存在显著差异。它们直接映射到用户问题是否得到解决、用户是否继续探索产品,还是放弃对话。解决率从最高互动状态的约78%,下降到脱离中状态的约30%。

更关键的发现是,同样的AI行为在不同状态下会产生截然不同的效果。例如,保持话题连续性可以让积极互动的用户保持在正轨上,但可能会让已经想走的人困在最低解决率的状态里。推送一个可视化内容,可以帮助处于“细节探讨”状态的用户向前推进,但会让“脱离中”的用户更难挽回。这正是平均指标最致命的陷阱所在。如果将所有对话中的行为混合在一起计算平均值,在一个状态中的收益会和另一个状态中的损失相互抵消,净效应就是一个有偏差的估计。一旦我们将状态纳入考量,真实的策略信号就会浮现出来。

这意味着,这个模型已经化身为一幅“策略地图”——它告诉我们,对于一个特定的对话状态,哪种响应改变最可能将对话引向更好的方向。举个例子,增加一个行动号召,可以防止细节探讨因持续过久而滑入脱离状态;而镜像用户的语气词模式,则可以帮助一个正在脱离的用户重新回到积极互动的轨道上。

我们想要实施的策略,是最大化对话过程中问题得到解决的概率。考虑到不同状态在解决率上的巨大差距,策略目标就变得非常直接:让对话停留在高解决率的状态,并远离低解决率的状态。这个模型恰好给我们提供了实现这一目标的精确方法——它能将用户轮次在“脱离中”状态的占比从23%减少到11%,并将大部分流量分流到“积极互动”状态,使其占比从53%提升到64%。

将策略嵌入到驱动引擎中

一个拟合好的模型本身并不是一个可用的策略。要让它真正运作起来,模型必须被部署到驱动引擎中,它驱动的每一次改变都必须被记录下来,而且其效果在上线前需要经过验证,上线后需要进行测量。

请求路径中的状态推断。模型在每一轮对话中运行,速度足够快,能够影响下一次回应。我们冻结拟合好的参数,从轨迹中已有的信号计算用户当前状态,并将这个状态作为元数据写回轨迹中,整个计算过程在一个回复的延迟预算内完成。

每个状态对应一个版本化的变更。必须有一种机制,将推断出的状态转化为不同的响应——无论是通过提示语插入、工具选择,还是不同的响应模板。每一个变更都作为一个版本化的策略规则存在于LangSmith中,并且执行的版本会被记录在该轮对话中,这样我们就能随时知道是哪个变更被应用了。

离线验证。每个状态感知型的策略变更都会动态地向Cait的提示语中添加指令,以引导用户进入更好的状态。在部署前,我们会用保留的LangSmith数据集进行回放,让Cait在新的提示语下重新生成响应,并用我们的评估器进行评分,以确认它产生了预期的状态转移,同时没有影响响应的其他部分。只有通过验证的提示语才会进入实验的测试组。

随机分配。Cait的回应并非随机分配,它们已经依赖于用户的消息和之前的对话。因此,模型可以学习到哪个状态需要哪种回应,而不是学习某种回应是否能改变对话轨迹。一个随机化的实验提供了缺失的外生变量。每个用户被随机分配到现有行为组或状态感知策略组,分配结果保持稳定并被标记到每一条对话轨迹上。LangSmith允许我们在实验进行时实时监控两个实验组,这样我们就可以在最终结果出来之前,观察到状态分布和解决率的变化。

整个闭环的记录。推断出的状态、提示语版本、实验组、最终结果、解决率以及产品激活数据,都存储在同一个对话轨迹中。

至此,LangSmith完成了这个闭环:对话轨迹变成了状态感知的评估数据,评估数据催生了提示语策略实验,而生产环境的监控则告诉我们,该策略是否真的改变了对话的轨迹。

构建更好的智能体:将评估作为控制信号

我们的模型为智能体提供了一种事后成功分数永远无法企及的能力:回合级的、关于互动当前所处位置的实时读数。更重要的是,这个读数在智能体仍然可以采取行动的时候就能获得。这使得评估从一个“成绩单”变为了一个“控制信号”。

这一点并非仅限于金融对话领域,甚至不限于对话本身。这个方法只需要三个要素:(1)一个只在最终才能观测到的结果;(2)可以从对话轨迹中实时计算出来的回合级信号;(3)智能体可以控制的行为。任何具有目标的多轮交互智能体,都具备这三个要素。

想象一个编程智能体。它的最终结果——一个合并的代码变更请求,或一套通过的测试用例——都是在最后才出现的。但对话轨迹中包含了每一轮的潜在状态信号:每次补丁后测试失败的方式是新的还是重复的;代码编辑是否一直在同一堆文件里打转而无法缩小问题范围;审查评论是否越来越短、越来越像纠错。一个卡在糟糕状态下的编程智能体,应该停下来、重新规划、或提出一个问题,而不是继续推送下一个补丁。但遗憾的是,目前的大多数编程智能体无论情况如何,都运行着同样的循环。

一个负责协调子智能体的总控智能体也具备同样的三个要素。子智能体的进度报告是一种信号,但也是充满噪音的;真正能说明问题的,是其工作形态本身。工具调用是否在不断发现新信息?计划是在聚焦还是在发散?一个能够读懂“收敛”信号的协调者可以提前介入——缩小任务范围、替换工具、终止运行——而不是依靠固定轮次上限或令牌预算,因为后者可能在一个即将完成的步骤前停止它,也可能让一个注定失败的任务烧光所有配额。

这对评估工作本身也有一个启示。在我们的数据中,同样的智能体行为在一个状态下是良药,在另一个状态下可能就是毒药。汇总平均后,这些效应相互抵消,信号就消失了。如果我们只测量某个行为“平均而言”是否有效,就会错过那个更有价值的问题:它什么时候有效?什么时候有害?

智能体负责的任务时间跨度越长,其行动与最终结果之间的距离就越宽,智能体就越需要一个在中间某个时间点可读的信号。状态,正是连接这两种视图、提供更高精度的那个层次。最终结果定义了我们的目标,而回合级的状态估计则为智能体提供了一个在结果未实现之前就能使用的工具。当每一轮对话、每一条轨迹都包含这个状态估计时,评估就成为了AI运行循环的一部分:轨迹记录发生了什么,模型读取交互的状态,策略选择相应的回应,而下一条轨迹则会告诉你这个选择是否将对话推向了正确的方向。

来源:https://www.bestblogs.dev/article/fe0c6c27?utm_source=rss&utm_medium=feed&utm_campaign=resources&entry=rss_article_item

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。