我们最近发布了 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 字典作为参数的评估器函数。如果需要,您可以继续传入
run
和example
以访问运行中间步骤或运行/示例元数据。 - (仅限 Python)您可以直接返回基本类型(浮点型、整型、布尔型、字符串型)
与 摘要评估器 和 成对评估器 进行了类似的简化。有关定义评估器的更多信息,请访问本操作指南。
直接评估 langgraph
和 langchain
对象
您现在可以直接将您的 langgraph
和 langchain
对象传递到 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, ...)
有关评估 langgraph
和 langchain
对象的更多信息,请参阅以下操作指南:langgraph,langchain。
整合的评估方法
以前,有三种不同的方法用于运行评估(不包括其异步对应方法):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)。