Skip to main content
代码评估器是接收数据集示例和应用程序输出结果,并返回一个或多个指标的函数。这些函数可以直接传递给 evaluate()aevaluate() 函数。
要在 LangSmith UI 中定义代码评估器,请参阅 如何定义代码评估器 (UI)

基本示例

from langsmith import evaluate

def correct(outputs: dict, reference_outputs: dict) -> bool:
    """检查答案是否与预期答案完全匹配。"""
    return outputs["answer"] == reference_outputs["answer"]

def dummy_app(inputs: dict) -> dict:
    return {"answer": "hmm i'm not sure", "reasoning": "i didn't understand the question"}

results = evaluate(
    dummy_app,
    data="dataset_name",
    evaluators=[correct]
)

评估器参数

代码评估器函数必须具有特定的参数名称。它们可以接受以下参数的任意子集:
  • run: Run:应用程序在给定示例上生成的完整 Run 对象。
  • example: Example:完整的数据集 Example,包括示例输入、输出(如果可用)和元数据(如果可用)。
  • inputs: dict:对应于数据集中单个示例的输入字典。
  • outputs: dict:应用程序在给定 inputs 上生成的输出字典。
  • reference_outputs/referenceOutputs: dict:与示例关联的参考输出字典(如果可用)。
对于大多数用例,您只需要 inputsoutputsreference_outputsrunexample 仅在您需要应用程序实际输入和输出之外的某些额外跟踪或示例元数据时才有用。 使用 JS/TS 时,这些都应作为单个对象参数的一部分传递。

评估器输出

代码评估器应返回以下类型之一: Python 和 JS/TS
  • dict:形如 {"score" | "value": ..., "key": ...} 的字典允许您自定义指标类型(“score” 用于数值型,“value” 用于分类型)和指标名称。例如,当您想将整数记录为分类指标时,这很有用。
仅限 Python
  • int | float | bool:这被解释为可以求平均值、排序等的连续指标。函数名用作指标的名称。
  • str:这被解释为分类指标。函数名用作指标的名称。
  • list[dict]:使用单个函数返回多个指标。

附加示例

需要 langsmith>=0.2.0
from langsmith import evaluate, wrappers
from langsmith.schemas import Run, Example
from openai import AsyncOpenAI
# 假设您已安装 pydantic。
from pydantic import BaseModel

# 如果愿意,我们仍然可以传入 Run 和 Example 对象
def correct_old_signature(run: Run, example: Example) -> dict:
    """检查答案是否与预期答案完全匹配。"""
    return {"key": "correct", "score": run.outputs["answer"] == example.outputs["answer"]}

# 仅评估实际输出
def concision(outputs: dict) -> int:
    """评估答案的简洁程度。1 表示最简洁,5 表示最不简洁。"""
    return min(len(outputs["answer"]) // 1000, 4) + 1

# 使用 LLM 作为评判者
oai_client = wrappers.wrap_openai(AsyncOpenAI())

async def valid_reasoning(inputs: dict, outputs: dict) -> bool:
    """使用 LLM 判断推理和答案是否一致。"""
    instructions = """
给定以下问题、答案和推理,判断答案的推理在逻辑上是否有效,并且与问题和答案一致。"""

    class Response(BaseModel):
        reasoning_is_valid: bool

    msg = f"Question: {inputs['question']}\nAnswer: {outputs['answer']}\nReasoning: {outputs['reasoning']}"
    response = await oai_client.beta.chat.completions.parse(
        model="gpt-5.4-mini",
        messages=[{"role": "system", "content": instructions,}, {"role": "user", "content": msg}],
        response_format=Response
    )
    return response.choices[0].message.parsed.reasoning_is_valid

def dummy_app(inputs: dict) -> dict:
    return {"answer": "hmm i'm not sure", "reasoning": "i didn't understand the question"}

results = evaluate(
    dummy_app,
    data="dataset_name",
    evaluators=[correct_old_signature, concision, valid_reasoning]
)

相关内容