使用 TensorZero 微调多模态视觉语言模型VLM以 arXiv 论文分类为例【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero本指南基于 TensorZero 仓库中的 examples/multimodal-vision-finetuning/README.md 及其配套的配置、Notebook 与数据集生成脚本完整讲解如何在 TensorZero 平台上完成一次「视觉语言模型VLM监督微调」的端到端实践。你将掌握如何用 config/tensorzero.toml 声明一个接收图片输入的 JSON 函数、如何通过 Python SDK 以 Base64 图片发起推理并回写反馈、如何在 TensorZero UI 中发起 SFT 微调任务以及如何把微调后的模型挂载为新 variant 并复测准确率。示例任务与核心思路示例选择了刻意简化的任务仅根据论文首页的图片判断该论文所属的 arXiv 计算机科学cs.*分类。任务中不向模型提供任何关于分类体系的提示词模型需要自行从论文首页的版式、标题与摘要文字中推断类别。微调前由于完全没有上下文模型几乎必然失败典型输出如{category: Academic Paper}微调后模型在留出的测试集上取得高准确率典型输出如{category: cs.CV}。这一对比直观地说明了 SFT 的价值当提示词无法传达任务规律例如领域特有的分类体系时用高质量示例数据微调模型可以显著改善其行为。正如 docs/optimization/supervised-fine-tuning-sft.mdx 中所述SFT 的核心工作流为收集良好行为示例 → TensorZero 将示例渲染成训练集 → 上传数据集并在提供商OpenAI、GCP Vertex AI、Fireworks、Together侧启动微调任务 → 拿到微调模型标识 → 更新配置启用新模型。前置条件与依赖运行该示例需要安装 Docker用于启动 TensorZero Gateway 与 ClickHouse安装 Python 3.10生成一个 OpenAI API Key。Python 依赖由 examples/multimodal-vision-finetuning/pyproject.toml 声明主要包括tensorzeroTensorZero Python 客户端 SDKarxiv、pymupdf、pandas用于抓取论文与生成数据集从头生成数据集时使用ipykernel、ipywidgets、tqdmNotebook 运行环境与进度展示requests下载预生成数据集时使用。配置文件解析函数与 variant 声明核心配置位于 config/tensorzero.toml它定义了一个标准的 JSON 函数classify_document[functions.classify_document] type json output_schema functions/classify_document/output_schema.json [functions.classify_document.variants.baseline] type chat_completion model openai::gpt-4o-2024-08-06 json_mode strict retries { num_retries 2, max_delay_s 10 }要点说明type json表示该函数要求模型输出符合 JSON Schema 的结构化结果输出 Schema 定义在 config/functions/classify_document/output_schema.json 中一个仅包含必填字符串字段category的对象且additionalProperties false强制模型只输出分类结果baselinevariant 使用openai::gpt-4o-2024-08-06支持图像输入json_mode strict开启严格 JSON 模式retries配置最多重试 2 次、最大退避延迟 10 秒配置中已用注释预留了finetunedvariant 的模板微调完成后取消注释并替换模型 ID 即可。指标声明同一文件还声明了一个布尔指标correct_classification用于记录每次推理的分类是否正确[metrics.correct_classification] type boolean level inference optimize maxlevel inference该指标按单次推理inference粒度记录optimize max目标是最大化该指标SFT 等优化流程会据此挑选高质量训练样本。存储与部署配置开头的[object_storage]段指定了对象存储类型为本地文件系统[object_storage] type filesystem path object_storage训练图片等对象会存放在该目录下Notebook 中也会预先创建tensorzero/object_storage目录供网关写缓存等对象使用。本地一键部署由 examples/multimodal-vision-finetuning/docker-compose.yml 提供包含三个服务clickhouseclickhouse:lts观测与训练数据存储健康检查通过/ping完成gatewaytensorzero/gateway以只读方式挂载./config为/app/config并通过--config-file /app/config/tensorzero.toml加载配置通过TENSORZERO_CLICKHOUSE_URL连接 ClickHouse通过${OPENAI_API_KEY:?...}强校验必须设置 OpenAI API Key暴露端口 3000uitensorzero/uiTensorZero 控制台通过TENSORZERO_GATEWAY_URL连接网关暴露端口 4000用于发起与查看 SFT 任务。注意该 compose 文件为学习用途的简化版生产环境部署请参考 docs/deployment/tensorzero-gateway.mdx 与 docs/deployment/clickhouse.mdx。数据集下载或从头生成数据集包含 arXiv 全部cs.*分类分类清单见 examples/multimodal-vision-finetuning/data/categories.txt共约 40 个分类下各 20 篇论文每条样本包含论文首页图片与正确分类。方式一下载预生成数据集wget https://assets.tensorzero.com/examples/multimodal-vision-finetuning.tar.gz tar -xvf multimodal-vision-finetuning.tar.gz -C .方式二从头生成如需从零生成数据集可运行 data/generate_dataset.ipynb。Notebook 依赖arxiv库抓取论文元数据、pymupdf将 PDF 首页渲染为 PNG 图片最终产出一份data/labels.csv含document、label、is_train三列is_train1表示训练集0表示测试集。安装依赖与启动服务# 1. 设置 OpenAI API Key export OPENAI_API_KEYsk-... # 2. 启动 TensorZeroGateway ClickHouse UI docker compose up # 3. 安装 Python 依赖推荐使用 uv uv sync # 4. 运行主 Notebook # jupyter notebook main.ipynb推理、反馈与数据采集Notebook 逐段拆解主脚本 main.ipynb 完成了「推理 → 判定 → 反馈」的数据采集闭环。理解这段代码就等于理解了 TensorZero 训练数据是如何从真实调用中沉淀下来的。连接网关from tensorzero import AsyncTensorZeroGateway t0 await AsyncTensorZeroGateway.build_http( gateway_urlhttp://localhost:3000, )build_http通过 HTTP 连接网关对应 Python SDK 中AsyncTensorZeroGateway的构建方法见 crates/tensorzero-python/tensorzero/tensorzero.pyi 中build_http/inference/feedback的签名。Notebook 中的CONCURRENCY 10配合asyncio.Semaphore控制并发请求数。加载图片为 Base64def load_document(path: PathLike): Load an image and encode as a base64 string path DATA_PATH / path assert path.exists() assert path.suffix.lower() .png with open(path, rb) as image_file: return base64.b64encode(image_file.read()).decode(utf-8)图片被编码为 Base64 字符串后随推理请求一并发送。发起多模态推理response await t0.inference( function_nameclassify_document, input{ system: Categorize this document., messages: [ { role: user, content: [ { type: image, mime_type: image/png, data: load_document(row.document), }, ], } ], }, dryrunnot row.is_train, cache_options{ enabled: on, }, variant_nameVARIANT_NAME, )关键参数说明input.messages[].content采用多模态内容块格式type image的消息包含mime_type与 Base64 编码的datadryrunnot row.is_train测试集样本以 dryrun 方式推理不落库只有训练集样本会持久化到 ClickHouse供后续 SFT 使用cache_options {enabled: on}开启推理缓存相同图片与提示词可命中缓存、避免重复计费variant_name当前运行baseline微调完成后改为finetuned复测。判定结果并回写反馈predicted_category response.output.parsed[category] correct_classification predicted_category row.label if row.is_train: await t0.feedback( metric_namecorrect_classification, valuecorrect_classification, inference_idresponse.inference_id, ) await t0.feedback( metric_namedemonstration, value{ category: row.label, }, inference_idresponse.inference_id, )这里演示了 TensorZero 反馈机制的两种典型用法布尔指标反馈把「预测是否等于真实标签」写入correct_classification指标demonstration示范答案反馈把人工标注的正确分类{category: row.label}作为该次推理的示范输出写入。SFT 正是依赖这些 demonstration 构造训练样本的——在 TensorZero UI 的Supervised Finetuning页面中选择demonstration作为优化指标即可把每个训练样本的示范输出渲染为微调语料。汇总准确率scores await tqdm_asyncio.gather(*[process_document_with_semaphore(row) for _, row in train_df.iterrows()]) print(fTrain Set Accuracy: {np.mean(scores):.1%}) scores await tqdm_asyncio.gather(*[process_document_with_semaphore(row) for _, row in test_df.iterrows()]) print(fTest Set Accuracy: {np.mean(scores):.1%})分别统计训练集与测试集的准确率得到微调前后的对比基线。在 TensorZero UI 中发起微调运行完baseline阶段的 Notebook 后浏览器访问http://localhost:4000进入Supervised Finetuning页面以demonstration作为优化指标启动一个微调任务。[!TIP] 大多数模型不支持多模态微调。本示例建议使用gpt-4o-2024-08-06作为微调基座模型。TensorZero 的 SFT 工作流由 crates/tensorzero-optimizers 中的优化器实现如openai_sft.rs、gcp_vertex_gemini_sft.rs、fireworks_sft.rs、together_sft.rs分别对接不同提供商TensorZero 会从历史推理与反馈中筛选示范样本、用提示模板渲染成训练集、上传数据集并在提供商侧启动微调作业完成后返回微调模型标识。关于各提供商 SFT 配置参数的完整说明如 OpenAI 的batch_size、learning_rate_multiplier、n_epochs、seed、suffixGCP Vertex 的adapter_size、tuned_model_display_name等可参考 docs/optimization/supervised-fine-tuning-sft.mdx 的 Provider Configuration Reference 章节。挂载微调模型并复测任务完成后在 config/tensorzero.toml 中新增一个 variant指向微调产出的模型 ID形如openai::ft:gpt-4o-2024-08-06:tensorzero::xxxxxxx[functions.classify_document.variants.finetuned] type chat_completion model openai::ft:gpt-4o-2024-08-06:tensorzero::xxxxxxx json_mode strict retries { num_retries 2, max_delay_s 10 }说明model使用openai::前缀的简写语法指向 OpenAI 微调产物也可改用显式的[models.*]段定义见 docs/optimization/supervised-fine-tuning-sft.mdx保持json_mode strict与retries与 baseline 一致确保对比口径相同。随后重启网关使配置生效并将 Notebook 中的VARIANT_NAME改为finetuned后重新运行。此时你会观察到模型在留出的测试集上取得了远超 baseline 的分类准确率。小结与后续方向该示例完整呈现了 TensorZero 的「观测 → 反馈 → 优化 → 部署」闭环配置一个多模态 JSON 函数 → 用 Python SDK 采集带 demonstration 的训练数据 → 在 UI 中一键发起 SFT → 以新 variant 挂载微调模型并验证效果。整个流程中你只负责写配置和写调用代码训练数据的组织、上传与任务调度全部由 TensorZero 完成。在此基础上你还可以进一步探索用微调前后的两个 variant 运行自适应 A/B 实验量化优化收益参考 docs/experimentation/run-adaptive-ab-tests.mdx数据量不足时先尝试 docs/optimization/dynamic-in-context-learning-dicl.mdx 等轻量优化手段将任务推广到其他多模态输入——TensorZero 的输入内容块支持image/jpeg、image/png、application/pdf、audio/*等多种 MIME 类型见 crates/tensorzero-inference-types/src/lib.rs 中mime_type_to_ext的实现图片、PDF 与音频均可作为推理输入。【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
