Skip to main content

如何定义用于评估的目标函数

运行评估需要三个主要部分:

  1. 一个包含测试输入和预期输出的数据集
  2. 一个目标函数,即您正在评估的内容。
  3. 评估器 用于对你的目标函数的输出进行评分。

本指南展示了如何根据您正在评估的应用程序部分来定义目标函数。 有关< a href=\"0\">如何创建数据集和< a href=\"1\">如何定义评估器,请参见此处;有关< a href=\"2\">运行评估的端到端示例,请参见此处。

目标函数签名

为了在代码中评估一个应用程序,我们需要一种运行该应用程序的方法。当使用 evaluate()Python/TypeScript)时,我们将通过传入一个目标函数参数来实现这一点。这是一个接收数据集示例输入并返回应用程序输出为字典的函数。在该函数内,我们可以按需调用我们的应用程序。我们还可以按任意方式格式化输出。关键在于,我们定义的任何评估器函数都应与我们在目标函数中返回的输出格式兼容。

from langsmith import Client

# 'inputs' will come from your dataset.
def dummy_target(inputs: dict) -> dict:
return {"foo": 1, "bar": "two"}

# 'inputs' will come from your dataset.
# 'outputs' will come from your target function.
def evaluator_one(inputs: dict, outputs: dict) -> bool:
return outputs["foo"] == 2

def evaluator_two(inputs: dict, outputs: dict) -> bool:
return len(outputs["bar"]) < 3

client = Client()
results = client.evaluate(
dummy_target, # <-- target function
data="your-dataset-name",
evaluators=[evaluator_one, evaluator_two],
...
)
自动追踪

evaluate() 将自动追踪您的目标函数。 这意味着,如果您在目标函数中运行任何可追踪的代码,这些代码也将作为目标追踪的子运行被追踪。

示例:单次LLM调用

当我们迭代提示或比较模型时,评估单个 LLM 调用可能很有用:

设置环境变量 OPENAI_API_KEY 并安装依赖项 pip install -U openai langsmith

from langsmith import wrappers
from openai import OpenAI

# Optionally wrap the OpenAI client to automatically
# trace all model calls.
oai_client = wrappers.wrap_openai(OpenAI())

def target(inputs: dict) -> dict:
# This assumes your dataset has inputs with a 'messages' key.
# You can update to match your dataset schema.
messages = inputs["messages"]
response = oai_client.chat.completions.create(
messages=messages,
model="gpt-4o-mini",
)
return {"answer": response.choices[0].message.content}

示例:非LLM组件

有时,您可能希望评估应用程序的某个步骤,而该步骤不涉及大语言模型(LLM)。这包括但不限于:

  • RAG 应用程序中的检索步骤
  • 工具执行

在此示例中,我们展示如何测试一个简单的计算器工具。实际上,评估对于具有更复杂且难以进行单元测试行为的组件(如检索器或在线研究工具)非常有用。

from langsmith import traceable

# Optionally decorate with '@traceable' to trace all invocations of this function.
@traceable
def calculator_tool(operation: str, number1: float, number2: float) -> str:
if operation == "add":
return str(number1 + number2)
elif operation == "subtract":
return str(number1 - number2)
elif operation == "multiply":
return str(number1 * number2)
elif operation == "divide":
return str(number1 / number2)
else:
raise ValueError(f"Unrecognized operation: {operation}.")

# This is the function you will evaluate.
def target(inputs: dict) -> dict:
# This assumes your dataset has inputs with `operation`, `num1`, and `num2` keys.
operation = inputs["operation"]
number1 = inputs["num1"]
number2 = inputs["num2"]
result = calculator_tool(operation, number1, number2)
return {"result": result}

示例:应用程序或智能体

评估您的智能体应用程序的完整输出可以捕捉多个组件之间的交互,从而提供更真实的端到端性能图景。端到端评估还可能揭示在测试孤立功能或单个大语言模型调用时可能遗漏的集成和错误处理问题。

from my_agent import agent

# This is the function you will evaluate.
def target(inputs: dict) -> dict:
# This assumes your dataset has inputs with a `messages` key
messages = inputs["messages"]
# Replace `invoke` with whatever you use to call your agent
response = agent.invoke({"messages": messages})
# This assumes your agent output is in the right format
return response
LangGraph / LangChain 目标

如果您有一个 LangGraph/LangChain 智能体,它接受您在数据集中定义的输入,并返回您希望在评估器中使用的输出格式,那么您可以直接将该对象作为目标传入:

from my_agent import agent
from langsmith import Client

client = Client()
client.evaluate(agent, ...)

此页面有帮助吗?


您可以留下详细的反馈 在 GitHub 上