Easier evaluations with LangSmith SDK v0.2

使用 LangSmith SDK v0.2 进行更轻松的评估

我们发布了 LangSmith SDK v0.2 版本,其中包含各种评估和性能改进。

4 分钟阅读

我们最近发布了 LangSmith SDK v0.2 版本,该版本为评估应用程序的开发者体验带来了一些改进。我们简化了 evaluate() / aevaluate() 方法的用法,添加了在本地运行评估而无需上传任何结果的选项,提高了 SDK 性能,并扩展了我们的文档。这些改进已在 Python 和 TypeScript SDK 中实现。

v0.2 版本在 Python SDK 中有 2 个重大更改。这些更改在底部列出。

简化了 evaluate() / aevaluate() 的用法

更简单的评估器

LangSmith SDK 允许您定义自定义评估器,这些评估器是用于对数据集上应用程序的输出进行评分的函数。在今天之前,这些评估器必须将 Run 和 Example 对象作为参数。

from langsmith import evaluate
from langsmith.schemas import Run, Example

def correct(run: Run, example: Example) -> dict:
  outputs = run.outputs
  inputs = example.inputs
  reference_outputs = example.outputs
	
	score = run.outputs['answer'] == example.outputs['answer']
  return {"key": "correct", "score": score}

results = evaluate(..., evaluators=[correct])

在 v0.2 中,您可以在 Python 中这样编写:

from langsmith import evaluate

def correct(inputs: dict, outputs: dict, reference_outputs: dict) -> bool:
  return outputs["answer"] == reference_outputs["answer"]

results = evaluate(..., evaluators=[correct])

在 TypeScript 中这样编写:

import type { EvaluationResult } from "langsmith/evaluation";

const correct = async ({
  outputs,
  referenceOutputs,
}: {
  outputs: Record<string, any>;
  referenceOutputs?: Record<string, any>;
}): Promise<EvaluationResult> => {
  const score = outputs?.answer === referenceOutputs?.answer;
  return { key: "correct", score };
};

主要更改如下:

  • 您可以编写接受 inputs、outputs、reference_outputs 字典作为参数的评估器函数。如果需要,您可以继续传入 runexample 以访问运行中间步骤或运行/示例元数据。
  • (仅限 Python)您可以直接返回基本类型(浮点型、整型、布尔型、字符串型)

摘要评估器成对评估器 进行了类似的简化。有关定义评估器的更多信息,请访问本操作指南

直接评估 langgraphlangchain 对象

您现在可以直接将您的 langgraphlangchain 对象传递到 evaluate() / aevaluate()

from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent
from langsmith import evaluate

def check_weather(location: str) -> str:
		'''Return the weather forecast for the specified location.'''
		return f"It's always sunny in {location}"

tools = [check_weather]
model = init_chat_model("gpt-4o-mini")
graph = create_react_agent(model, tools=tools)

results = evaluate(graph, ...)

有关评估 langgraphlangchain 对象的更多信息,请参阅以下操作指南:langgraphlangchain

整合的评估方法

以前,有三种不同的方法用于运行评估(不包括其异步对应方法):evaluate()evaluate_existing()evaluate_comparative() / evaluateComparative()。第一种方法用于在数据集上运行您的应用程序并对输出进行评分,第二种方法仅用于在现有实验结果上运行评估器,第三种方法用于在两个现有实验上运行成对评估器。

在 v0.2 中,您只需要了解 evaluate() 方法

from langsmith import evaluate

# Run the application and evaluate the results
def app(inputs: dict) -> dict:
  return {"answer": "i'm not sure"}

results = evaluate(app, data="dataset-name", evaluators=[correct])

# Run new evaluators on existing experimental results
def concise(outputs: dict) -> bool:
	return len(outputs["answer"]) < 10

more_results = evaluate(
	results.experiment_name,  # Pass in an experiment name/ID instead of a function.
	evaluators=[concise].
)

# Run comparative evaluation
# First we need to run a second experiment
def app_v2(inputs: dict) -> dict:
	return {"answer": "i dunno you tell me"}

results_v2 = evaluate(app_v2, data="dataset-name", evaluators=[correct])

# Note: 'outputs' is a two-item list for pairwise evaluators.
def more_concise(outputs: list[dict]) -> bool:
	v1_len = len(outputs[0]["answer"])
	v2_len = len(outputs[1]["answer"])
	if v1_len < v2_len:
		return [1, 0]
	elif v1_len > v2_len:
		return [0, 1]
	else:
		return [0, 0]

comparative_results = evaluate(
	[results.experiment_name, results_v2.experiment_name],  # Pass in two experiment names/IDs instead of a function.
	evaluators=[more_concise],  # Pass in a pairwise evaluator(s).
)

有关更多信息,请参阅我们的操作指南,了解成对实验评估现有实验

测试版:在本地运行评估,无需上传结果

有时,在本地运行评估而不将任何结果上传到 LangSmith 会很有帮助。例如,如果您正在快速迭代提示并想在一些示例上进行冒烟测试,或者如果您正在验证您的目标和评估器函数是否定义正确,您可能不想记录这些评估。

在 v0.2 Python SDK 中,您只需设置

results = evaluate(..., upload_results=False)

此输出的外观与之前完全相同,但 LangSmith 中不会显示此实验的任何迹象。有关更多信息,请访问我们的关于在本地运行评估的操作指南

请注意,此功能仍处于测试阶段,仅在 Python 中受支持。

改进的 Python SDK 性能

我们还对 Python SDK 的大型示例评估性能进行了一些改进,对于 1 到 4MB 的示例,aevaluate() 的速度大约提高了 30%。

改进的文档

我们重写了我们的大部分评估操作指南,改进了现有指南并添加了许多与本文中提到的改进相关的新指南。我们还更新了 Python SDK API 参考,并将其与主要的 LangSmith 文档合并:https://langsmith.langchain.ac.cn/reference/python

重大更改

在 Python SDK 中,进行了两项重大更改

  • 在 Python SDK 中,evaluate / aevaluate 现在默认 max_concurrency=0 而不是 None。这使得默认情况下不使用并发,而不是无限制的并发。
  • 在 Python SDK 中,如果您将字符串作为数据参数传递给 evaluate:evaluate(..., data="...") / aevaluate(..., data="..."),我们现在将检查该字符串是否对应于 UUID,并应将其视为数据集 ID,然后再将其视为数据集名称。以前,总是假定字符串值对应于数据集名称。
  • 我们已正式停止支持 Python 3.8,该版本已于 2024 年 10 月达到其生命周期结束 (EOL)。