向量嵌入核心原理:文本向量化与Milvus数据库架构

一.为什么需要向量嵌入?

  传统关系型数据库依托关键词匹配、字符比对实现数据检索,擅长完成字面精准匹配 与模糊字符检索,日常通过WHERE title='气候变化'等值精准查询、LIKE "%气候%"通配模糊查询等语句,能够快速匹配到文本中含有相同字词、句式高度一致的数据内容。

  但在实际业务与智能检索场景中,用户日常提出的自然语言问题大多脱离字面词汇束缚,偏向语义意图层面的理解与匹配,不再局限于文字表面是否重合,即便查询语句和目标文档用词不同、句式相异、表达方式存在差异,只要核心含义、表达主旨相近,就应当被精准检索出来,这也是传统关键词检索模式难以高效满足的核心痛点。如下表所示:

用户查询 期望匹配文档(标题) 传统关键词能否命中
什么是健康饮食与生活习惯 健康饮食与生活习惯建议 部分命中(需包含相同词)
向量数据库怎么用 Milvus 向量数据库使用教程 难以命中(词面不同)
全球变暖对生态的影响 气候变化对生态环境的影响 难以命中(同义表达)

  向量嵌入是将文本映射到高维连续向量空间,使语义相近的文本在空间中的距离更近。配合向量数据库即可实现语义检索。整体流程如下图所示:

二.文本向量化的核心原理

(1)从字符到向量的流水线

  文本向量化不是简单的查表,而是一条深度学习的流水线,如下图所示:

  如图所示,首先对原始文本执行分词处理,把完整语句拆解为模型可识别的子词单元,再将分词结果映射为对应的数字标识。随后依托Transformer类预训练嵌入模型,为每一个子词生成初始向量表征,并结合上下文语境完成语义信息建模,挖掘词句之间的语义关联。

  完成深层特征编码后,通过CLS池化、均值池化等方式,把不定长的序列向量压缩整合为固定维度的全局文本向量,得到标准稠密向量结果。最后可根据检索需求选择进行L2归一化处理,统一向量模长,让向量能够适配余弦相似度、内积等主流相似度计算方式,为后续向量库存储与语义匹配检索做准备。

(2)稠密向量与稀疏向量

  这里用表格来进行对比:

类型 维度特点 典型来源 语义能力 关键词能力
稠密向量 Dense 固定低维(128~4096),几乎全部维度非零 Transformer Embedding 模型 强(同义、泛化)
稀疏向量 Sparse 超高维(词汇表大小),仅少量维度非零 TF-IDF、BM25 强(精确词匹配)

  在文本向量表征体系中,稠密向量与稀疏向量是两类应用场景截然不同的向量形式,二者在维度结构、生成方式、语义表达能力上存在明显差异。

  其中稠密向量维度数量固定,取值范围集中,绝大多数维度均具备有效数值,主要依靠大语言类嵌入模型训练生成,擅长挖掘文本深层语义,能够精准识别语句同义替换、语义引申等抽象表达,但对精准关键词的匹配把控能力较弱。

  稀疏向量整体维度规模庞大,与语料词汇表量级保持一致,仅极少数维度存在有效权重数值,多由传统统计检索算法生成,在关键词精准命中、字词匹配场景中表现优异,却难以完成深层次语义理解与泛化推理。

  在实际RAG检索系统搭建过程中,通常将两种向量形式结合使用,兼顾语义理解能力与关键词检索优势,补齐单一向量检索存在的功能短板。

(3)嵌入空间的直觉

训练良好的嵌入模型满足:

  1.语义相近,例如:"国王"与"皇帝"向量夹角小。

  2.语义对立,例如:"健康"与"疾病"向量夹角大。

  3.类比管理,例如:vec("国王")-vec("男人")+vec("女人")≈vec("女王")(经典  Word2Vec现象,现代模型仍保留类似结构)。

维度选择存在权衡:

维度 优点 缺点
256~512 存储小、检索快 语义表达能力有限
1024(常用) 平衡精度与性能 主流选择
2048~4096 细粒度语义区分 存储与计算成本高

三.相似度度量与向量空间

向量入库与检索前,必须约定距离/相似度度量方式。

(1)常用度量公式与适应场景表

度量名称 公式 Milvus metric_type 适用场景
欧氏距离L2 ( d = \sqrt{\sum_i (a_i - b_i)^2} ) L2 未归一化向量
内积IP ( s = \sum_i a_i \cdot b_i ) IP L2 归一化后等价于余弦
余弦相似度 (\cos = \frac{a \cdot b}{ a b } ) COSINE 文本Embedding最常用
BM25 基于词频的稀疏打分 BM25 稀疏向量/全文检索

  需要注意的是Milvus中distance字段的含义因metric而异,L2越小越相似,IP/COSINE/BM25越大越相似。后处理阈值需与metric对齐。

(2)余弦相似度的几何直觉

  在高维向量空间内,所有文本向量均以原点作为起始点进行分布排布,查询向量与各类文档向量形成不同夹角。

  向量之间的夹角大小直接决定语义相似度高低,夹角越小代表余弦相似度数值越高,对应文本语义契合度也就越高。

  将所有向量完成L2归一化处理后,内积计算结果和余弦相似度的排序逻辑完全统一,在实际项目开发中,开发人员大多直接采用内积运算完成相似度判定,以此简化运算流程、降低检索计算开销。

如下图所示:

四.文本向量化的工程实践

(1)单文本向量化与批量向量化

  实际工程中需处理API限流、批量大小、异常重试等问题。embedding_demo.py演示完整流程:

python 复制代码
from embedding_utils import get_embedding, get_embeddings

# 单条文本向量化
query = "什么是健康饮食与生活习惯"
query_vector = get_embedding(query)
print(f"向量维度: {len(query_vector)}")  # 1024

# 批量向量化自动按BATCH_MAX_SIZE分批
texts = [
    "人工智能技术正在改变医疗行业",
    "Python 是一门简洁易懂的编程语言",
    "全球气候变暖导致极端天气增多",
]
vectors = get_embeddings(texts)
print(f"批量数量: {len(vectors)}, 单条维度: {len(vectors[0])}")

(2)向量化工具函数设计要点

  文本批量向量化工具函数在开发设计时,充分结合接口调用规范与项目安全规范制定多项优化策略。采用批量调用接口的方式,能够有效减少接口请求频次,大幅降低接口响应延迟与调用成本。

同时按照接口单次最大请求数量对文本数据进行分批切片处理,严格遵循平台接口传入条数限制,避免请求报错。

  函数统一设置向量维度入参,保障存入向量数据库同一集合内的所有向量维度保持统一,满足数据库存储与检索的基础要求。在密钥管理层面,将接口密钥存放于环境变量中调用,摒弃代码硬编码写法,从源头规避密钥泄露风险,提升项目整体安全性与可维护性。

可以参考下表:

设计要点 原因
批量接口 减少API调用次数,降低延迟与费用
分批切片 遵守APIbatch_size上限
统一维度参数 同一Collection内所有向量维度必须一致
环境变量存API Key 避免密钥硬编码泄露

(3)文档入库前的数据装配

  将业务字段与向量字段组装为Milvus可接受的记录结构,示例代码:

python 复制代码
import json

with open("sample_data.json") as f:
    data = json.load(f)

texts = [item["content"] for item in data]
embeddings = get_embeddings(texts)

for item, vector in zip(data, embeddings):
    item["vector"] = vector  # 装配稠密向量字段

client.insert(collection_name="demo_collection", data=data)

  其中sample_data.json记录结构举例

json 复制代码
[ { "id": 1, "title": "健康饮食与生活习惯指南", "content": "日常保持均衡饮食,多食用蔬菜水果,减少高油高盐食物摄入,同时坚持规律作息与适度运动,养成良好生活方式。", "source": "生活健康科普文库", "vector":[0.021, 0.135, -0.087, 0.204, 0.056, -0.112, 0.093, -0.037] },

五.Milvus数据库架构概览

  Milvus是专为海量高维向量设计的开源分布式数据库,核心解决存储、索引、近似最近邻(ANN)检索。

(1)整体架构

  这里不进行配图了,简单描述一下,想具体了解可以看看官方文档。

  Milvus是面向海量高维向量数据研发的开源分布式向量数据库,核心聚焦向量数据持久化存储、高效索引构建以及近似最近邻检索三大核心能力。

  整体采用分层式架构设计,自上而下依次为客户端层、接入层、协调层、工作节点层与底层存储层。

  客户端可通过官方SDK或REST接口发起各类业务请求,请求统一经由Proxy接入层完成路由转发与身份校验;再由各类协调器统一统筹管理元数据、数据分片、查询任务与索引任务,合理分发调度;最终交由数据节点、查询节点、索引节点完成数据写入、向量检索、索引生成等实际业务操作,所有数据、元数据与增量日志则分别依托对象存储、etcd与消息队列完成持久化,保障集群稳定运行与数据可靠存储。

(2)单机模式与分布式模式

  Milvus主要分为单机部署与集群部署两种运行模式,适配不同使用场景。

单机模式可通过Docker Compose快速搭建,适合日常学习调试、项目开发测试以及小规模业务上线使用 ,本地默认通过http://localhost:19530完成连接访问。

  集群模式依托Kubernetes 实现多节点分布式部署,具备强大的扩容能力与并发处理能力,能够承载亿级海量向量数据存储,支撑高并发检索业务场景,客户端通过集群代理地址建立连接。

  学习阶段使用Milvus LiteDocker Standalone 即可,API与集群版一致。

(3)核心概念关系

  在Milvus向量数据库中,数据库作为顶层逻辑容器,内部包含多个集合。

集合是存储数据的核心单元,既定义各类字段结构,也可创建检索索引,同时用于存储一条条实体数据记录。

  字段是构成实体的基本单元,可针对性建立索引来加速查询,实体则对应实际存入的业务数据行,包含主键、文本字段与向量字段等核心内容,整体架构逻辑与传统关系型数据库表结构高度相似,上手学习难度较低。核心表如下图所示:

概念 类比关系型数据库 说明
Database Database 逻辑命名空间隔离
Collection Table 一组同Schema的实体
Field Column 标量字段或向量字段
Entity Row 一条记录
Index Index 加速向量/标量检索
Partition Partition Collection内逻辑分片(可选)

六.Collection与Schema设计

(1)简单Schema

  稠密向量检索,如下代码所示:

python 复制代码
# 快速创建隐式Schema
client.create_collection(
    collection_name="demo_collection",
    dimension=1024,  # 向量维度
)

(2)完整Schema包括多字段与混合检索

示例代码:

python 复制代码
from pymilvus import MilvusClient, DataType, Function, FunctionType

schema = MilvusClient.create_schema()

schema.add_field("id", DataType.INT64, is_primary=True, auto_id=True)
schema.add_field("title", DataType.VARCHAR, max_length=512)
schema.add_field("content", DataType.VARCHAR, max_length=65535,
                 enable_analyzer=True, enable_match=True,
                 analyzer_params={"tokenizer": "standard", "filter": ["lowercase"]})
schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR)
schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=1024)

# BM25函数:content到sparse_vector入库时自动计算
bm25_fn = Function(
    name="bm25",
    function_type=FunctionType.BM25,
    input_field_names="content",
    output_field_names="sparse_vector",
)
schema.add_function(bm25_fn)

Schema字段设计参考表:

字段名 数据类型 索引 用途
id INT64, PK --- 主键,支持精确查询
title VARCHAR --- 展示、标量过滤
content VARCHAR + Analyzer --- 正文、BM25输入
metadata JSON --- 灵活扩展元信息
dense_vector FLOAT_VECTOR1024 HNSW + IP 语义检索
sparse_vector SPARSE_FLOAT_VECTOR SPARSE_INVERTED_INDEX 关键词检索

七.索引类型与检索算法

  向量全量暴力扫描Flat在百万级以上不可接受,Milvus通过ANN 索引牺牲少量精度换取百倍加速。

(1)稠密向量检索对比表

索引类型 原理 构建速度 查询速度 内存占用 适用场景
FLAT 暴力扫描 无需构建 小数据集、基准测试
IVF_FLAT 聚类 + 倒排 中等规模
IVF_PQ 聚类 + 乘积量化 大规模、内存敏感
HNSW 分层导航小世界图 很快 生产首选
DISKANN 磁盘友好图索引 低磁盘 超大规模

(2)稀疏向量索引

索引类型 metric_type 说明
SPARSE_INVERTED_INDEX BM25 倒排索引,经典全文检索

(3)创建索引示例

  这里直接给出代码示例,这段代码用于批量配置Milvus集合索引并完成集合创建,分别为稠密向量与稀疏向量配置专属索引规则。

  针对dense_vector 稠密向量字段选用主流的HNSW索引,搭配内积IP作为相似度计算方式;针对sparse_vector稀疏向量字段采用稀疏倒排索引,适配 BM25 关键词检索模式,最后结合预设数据表结构与索引参数完成向量集合一键创建,适配语义+关键词双路检索场景:

python 复制代码
index_params = MilvusClient.prepare_index_params()

# 稠密向量:HNSW与内积
index_params.add_index(
    field_name="dense_vector",
    index_type="HNSW",
    metric_type="IP",
    params={"M": 16, "efConstruction": 200},
)

# 稀疏向量:倒排与BM25
index_params.add_index(
    field_name="sparse_vector",
    index_type="SPARSE_INVERTED_INDEX",
    metric_type="BM25",
)

client.create_collection(COLLECTION_NAME, schema=schema, index_params=index_params)

  HNSW索引拥有三个核心可调参数,其中M 代表图结构每层节点最大连接数量,数值越大检索精度越高,但内存占用随之上升,日常取值范围为8至64;

  efConstruction 是索引构建阶段的候选检索数量,调大该参数能够提升索引整体质量,同时会拉长索引构建耗时;

  ef为检索阶段候选集数量,提升该值可有效提高内容召回率,也会增加查询响应延迟,可根据业务对速度与精度的需求灵活调配。

八.检索流程:从查询到结果

(1)三种检索模式

  精确查询通过指定主键ID直接定位数据,能够快速精准获取指定记录。

  Milvus标量过滤依托文本字段完成关键词模糊筛选,沿用传统数据库检索逻辑,实现字面内容匹配。

  Milvus语义检索则传入向量化后的查询向量,借助 ANN 近似最近邻算法完成相似度比对,突破文字表层限制,实现基于语义含义的智能检索。

(2)语义检索完整代码

  导入向量化工具函数,将用户输入的自然语言查询语句转为对应的语义向量。接着调用Milvus检索接口,指定目标向量集合、传入查询向量,设置返回结果数量并声明需要展示的文本字段。接口执行ANN近似近邻检索后返回匹配结果,结果为双层列表结构,内层每条结果包含数据主键、相似度分值与完整实体信息。最后遍历检索结果,格式化输出相似度数值与文档标题,直观展示语义匹配度最高的相关内容。实现代码示例如下:

python 复制代码
from embedding_utils import get_embedding

query = "什么是健康饮食与生活习惯"
query_vector = get_embedding(query)

hits = client.search(
    collection_name="demo_collection",
    data=[query_vector],
    limit=5,
    output_fields=["title", "content"],
)

# hits结构: List[List[Hit]],每个Hit含id, distance, entity
for hit in hits[0]:
    print(f"距离={hit['distance']:.4f} | {hit['entity']['title']}")

(3)后处理,阈值过滤与Top-K截断

  模型返回的Top-K未必都足够相关,工程上常加阈值,例如:

python 复制代码
TOP_K = 3
THRESHOLD = 0.3  # IP/COSINE越大越相似

final_results = []
for item in hits[0]:
    if item["distance"] >= THRESHOLD and len(final_results) < TOP_K:
        final_results.append(item)
    else:
        break  # 假设结果按distance降序,低分直接终止

  后处理策略与作用如下表所示:

后处理策略 作用
距离阈值 过滤低相关结果,减少噪声
Top-K 截断 控制上下文长度(RAG 场景)
重排序 Rerank 用 Cross-Encoder 二次精排(可选)

(4)检索链路时序

  用户向业务应用发起自然语言提问,应用先调用嵌入服务接口,将文本内容转换为固定维度的查询向量。

  随后携带向量数据向Milvus向量数据库发起检索请求,数据库调用底层HNSW索引执行近似最近邻遍历搜索,快速筛选出相似度靠前的候选数据并计算匹配分值。

  数据库将携带业务字段的检索结果回传给应用端,应用再通过相似度阈值筛选、结果重排序等方式完成二次优化,剔除低质量无关内容,最后整理规整后将精准的最终结果反馈给用户。

整体时序图如下图所示:

九.混合检索,稠密与稀疏

  单一稠密检索可能漏掉精确关键词

  单一BM25无法理解同义表达。混合检索(Hybrid Search)融合两者优势。

(1)混合架构与代码示意

  混合检索同时开启两条检索链路,用户查询文本一方面通过嵌入模型生成稠密向量,依靠 HNSW 索引完成语义层面检索。

  另一方面借助BM25算法生成稀疏向量,利用倒排索引实现关键词精准匹配。两路检索结果汇总后,通过RRF倒数排名融合或加权打分的方式统一排序,综合语义相似度与关键词匹配度,筛选出相关性最优的Top-K结果输出,兼顾语义理解与精准词条匹配能力,示意图如下图所示。

下面是一段混合检索到示例代码:

python 复制代码
from pymilvus import AnnSearchRequest, RRFRanker

query = "什么是健康饮食与生活习惯?"

sparse_request = AnnSearchRequest(
    data=[query],
    anns_field="sparse_vector",
    param={"metric_type": "BM25"},
    limit=5,
)

dense_request = AnnSearchRequest(
    data=[get_embedding(query)],
    anns_field="dense_vector",
    param={"metric_type": "IP"},
    limit=5,
)

results = client.hybrid_search(
    collection_name="demo_hybrid_collection",
    reqs=[sparse_request, dense_request],
    ranker=RRFRanker(),  # Reciprocal Rank Fusion
    limit=5,
    output_fields=["title", "content"],
)

(2)融合策略对比

常用的融合策略与对应的优劣分析如下表所示:

融合算法 原理 优点 缺点
RRF 按排名倒数加权求和 无需调参、鲁棒 无法强调某一路
Weighted 加权合并两路分数 可自定义权重 需调参
Rerank Cross-Encoder重排 精度最高 延迟大、成本高

十.总结

  本文梳理了向量嵌入技术与Milvus向量数据库的完整知识体系,从传统检索方式存在的语义匹配短板出发,逐层讲解文本向量化的底层流程、向量分类差异与空间分布逻辑,清晰阐明各类相似度计算方式的适用场景与使用规范。同时结合实际开发场景,落地讲解文本批量向量化、数据入库装配等工程化实操方案,打通从原始文本到标准向量数据的全流程处理流程。

  剖析Milvus分层架构、部署模式与核心数据概念,详细介绍集合结构设计、主流向量索引选型规则与参数调优思路,完整演示单一路径语义检索与稠密稀疏混合检索的实现方式,并对比多种结果融合策略的优劣。整体内容兼顾理论原理与项目实战,既理清了向量语义检索的核心逻辑,也提供了可直接复用的代码方案与落地规范,能够为RAG知识库搭建、智能语义检索系统开发提供完整的技术参考与实践指导。

相关推荐
前端双越老师3 小时前
我开发 AI Agent 项目踩过的 5个坑
前端·agent·全栈
怕浪猫3 小时前
第2章 核心技术栈:大语言模型与Prompt工程
openai·agent·ai编程
倔强的石头_3 小时前
QClaw 实践应用:把 QQ 私聊配置成一个可用的 AI Agent 入口
agent
xiezhr3 小时前
折腾了半小时,终于让AI能帮我写飞书文档了
人工智能·agent·ai编程
葫芦和十三3 小时前
图解 MongoDB 06|模式演进:无 schema 是优势还是债
后端·mongodb·agent
Artech4 小时前
[MAF预定义的AIContextProvider-04]Mem0Provider——长期记忆基于的云端解决方案
ai·agent·maf·aicontextprovider·chathistorymemoryprovider·mem0provider
葫芦和十三11 小时前
图解 MongoDB 05|文档模型设计:内嵌 vs 引用,反范式不是免费午餐
后端·mongodb·agent
米小虾19 小时前
手把手教你搭建第一个生产级AI Agent:从选型到实战的完整指南
人工智能·agent
米小虾19 小时前
2026年AI Agent全面爆发:从开源生态到企业级应用的进化之路
人工智能·agent