- 单元测试通过使用内存中的模拟来单独锻炼智能体的微小、确定性的部分,以便您可以快速且确定性地断言确切的行为。
- 集成测试 通过使用真实的网络调用来测试智能体,以确认组件协同工作、凭据和模式匹配,以及延迟可接受。
集成测试
许多智能体行为只有在使用真实的LLM时才会出现,例如智能体决定调用哪个工具、如何格式化响应,或者提示修改是否影响整个执行轨迹。LangChain的agentevals包提供了专门为测试智能体轨迹与实时模型而设计的评估器。
AgentEvals 允许您通过执行 轨迹匹配 或使用 LLM 判定器,轻松评估您的智能体(包括工具调用的确切消息序列)的轨迹。
Trajectory match
为给定输入硬编码一个参考轨迹,并通过逐步比较来验证运行。非常适合测试定义明确的流程,其中您知道预期的行为。当您对应该调用哪些工具以及调用顺序有具体期望时使用。这种方法是确定性的、快速的且成本效益高,因为它不需要额外的LLM调用。
LLM-as-judge
使用大型语言模型(LLM)对智能体的执行轨迹进行定性验证。“裁判” LLM 将智能体的决策与提示准则(可能包括参考轨迹)进行对比。更灵活,可以评估细微方面,如效率和适宜性,但需要调用LLM,且确定性较低。当您想评估智能体轨迹的整体质量和合理性,而不需要严格的工具调用或排序要求时使用。
安装 AgentEvals
轨迹匹配评估器
AgentEvals 提供了createTrajectoryMatchEvaluator 函数,用于将您的智能体轨迹与参考轨迹进行匹配。有四种模式可供选择:
| 模式 | 描述 | 应用场景 |
|---|---|---|
strict | 按相同顺序匹配消息和工具调用 | 测试特定序列(例如,在授权前查找策略) |
unordered | 允许任何顺序的工具调用 | 验证信息检索时顺序不重要 |
subset | 智能体仅调用参考工具(无额外工具) | 确保智能体不超过预期范围 |
superset | 智能体至少调用参考工具(允许额外工具) | 验证是否采取了所需的最小行动 |
Strict match
Strict match
strict 模式确保轨迹包含相同顺序的相同工具调用的相同消息,尽管它允许消息内容存在差异。这在需要强制执行特定操作顺序时很有用,例如在授权操作之前要求查找策略。Unordered match
Unordered match
unordered 模式允许以任何顺序调用相同的工具,这在您想验证是否检索到特定信息但不在乎顺序时很有帮助。例如,一个智能体可能需要检查一个城市的天气和事件,但顺序并不重要。Subset and superset match
Subset and superset match
superset 和 subset 模式匹配部分轨迹。superset 模式验证智能体至少调用了参考轨迹中的工具,允许调用更多工具。subset 模式确保智能体没有调用参考轨迹之外的任何工具。您还可以设置
toolArgsMatchMode 属性和/或 toolArgsMatchOverrides 来自定义评估器如何考虑实际轨迹与参考之间工具调用之间的相等性。默认情况下,只有对同一工具使用相同参数的工具调用被视为相等。有关更多详细信息,请访问 仓库。LLM-as-Judge 评估器
您还可以使用一个LLM来使用createTrajectoryLLMAsJudge 函数评估智能体的执行路径。与轨迹匹配评估器不同,它不需要参考轨迹,但如果有的话,也可以提供。
Without reference trajectory
Without reference trajectory
With reference trajectory
With reference trajectory
如果您有一个参考轨迹,您可以在提示中添加一个额外的变量并传入参考轨迹。下面,我们使用预构建的
TRAJECTORY_ACCURACY_PROMPT_WITH_REFERENCE 提示并配置 reference_outputs 变量:为了更灵活地配置LLM评估轨迹的方式,请访问仓库。
LangSmith 集成
为了跟踪随时间进行的实验,您可以将评估器结果记录到LangSmith,这是一个用于构建生产级LLM应用的平台,包括跟踪、评估和实验工具。 首先,通过设置所需的环境变量来设置 LangSmith:evaluate函数。
Using vitest/jest integration
Using vitest/jest integration
Using the evaluate function
Using the evaluate function
或者,您可以在LangSmith中创建一个数据集并使用 结果将自动记录到LangSmith。
evaluate 函数: