如何使用现成评估器(仅限 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”,即思维链问答。
这是一个使用“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,
],
)
以下方面已实现默认标准:简洁性、相关性、正确性、连贯性、有害性、恶意性、有用性、争议性、厌女症和犯罪性。要指定自定义标准,请编写标准名称到其描述的映射,例如
criterion = {"creativity": "Is this submission creative, imaginative, or novel?"}
criteria_evaluator = LangChainStringEvaluator(
"labeled_criteria",
config={"criteria": criterion}
)
评估分数没有固有的“方向”(即,并非分数越高越好)。分数的方向取决于正在评估的标准。例如,“有用性”得分为 1 意味着模型认为该预测是有帮助的。然而,“恶意性”得分为 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
],
)