目标函数签名
为了在代码中评估应用程序,我们需要一种运行应用程序的方法。当使用evaluate()(Python / JavaScript)时,我们将通过传入一个 目标函数 参数来实现。这是一个接收数据集示例的输入并以字典形式返回应用程序输出的函数。在此函数内,我们可以以任何方式调用我们的应用程序。我们也可以以任何方式格式化输出。关键在于,我们定义的任何评估器函数都应能与我们在目标函数中返回的输出格式配合工作。
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],
...
)
evaluate() 将自动追踪你的目标函数。这意味着,如果你在目标函数内运行任何可追踪的代码,这些代码也将作为目标追踪的子运行被追踪。示例:单次 LLM 调用
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-5.4-mini",
)
return {"answer": response.choices[0].message.content}
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-5.4-mini',
});
return { answer: response.choices[0].message.content };
}
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-5.4-mini")
def target(inputs: dict) -> dict:
# 这假设你的数据集包含带有 `messages` 键的输入
messages = inputs["messages"]
response = model.invoke(messages)
return {"answer": response.content}
import { ChatOpenAI } from '@langchain/openai';
// 这是你将评估的函数。
const target = async(inputs) => {
// 这假设你的数据集包含带有 `messages` 键的输入
const messages = inputs.messages;
const model = new ChatOpenAI({ model: "gpt-5.4-mini" });
const response = await model.invoke(messages);
return {"answer": response.content};
}
示例:非 LLM 组件
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}
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 };
}
示例:应用程序或代理
from my_agent import agent
# 这是你将评估的函数。
def target(inputs: dict) -> dict:
# 这假设你的数据集包含带有 `messages` 键的输入
messages = inputs["messages"]
# 将 `invoke` 替换为你用于调用代理的任何方法
response = agent.invoke({"messages": messages})
# 这假设你的代理输出格式正确
return response
import { agent } from 'my_agent';
// 这是你将评估的函数。
const target = async(inputs) => {
// 这假设你的数据集包含带有 `messages` 键的输入
const messages = inputs.messages;
// 将 `invoke` 替换为你用于调用代理的任何方法
const response = await agent.invoke({ messages });
// 这假设你的代理输出格式正确
return response;
}
如果你有一个 LangGraph/LangChain 代理,它接受你数据集中定义的输入,并返回你希望在评估器中使用的输出格式,你可以直接将该对象作为目标传入:
from my_agent import agent
from langsmith import Client
client = Client()
client.evaluate(agent, ...)
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

