# 内置评估器 > 从 pixie 源代码文档字符串自动生成。 > 请勿手动编辑——运行 `uv run python scripts/generate_skill_docs.py`。 Autoevals 适配器——封装 `autoevals` 评分器的预制评估器。 本模块提供 :class:`AutoevalsAdapter`,它将 autoevals 的 `Scorer` 接口桥接到 pixie 的 `Evaluator` 协议,以及一组用于常见评估任务的工厂函数。 公共 API(均从 `pixie.evals` 重新导出): **核心适配器:** - :class:`AutoevalsAdapter` —— 任意 autoevals `Scorer` 的通用包装器。 **启发式评分器(无需 LLM):** - :func:`LevenshteinMatch` —— 编辑距离字符串相似度。 - :func:`ExactMatch` —— 精确值比较。 - :func:`NumericDiff` —— 归一化数值差异。 - :func:`JSONDiff` —— 结构化 JSON 比较。 - :func:`ValidJSON` —— JSON 语法/模式验证。 - :func:`ListContains` —— 两个字符串列表之间的重叠。 **嵌入评分器:** - :func:`EmbeddingSimilarity` —— 基于嵌入的余弦相似度。 **LLM 作为评判者的评分器:** - :func:`Factuality`、:func:`ClosedQA`、:func:`Battle`、 :func:`Humor`、:func:`Security`、:func:`Sql`、 :func:`Summary`、:func:`Translation`、:func:`Possible`。 **内容审核:** - :func:`Moderation` —— OpenAI 内容审核检查。 **RAGAS 指标:** - :func:`ContextRelevancy`、:func:`Faithfulness`、 :func:`AnswerRelevancy`、:func:`AnswerCorrectness`。 ## 评估器选择指南 根据**输出类型**和评估标准选择评估器: | 输出类型 | 评估器类别 | 示例 | | -------------------------------------------- | ----------------------------------------------------------- | -------------------------------------- | | 确定性输出(标签、是/否、固定格式) | 启发式:`ExactMatch`、`JSONDiff`、`ValidJSON` | 标签分类、JSON 提取 | | 带有参考答案的开放式文本 | LLM 作为评判者:`Factuality`、`ClosedQA`、`AnswerCorrectness` | 聊天机器人回复、问答、摘要 | | 带有预期上下文/依据的文本 | RAG:`Faithfulness`、`ContextRelevancy` | RAG 流水线 | | 带有风格/格式要求的文本 | 通过 `create_llm_evaluator` 自定义 | 语音友好型回复、语气检查 | | 多维度质量 | 组合多个评估器 | 事实性 + 相关性 + 语气 | | 依赖追踪的质量(工具使用、路由) | 通过 `create_agent_evaluator` 创建代理评估器 | 工具正确性、多步推理质量 | 关键规则: - 对于开放式 LLM 文本,**切勿**使用 `ExactMatch`——LLM 输出是非确定性的。 - `AnswerRelevancy` 是**仅限 RAG** 的——需要追踪中的 `context`。没有该值则返回 0.0。对于通用相关性,请使用 `create_llm_evaluator`。 - 不要在缺少 `expected_output` 的条目上使用比较评估器(`Factuality`、`ClosedQA`、 `ExactMatch`)——它们会产生无意义的分数。 --- ## 评估器参考 ### `AnswerCorrectness` ```python AnswerCorrectness(*, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 答案正确性评估器(RAGAS)。 判断 `eval_output` 与 `expected_output` 相比是否正确,综合了事实相似度和语义相似度。 **使用场景**:RAG 流水线中的问答场景,当你拥有参考答案并希望获得全面的正确性分数时。 **需要 `expected_output`**:是。 **需要 `eval_metadata["context"]`**:可选(可提高准确性)。 参数: client:OpenAI 客户端实例。 ### `AnswerRelevancy` ```python AnswerRelevancy(*, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 答案相关性评估器(RAGAS)。 判断 `eval_output` 是否直接回应了 `eval_input` 中的问题。 **使用场景**:仅限 RAG 流水线——需要追踪中的 `context`。没有该值则返回 0.0。对于通用(非 RAG)响应相关性,请改用 `create_llm_evaluator` 并编写自定义提示词。 **需要 `expected_output`**:否。 **需要 `eval_metadata["context"]`**:是——**仅限 RAG 流水线**。 参数: client:OpenAI 客户端实例。 ### `Battle` ```python Battle(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 头对头比较评估器(LLM 作为评判者)。 使用 LLM 将 `eval_output` 与 `expected_output` 进行比较,并根据 `eval_input` 中的指令判断哪个更优。 **使用场景**:A/B 测试场景、比较模型输出、或对备选回复进行排序。 **需要 `expected_output`**:是。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `ClosedQA` ```python ClosedQA(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 闭卷问答评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 是否与 `expected_output` 相比正确回答了 `eval_input` 中的问题。可选地转发 `eval_metadata["criteria"]` 以用于自定义评分标准。 **使用场景**:答案应与参考答案匹配的问答场景——例如客户支持回答、知识库查询。 **需要 `expected_output`**:是——不要在缺少 `expected_output` 的条目上使用;会产生无意义的分数。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `ContextRelevancy` ```python ContextRelevancy(*, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 上下文相关性评估器(RAGAS)。 判断检索到的上下文是否与查询相关。将 `eval_metadata["context"]` 转发到底层评分器。 **使用场景**:RAG 流水线——评估检索质量。 **需要 `expected_output`**:是。 **需要 `eval_metadata["context"]`**:是(仅限 RAG 流水线)。 参数: client:OpenAI 客户端实例。 ### `EmbeddingSimilarity` ```python EmbeddingSimilarity(*, prefix: 'str | None' = None, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 基于嵌入的语义相似度评估器。 计算 `eval_output` 和 `expected_output` 嵌入向量之间的余弦相似度。 **使用场景**:比较两段文本的语义含义,而不关心具体措辞。对于改写内容比 Levenshtein 更稳健,但不如 LLM 作为评判者的评估器细致。 **需要 `expected_output`**:是。 参数: prefix:可选的前缀文本,用于提供领域上下文。 model:嵌入模型名称。 client:OpenAI 客户端实例。 ### `ExactMatch` ```python ExactMatch() -> 'AutoevalsAdapter' ``` 精确值比较评估器。 如果 `eval_output` 与 `expected_output` 完全相等,则返回 1.0,否则返回 0.0。 **使用场景**:确定性、结构化的输出(分类标签、是/否回答、固定格式字符串)。**切勿**用于开放式 LLM 文本——LLM 输出是非确定性的,因此精确匹配几乎总是失败。 **需要 `expected_output`**:是。 ### `Factuality` ```python Factuality(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 事实准确性评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 在 `eval_input` 的上下文中是否与 `expected_output` 事实一致。 **使用场景**:需要事实正确性的开放式文本(聊天机器人回复、问答回答、摘要)。对于 LLM 生成的文本,优先于 `ExactMatch`。 **需要 `expected_output`**:是——不要在缺少 `expected_output` 的条目上使用;会产生无意义的分数。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `Faithfulness` ```python Faithfulness(*, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 忠实度评估器(RAGAS)。 判断 `eval_output` 是否忠实于(即是否由)所提供的上下文所支持。转发 `eval_metadata["context"]`。 **使用场景**:RAG 流水线——确保回答不会超出检索到的上下文而产生幻觉。 **需要 `expected_output`**:否。 **需要 `eval_metadata["context"]`**:是(仅限 RAG 流水线)。 参数: client:OpenAI 客户端实例。 ### `Humor` ```python Humor(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 幽默质量评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 相对于 `expected_output` 的幽默质量。 **使用场景**:评估创意写作、聊天机器人个性或娱乐应用中的幽默效果。 **需要 `expected_output`**:是。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `JSONDiff` ```python JSONDiff(*, string_scorer: 'Any' = None) -> 'AutoevalsAdapter' ``` 结构化 JSON 比较评估器。 递归比较两个 JSON 结构并生成相似度分数。支持嵌套对象、数组和混合类型。 **使用场景**:需要字段级比较的结构化 JSON 输出(例如提取的数据、API 响应模式、工具调用参数)。 **需要 `expected_output`**:是。 参数: string_scorer:用于字符串字段的可选成对评分器。 ### `LevenshteinMatch` ```python LevenshteinMatch() -> 'AutoevalsAdapter' ``` 编辑距离字符串相似度评估器。 计算 `eval_output` 与 `expected_output` 之间的归一化 Levenshtein 距离。完全相同返回 1.0,编辑距离越大分数越低。 **使用场景**:确定性或近似确定性的输出,允许较小的文本变化(例如格式差异、轻微拼写错误)。不适用于开放式 LLM 文本——请改用 LLM 作为评判者的评估器。 **需要 `expected_output`**:是。 ### `ListContains` ```python ListContains(*, pairwise_scorer: 'Any' = None, allow_extra_entities: 'bool' = False) -> 'AutoevalsAdapter' ``` 列表重叠评估器。 检查 `eval_output` 是否包含 `expected_output` 中的所有条目。基于重叠比例评分。 **使用场景**:输出为条目列表且完整性至关重要的场景(例如提取的实体、搜索结果、推荐)。 **需要 `expected_output`**:是。 参数: pairwise_scorer:用于逐对元素比较的可选评分器。 allow_extra_entities:如果为 True,输出中的多余条目不扣分。 ### `Moderation` ```python Moderation(*, threshold: 'float | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 内容审核评估器。 使用 OpenAI 审核 API 检查 `eval_output` 中是否包含不安全内容(仇恨言论、暴力、自残等)。 **使用场景**:任何需要关注输出安全性的应用——聊天机器人、内容生成、面向用户的 AI。 **需要 `expected_output`**:否。 参数: threshold:自定义标记阈值。 client:OpenAI 客户端实例。 ### `NumericDiff` ```python NumericDiff() -> 'AutoevalsAdapter' ``` 归一化数值差异评估器。 计算 `eval_output` 与 `expected_output` 之间的归一化数值距离。完全相同返回 1.0,差异越大分数越低。 **使用场景**:允许近似相等的数值输出(例如价格计算、分数、测量值)。 **需要 `expected_output`**:是。 ### `Possible` ```python Possible(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 可行性/合理性评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 是否是一个合理或可行的回答。 **使用场景**:通用质量检查,当你希望验证输出是否合理而不需要特定参考答案时。 **需要 `expected_output`**:否。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `Security` ```python Security(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 安全漏洞评估器(LLM 作为评判者)。 使用 LLM 检查 `eval_output` 是否基于 `eval_input` 中的指令存在安全漏洞。 **使用场景**:代码生成、SQL 输出,或任何需要检查输出是否存在注入或漏洞风险的场景。 **需要 `expected_output`**:否。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `Sql` ```python Sql(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` SQL 等价性评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` SQL 是否与 `expected_output` SQL 语义等价。 **使用场景**:Text-to-SQL 应用,要求生成的 SQL 在功能上与参考查询等价。 **需要 `expected_output`**:是。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `Summary` ```python Summary(*, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 摘要质量评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 作为摘要的质量,并与 `expected_output` 中的参考摘要进行比较。 **使用场景**:摘要任务,要求输出必须从源材料中捕获关键信息。 **需要 `expected_output`**:是。 参数: model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `Translation` ```python Translation(*, language: 'str | None' = None, model: 'str | None' = None, client: 'Any' = None) -> 'AutoevalsAdapter' ``` 翻译质量评估器(LLM 作为评判者)。 使用 LLM 判断 `eval_output` 与目标语言中 `expected_output` 相比的翻译质量。 **使用场景**:机器翻译或多语言输出场景。 **需要 `expected_output`**:是。 参数: language:目标语言(例如 `"Spanish"`)。 model:LLM 模型名称。 client:OpenAI 客户端实例。 ### `ValidJSON` ```python ValidJSON(*, schema: 'Any' = None) -> 'AutoevalsAdapter' ``` JSON 语法和模式验证评估器。 如果 `eval_output` 是有效 JSON(并且可选地匹配提供的模式),则返回 1.0,否则返回 0.0。 **使用场景**:输出必须是有效 JSON 的场景——可选择性地要求符合特定模式(例如工具调用响应、结构化提取)。 **需要 `expected_output`**:否。 参数: schema:用于验证的可选 JSON Schema。 --- ## 自定义评估器:`create_llm_evaluator` 从提示词模板创建自定义 LLM 作为评判者的评估器的工厂函数。 用法:: from pixie import create_llm_evaluator concise_voice_style = create_llm_evaluator( name="ConciseVoiceStyle", prompt_template=""" 你正在评估一个语音代理的回复是否简洁且适合电话沟通。 用户说:{eval_input} 代理回复:{eval_output} 预期行为:{expectation} 如果回复简洁(少于 3 句)、直接回答问题、并使用适合电话对话的口语化语言,则评分 1.0。 如果回复冗长、离题、或使用了书面风格格式,则评分 0.0。 """, ) ### `create_llm_evaluator` ```python create_llm_evaluator(name: 'str', prompt_template: 'str', *, model: 'str' = 'gpt-4o-mini', client: 'Any | None' = None) -> '_LLMEvaluator' ``` 从提示词模板创建一个自定义的 LLM 作为评判者的评估器。 模板可以引用以下变量(这些变量从 :class:`~pixie.storage.evaluable.Evaluable` 字段填充): - `{eval_input}` —— evaluable 的输入数据。单项列表展开为该条目的值;多项列表展开为 `name → value` 对的 JSON 字典。 - `{eval_output}` —— evaluable 的输出数据(规则同 `eval_input`)。 - `{expectation}` —— evaluable 的预期输出 参数: name:评估器的显示名称(显示在计分卡中)。 prompt_template:包含 `{eval_input}`、`{eval_output}` 和/或 `{expectation}` 占位符的字符串模板。 model:OpenAI 模型名称(默认:`gpt-4o-mini`)。 client:可选预配置的 OpenAI 客户端实例。 返回: 一个满足 `Evaluator` 协议的可调用评估器。 抛出: ValueError:如果模板使用类似 `{eval_input[key]}` 的嵌套字段访问(仅支持顶层占位符)。 ### `create_agent_evaluator` ```python create_agent_evaluator(name: 'str', criteria: 'str') -> '_AgentEvaluator' ``` 创建一个将评分委托给编码代理的评估器。 在 `pixie test` 期间,代理评估器不会自动评分。相反,它们会抛出 `AgentEvaluationPending` 异常,并使用评估标准记录一个 `PendingEvaluation`。编码代理(由步骤 6 指导)审查每个条目的追踪和输出,然后对待处理评估进行评分。 **使用场景**:需要对 LLM 追踪进行全面审查的质量维度——工具调用正确性、多步推理质量、路由决策——这些场景下自动化的 LLM 作为评判者的提示词无法捕捉到细微差异。 **何时不该使用**:简单的文本质量检查(改用 `create_llm_evaluator`)、确定性检查(使用启发式评估器),或任何仅凭输入+输出即可评分而无需追踪上下文的评估标准。 参数: name:评估器的显示名称(计分卡中显示为 ⏳ 待处理)。 criteria:评估标准——编码代理在审查结果时将遵循的评分说明。请具体且可操作。 返回: 一个满足 `Evaluator` 协议的可调用评估器。其 `__call__` 方法抛出 `AgentEvaluationPending` 异常,而不是返回 `Evaluation`。 示例: ```python from pixie import create_agent_evaluator ResponseQuality = create_agent_evaluator( name="ResponseQuality", criteria="回复直接回应用户的问题,信息准确、结构清晰。" "没有幻觉或离题内容。", ) ToolUsageCorrectness = create_agent_evaluator( name="ToolUsageCorrectness", criteria="应用根据用户的意图以正确顺序调用了正确的工具。" "没有不必要的或遗漏的工具调用。", ) ```