Skip to content

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

  1. 包含测试输入和预期输出的数据集
  2. 一个目标函数,即您要评估的对象。
  3. 用于为目标函数输出打分的评估器

本指南将向您展示如何根据您要评估的应用程序部分来定义目标函数。关于如何创建数据集如何定义评估器,请参阅此处,关于运行评估的端到端示例,请参阅此处。

目标函数签名

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

python
from langsmith import Client

# 'inputs' 将来自您的数据集。
def dummy_target(inputs: dict) -> dict:
    return {"foo": 1, "bar": "two"}

# 'inputs' 将来自您的数据集。
# 'outputs' 将来自您的目标函数。
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,  # <-- 目标函数
    data="your-dataset-name",
    evaluators=[evaluator_one, evaluator_two],
    ...
)

示例:单个 LLM 调用

python
from langsmith import wrappers
from openai import OpenAI

# 可选地包装 OpenAI 客户端以自动追踪所有模型调用。
oai_client = wrappers.wrap_openai(OpenAI())

def target(inputs: dict) -> dict:
  # 这假设您的数据集输入包含一个 'messages' 键。
  # 您可以更新以匹配您的数据集模式。
  messages = inputs["messages"]
  response = oai_client.chat.completions.create(
      messages=messages,
      model="gpt-4o-mini",
  )
  return {"answer": response.choices[0].message.content}
typescript
import OpenAI from 'openai';
import { wrapOpenAI } from "langsmith/wrappers";

const client = wrapOpenAI(new OpenAI());

// 这是您将要评估的函数。
const target = async(inputs) => {
  // 这假设您的数据集输入包含一个 `messages` 键
  const messages = inputs.messages;
  const response = await client.chat.completions.create({
      messages: messages,
      model: 'gpt-4o-mini',
  });
  return { answer: response.choices[0].message.content };
}
python
from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4o-mini")

def target(inputs: dict) -> dict:
  # 这假设您的数据集输入包含一个 `messages` 键
  messages = inputs["messages"]
  response = model.invoke(messages)
  return {"answer": response.content}
typescript
import { ChatOpenAI } from '@langchain/openai';

// 这是您将要评估的函数。
const target = async(inputs) => {
  // 这假设您的数据集输入包含一个 `messages` 键
  const messages = inputs.messages;
  const model = new ChatOpenAI({ model: "gpt-4o-mini" });
  const response = await model.invoke(messages);
  return {"answer": response.content};
}

示例:非 LLM 组件

python
from langsmith import traceable

# 可选地使用 '@traceable' 装饰以追踪此函数的所有调用。
@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}.")

# 这是您将要评估的函数。
def target(inputs: dict) -> dict:
  # 这假设您的数据集输入包含 `operation`、`num1` 和 `num2` 键。
  operation = inputs["operation"]
  number1 = inputs["num1"]
  number2 = inputs["num2"]
  result = calculator_tool(operation, number1, number2)
  return {"result": result}
typescript
import { traceable } from "langsmith/traceable";

// 可选地包装在 'traceable' 中以追踪此函数的所有调用。
const calculatorTool = traceable(async ({ operation, number1, number2 }) => {
// 函数必须返回字符串
if (operation === "add") {
  return (number1 + number2).toString();
} else if (operation === "subtract") {
  return (number1 - number2).toString();
} else if (operation === "multiply") {
  return (number1 * number2).toString();
} else if (operation === "divide") {
  return (number1 / number2).toString();
} else {
  throw new Error("Invalid operation.");
}
});

// 这是您将要评估的函数。
const target = async (inputs) => {
// 这假设您的数据集输入包含 `operation`、`num1` 和 `num2` 键
const result = await calculatorTool.invoke({
  operation: inputs.operation,
  number1: inputs.num1,
  number2: inputs.num2,
});
return { result };
}

示例:应用程序或智能体

python
from my_agent import agent

      # 这是您将要评估的函数。
def target(inputs: dict) -> dict:
  # 这假设您的数据集输入包含一个 `messages` 键
  messages = inputs["messages"]
  # 将 `invoke` 替换为您用来调用智能体的任何方法
  response = agent.invoke({"messages": messages})
  # 这假设您的智能体输出格式正确
  return response
typescript
import { agent } from 'my_agent';

// 这是您将要评估的函数。
const target = async(inputs) => {
// 这假设您的数据集输入包含一个 `messages` 键
const messages = inputs.messages;
// 将 `invoke` 替换为您用来调用智能体的任何方法
const response = await agent.invoke({ messages });
// 这假设您的智能体输出格式正确
return response;
}

LangChain 中文文档