# 步骤 3:定义评估器 **为什么需要这一步**:在完成应用的仪器化(步骤 2)之后,现在你需要将每个评估标准映射到具体的评估器——在需要的地方实现自定义评估器——以便数据集(步骤 4)可以通过名称引用它们。 --- ## 3a. 将标准映射到评估器 **步骤 1c 中的每个评估标准——包括用户在提示中指定的任何维度——都必须有对应的评估器。** 如果用户要求了"事实准确性、完整性和偏见性",你就需要三个评估器(或者一个覆盖全部三者的多标准评估器)。不要静默地丢弃任何被请求的维度。优先选择那些能够衡量 `pixie_qa/00-project-analysis.md` 中确定的**困难问题/失败模式**的评估器——这些比通用的质量评估器更有价值。 对于每个评估标准,按照以下决策顺序选择评估器: 1. **内置评估器**——如果标准评估器符合该标准(事实正确性 → `Factuality`,精确匹配 → `ExactMatch`,RAG 忠实度 → `Faithfulness`)。完整目录请参见 `evaluators.md`。 2. **Agent 评估器**(`create_agent_evaluator`)——**所有语义性、定性和应用特定标准的默认选择**。Agent 评估器将由你(编码 agent)在步骤 6 中进行评分,你将在该步骤中全面审查每个条目的追踪记录和输出。对于像"提取结果是否准确捕获了源内容?""是否存在幻觉值?"或"应用是否优雅地处理了嘈杂输入?"这样的标准,这种方法远比自动化评分有效。 3. **手动自定义评估器**——仅用于**机械性、确定性的检查**,即程序化函数可以明确给出正确答案的场景:字段存在性、正则表达式模式匹配、JSON Schema 验证、数值阈值、类型检查。**切勿将手动自定义评估器用于语义质量评估**——如果检查需要对内容是否正确、相关或完整做出**判断**,则应改用 Agent 评估器。 **区分结构性标准与语义性标准**:对于每个标准,问自己:"能否通过一个简单的程序化规则来检查,并且该规则总能给出正确答案?"如果能 → 使用手动自定义评估器。如果不能 → 使用 Agent 评估器。大多数应用特定的质量标准是语义性的,而非结构性的。 对于开放式 LLM 文本,**切勿**使用 `ExactMatch`——LLM 输出是非确定性的。 `AnswerRelevancy` 是**仅限 RAG** 的——它需要在追踪记录中存在 `context` 值。缺少该值时返回 0.0。对于一般的相关性,请使用带有明确标准的 Agent 评估器。 ## 3b. 实现自定义评估器 如果任何标准需要自定义评估器,请立即实现。将自定义评估器放置在 `pixie_qa/evaluators.py` 中(如果数量较多,可放在子模块中)。 ### Agent 评估器(`create_agent_evaluator`)——默认选择 对于**所有语义性、定性和基于判断的标准**,请使用 Agent 评估器。这些评估器将由你(编码 agent)在步骤 5d 中进行评分,你将在该步骤中结合完整上下文审查每个条目的追踪记录和输出——对于准确性、完整性、幻觉检测或错误处理等质量维度,这远比任何自动化方法有效。 ```python from pixie import create_agent_evaluator extraction_accuracy = create_agent_evaluator( name="ExtractionAccuracy", criteria="提取的数据准确反映了源内容。所有字段都包含源中的正确值——没有幻觉值、" "编造值或占位符值。将 final_answer 与 fetched_content " "和 parsed_content 进行比较,以验证每个声称的事实。", ) noise_handling = create_agent_evaluator( name="NoiseHandling", criteria="应用正确忽略了源中的导航装饰、样板文本、广告和其他非内容元素。" "提取的数据仅包含与用户提示相关的信息,而不包含页面结构中的噪音。", ) schema_compliance = create_agent_evaluator( name="SchemaCompliance", criteria="输出包含提示中请求的所有字段,且具有适当的类型和非空值。" "缺失字段、必需数据的空值或包含通用占位符文本的字段表示失败。", ) ``` 在数据集中通过 `filepath:callable_name`(例如 `"pixie_qa/evaluators.py:extraction_accuracy"`)引用 Agent 评估器。 在 `pixie test` 运行期间,Agent 评估器在控制台中显示为 `⏳`。它们将在步骤 5d 中进行评分。 **编写有效的标准**:`criteria` 字符串是你在步骤 5d 中将要遵循的评分细则。请使其具体且可操作: - **不好**:"检查输出是否良好"——过于模糊,难以一致评分 - **不好**:"响应应该准确"——没有说明要与什么进行比较 - **好**:"将提取的字段与源 HTML/文档进行比较。每个字段必须在源中有对应的段落。标记任何无法追溯到源内容的字段值。" - **好**:"应用应保留源文档的结构层次。如果源有章节/子章节,提取结果应反映该嵌套结构,而不是将所有内容扁平化为单一层级。" ### 手动自定义评估器——仅用于机械性检查 仅在确定性的程序化检查中使用手动自定义评估器**,即简单函数能够明确给出正确答案的场景。示例包括:字段存在性、正则匹配、JSON Schema 验证、数值范围检查、类型验证。 **不要将手动自定义评估器用于语义质量评估。** 如果检查需要对内容是否正确、相关、完整或文笔优美做出**判断**,请改用 Agent 评估器。判定标准:"正则表达式、字符串匹配或比较运算符能否完美实现这个检查?"如果不能,则属于语义性检查——请使用 Agent 评估器。 自定义评估器可以是**同步或异步函数**。将它们赋值给 `pixie_qa/evaluators.py` 中的模块级变量: ```python from pixie import Evaluation, Evaluable def my_evaluator(evaluable: Evaluable, *, trace=None) -> Evaluation: score = 1.0 if "expected pattern" in str(evaluable.eval_output) else 0.0 return Evaluation(score=score, reasoning="...") ``` 在数据集中通过 `filepath:callable_name` 引用:`"pixie_qa/evaluators.py:my_evaluator"`。 **访问 `eval_metadata` 和捕获的数据**:自定义评估器通过 `Evaluable` 字段访问每个条目的元数据和 `wrap()` 输出: - `evaluable.eval_metadata` —— 来自条目 `eval_metadata` 字段的字典(例如 `{"expected_tool": "endCall"}`) - `evaluable.eval_output` —— 包含所有 `wrap(purpose="output")` 和 `wrap(purpose="state")` 值的 `list[NamedData]`。每个项包含 `.name`(str)和 `.value`(JsonValue)。使用下面的辅助函数按名称查找。 ```python def _get_output(evaluable: Evaluable, name: str) -> Any: """按名称从 eval_output 中查找 wrap 值。""" for item in evaluable.eval_output: if item.name == name: return item.value return None def call_ended_check(evaluable: Evaluable, *, trace=None) -> Evaluation: expected = evaluable.eval_metadata.get("expected_call_ended") if evaluable.eval_metadata else None actual = _get_output(evaluable, "call_ended") if expected is None: return Evaluation(score=1.0, reasoning="eval_metadata 中无 expected_call_ended") match = bool(actual) == bool(expected) return Evaluation( score=1.0 if match else 0.0, reasoning=f"期望 call_ended={expected},实际得到 {actual}", ) ``` ### ValidJSON 与字符串期望值的冲突 当数据集的 `expectation` 字段中存在值时,`ValidJSON` 会将其视为 JSON Schema。如果你的条目使用**字符串**期望值(例如用于 `Factuality`),将 `ValidJSON` 添加为数据集级别的默认评估器会导致失败——它无法将纯字符串验证为 JSON Schema。要么仅将 `ValidJSON` 应用于具有对象/布尔值期望值的条目,要么在数据集依赖字符串期望值时省略它。 ## 3c. 生成评估器映射文档 将标准到评估器的映射写入 `pixie_qa/03-evaluator-mapping.md`。该文档连接了评估标准(步骤 1c)和数据集(步骤 4)。 **关键**:使用与 `evaluators.md` 参考文档中完全一致的评估器名称——内置评估器使用其短名称(例如 `Factuality`、`ClosedQA`),自定义评估器使用 `filepath:callable_name` 格式(例如 `pixie_qa/evaluators.py:ConciseVoiceStyle`)。 ### 模板 ```markdown # 评估器映射 ## 使用的内置评估器 | 评估器名称 | 覆盖的标准 | 适用范围 | | ------------ | ---------------- | -------------------------- | | Factuality | 事实准确性 | 所有条目 | | ClosedQA | 答案正确性 | 含有 expected_output 的条目 | ## Agent 评估器 | 评估器名称 | 覆盖的标准 | 适用范围 | 源文件 | | -------------------------------------------- | ------------------------ | --------- | ----------------------- | | pixie_qa/evaluators.py:extraction_accuracy | 内容与源的准确性对照 | 所有条目 | pixie_qa/evaluators.py | | pixie_qa/evaluators.py:noise_handling | 导航/样板文本噪音 | 所有条目 | pixie_qa/evaluators.py | ## 手动自定义评估器(仅限机械性检查) | 评估器名称 | 覆盖的标准 | 适用范围 | 源文件 | | -------------------------------------------- | ---------------- | --------- | ----------------------- | | pixie_qa/evaluators.py:required_fields_present | 必填字段检查 | 所有条目 | pixie_qa/evaluators.py | ## 适用范围总结 - **数据集级别默认**(适用于所有条目):Factuality、pixie_qa/evaluators.py:extraction_accuracy - **条目特定**(适用于子集):ClosedQA(仅适用于含有 expected_output 的条目) ``` ## 输出 - `pixie_qa/evaluators.py` 中的自定义评估器实现(如果需要任何自定义评估器) - `pixie_qa/03-evaluator-mapping.md`——标准到评估器的映射 --- > **评估器选择指南**:参见 `evaluators.md` 获取完整的内置评估器目录和 `create_agent_evaluator` 参考。 > > **如果在实现评估器时遇到意外错误**(导入失败、API 不匹配),请先阅读 `evaluators.md` 获取权威的评估器参考,以及 `wrap-api.md` 获取 API 详细信息,然后再猜测修复方法。