断言将审阅者的英语标准转换为自动化检查。它们是关于正确答案应该或不应该包含什么的简短、自由格式的声明。您在审阅单次运行时编写它们 单次运行标注队列,LangSmith 将每个断言保存到一个 数据集示例。任何 离线评估器 都可以检查您应用程序的新输出是否满足每个断言。
使用断言的场景:
- - 运行的输出是错误的,而您更愿意描述正确答案的外观,而不是手动编写一个。
- - 您想在不离开审阅流程的情况下用简单英语捕获验收标准。
添加断言
- 在 LangSmith UI中,导航到 **标注队列** 在左侧边栏中。打开一个单次运行队列并选择一个运行。
- 在侧面板中,找到 **断言** 部分,位于 **反馈**.
- 下方。点击 **+ 添加** 以创建断言行。
- 输入一个 **键** 来总结该断言(例如,
must_cite_source,must_not_invent_url)和一句 **评论** 来描述该断言。
该键是自由格式的。 must_ / must_not_ 前缀只是一种命名约定;LangSmith 不会特别处理它们。
- 为您想要捕获的每个标准重复步骤 3 和 4。
运行编辑器与断言侧面板并排显示运行的输入和输出。一旦您添加至少一个断言,运行编辑器的 **输出** 面板从运行的输出切换为您添加的断言的只读预览。此预览将保存到数据集中。运行的输出不会被保存,因为断言描述的是正确答案应该包含的内容,而不是这个运行产生的内容。
您可以随时编辑运行的 **输入** ,例如在保存示例之前优化提示词。 **输出** 面板会在存在任何断言时保持锁定在断言预览状态。
- 点击 **添加到数据集并继续** 在侧边栏底部(键盘快捷键: <kbd>⌘ Enter</kbd> 在 macOS 上,或 <kbd>Ctrl Enter</kbd> 在其他位置)。LangSmith 会将当前运行添加到队列的 默认数据集,如果没有配置默认数据集,则会提示您选择一个。然后队列会转到下一个运行。
保存的示例的 outputs 字段存储为 JSON。例如:
{
"assertions": [
{
"key": "must_cite_source",
"comment": "The response cites the source URL it is drawing from."
},
{
"key": "must_not_invent_url",
"comment": "The response does not include URLs that do not appear in the inputs."
}
]
}
示例的 inputs 字段存储运行的输入,如果您进行了修改,则存储编辑后的版本。参见 示例数据格式 了解保存示例的完整结构。
根据断言进行评估
编写一个 离线评估器 ,用于读取保存的断言 reference_outputs["assertions"] 并为每个断言返回一个反馈分数。最小形状:
def grade_against_assertions(outputs: dict, reference_outputs: dict) -> list[dict]:
"""Return one feedback score per assertion."""
feedback = []
for assertion in reference_outputs["assertions"]:
# Replace with your scoring logic: LLM judge, regex, schema check, and so on.
score = ...
feedback.append({"key": assertion["key"], "score": score})
return feedback
如何对每个声明进行评分取决于您。三种模式较为常见,可以在一个评估器中组合使用:
- - **LLM-as-a-judge**:对于每个断言,使用应用程序的输出和断言的
comment来提示模型,并让它返回一个分数。当声明较为主观或难以机械验证时效果最佳。 - - **代码检查**:对于每个断言,根据断言的
key运行确定性检查,例如正则匹配、模式验证或子字符串存在性检查。当声明有明确、机械的答案时效果最佳。 - - **部分信用评分**:返回数值分数(例如 0.0 到 1.0 之间)而不是布尔值,以便按等级评分,并对满足部分但非全部声明的输出给予"部分信用"。