在本文中,将介绍如何通过Python IDE测试和评估你的应用程序,测量应用程序在固定数据集上的性能。
创建数据集
准备测试和评估应用程序的第一步是定义要评估的数据点。这里需要考虑以下几个方面:•每个数据点的模式应该是什么?我应该收集多少数据点?我应该如何收集这些数据点?模式:每个数据点至少应该由应用程序的输入组成。如果可以的话,定义预期的输出也很有帮助——这些表示正常运行的应用程序的期望输出。通常情况下,无法定义完美的输出,但是没关系。评估是一个迭代的过程。有时你可能还想为每个示例定义更多的信息——比如RAG中要获取的预期文档,或者作为代理要采取的预期步骤。LangSmith数据集非常灵活,允许你定义任意的模式。多少人:对于应该聚集多少人并没有严格的规定。最重要的是确保你对想要防范的边界情况有适当的覆盖。即使是10-50个示例也可以提供很多价值!不要担心一开始就得到一个很大的数字——你可以(也应该)总是随着时间的推移而增加!获取方法:这可能是最棘手的部分。一旦你知道你想要收集一个数据集……你到底是怎么做的?对于大多数开始新项目的团队来说,我们通常看到他们从手工收集最初的10-20个数据点开始。从这些数据点开始,这些数据集通常是活的结构,并随着时间的推移而增长。在看到真实用户如何使用你的应用程序,看到存在的痛点,然后将其中的一些数据点移到这个集合中之后,它们通常会增长。还有一些方法可以用来增强数据集,比如合成数据。首先,我们建议不要担心这些,只需手工标记大约10-20个样本。有了数据集之后,有几种不同的方法可以将它们上传到LangSmith。在本教程中,我们将使用客户端,但你也可以通过UI上传(甚至在UI中创建它们)。在本教程中,我们将创建5个数据点来评估。我们将评估一个问答应用程序。输入是一个问题,输出是一个答案。由于这是一个问答应用程序,我们可以定义预期的答案。让我们展示一下如何创建这个数据集并上传到LangSmith!
from langsmith import Client
client = Client()
# Define dataset: these are your test cases
dataset_name = "QA Example Dataset"
dataset = client.create_dataset(dataset_name)
client.create_examples(
inputs=[
{"question": "What is LangChain?"},
{"question": "What is LangSmith?"},
{"question": "What is OpenAI?"},
{"question": "What is Google?"},
{"question": "What is Mistral?"},
],
outputs=[
{"answer": "A framework for building LLM applications"},
{"answer": "A platform for observing and evaluating LLM applications"},
{"answer": "A company that creates Large Language Models"},
{"answer": "A technology company known for search"},
{"answer": "A company that creates Large Language Models"},
],
dataset_id=dataset.id,
)
在你的python IDE上运行了以上代码过后,如果我们进入LangSmith UI并在QA示例数据集,我们应该看到我们有五个新示例。
定义指标
创建数据集后,我们现在可以定义一些指标来进行评估。由于我们有一个预期的答案,我们可以将其作为评估的一部分进行比较。然而,我们并不期望我们的应用程序输出这些确切的答案,而是类似的东西。除了评估正确性之外,我们还要确保我们的答案简短而简洁。这将会简单一些——我们可以定义一个简单的Python函数来测量响应的长度。让我们继续定义这两个指标。首先,我们将使用LLM来判断输出是否正确(根据预期输出)。这种LLM-as-a-judge对于那些过于复杂而无法用简单函数衡量的案件来说是相对常见的。我们可以在这里定义自己的prompt和LLM用于评估:
from langchain_openai import ChatOpenAI
from langchain_core.prompts.prompt import PromptTemplate
from langsmith.evaluation import LangChainStringEvaluator
from langsmith.schemas import Run, Example
def evaluate_length(run: Run, example: Example) -> dict:
prediction = run.outputs.get("output") or ""
required = example.outputs.get("answer") or ""
score = int(len(prediction) < 2 * len(required))
return {"key":"length", "score": score}
_PROMPT_TEMPLATE = """You are an expert professor specialized in grading students' answers to questions.
You are grading the following question:
{query}
Here is the real answer:
{answer}
You are grading the following predicted answer:
{result}
Respond with CORRECT or INCORRECT:
Grade:
"""
PROMPT = PromptTemplate(
input_variables=["query", "answer", "result"], template=_PROMPT_TEMPLATE
)
eval_llm = ChatOpenAI(model='qwen2.5-72b-instruct')
qa_evaluator = LangChainStringEvaluator("qa", config={"llm": eval_llm, "prompt": PROMPT})
注意!!!!我这里虽然用的是Openai的chat库,但是我的api和api的url用的是通义千问的Qwen模型库,因为本人没有开通openai plus,request的quato会有限制,所以用Qwen模型代替。用的时候记得在系统的环境变量里面设置好api和api对应的url。上述代码中用到的模型是”qwen2.5-72b-instruct”。
进行评估
现在我们有了数据集和评估器,我们所需要的就是我们的应用程序!我们将构建一个简单的应用程序,该应用程序只有一个关于如何响应的说明的系统消息,然后将其传递给LLM。我们将直接使用OpenAI SDK构建它:
import openai
from metrics import qa_evaluator, evaluate_length
from langsmith import evaluate
openai_client = openai.Client()
def my_app(question):
return openai_client.chat.completions.create(
model="qwen2.5-72b-instruct",
temperature=0,
messages=[
{
"role": "system",
"content": "Respond to the users question in a short, concise manner (one short sentence)."
},
{
"role": "user",
"content": question,
}
],
).choices[0].message.content
def langsmith_app1(inputs):
output = my_app(inputs["question"])
return {"output": output}
experiment_results = evaluate(
langsmith_app1, # Your AI system
data="QA Example Dataset", # The data to predict and grade over
evaluators=[evaluate_length, qa_evaluator], # The evaluators to score the results
experiment_prefix="Qwen4", # A prefix for your experiment names to easily identify them
)
在python IDE中运行上述代码后就能在LangSmith的UI上看到评估的结果,下面这张图是我运行了四个不同的模型后得到的四份评估数据。
点击任意一份数据后都能进入一个可视化评估分析的UI界面:
而且还能通过图形来分析哪个模型更加准确,生成的文本内容更好,还能把模型生成是否正确,生成所需时间以及评估的得分显示出来如下: