阿里云Milvus AI 中心:一站式完成文本与多模态向量化

更新时间:
复制 MD 格式

阿里云 Milvus AI 中心是内置于 Milvus 的托管式模型服务能力。开通后,在数据写入和检索时可直接传入原始文本或多模态数据(图片、视频),由系统自动完成向量生成,无需单独部署 Embedding 推理服务。

功能概览

image

功能

说明

控制台一站式管理

在控制台完成模型服务的查看、配置与调用示例获取,无需跳转多个平台。

托管式模型能力

平台提供托管式模型推理服务,无需自建推理服务与运维基础设施。

原始数据直接写入和检索

写入、更新和查询时直接传入原始文本或多模态内容,系统自动完成向量化。

多模型灵活切换

提供多个向量化模型,可按业务场景在效果、时延和成本之间灵活选择。

调用量与 Token 统计

按集群和模型两个维度统计 Token 用量与调用次数。

调用监控

支持查看请求成功率(Success Rate)与平均响应时间(Average RT)等运行指标。

除向量化外,AI 中心还统一提供重排序、文本生成、多模态理解、视频编辑等模型能力,可直接用于语义检索、RAG 知识库、企业智能问答、内容推荐与多模态搜索等场景。本文以向量化为例,介绍文本检索与多模态检索的完整接入流程。

使用步骤

查看可用的向量化模型

登录 Milvus 控制台,在左侧导航栏选择AI 中心,在模型服务页签下查看向量化分组,可获取模型的输入类型、输出维度以及 API 示例

当前可选的向量化模型如下:

模型

支持的输入

说明

qwen3.7-text-embedding

文本

推荐使用的文本向量模型,默认维度 1024。

text-embedding-v4

文本

多语言文本向量模型,支持自定义向量维度。

text-embedding-v3

文本

通用文本向量模型。

text-embedding-v2

文本

通用文本向量模型,即将下线,不建议在新业务中使用。

qwen3-vl-embedding

文本、图片、视频

推荐使用的多模态向量模型,默认维度 2560,可通过 dim 指定其他维度。

tongyi-embedding-vision-plus

文本、图片、视频

多模态向量模型。

说明

AI 中心按地域独立提供服务,切换地域后需在新地域重新查看和配置。

准备 Milvus 实例

向量化能力依赖 Milvus 2.6 版本实例。创建 2.6 版本实例后即可在 Collection 中直接声明 Function 调用模型,无需单独执行模型与实例的绑定操作。

如需从公网访问实例,请在实例详情页的安全配置页签开启公网访问并配置公网访问白名单。

查看用量与监控

进入AI 中心,单击监控页签,可按按 Milvus 集群按模型两种视角查看调用情况:

  • Token 用量 / 调用次数:按集群和模型列出 Token 用量与调用次数明细。

  • Token 总量、文本输入 Token 总量:所选范围内的 Token 消耗汇总。

  • Success Rate:请求成功率。

  • Average RT:平均响应时间。

支持选择集群或模型、设置采样间隔(interval),并按 1 小时、3 小时、6 小时、12 小时、1 天、7 天等快捷范围或自定义时间窗口筛选。

案例一:文搜文语义检索

场景说明

将一批原始文本写入 Milvus,无需预先生成向量。查询时直接输入自然语言问题,Milvus 自动完成查询向量化并返回语义最相关的结果。适用于知识库问答、文档搜索、FAQ 检索等场景。

操作步骤

  1. 创建 Collection,定义原始文本字段 document 和向量字段 dense

  2. 通过 Function 绑定 qwen3.7-text-embedding 模型。

  3. 插入测试文本数据,并调用 flush 确保数据可检索。

  4. 使用自然语言问题发起检索,返回最相关的文本片段。

说明

插入数据后需调用 flush,否则紧接着执行检索可能返回空结果。

示例代码

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",
    token='root:xxx',
)

# ========== 创建 Collection ==========
collection_name = 'demo1'
schema = client.create_schema()

schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("document", DataType.VARCHAR, max_length=9000)
schema.add_field("dense", DataType.FLOAT_VECTOR, dim=1024)
text_embedding_function = Function(
    name="dashscope_api_test123",
    function_type=FunctionType.TEXTEMBEDDING,
    input_field_names=["document"],
    output_field_names=["dense"],
    params={
        "provider": "aliyun_milvus",
        "model_name": "qwen3.7-text-embedding"
    }
)

schema.add_function(text_embedding_function)
index_params = client.prepare_index_params()

index_params.add_index(
    field_name="dense",
    index_type="AUTOINDEX",
    metric_type="COSINE"
)
client.drop_collection(collection_name)
client.create_collection(
    collection_name=collection_name,
    schema=schema,
    index_params=index_params
)

insert_data = []
record_id = 1

mock_texts = [
    "向量数据库通过将文本转换为高维向量来实现语义检索,能够理解查询的真实意图。",
    "深度学习模型可以从大量图片数据中学习特征表示,用于图像分类和目标检测等任务。",
    "检索增强生成通过召回相关文档为大模型提供外部知识,减少幻觉并提升答案可靠性。",
    "在客服场景中,语义搜索可以快速定位历史工单,提高首次响应效率和问题解决率。",
    "相似度搜索常用余弦距离衡量向量方向接近程度,适合文本语义匹配任务。",
    "数据清洗是向量化前的重要步骤,去噪和统一格式能显著提升召回质量。",
    "embedding 维度并非越高越好,需要在效果、延迟和存储成本之间做平衡。",
    "通过分块策略将长文档切分为小段,可以提高检索命中率并减少上下文冗余。",
    "为每条知识添加来源字段有助于结果可解释性,方便在前端展示引用证据。",
    "多语言检索可借助统一向量空间实现跨语言匹配,提升国际化系统体验。",
    "索引参数如 ef 和 M 会影响 HNSW 的召回率与查询性能,需要结合业务调优。",
    "在上线前进行离线评测可以量化不同模型和参数组合的检索质量差异。",
    "向量库中的元数据过滤能够与语义召回结合,实现更精准的范围限定搜索。",
    "对于高频问题,可将检索结果做短时缓存以降低后端计算压力和响应时间。",
    "语义检索链路应记录查询日志,便于后续分析零结果查询并持续优化知识库。",
    "当知识内容更新频繁时,增量索引策略可以减少全量重建带来的资源消耗。",
    "在问答系统中加入重排序模型可以提升前几条结果的相关性和可读性。",
    "为敏感数据建立访问控制策略是企业级向量检索系统的基础安全要求。",
    "合理设置 topK 能在覆盖率与噪声之间取得平衡,避免返回过多低相关结果。",
    "将用户反馈回流到训练与评估流程,可以持续改进检索与问答整体效果。",
]

for text in mock_texts:
    insert_data.append({
        "id": record_id,
        "document": text,
    })
    record_id += 1

BATCH_SIZE = 30
print(f"准备插入 {len(insert_data)} 条数据,batch_size={BATCH_SIZE}...")
for batch_start in range(0, len(insert_data), BATCH_SIZE):
    batch = insert_data[batch_start:batch_start + BATCH_SIZE]
    client.insert(collection_name, batch)
    print(f"  已插入 {min(batch_start + BATCH_SIZE, len(insert_data))}/{len(insert_data)} 条")
client.flush(collection_name)
print("数据插入完成!\n")

# ========== 测试1:文搜文(通过 dense 字段做纯文本语义检索) ==========
print("=" * 60)
print("测试1:文搜文 - 查询与向量数据库相关的内容")
print("=" * 60)
results = client.search(
    collection_name=collection_name,
    data=['什么是语义检索?向量数据库如何工作?'],
    anns_field='dense',
    limit=3,
    output_fields=['document'],
)
for hits in results:
    for hit in hits:
        print(f"  id={hit['id']}, distance={hit['distance']:.4f}, document={hit['entity']['document'][:50]}")

运行结果

准备插入 20 条数据,batch_size=30...
  已插入 20/20 条
数据插入完成!

============================================================
测试1:文搜文 - 查询与向量数据库相关的内容
============================================================
  id=1, distance=0.8668, document=向量数据库通过将文本转换为高维向量来实现语义检索,能够理解查询的真实意图。
  id=13, distance=0.5989, document=向量库中的元数据过滤能够与语义召回结合,实现更精准的范围限定搜索。
  id=15, distance=0.5414, document=语义检索链路应记录查询日志,便于后续分析零结果查询并持续优化知识库。

检索结果按语义相关性排序,与查询意图最接近的文本排在最前。实际的相似度分数会随模型版本和数据内容变化。

案例二:多模态检索

场景说明

在零售、电商和内容平台场景中,检索对象除文本外还包括图片和视频。AI 中心的多模态向量模型支持将文本与视觉内容纳入统一的向量化与检索流程,实现文搜图/视频、图搜图/视频等跨模态检索能力。

本案例在同一个 Collection 中定义两个向量字段:dense 由文本模型生成,用于文本语义检索;dense_mm 由多模态模型生成,用于跨模态检索。

操作步骤

  1. 将图片或视频上传至 OSS 等对象存储,生成可被模型服务访问的 URL。

  2. 创建 Collection,定义文本字段 document、多媒体地址字段 url、文本向量字段 dense 和多模态向量字段 dense_mm

  3. 分别为文本和多媒体字段绑定 qwen3.7-text-embeddingqwen3-vl-embedding

  4. 插入测试素材及对应文本描述。

  5. 执行文搜文、文搜图/视频、图搜图/视频等检索验证。

重要

为多媒体字段绑定多模态模型时,params 中必须设置 is_multimodaltrue,否则创建 Collection 时会因模型无法解析输入而报错。dim 需与向量字段声明的维度一致。

多媒体字段也可以直接写入纯文本,多模态模型会为其生成同一向量空间中的文本向量,从而支持图文混合检索。

示例代码

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",
    token='root:xxx',
)

# 替换为业务自有的图片或视频地址,需可被模型服务访问
IMAGE_URL = "https://example.com/your-image.jpg"
VIDEO_URL = "https://example.com/your-video.mp4"

# ========== 创建 Collection ==========
collection_name = 'demo11'
schema = client.create_schema()

schema.add_field("id", DataType.INT64, is_primary=True, auto_id=False)
schema.add_field("document", DataType.VARCHAR, max_length=9000)
schema.add_field("url", DataType.VARCHAR, max_length=9000)
schema.add_field("dense", DataType.FLOAT_VECTOR, dim=1024)
schema.add_field("dense_mm", DataType.FLOAT_VECTOR, dim=1024)

text_embedding_function = Function(
    name="dashscope_api_test123",
    function_type=FunctionType.TEXTEMBEDDING,
    input_field_names=["document"],
    output_field_names=["dense"],
    params={
        "provider": "aliyun_milvus",
        "model_name": "qwen3.7-text-embedding"
    }
)
mm_embedding_function = Function(
    name="dashscope_api_mm123",
    function_type=FunctionType.TEXTEMBEDDING,
    input_field_names=["url"],
    output_field_names=["dense_mm"],
    params={
        "provider": "aliyun_milvus",
        "model_name": "qwen3-vl-embedding",
        "dim": "1024",
        "is_multimodal": "true"
    }
)

schema.add_function(text_embedding_function)
schema.add_function(mm_embedding_function)
index_params = client.prepare_index_params()

index_params.add_index(
    field_name="dense",
    index_type="AUTOINDEX",
    metric_type="COSINE"
)
index_params.add_index(
    field_name="dense_mm",
    index_type="AUTOINDEX",
    metric_type="COSINE"
)
client.drop_collection(collection_name)
client.create_collection(
    collection_name=collection_name,
    schema=schema,
    index_params=index_params
)

# ========== 插入数据:多媒体素材传 URL,纯文本直接传文本 ==========
insert_data = [
    {"id": 1, "document": "一张服装类商品图片,展示人物穿着的上衣外观细节。", "url": IMAGE_URL},
    {"id": 2, "document": "一段服装展示短视频,镜头展现衣物的动态穿着效果。", "url": VIDEO_URL},
    {"id": 3,
     "document": "向量数据库通过将文本转换为高维向量来实现语义检索,能够理解查询的真实意图。",
     "url": "向量数据库通过将文本转换为高维向量来实现语义检索,能够理解查询的真实意图。"},
    {"id": 4,
     "document": "深度学习模型可以从大量图片数据中学习特征表示,用于图像分类和目标检测等任务。",
     "url": "深度学习模型可以从大量图片数据中学习特征表示,用于图像分类和目标检测等任务。"},
    {"id": 5,
     "document": "服装电商平台通常需要按款式、颜色和材质检索商品主图。",
     "url": "服装电商平台通常需要按款式、颜色和材质检索商品主图。"},
]

print(f"准备插入 {len(insert_data)} 条数据...")
client.insert(collection_name, insert_data)
client.flush(collection_name)
print("数据插入完成!\n")

# ========== 测试1:文搜文(通过 dense 字段做纯文本语义检索) ==========
print("=" * 60)
print("测试1:文搜文 - 查询服装商品相关的内容")
print("=" * 60)
results = client.search(
    collection_name=collection_name,
    data=['服装商品的外观展示'],
    anns_field='dense',
    limit=3,
    output_fields=['document', 'url'],
)
for hits in results:
    for hit in hits:
        print(f"  id={hit['id']}, distance={hit['distance']:.4f}, document={hit['entity']['document'][:40]}")

# ========== 测试2:文搜图 / 视频(用文本查询匹配多媒体内容,过滤出 URL 记录) ==========
print("\n" + "=" * 60)
print("测试2:文搜图 / 视频 - 用文本描述搜索服装相关的素材")
print("=" * 60)
results = client.search(
    collection_name=collection_name,
    data=['一件衣服的穿着展示'],
    anns_field='dense_mm',
    limit=3,
    filter='url like "http%"',
    output_fields=['document', 'url'],
)
for hits in results:
    for hit in hits:
        is_media = "媒体" if str(hit['entity']['url']).startswith('http') else "文本"
        print(f"  id={hit['id']}, distance={hit['distance']:.4f}, [{is_media}] document={hit['entity']['document'][:40]}")

# ========== 测试3:图搜图 / 视频(用图片地址查询多媒体内容) ==========
print("\n" + "=" * 60)
print("测试3:图搜图 / 视频 - 用图片地址搜索相似素材")
print("=" * 60)
results = client.search(
    collection_name=collection_name,
    data=[IMAGE_URL],
    anns_field='dense_mm',
    limit=3,
    output_fields=['document', 'url'],
)
for hits in results:
    for hit in hits:
        is_media = "媒体" if str(hit['entity']['url']).startswith('http') else "文本"
        print(f"  id={hit['id']}, distance={hit['distance']:.4f}, [{is_media}] document={hit['entity']['document'][:40]}")

运行结果

准备插入 5 条数据...
数据插入完成!

============================================================
测试1:文搜文 - 查询服装商品相关的内容
============================================================
  id=1, distance=0.6412, document=一张服装类商品图片,展示人物穿着的上衣外观细节。
  id=5, distance=0.5901, document=服装电商平台通常需要按款式、颜色和材质检索商品主图。
  id=2, distance=0.5689, document=一段服装展示短视频,镜头展现衣物的动态穿着效果。

============================================================
测试2:文搜图 / 视频 - 用文本描述搜索服装相关的素材
============================================================
  id=2, distance=0.1861, [媒体] document=一段服装展示短视频,镜头展现衣物的动态穿着效果。
  id=1, distance=0.1153, [媒体] document=一张服装类商品图片,展示人物穿着的上衣外观细节。

============================================================
测试3:图搜图 / 视频 - 用图片地址搜索相似素材
============================================================
  id=1, distance=1.0000, [媒体] document=一张服装类商品图片,展示人物穿着的上衣外观细节。
  id=2, distance=0.0732, [媒体] document=一段服装展示短视频,镜头展现衣物的动态穿着效果。
  id=3, distance=0.0294, [文本] document=向量数据库通过将文本转换为高维向量来实现语义检索,能够理解查询的真实意图。

测试3 中查询图片与库中同一张图片的相似度为 1.0000,说明图搜图链路生效。跨模态检索(文本查询多媒体)的相似度量级通常低于同模态检索,属于正常现象,业务侧应按同一检索场景内的相对排序来判断效果,而非跨场景比较绝对分值。