Doubao 多模态 Embedding:建立一个图文检索小样本
多模态向量请求可以把文字与图片组合为检索表示。工程上首先要决定一个向量代表什么:一份文档、一张图片,还是有意组合的一条记录。建立大索引前,应先验证这个边界。
发布 2026-09-23 · 更新 2026-09-29 · KeepRouter Editorial · 5 分钟阅读

当用户用文字寻找图片,或希望把一条图文混合记录放进同一个索引时,Doubao 多模态向量端点值得评估。首先应定义“一条记录”的边界:商品照片和对应描述可以属于同一项;十张互不相关的图片则不应只因为被放进同一个 input 数组,就意外合成一个向量。
KeepRouter 将 Doubao Embedding Vision 251215列在独立的多模态向量操作下。火山引擎的向量化文档说明上游模型家族及版本相关选项。本文只讨论普通稠密向量流程,不声称稀疏、压缩或多向量等可选能力在每条网关线路上都能原样工作。
调用 API 前,先定义检索实验
建立一组自己拥有或可使用的素材,例如十二张商品图片,各配一段简短、可核对的描述;再写八个能够人工判断预期结果的查询。加入两组容易混淆的案例:外观相近但用途不同的商品,以及拍摄方式不同但用途相同的商品。
在本地样本中保存记录 ID、素材地址、描述和预期查询匹配。不要让模型自己编造预期答案,检索实验需要独立答案表。先决定产品需要的是宽泛类别、准确商品还是近重复图片,因为这些目标可能适合不同的向量表示与评估方法。
| 输入设计 | 一个向量代表什么 | 适合的首轮实验 |
|---|---|---|
| 单个文本部件 | 查询或文档 | 文本检索文本 |
| 单张图片部件 | 一张图片 | 文字检索图片 |
| 图片加对应描述 | 一条组合记录 | 商品发现 |
| 多张无关图片 | 含义不清的组合对象 | 先拆为独立请求 |
使用专用操作,并检查返回向量
下面的代码在有效余额和有权限的 Key 下运行时,会发起一次付费模型请求。它是供你执行的测试模板,不代表撰写本文时已经运行。公开 logo 仅用来检查传输流程,实际检索实验应替换为目标任务素材。
import math
import os
import requests
response = requests.post(
"https://keeprouter.com/v1/embeddings/multimodal",
headers={"Authorization": "Bearer " + os.environ["KEEPROUTER_KEY"]},
json={
"model": "doubao-embedding-vision-251215",
"input": [
{"type": "text", "text": "KeepRouter product logo"},
{"type": "image_url", "image_url": {"url": "https://keeprouter.com/logo-512.png"}},
],
},
timeout=60,
)
response.raise_for_status()
body = response.json()
vector = body["data"][0]["embedding"]
if not vector or not all(type(v) in (int, float) and math.isfinite(v) for v in vector):
raise ValueError("Expected a non-empty finite dense vector")
print({"dimensions": len(vector), "usage": body.get("usage")})KeepRouter 适配器会把上游单个 embedding 对象归一化为列表形响应,但这种转换不等于每个输入部件都会各自得到一个向量。应读取实际结果,并把它关联到提交的那条组合记录。对独立商品,应分别请求,除非目标端点明确提供保留记录边界的批处理契约。
通过 API 参考核实当前路由。同一个模型发到普通 /v1/embeddings 属于另一种操作,可能被拒绝。请求失败时,先检查模型资格和端点,再尝试修改媒体格式。
将生成方法和向量一起保存
记录公开模型 ID、实际返回维度、输入构造方式、可选指令和生成日期。文档向量与查询向量应使用互相兼容的生成方法。即使两个模型返回的数组长度相同,也不能据此把不同版本的向量随意混用。
如果采用上游的指令或维度选项,应在准确线路上验证,再重新运行测试样本。改善一个查询的修改,也可能改变其他结果的排序。把新的表示方法作为新索引版本保存,才能比较和回滚,而不破坏旧集合。
小规模实验中,如果模型文档支持这种距离度量,可以先用精确余弦比较。要检查零向量和维度一致性。等到集合大小、过滤条件和更新方式确实需要时,再引入向量数据库;数据库不会自动修复记录边界不清或生成方法不合适的问题。
将检索效果与请求成功分开验收
逐个查询检查前几条结果,记录预期记录是否出现,同时记录干扰项,以及文字描述是否过度压住图片信号。固定查询,比较“仅图片”与“图片加描述”两种方式。实验可能发现,一种更适合准确商品搜索,另一种更适合按类别浏览。
HTTP 200 和预期宽度的向量,只说明传输和解析成功,不能证明检索有用。也不要从十二项样本发布通用准确率排名。这个小实验的作用,是发现接入错误,并决定下一轮应建立什么更有代表性的评估集合。
加入一个容易混淆的检索案例
准备两件外观相似、文字属性不同的商品,再加一件文字匹配但图像错误的条目。提问同时涉及属性和外观,记录正确条目是否进入 top-k,而不仅看是否返回向量。火山引擎向量化指南是模型家族参考,本文 KeepRouter 示例则定义正在测试的路径。这能区分 API 可用与跨模态检索有用。
分别预算建索引和在线查询
建索引费用跟语料规模有关,在线查询费用跟搜索流量有关。还需计入图片、描述或模型版本变化后的重新生成。例如,一个有 10,000 条记录的集合,每月更新 5%,意味着 500 条更新,而不是每月必然全量重建 10,000 条;查询量应另列。这些都是规划假设,不是本站观察到的真实使用量。
媒体消耗的 token 无法从 URL 的字符数推算。应保留代表性图片大小和输入组合的报告用量,再采用模型页的当前客户价格。API 费用计算器覆盖到相应单位时可直接使用;工具未表达的媒体专用类别应继续在自己的工作表中保留。
多模态向量概览介绍端点家族。小样本跑通之后,再逐步扩大集合,同时比较检索质量、导入失败、更新及时性和每次有效搜索的成本。一个总是返回错误商品的低价向量,会增加后续工作,而不能带来有用的节省。
常见问题
每个多模态 input 部件都有独立向量吗?
不能这样假设。带类型部件可能描述一条组合记录;独立记录应按文档确认边界,必要时分别请求。
能直接用普通 embeddings 端点吗?
应采用具体模型公布的端点;此 KeepRouter 模型使用 /v1/embeddings/multimodal。
向量维度应该照文章写死吗?
应先验证所选模型和配置实际返回的维度,再与索引版本一起保存。
返回有效向量就证明搜索效果好吗?
不能。应在代表性查询上独立评估预期命中和干扰结果。
参考的一手资料
本文最近复核 2026-09-29
- [1] Volcengine multimodal vectorization
- [2] KeepRouter Doubao model and endpoint
- [3] KeepRouter OpenAPI