Strands Evals 多模态图像转文本评估:MultimodalOutputEvaluator 与 MLLM-as-a-Judge 的设计与实战指南
发布时间:2026/9/28 7:35:09来源:尧图网络
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务【免费下载链接】harness-sdkBuild an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python TypeScript - any model, any cloud.项目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk点击查看免费下载MultimodalOutputEvaluator是 Strands Evals 为「图片/文档输入、文本输出」类任务引入的 MLLM-as-a-Judge 评估器它让 Agent 的输出可以直接携带图片数据交给多模态大模型评判从而覆盖文本评判器无法察觉的视觉幻觉、事实错误与指令违背。本文基于 设计文档 展开结合仓库内的 官方示例 与 用户指南完整解析其 API 设计、数据模型、评分体系与实战用法。读完你将掌握如何构造多模态 Case、如何选用四种内置评估器、如何自定义 rubric 与 reference suffix以及参考式reference-based与免参考式reference-free两种评估模式的切换方式。背景文本评判器的盲区为什么视觉 Agent 需要多模态评估Strands Evals 原有的OutputEvaluator采用 LLM-as-a-Judge 评估纯文本输出但面对视觉任务时存在根本性缺口评判器根本看不到图片。设计文档 0010-multimodal-i2t-evaluation.md 用一段代码描述了开发者当前的困境from strands_evals import Case, Experiment from strands_evals.evaluators import OutputEvaluator evaluator OutputEvaluator(rubricIs the caption accurate?) case Case( nameimage-caption-001, inputDescribe this image., # No way to carry image data expected_outputA dog playing fetch in a park., ) # The judge never sees the image — it cannot detect visual hallucinations experiment Experiment(cases[case], evaluators[evaluator])该设计文档将缺口归纳为三点没有图像感知的评估judge 的提示词prompt是纯文本的模型无法基于图像事实做判断没有多模态提示词构造机制缺少把图像内容块content block与文本组合进一次 judge 调用的能力没有面向视觉任务的维度化 rubric正确性correctness、忠实性faithfulness、幻觉检测hallucination detection需要各自的评分标准。设计范围范围内Scope图像/文档到文本image/document-to-text任务的输出评估例如图像描述、图表问答、文档问答、OCR 类任务。范围外Out of scope文生图text-to-image、音频audio、视频video以及轨迹评估trajectory evaluation。评估维度设计文档为多模态评估定义了四个核心维度其中正确性与整体质量是 P0 优先级忠实性与指令遵循是 P1优先级指标量表核心问题P0Overall Quality整体质量Likert-5响应整体上有多好P0Correctness正确性BinaryYes/No响应在事实上是否准确且完整P1Faithfulness忠实性BinaryYes/No响应是否扎根于图像、没有幻觉P1Instruction Following指令遵循BinaryYes/No响应是否满足查询的要求总体设计一个基类 四个便捷子类设计文档的核心决定是新增MultimodalOutputEvaluator(OutputEvaluator[InputT, OutputT])类用于「媒体进、文本出」的 MLLM-as-a-Judge 评估。输入由 Pydantic 模型MultimodalInput承载字段为media、instruction以及可选的context。在类层次上它直接继承文本版的OutputEvaluator文本版参考 output_evaluator.mdx只覆写_build_prompt()一个钩子方法。核心逻辑全部收敛在基类中四个便捷子类仅预配置各自的 rubricMultimodalOverallQualityEvaluator— Likert-5 整体质量评分MultimodalCorrectnessEvaluator— 严格二值的事实正确性检查MultimodalFaithfulnessEvaluator— 严格二值的幻觉检测MultimodalInstructionFollowingEvaluator— 严格二值的指令合规检查。这四个子类的详细参数与用法分别记录在 multimodal_overall_quality_evaluator.mdx、multimodal_correctness_evaluator.mdx、multimodal_faithfulness_evaluator.mdx 与 multimodal_instruction_following_evaluator.mdx 中。核心数据结构MultimodalInput 与 ImageData开发者日常使用的两个支撑模型是MultimodalInput和ImageData。设计文档给出了它们的完整形态from __future__ import annotations from typing import TYPE_CHECKING, Literal from pydantic import BaseModel if TYPE_CHECKING: from PIL.Image import Image as PILImage class ImageData(BaseModel): Normalizes image sources so the judge receives raw bytes. source: str | bytes | PILImage # file path, base64, data URL, HTTP(S) URL, bytes, or PIL Image format: Literal[jpeg, png, gif, webp] | None None # auto-detected from extension / data URL media_type: str | None None # auto-derived from format def to_bytes(self) - bytes: ... def to_base64(self) - str: ... def to_data_url(self) - str: ... AnyMediaData ImageData # currently aliases ImageData; future: ImageData | VideoData | AudioData | DocumentData class MultimodalInput(BaseModel): Input structure for multimodal evaluations. media: AnyMediaData | list[AnyMediaData] | str instruction: str context: str | None NoneImageData统一图像来源ImageData的作用是把各种图像来源「归一化」为原始字节确保 judge 收到的是同一形态的媒体数据。其source字段支持的输入形式如下见 multimodal_output_evaluator.mdx来源示例本地文件路径/path/to/chart.png或pathlib.Path(...)Base64 字符串iVBORw0KGgo...Data URLdata:image/png;base64,iVBORw0KGgo...HTTP(S) URLhttps://example.com/image.jpg原始字节b\x89PNG...PIL ImagePIL.Image.Image实例需要Pillow几点实现细节需要留意HTTP(S) URL 自动抓取通过标准库urllib.request完成不引入额外依赖格式自动检测format字段jpeg、png、gif、webp省略时会根据扩展名或 data URL 自动推断S3 URI 不支持自动抓取设计文档明确说明首版不引入boto3依赖避免可选依赖与鉴权面S3 对象需要先预下载为字节或本地路径再构造ImageData提供to_bytes()、to_base64()、to_data_url()三个转换方法方便在任务函数中把图像塞进 ContentBlock。MultimodalInput多模态 Case 的输入结构MultimodalInput是 PydanticBaseModel三个字段语义如下mediaAnyMediaData | list[AnyMediaData] | str一个或多个图像来源。裸字符串是ImageData(source...)的简写列表原生支持多图场景instructionstr针对媒体提出的问题或请求contextstr | None可选附加上下文会呈现给 judge。设计文档特别强调AnyMediaData目前只是ImageData的别名未来可以扩展为ImageData | VideoData | AudioData | DocumentData而无需破坏现有 API——这也是选择media而非image作为字段名的原因。核心 APIMultimodalOutputEvaluator 的实现原理设计文档给出的核心类实现如下注意片段中的 imports 属于实现内部细节仅用于展示类上下文不是终端用户应使用的导入路径对外公开的导入是from strands_evals.evaluators import MultimodalOutputEvaluatorfrom strands.models.model import Model from strands_evals.evaluators import OutputEvaluator from strands_evals.evaluators.prompt_templates.multimodal_case_prompt_template import ( compose_multimodal_test_prompt, ) from strands_evals.evaluators.prompt_templates.multimodal_judge_system_prompt import ( MLLM_JUDGE_SYSTEM_PROMPT, ) from strands_evals.types.evaluation import InputT, OutputT class MultimodalOutputEvaluator(OutputEvaluator[InputT, OutputT]): MLLM-as-a-Judge evaluator for multimodal tasks. DEFAULT_REFERENCE_SUFFIX REFERENCE COMPARISON: - Compare the response against the Oracle reference answer above. - The reference is the gold standard. Use discrepancies as evidence for your judgment. def __init__(self, rubric: str, model: Model | str | None None, include_inputs: bool True, system_prompt: str | None None, reference_suffix: str | None None, uses_environment_state: bool False): super().__init__( rubricrubric, modelmodel, system_promptsystem_prompt if system_prompt is not None else MLLM_JUDGE_SYSTEM_PROMPT, include_inputsinclude_inputs, uses_environment_stateuses_environment_state, ) self.reference_suffix reference_suffix if reference_suffix is not None else self.DEFAULT_REFERENCE_SUFFIX def _select_rubric(self, evaluation_case): Append the reference comparison suffix when expected_output is present. if evaluation_case.expected_output is not None: return self.rubric self.reference_suffix return self.rubric def _build_prompt(self, evaluation_case): # Parent OutputEvaluator.evaluate() calls _build_prompt(); we only override this hook. return compose_multimodal_test_prompt( evaluation_caseevaluation_case, rubricself._select_rubric(evaluation_case), include_inputsself.include_inputs, )compose_multimodal_test_prompt的返回类型取决于输入当输入是携带媒体media的MultimodalInput时返回list[ContentBlock]例如[{image: {format: jpeg, source: {bytes: b...}}}, {text: Input.../InputOutput.../OutputRubric.../Rubric}]否则返回普通str进入纯文本 LLM 模式。构造函数参数一览结合 multimodal_output_evaluator.mdx 的参数说明MultimodalOutputEvaluator的构造参数如下参数类型默认值说明rubricstr必填—评估标准定义何为好的响应应包含打分指引如 Score 1.0 if ..., 0.0 if ...可自撰或复用内置 rubricmodelModel \| str \| NoneNone使用默认 Bedrock 模型多模态 judge 模型可为模型 ID 字符串或Model实例默认模型必须支持图像输入system_promptstr \| NoneNone使用内置MLLM_JUDGE_SYSTEM_PROMPT自定义系统提示词用于引导 judge 行为include_inputsboolTrue是否在评估提示词中包含用户指令设为False可对响应单独打分reference_suffixstr \| NoneNone使用内置默认后缀当 Case 存在expected_output时追加到 rubric 后的文本用于定制 judge 如何使用参考答案严格或宽松uses_environment_stateboolFalse是否在评估提示词中引入环境状态以评估 Agent 的副作用关键设计决策设计文档总结了十条关键设计决策这里按实现机制归类只覆写_build_prompt()钩子父类OutputEvaluator被重构出_build_prompt()扩展钩子子类继承evaluate()/evaluate_async()不变避免重复构造 judge-agent 与异步管道同时保持父类纯文本行为不受影响沿用父类的 Agent 调用模式Agent.__call__(prompt, structured_output_model...)同时接受str与list[ContentBlock]因此父类的 evaluate 循环无需分支即可处理两种模式。ContentBlock 类型定义见 strands-py/src/strands/models/model.py该文件从..types.content导入ContentBlock原生 ContentBlock 格式媒体块使用{image: {format: jpeg, source: {bytes: b...}}}——这正是 Strands SDK 的原生格式数据驱动分发无include_media标志compose_multimodal_test_prompt检查输入类型——若为携带媒体的MultimodalInput则返回内容块否则返回纯文本。想做纯 LLM 对比时传一个非MultimodalInput输入如普通字符串即可用后缀而非替换 rubric 处理参考答案存在expected_output时_select_rubric()将reference_suffix追加到基础 rubric 之后而不是切换到一套平行的参考 rubric从而每个维度只有一个事实来源并消除了*_REFrubric 的重复维护内置 rubric 模板自带OVERALL_QUALITY_RUBRIC_V0、CORRECTNESS_RUBRIC_V0、FAITHFULNESS_RUBRIC_V0、INSTRUCTION_FOLLOWING_RUBRIC_V0。MultimodalOverallQualityEvaluator覆写了维度专属后缀其余三个使用默认后缀用户也可提供自定义 rubric 和/或自定义reference_suffixMultimodalInput采用 PydanticBaseModel提供model_validate支持存取往返、media字段校验并为context字段提供自然归宿列表媒体原生支持裸字符串源自动强转为ImageDatamedia/AnyMediaData的模态通用命名而非image为未来文档/视频/音频类型留出空间存取往返安全compose_multimodal_test_prompt在提示词构造边界处把原始dict输入强转回MultimodalInput因此通过Experiment.from_dict重载的 Case会丢失泛型参数化信息仍能正确分发到多模态模式。开发者实战五种典型用法设计文档的 Developer Experience 一节给出了完整的实战片段仓库示例 multimodal_output_evaluator.py 进一步提供了可运行的端到端版本。1. 基础用法免参考式Reference-Freefrom strands_evals import Case, Experiment from strands_evals.evaluators import MultimodalCorrectnessEvaluator from strands_evals.types import ImageData, MultimodalInput # Define cases with a MultimodalInput carrying the image and instruction cases [Case( inputMultimodalInput( mediaImageData(sourcechart.png), instructionWhat is the revenue trend?, ), )] # Standard workflow evaluator MultimodalCorrectnessEvaluator() experiment Experiment(casescases, evaluators[evaluator]) reports experiment.run_evaluations(tasklambda case: my_model(case.input))这里task函数接收每个Case对图像加指令运行视觉模型返回待评估的响应字符串。示例文件中的完整任务函数展示了如何把ImageData转成 Strands ContentBlock 并调用 Agentmedia multimodal_input.media image media if isinstance(media, ImageData) else ImageData(sourcemedia) prompt [ {image: {format: image.format or png, source: {bytes: image.to_bytes()}}}, {text: multimodal_input.instruction}, ] response await agent.invoke_async(prompt) return str(response)2. 参考式评估Reference-Based自动追加 reference suffix为 Case 提供expected_output会自动触发参考对比模式——_select_rubric()会把reference_suffix追加到 rubric 之后让 judge 对照黄金答案评判# Reference-based evaluation: providing expected_output auto-appends the reference suffix case Case( inputMultimodalInput( mediaImageData(sourcescene.jpg), instructionDescribe this image., ), expected_outputA sunny park with a dog playing fetch., # triggers reference suffix )3. 自定义 rubric 与自定义 reference suffix对于医学影像等垂直领域可以完全接管评分标准from strands_evals.evaluators import MultimodalOutputEvaluator medical_rubric Rate diagnostic accuracy on a 3-point scale: - Completely (1.0): All findings correctly identified with proper terminology. - Partially (0.5): Key findings identified but with imprecise terminology. - Not at all (0.0): Critical findings missed or misidentified. evaluator MultimodalOutputEvaluator( rubricmedical_rubric, reference_suffix\n\nCompare against the radiologists ground-truth report above., )4. 纯文本 LLM 回退Text-Only Fallback同一个评估器可以处理纯文本 Case——只要传入非MultimodalInput的输入如普通字符串compose_multimodal_test_prompt就返回纯文本提示词行为与OutputEvaluator完全一致# Text-only (LLM-as-a-Judge) fallback: pass a plain string instead of a MultimodalInput case Case(inputDescribe the chart., actual_outputRevenue rose 15% YoY.) # compose_multimodal_test_prompt returns a text-only prompt for this case.这意味着同一个评估器可以混合评估多模态与纯文本 Case无需设置任何标志位——数据驱动的分发逻辑自动完成模式选择。5. 单 Case 多张图片media字段支持列表适合「前后对比」「多图推理」类任务# Multiple images per case case Case( inputMultimodalInput( media[ImageData(sourcebefore.jpg), ImageData(sourceafter.jpg)], instructionDescribe what changed between these two images., ), )完整工作流Case → Experiment → Report示例文件 multimodal_output_evaluator.py 演示了完整链路构造任务函数 → 创建免参考/参考式 Case → 组合自定义 rubric 的基类评估器与内置 rubric 的便捷子类 → 构造Experiment→run_evaluations_async得到合并报告 →report.run_display()展示结果并可选experiment.to_file(...)/report.to_file(...)落盘。数据驱动的模式分发Data-Driven Dispatch这是本设计最值得关注的行为机制值得单独说明若case.input是携带非空媒体的MultimodalInput提示词构造器返回内容块列表媒体在前、评估文本在后judge 以 MLLM 身份被调用若case.input是其他任何类型普通字符串或media为空的MultimodalInput构造器返回纯文本提示词judge 行为与OutputEvaluator完全一致。设计文档明确否决了include_media标志方案理由是输入自身的类型已经决定了模式冗余开关既可能与载荷冲突也没有任何增益。同样的逻辑也体现在「空media的MultimodalInput回退到纯文本并发出 UserWarning」的错误处理设计上。评分体系与内置 Rubric评分系统MultimodalOutputEvaluator返回的EvaluationOutput与其他评估器一致score0.01.0 浮点、test_pass布尔、reasonjudge 的推理字符串、label可选分类标签。评分粒度由 rubric 决定严格二值CORRECTNESS_RUBRIC_V0、FAITHFULNESS_RUBRIC_V0、INSTRUCTION_FOLLOWING_RUBRIC_V0成功为1.0任何违规为0.0只有1.0才算通过Likert-5OVERALL_QUALITY_RUBRIC_V0取值0.0、0.25、0.5、0.75、1.0通常 0.75视为通过自定义 rubric粒度由你在 rubric 文本中定义如 Score 1.0 if ...并在 rubric 内写明通过阈值。以MultimodalOverallQualityEvaluator为例五个档位的语义为1.0优秀准确、完整、直接回应指令、0.75良好基本准确、轻微不精确、0.5一般部分正确、遗漏重要细节或轻微错误、0.25较差多处不准确或显著遗漏、0.0很差事实错误、离题、无帮助。四个内置 rubric 常量可从strands_evals.evaluators.prompt_templates.multimodal导入OVERALL_QUALITY_RUBRIC_V0Likert-5 量表综合视觉准确性、指令遵循、完整性与连贯性CORRECTNESS_RUBRIC_V0严格二值针对图像的事实核查对象、数量、颜色、位置、可读文字、描述动作FAITHFULNESS_RUBRIC_V0严格二值捕获未扎根于图像的幻觉虚构细节、未经支持的假设、外部知识泄漏、推测INSTRUCTION_FOLLOWING_RUBRIC_V0严格二值检查数量/格式/范围/顺序/完整性/风格等显式约束。每个内置 rubric 是对应便捷子类的默认值按 multimodal_overall_quality_evaluator.mdx 的说明MultimodalOverallQualityEvaluator的默认reference_suffix是整体质量专属的按事实内容而非逐字匹配评分其余三个使用通用默认后缀。错误处理与边界情况设计文档对异常路径做了明确约定图像找不到抛出ValueError并列出支持的来源类型输入不是MultimodalInput自动分发到纯文本模式无需警告MultimodalInput的media为空回退到纯文本并发出UserWarningCase 缺少actual_output抛出ValueError任务函数必须返回值或{output: ...}远程来源HTTP/HTTPS URL 通过urllib.request自动抓取标准库无额外依赖支持的图像格式JPEG、PNG、GIF、WebP支持的本地来源文件路径、base64 字符串、data URL、原始字节、PIL Image。备选方案回顾为什么最终这样设计设计文档记录了 10 个被评估过的备选方案及结论是理解 API 形态的关键材料备选方案结论理由直接修改OutputEvaluator否决向文本聚焦的类里塞媒体处理会过载其 API改为提供_build_prompt()扩展钩子直接继承Evaluator而非OutputEvaluator否决会重复 rubric、model、system_prompt 及 judge-agent 的evaluate()/evaluate_async()管道媒体数据放Case.metadata否决metadata用于辅助信息人工分数、标签模式不直观且无法类型检查每个维度一个独立类采纳为便捷子类核心逻辑在MultimodalOutputEvaluator子类只预配置 rubric 与后缀用Agent.structured_output()替代Agent.__call__()否决Agent.__call__同时接受str与list[ContentBlock]单代码路径即可处理两种模式输入字段名用image否决改用media模态通用命名可经AnyMediaData平滑扩展到文档/音频/视频include_media标志否决改用数据驱动分发输入类型本身决定模式避免冗余开关与载荷冲突平行的*_RUBRIC_V0_REF参考版否决改用reference_suffix每维度单一事实来源、用户可覆写、维护成本低S3 URI 经boto3自动抓取首版放弃引入可选依赖与鉴权面可先预下载为字节/路径HTTP/HTTPS 已由标准库支持MultimodalInput用TypedDict否决改用 PydanticBaseModel获得model_validate存取往返、media字段校验与context字段归属设计影响与权衡设计文档的 Consequences 一节总结了采纳后的收益与代价。更轻松Easier多模态评估复用完全相同的Case→Experiment→Report工作流参考式与免参考式均受支持通过expected_output自动追加后缀切换四个维度的内置 rubric 源自经过实验验证的提示词支持自定义 rubric 与自定义 reference suffix 满足领域需求纯文本对比实验零代码改动——传非MultimodalInput输入即可与父类OutputEvaluator使用相同的Agent.__call__调用与异步管道单 Case 多图、PIL Image、字节、data URL、HTTP URL 与文件路径全部接受。代价Trade-offsMultimodalInput校验在 Case 构造时及存取往返时各执行一次相比TypedDict有轻微开销多模态 judge 调用比纯文本更昂贵、更慢图像 token 成本更高远程媒体本版仅支持 HTTP/HTTPSS3 用户需预下载。最佳实践综合 multimodal_output_evaluator.mdx 与仓库内发布文章 multimodal-evaluators-mllm-as-a-judge-image-to-text-strands-evals.mdx 的实验结论实践建议如下选用多模态能力的 judge默认 Bedrock 模型必须支持图像输入覆写model时确认模型 ID 接受图像内容块。仓库发布文章记录其默认 judge 为 Anthropic Claude Sonnet 4.6Amazon Bedrock理由是准确率/成本权衡最佳且实验显示同档位内高价模型并未比中档模型获得可测增益控制图像分辨率超大图像只增加延迟与成本而不提升评判质量应按任务所需的最小分辨率处理rubric 中锚定图像使用「based on what is visible in the image」这类措辞把 judge 锚定到媒体而非其先验知识有已知答案的基准任务用参考式图表问答chart QA、视觉问答VQA等有标准答案的场景配合expected_output与 reference suffix 效果更好。仓库发布文章的消融实验显示参考答案对内容扎根型指标整体质量、正确性、忠实性有帮助但对指令遵循是干扰——指令遵循应由查询与响应本身决定内容型指标用参考、结构型指标跳过参考先从内置 rubric 起步四个内置 rubric 已默认配置好先在自有数据上观察其短板再定制让 judge 先推理再打分仓库发布文章的消融结果显示这是对齐人工评分最有效的单一改动比「仅输出分数」模式显著提升与人类评分的一致性加入少量多样化校准示例与细粒度多维 rubric 也能单调提升对齐度组合使用多个评估器Experiment支持多个评估器合并成一份报告每行report.cases带evaluator键标明来源。把正确性事实是否对与忠实性是否扎根图像组合可以区分「答错」与「无中生有」两种失败模式。总结MultimodalOutputEvaluator及四个便捷子类把 Strands Evals 的评估能力从纯文本扩展到「图像/文档进、文本出」任务通过MultimodalInput/ImageData两个 Pydantic 模型承载媒体数据通过覆写_build_prompt()钩子复用父类全部评估管道通过数据驱动的模式分发让多模态与纯文本 Case 在同一个Experiment中共存。参考式与免参考式两种模式、四个内置 rubric、自定义 rubric/后缀机制加上可读的reason推理输出使视觉 Agent 的幻觉、事实错误与指令违背第一次可以被自动化、图像扎根地量化评估。更多细节可继续阅读 设计文档原文、官方示例 与 多模态评估器用户指南。赞分享人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务【免费下载链接】harness-sdkBuild an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python TypeScript - any model, any cloud.项目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk点击查看免费下载相关推荐Strands Evals v0.1.0 全解LLM-as-a-Judge、轨迹评估与模拟器驱动的生产级 Agent 评测框架Strands Evals v0.1.0 全解LLM as a Judge、轨迹评估与模拟器驱动的生产级 Agent 评测框架 Strands Evaluat人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务Agno Evals Cookbook 实战指南Accuracy、Agent-as-Judge、Performance 与 Reliability 四大评估模式Agno Evals Cookbook 实战指南Accuracy、Agent as Judge、Performance 与 Reliability 四大评估模人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆Daft 多模态结构化输出实战用消融实验与 VLM-as-a-Judge 规模化评估 VLM 图像理解Daft 多模态结构化输出实战用消融实验与 VLM as a Judge 规模化评估 VLM 图像理解 一个基于 Daft 与 Qwen3 VL 8B 的端到大数据数据分析数据工程AI 应用上一篇PJSIP开源多媒体通信库的全面指南下一篇迁移逃生舱OpenMontage remotion-to-hyperframes 的运行时互操作模式Runtime Interop Pattern创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网