在向量数据库技术持续迭代的今天,如何灵活地组合不同来源的查询数据,成为许多开发者关注的焦点。近日,Milvus 社区中一个高频问题引发热议:「在使用 Milvus 文本嵌入功能时,能否混合使用原始文本查询和预计算向量?」 答案不仅是肯定的,而且 Milvus 2.4 及以上版本已通过内置的 Embedding Functions 提供了原生支持。

技术背景:Milvus 文本嵌入功能如何工作?

Milvus 是广受欢迎的开源向量数据库,其 2.4 版本引入了 Embedding Functions 特性,允许用户在 Collection Schema 中直接定义文本字段与向量模型的映射关系。例如,用户可配置调用 OpenAI、Cohere、VoyageAI 等第三方模型,或使用 Hugging Face 上的本地模型,将原始文本自动转化为向量。当插入数据时,系统自动为文本字段生成向量;查询时,用户只需输入原生文本,Milvus 便会调用指定的 Embedding Function 将文本转为向量后再执行相似度搜索。

这一设计极大简化了传统“手动编码+再插入”的繁琐流程,但同时也引出一个新问题:如果同一个 Collection 中,部分数据的向量早已预计算好并直接存储,另一部分数据仍以原始文本形式存在,如何在一次查询中同时处理这两种情况?

混合查询:API 层面的无缝集成

Milvus 官方明确回应:支持混合。 其核心在于 AnnSearchRequest混合搜索(Hybrid Search) 机制。开发者可以在一次搜索请求中,同时定义多个子请求,每个子请求可以针对不同的向量字段或文本字段,并指定各自的查询向量来源。

具体而言: - 对于 预计算向量 的字段(如 image_vector),搜索时直接传入已有向量(numpy.ndarraylist)作为查询输入。 - 对于 文本字段(如 description),若该字段已在 Schema 中配置了 Embedding Function,则搜索时只需传入原始文本字符串,Milvus 会自动实时调用模型生成向量,无需用户手动转换。

两种子请求可以并行执行,最终通过 reranking 策略(如 Reciprocal Rank Fusion)合并结果。这一设计让开发者能够针对多模态数据(如商品图片预计算向量 + 商品描述原始文本)执行统一检索,极大提升了查询灵活性。

实战场景:电商多模态搜索

以电商平台为例,商品库中包含两类数据: - 商品主图:已通过 ResNet-50 等模型提取出 512 维向量,存储于 img_vector 字段。 - 商品标题和描述:原始文本存储于 title 字段,Schema 配置为 Function("openai-embedding-3-small") 自动生成向量。

用户发起搜索“红色连衣裙”,并附上一张参考图片的预计算向量。传统方式需要分别调用两个系统(向量检索引擎 + 文本检索引擎),而 Milvus 一次请求即可完成:

from pymilvus import AnnSearchRequest, Collection

collection = Collection("products")
# 文本查询:原始字符串
text_req = AnnSearchRequest(
    data=["红色连衣裙"],
    anns_field="title_vector",  # 自动调 Embedding Function
    param={"metric_type": "IP", "params": {"nprobe": 10}},
    limit=10
)
# 图像查询:预计算向量
image_vec = [0.12, 0.34, ...]  # 预计算
image_req = AnnSearchRequest(
    data=[image_vec],
    anns_field="img_vector",
    param={"metric_type": "L2", "params": {"nprobe": 10}},
    limit=10
)
from pymilvus import WeightedRanker
results = collection.hybrid_search(
    reqs=[text_req, image_req],
    rerank=WeightedRanker(0.7, 0.3),
    limit=10
)

注意事项与最佳实践

尽管混合查询已“开箱即用”,但开发者仍需注意以下几点:

  1. Embedding Function 的延迟:实时文本嵌入会增加查询响应时间,建议对高频查询场景使用异步或批处理机制。
  2. 向量维度一致性:预计算向量与文本嵌入向量必须使用同一模型或相同维度(如 1536 维),否则无法在同一 Collection 中索引。
  3. 字段配置:文本字段必须事先声明 enable_analyzer=True 并配置 function,预计算向量字段则关闭自动嵌入。
  4. 资源开销:高并发场景下需评估模型推理服务的吞吐能力,可考虑使用 Milvus 的 Built-in Embedding Functions(如 Google 的 Gecko)以降低运维成本。

展望未来

混合查询能力标志着向量数据库从“纯向量检索”向“智能语义检索”演进。随着 LLM 和 RAG 应用的普及,开发者希望在同一系统中融合预计算知识向量与实时文本理解。Milvus 的这一设计,恰好为构建新一代 AI 原生的检索系统铺平了道路——无需再纠结“向量与文本谁更优先”,而是让两者在同一个数据库里“各展所长,协同工作”。

正如 Milvus 核心开发者所言:“用户不应被数据存储形式所限制。无论是预计算向量,还是原始文本,Milvus 都希望成为它们共同的归属。”