向量数据库¶
向量数据库保存 Embedding 与元数据,用于从大量文档片段中找出语义相近的候选内容。它不是答案生成器,也不能自动保证召回正确。
先理解:什么是向量¶
计算机不能直接拿“SSH 登录失败”和“无法通过 SSH 连接服务器”比较语义。Embedding 模型会把一段文本转换为一串浮点数,例如:
这串数字就是向量(Vector),也常叫 Embedding。单个数字本身没有可读的业务含义;重要的是整串数字在模型构造的“语义空间”里的相对位置:语义相近的文本通常距离更近,不相关的文本通常更远。
所以向量检索不是在理解中文,也不是逐字匹配关键词,而是在比较“问题向量”和“文档片段向量”之间的距离或相似度。
什么是向量维度¶
向量中数字的个数就是维度(dimension)。上例中的 [-0.18, 0.42, ...] 若共有 1,024 个数字,就是一个 1,024 维向量;维度由 Embedding 模型决定,不是 Milvus 可以随意设定的参数。
| 概念 | 例子 | 实际含义 |
|---|---|---|
| 文本 | SSH 登录失败 |
人能读的原始内容 |
| 向量 | [-0.18, 0.42, ...] |
模型输出的数字表示 |
| 维度 | 1024 |
该向量中有 1,024 个浮点数 |
| 相似度 | 0.91 |
问题和某片段在同一向量空间中有多接近 |
维度不是“越大越好”。更高维通常意味着更多存储、内存、索引构建和查询成本;是否更容易召回正确内容,主要取决于模型训练质量、业务语言是否匹配、切片质量和评测结果。选模型时先接受它输出的维度,然后在向量库 Schema 中把 Vector Field 的维度设为同一个值。
最常见的错误是:Collection 已按 1,024 维建立,后来换了输出 768 维的新模型,或者把不同模型产生的向量写入同一 Collection。前者会直接报维度不匹配;后者即使能写入,向量之间也未必处在可比较的语义空间,检索质量会失真。模型升级应新建 Collection 或按版本隔离后全量重建。
向量怎样判断“相近”¶
向量库会根据距离度量进行近邻搜索。常见做法包括余弦相似度、内积和欧氏距离;具体度量要和 Embedding 模型的建议保持一致。尤其是模型要求归一化时,写入向量和查询向量必须采用同一规则。
向量相近只说明“主题或语义像”,不保证它是正确答案。因此,RAG 还需要元数据过滤来限制权限与业务范围、关键词检索来处理精确编号、Reranker 来重排候选、以及最终的引用和评测来检查质量。
选型与数据模型¶
| 组件 | 需要设计的内容 |
|---|---|
| Vector | 使用哪个 Embedding 模型、维度、归一化与版本。 |
| Metadata | 文档 ID、标题、章节、来源、更新时间、权限、设备/站点等过滤字段。 |
| Index | HNSW、IVF 等索引参数在速度、召回率和内存之间取舍。 |
| Collection | 按租户、知识域或 Embedding 版本隔离,避免不同向量空间混用。 |
关键实践¶
- 文本变化、Embedding 模型升级或切片策略改变后,通常需要重建向量。
- 先用 metadata 过滤权限/业务范围,再做相似度搜索,防止跨租户或无权限召回。
- 向量检索擅长语义相近;术语、编号、精确字段常需要与关键词/BM25 混合检索。
- 记录查询、候选、分数、最终引用和用户反馈,才能持续调召回质量。
Milvus、Qdrant、Chroma、pgvector 都可作为实现选择;不要先按“产品名”决定,先明确数据规模、过滤需求、延迟目标、运维能力与已有数据库。
具体实现¶
- Milvus:向量检索与运维:把向量检索作为独立服务运行时的实战节点,涵盖 Schema、过滤、索引、部署、评测与排障。