如何使用现成的评估器(仅限 Python)
在深入阅读本文档之前,阅读以下内容可能会有所帮助
LangChain 提供了一套现成的评估器,您可以立即使用它们来评估您的应用程序性能,而无需编写任何自定义代码。这些评估器旨在用作评估的起点。
创建一个数据集并在 Python 中设置 LangSmith 客户端以继续操作
from langsmith import Client
client = Client()
Create a dataset
examples = [
{
"inputs": {"input": "Ankush"},
"outputs": {"expected": "Hello Ankush"},
},
{
"inputs": {"input": "Harrison"},
"outputs": {"expected": "Hello Harrison"},
},
]
dataset_name = "Hello Set"
dataset = client.create_dataset(dataset_name=dataset_name)
client.create_examples(dataset_id=dataset.id, examples=examples)
使用问题和答案(正确性)评估器
问题和答案 (QA) 评估器有助于衡量对用户查询或问题的响应的正确性。如果您有一个包含参考标签或参考上下文文档的数据集,那么这些评估器非常适合您!您可以加载三个 QA 评估器:"qa"
、"context_qa"
、"cot_qa"
。根据我们的元评估,我们建议使用 "cot_qa"
,或思维链 QA。
这是一个简单的示例,它使用 "cot_qa"
评估器来评估一个简单的管道,该管道在输入前加上 "Hello"
from langsmith import Client
from langsmith.evaluation import LangChainStringEvaluator, evaluate
cot_qa_evaluator = LangChainStringEvaluator("cot_qa")
client = Client()
evaluate(
lambda input: "Hello " + input["input"],
data=dataset_name,
evaluators=[cot_qa_evaluator],
)
使用标准评估器
如果您没有基本事实参考标签,您可以使用 "criteria"
评估器根据自定义标准集评估您的运行。当您希望监控模型的输出中其他显式检查或规则未捕获的高级语义方面时,这些评估器非常有用。
"criteria"
评估器指示 LLM 评估预测是否满足给定标准,并为每个标准输出一个二进制分数(0 或 1)
from langsmith import Client
from langsmith.evaluation import LangChainStringEvaluator, evaluate
criteria_evaluator = LangChainStringEvaluator(
"criteria",
config={
"criteria": {
"says_hello": "Does the submission say hello?",
}
}
)
client = Client()
evaluate(
lambda input: "Hello " + input["input"],
data=dataset_name,
evaluators=[
criteria_evaluator,
],
)
默认标准是为以下方面实施的:简洁性、相关性、正确性、连贯性、有害性、恶意性、 helpfulness、争议性、厌女症和犯罪性。要指定自定义标准,请编写标准名称到其描述的映射,例如
criterion = {"creativity": "Is this submission creative, imaginative, or novel?"}
criteria_evaluator = LangChainStringEvaluator(
"labeled_criteria",
config={"criteria": criterion}
)
评估分数没有固有的“方向”(即,分数越高不一定越好)。分数的方向取决于正在评估的标准。例如,“helpfulness”的分数为 1 表示模型认为预测有帮助。但是,“maliciousness”的分数为 1 表示预测包含恶意内容,这当然是“不好”的。
使用带标签的标准评估器
如果您有基本事实参考标签,您可以使用 "labeled_criteria"
或 "labeled_score_string"
评估器根据自定义标准评估您的运行,同时向 LLM 提供该参考信息。
"labeled_criteria"
评估器指示 LLM 评估预测是否满足标准,同时考虑参考标签"labeled_score_string"
评估器指示 LLM 在指定范围内根据参考标签评估预测
from langsmith import Client
from langsmith.evaluation import LangChainStringEvaluator, evaluate
labeled_criteria_evaluator = LangChainStringEvaluator(
"labeled_criteria",
config={
"criteria": {
"helpfulness": (
"Is this submission helpful to the user,"
" taking into account the correct reference answer?"
)
}
}
)
labeled_score_evaluator = LangChainStringEvaluator(
"labeled_score_string",
config={
"criteria": {
"accuracy": "How accurate is this prediction compared to the reference on a scale of 1-10?"
},
"normalize_by": 10,
}
)
client = Client()
evaluate(
lambda input: "Hello " + input["input"],
data=dataset_name,
evaluators=[
labeled_criteria_evaluator,
labeled_score_evaluator
],
)
使用字符串或嵌入距离指标
要衡量预测字符串和参考字符串之间的相似性,您可以使用字符串距离指标
"string_distance"
评估器计算预测和参考之间的归一化字符串编辑距离"embedding_distance"
评估器计算预测和参考的文本嵌入之间的距离
!pip install rapidfuzz
from langsmith.evaluation import LangChainStringEvaluator, evaluate
string_distance_evaluator = LangChainStringEvaluator(
"string_distance",
config={"distance": "levenshtein", "normalize_score": True}
)
embedding_distance_evaluator = LangChainStringEvaluator(
"embedding_distance",
config={
# Defaults to OpenAI, but you can customize which embedding provider to use:
# "embeddings": HuggingFaceEmbeddings(model="distilbert-base-uncased"),
# Can also choose "euclidean", "chebyshev", "hamming", and "manhattan"
"distance_metric": "cosine",
}
)
evaluate(
lambda input: "Hello " + input["input"],
data=dataset_name,
evaluators=[
string_distance_evaluator,
embedding_distance_evaluator,
],
)
在现成的评估器中使用自定义 LLM
您可以自定义用于任何基于 LLM 的评估器(标准或 QA)的模型。请注意,这目前需要使用 LangChain 库。
from langchain_openai import ChatOpenAI
from langchain_core.prompts.prompt import PromptTemplate
from langsmith.evaluation import LangChainStringEvaluator
eval_llm = ChatOpenAI(temperature=0.0, model="gpt-4o-mini")
cot_qa_evaluator = LangChainStringEvaluator("cot_qa", config={"llm": eval_llm})
evaluate(
lambda input: "Hello " + input["input"],
data=dataset_name,
evaluators=[cot_qa_evaluator],
)
处理多个输入或输出字段
如果您的输入字典、输出字典或示例字典各自具有单个字段,则 LangChain 现成的评估器可以无缝工作。如果您有多个字段,则可以使用 prepare_data
函数提取用于评估的相关字段。这些将键 "prediction"
、"reference"
和 "input"
映射到输入和输出字典中的正确字段。
对于以下示例,我们有一个模型输出两个字段:"greeting"
和 "foo"
。我们想要根据输出字典中的 "expected"
字段评估 "greeting"
字段。
from langsmith import Client
from langsmith.evaluation import LangChainStringEvaluator, evaluate
labeled_criteria_evaluator = LangChainStringEvaluator(
"labeled_criteria",
config={
"criteria": {
"helpfulness": (
"Is this submission helpful to the user,"
" taking into account the correct reference answer?"
)
}
},
prepare_data=lambda run, example: {
"prediction": run.outputs["greeting"],
"reference": example.outputs["expected"],
"input": example.inputs["input"],
}
)
client = Client()
evaluate(
lambda input: {"greeting": "Hello " + input["input"], "foo": "bar"},
data=dataset_name,
evaluators=[
labeled_criteria_evaluator
],
)