
详解 Opik AnswerRelevance LLM Judge 指标量化 RAG 回答相关性评分的完整实现【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llmAnswerRelevance 是 Opik Python SDK 内置的 LLM Judge 指标之一用于评估模型给出的回答answer在多大程度上切中了用户的问题question并输出 0.01.0 的相关性分数与评分理由。本篇基于 SDK 官方 API 文档页 AnswerRelevance.rst 及其对应的完整源码实现讲清该指标的构造参数、双模式打分有/无上下文、Prompt 与 Few-shot 设计、模型输出解析链路以及在opik.evaluate实验中实际使用它的方式。读完后你可以直接复制可运行的评分代码并理解分数背后的每一条校验逻辑。1. 指标定位一个用 LLM 给回答打相关性的评分器AnswerRelevance 的文档页通过 Sphinxautoclass指令直接渲染 opik.evaluation.metrics.AnswerRelevance 类本身的 docstring其核心定义为A metric that evaluates the relevance of an answer to a given input using an LLM. This metric uses a language model to assess how well the given output (answer) addresses the provided input (question) within the given context. It returns a score between 0.0 and 1.0, where higher values indicate better answer relevance.也就是说它属于opik.evaluation.metrics包下的 LLM Judge 家族同级还有Hallucination、ContextRecall、ContextPrecision、GEval等见 llm_judges 目录输入是问题 回答可选上下文输出是 0.0完全不相关到 1.0高度相关之间的浮点分数外加一段人类可读的评分理由典型场景是 RAG 系统评估检索出文档片段后判断最终回答是否真的围绕用户的问题展开而不是跑题、答非所问或堆砌无关信息。2. 快速上手最简调用文档 docstring 给出的最小示例如下可直接复制运行需配置好 LLM API Keyfrom opik.evaluation.metrics import AnswerRelevance answer_relevance_metric AnswerRelevance() result answer_relevance_metric.score( inputWhats the capital of France?, outputThe capital of France is Paris., context[France is a country in Europe.], ) print(result.value) # 0.9 print(result.reason) # The answer directly addresses the users query by correctly identifying Paris as the capital of France. ...返回类型是 ScoreResult包含三个字段字段含义name指标名默认answer_relevance_metric会写入实验结果的 feedback score 名称value相关性分数float范围 [0.0, 1.0]reason模型给出的评分理由文本指标同时提供同步与异步两种打分入口二者签名一致均接受额外的**ignored_kwargs在evaluate中 dataset 列会自动透传进来无需关心score(input, output, contextNone, **ignored_kwargs) - ScoreResult见 metric.py 第 116-143 行ascore(input, output, contextNone, **ignored_kwargs) - ScoreResult异步版见 metric.py 第 145-173 行3. 构造参数详解完整构造函数定义于 metric.py 第 48-75 行。官方文档页列出的全部参数及其源码默认值如下参数类型默认值说明modelstr \| base_model.OpikBaseModelNone用于评判的语言模型。可以传字符串模型名也可以传OpikBaseModel子类实例。为None时从OpikConfig().default_llm解析默认模型见 models_factory.get_default_model_name底层默认走LiteLLMChatModelnamestranswer_relevance_metric指标名称作为 feedback score 的名字few_shot_examplesList[FewShotExampleWithContextAnswerRelevance]None有上下文模式注入 Prompt 的 few-shot 示例不传则使用 Opik 内置示例few_shot_examples_no_contextList[FewShotExampleNoContextAnswerRelevance]None无上下文模式使用的 few-shot 示例无需context字段require_contextboolTrue为False时允许无上下文模式运行即score()不传context也不报错trackboolTrue是否将指标调用纳入 Opik 追踪project_namestrNone无父 span/trace 可继承项目名时指定追踪所在项目seedintNone可选随机种子传给模型以获得确定性输出temperaturefloatNone可选温度参数不传则使用模型默认温度几个实现层面的关键细节3.1 模型解析与缓存model参数的处理逻辑在 _init_model如果传入的是OpikBaseModel实例直接使用该实例否则通过 models_factory.get 按名称创建模型并把temperature、seed若提供作为model_kwargs透传给构造函数工厂内部维护了_MODEL_CACHE以(model_name, track, 冻结后的 kwargs)为缓存键同一配置只创建一次模型实例从源码结构看当模型名属于 Anthropic 系anthropic/或claude前缀且安装了 Anthropic SDK 时工厂会优先使用原生AnthropicChatModel否则回退到LiteLLMChatModel见 models_factory.py 第 60-91 行。3.2 seed 与 temperature 如何生效seed在构造时保存在self._seed随后与temperature一起组装进model_kwargs传给模型工厂。这意味着如果你希望批量评估结果可复现应显式设置seed例如metric AnswerRelevance(modelopenai/gpt-4o, seed42, temperature0.0)仓库中有专门的测试覆盖 seed 参数在各 LLM Judge 指标上的行为可参考 test_seed_parameter.py。3.3 追踪行为AnswerRelevance 继承自 base_metric.BaseMetric。基类构造时trackTrue且配置检查通过会用opik.track装饰器包裹score与ascore方法见 base_metric.py 第 75-83 行因此每次打分会自动产生一条 trace/span 记录到 Opik 平台便于排查 Judge 调用本身。若不想追踪传trackFalse注意project_name仅在trackTrue时允许设置否则抛ValueError。4. 两种打分模式有上下文 vs 无上下文score()的context参数List[str]决定走哪条 Prompt 分支逻辑在 _build_messagescontext 非空 - templates.build_messages_with_context(...) # 有上下文模式 context 为空 - 若 require_contextTrue - 抛出 MetricComputationError 若 require_contextFalse - templates.build_messages_no_context(...)具体行为有上下文模式默认Judge 会结合检索到的上下文片段、用户问题与回答三者综合评判。这是 RAG 评估的标准用法——回答既要切题也要与上下文对齐。无上下文模式Prompt 完全不提及 context只评判回答对问题本身的切题程度。适用于纯问答、无检索链路的场景。保护性异常默认require_contextTrue若漏传context会抛出MetricComputationError错误信息明确提示如需无上下文模式请显式使用AnswerRelevancy(require_contextFalse)见 metric.py 第 178-183 行。这是一个防止静默降级评判的防御式设计默认配置下不会在缺少检索片段的情况下悄悄给分。用户消息的组装格式有上下文模式如下输入、输出、上下文以固定模板拼入 user 消息见 templates.py 第 222-242 行###INPUTS:### *** Input: {input} Output: {output} Context: {context} ***5. Prompt 与 Few-shot 示例设计系统提示词定义在 templates.py 第 84-178 行两套模板有/无上下文结构一致均由四个部分组成角色设定YOU ARE AN EXPERT IN NLP EVALUATION METRICS, SPECIALLY TRAINED TO ASSESS ANSWER RELEVANCE...要求基于用户输入与上下文评估另一 LLM 回答的相关性指令INSTRUCTIONS先分析上下文与输入再评估回答给出 0.0完全不相关到 1.0高度相关的分数并以 JSON 对象返回包含分数与简要解释思维链CHAIN OF THOUGHTS显式引导四步——理解上下文与输入 → 评估回答 → 给出分数并论证 → 生成 JSON 输出且要求输出 JSON 只包含answer_relevance_score和reason两个字段禁止项WHAT NOT TO DO未完成分析不得打分、分数与解释必须一致、不得附加额外字段、除非回答完全相关且不含任何无关信息否则绝不给满分。5.1 内置 Few-shot 示例若不传few_shot_examples模板会注入三组内置示例templates.py 第 23-81 行全部围绕同一问题 Whats the capital of France?覆盖低/中/高三档分数示例回答分数理由要点Low RelevanceThe Eiffel Tower is a famous landmark.0.2与法国相关但未回答首都问题相关性低Medium RelevanceFrance has many beautiful cities, including Paris.0.6提到了正确答案 Paris但仅作为众多城市之一不够直接High RelevanceThe capital of France is Paris, a city known for its iconic Eiffel Tower.0.9直接正确回答且与上下文对齐因细节略多未给满分无上下文版示例FEW_SHOT_EXAMPLES_NO_CONTEXT内容相同只是去掉了context字段。5.2 自定义 Few-shot 示例示例的 schema 用TypedDict定义templates.py 第 6-20 行。有上下文模式每个示例需包含title、input、output、context字符串列表、answer_relevance_score、reason无上下文模式则不需要context。例如from opik.evaluation.metrics import AnswerRelevance metric AnswerRelevance( few_shot_examples[ { title: Off-topic answer, input: How do I reset my password?, output: Our support hours are 9-5., context: [Password reset is available from the account settings page.], answer_relevance_score: 0.1, reason: The answer talks about support hours instead of the password reset process., } ] )模板会把这些示例格式化为带标题的 Markdown 段落#### Example N: {title}附 Input/Output/Context 与 JSON 结果块拼进系统提示词的###FEW-SHOT EXAMPLES###区域见 _format_examples_with_context。当你的评分偏好与内置示例的尺度不一致比如你希望允许回答带更多背景信息时替换 few-shot 示例是校准评分口径最直接的手段。6. 模型输出解析与分数校验打分流程的最后一步是把模型回复解析成结构化结果实现在 parser.py期望的响应结构由 Pydantic 模型约束metric.py 第 11-13 行并通过generate_chat_completion(response_formatAnswerRelevanceResponseFormat)传给模型尽可能让模型输出受约束的 JSONclass AnswerRelevanceResponseFormat(pydantic.BaseModel): answer_relevance_score: float reason: strparse_model_output先用parsing_helpers.extract_json_content_or_raise从原始文本中提取 JSON再读取answer_relevance_score范围校验分数必须满足0.0 score 1.0否则抛出MetricComputationErrorAnswer relevance score must be between 0.0 and 1.0, got {score}见 parser.py 第 10-27 行任何解析失败JSON 非法、字段缺失、范围越界都会被记录 error 日志并统一转为MetricComputationError不会返回一个可疑的分数。单测覆盖了越界分数的场景如answer_relevance_score: -0.5必须抛错见 test_parser.py。7. 在 opik.evaluate 实验中批量评估AnswerRelevance 设计为可作为opik.evaluate的metrics参数之一对数据集逐行打分并汇总为实验结果。一个典型的 RAG 评估写法import opik from opik.evaluation.metrics import AnswerRelevance def task(data_point): # 调用你的 RAG 应用返回回答与检索片段 answer, retrieved_docs run_rag(data_point[question]) return {output: answer, context: retrieved_docs} dataset opik.Opik().get_dataset(namerag_qa) # 数据集列: question(即 input 来源列), output(由 task 产生), context(list[str]) opik.evaluate( experiment_namerag-answer-relevance, datadataset, tasktask, metrics[AnswerRelevance(modelopenai/gpt-4o, seed42)], )要点context列的值必须是字符串列表可以是 task 返回值里的任意列名evaluate会自动作为context关键字参数传入score()多余的列则进入**ignored_kwargs被忽略——这正是score()签名接受**ignored_kwargs的原因打分产生的answer_relevance_metric分数与理由会作为 feedback score 写入实验结果可在 Opik 平台的实验视图中按分数排序、过滤低相关样本由于基类在trackTrue时对score/ascore做了追踪包裹见第 3.3 节每条打分的 Judge 模型调用也会落库为 trace方便审计分数为什么是这个值。对 LLM Judge 类指标包括 AnswerRelevance的端到端验证可参考集成测试 test_evaluation_metrics.py。8. 源码与文档索引内容路径指标 API 文档页autoclass 渲染AnswerRelevance.rst指标主实现构造、score/ascore、消息构建metric.py系统提示词与 few-shot 模板templates.py输出解析与分数校验parser.py指标基类track 装饰逻辑base_metric.py结果类型score_result.py模型工厂默认模型、缓存、Anthropic/LiteLLM 选择models_factory.py解析器单测范围校验等test_parser.pyLLM Judge 指标集成测试test_evaluation_metrics.py实践建议RAG 场景保持require_contextTrue默认值漏传 context 时宁可报错也不要静默按无上下文模式给分否则会高估回答质量批量评估固定seed与temperatureJudge 模型本身有随机性固定这两个参数才能让不同版本的 RAG 管道分数可比用 few-shot 校准评分口径内置示例偏严格有无关信息不给满分如果你的业务允许回答附带解释性内容参照FewShotExampleWithContextAnswerRelevance结构补充 2-3 条符合业务口径的示例搭配使用AnswerRelevance 衡量切题性可与ContextRecall/ContextPrecision衡量检索质量和Hallucination衡量忠实度组合构成完整的 RAG 评估矩阵。【免费下载链接】comet-llmDebug, evaluate, and monitor your LLM applications, RAG systems, and agentic workflows with comprehensive tracing, automated evaluations, and production-ready dashboards.项目地址: https://gitcode.com/GitHub_Trending/co/comet-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考