← 返回专栏

向量库原理知识总结

向量管"像不像",元数据管"要不要"——理解这一句,就理解了向量库的核心设计。

向量库RAGAI基础设施知识管理

一、核心概念

向量(Vector)

  • 一组数字(如512个或1024个),用来表示一段内容的"语义坐标"
  • 由向量模型(Embedding Model)自动计算生成,人类读不懂,但机器能用它计算相似度
  • 任何内容(文本、图片、音频)都可以被转化为向量

向量库(Vector Database)

  • 专门存储、索引、检索高维向量数据的数据库
  • 核心能力:给定一个查询向量,快速找到最相似的向量
  • 三件事:(向量+元数据)、(索引加速的相似度搜索)、(增删改查、过滤、持久化)

RAG(检索增强生成)

  • 一种架构模式,不是单一技术
  • 三步流程:
    • R(Retrieve):把用户问题向量化,在向量库中搜索相关片段
    • A(Augmented):把搜到的片段拼进 Prompt,告诉大模型"参考这些资料回答"
    • G(Generation):Chat 模型基于资料生成回答
  • RAG 系统的各个环节(切片、向量化、检索、重排序、生成)各自独立存在,组装在一起叫"RAG 系统"

二、完整流程

存储流程

选择向量库 → 选择向量模型 → 读取数据源 → 切片 → 向量化 → 存入向量库

检索流程

用户提问 → 元数据过滤(缩小范围)→ 向量搜索 + 关键词搜索(多路召回)
→ Rerank 重排序(精选最相关的)→ 拼装 Prompt → Chat 模型生成回答

三、向量库选型

选型核心考量(按优先级)

  1. 数据规模:百万级以下都行,千万级选 Milvus/Qdrant,十亿级基本只有 Milvus
  2. 数据安全:数据能否出外网,不能则必须私有化部署
  3. 运维能力:有专业团队选 Milvus,团队小选 Qdrant,不想运维选云服务
  4. 已有技术栈:已有 PostgreSQL 可先试 pgvector
  5. 是否需要分布式

专用向量库 vs 传统数据库加插件

  • 专用向量库(Milvus、Qdrant):向量搜索性能强,索引算法丰富,适合向量搜索是核心能力的场景
  • 传统数据库加插件(pgvector):无额外运维成本,适合向量搜索只是辅助功能的场景

主流向量库对比

MilvusQdrantChromaPinecone
定位企业级重型企业级轻型开发/学习云托管
数据规模十亿级亿级百万级亿级
部署复杂度极低
国内使用最多(中国公司)在增长学习用

四、向量模型选择

核心差异维度

  • 语言能力:中文专精(bge-zh)vs 多语言(bge-m3、e5-large)
  • 维度:512 / 1024 / 1536 / 3072,越高精度越好但成本越高
  • 最大输入长度:决定单个切片能多长,超过会被截断导致语义丢失
  • 训练数据/语料:通用语料 vs 领域语料,影响特定领域的检索准确率
  • Benchmark 跑分:MTEB/C-MTEB 榜单的实测检索准确率

选型考量

  • 数据能否出外网?不能 → 本地部署(bge 系列);能 → 可用 OpenAI API
  • 纯中文 → bge-large-zh;中英混合 → bge-m3
  • 一旦选定,迁移成本极高(换模型 = 全部数据重新向量化),选型要审慎

向量模型 vs Chat 模型

向量模型Chat 模型
输入一段文本一段对话
输出一组数字(向量)一段文字(回答)
体积轻量(几十MB~2GB)很重(几GB~几百GB)
部署CPU 就够通常需要 GPU
在 RAG 中的角色负责"找到相关资料"负责"基于资料写回答"

五、切片策略

核心矛盾

  • 切太小:搜索精准但丢失上下文
  • 切太大:保留上下文但语义混杂、浪费 Token

四种策略

策略原理适用场景
固定长度每 N 字切一段,相邻段重叠快速原型、要求不高
按分隔符/章节识别文档结构(标题、条款),在自然边界切有清晰结构的文档(规章、手册、API文档)
递归切片先试大分隔符,太长再试小的,层层递归混合类型文档,大多数企业场景
语义切片用模型判断话题转折点,在转折处切结构不规则的文档(会议纪要、随笔)

切片参数

  • 目标长度(如 300-500 字)
  • 重叠长度(如 50-100 字,防止切断语义)
  • 分隔符选择
  • 切片长度不能超过向量模型的最大输入长度

实际定策略的方式

  • 不是理论推导,是测出来的:选 2-3 种策略,准备测试问题,跑对比,选效果最好的
  • 通常按知识库级别配置(同一知识库里文档类型相似,用同一套策略)

六、元数据(Metadata)

是什么

  • 和向量一起存储的结构化描述信息
  • 向量管"像不像",元数据管"要不要"

一条完整记录的结构

id:       唯一标识
vector:   [0.02, -0.03, ...] ← 语义搜索用
metadata: {source, department, author, date, ...} ← 过滤用
text:     原始文本内容 ← 展示用

元数据来源

  • 个人场景:工具自动生成(文件名、切片序号)
  • 企业场景:自动生成 + 业务元数据(部门、权限、文档类型等),来源于业务系统中已有的结构化信息

元数据更新

  • 文档内容变了 → 向量和元数据都要更新(通常删旧存新)
  • 只是元数据变了(如员工调部门)→ 只更新元数据,向量不用重算

七、搜索机制

相似度计算(数学层面)

方式原理适用
余弦相似度比较方向是否一致文本搜索(最常用)
欧氏距离比较空间直线距离图像相似度
点积方向×长度综合考虑推荐系统

不管什么数据类型(文本/图片/音频),都是先变成向量,再用上面的函数计算。区别在向量化模型不同,不在计算方式。

元数据过滤 + 向量搜索的三种配合方式

策略做法特点
Pre-filtering先按元数据筛,再在结果中向量搜索快,但可能漏结果
Post-filtering先向量搜索,再按元数据筛结果不漏语义相关的,但可能结果太少
Integrated搜索和过滤同时进行效果最好,主流向量库默认方式

检索增强手段

  1. 切片策略优化:存的时候就决定了搜索上限
  2. 元数据过滤:缩小搜索范围
  3. 多路召回:向量搜索 + 关键词搜索(BM25),取并集
  4. Rerank 重排序:搜完后用专门模型重新打分排序,更精确但更慢

八、索引与性能

为什么需要索引

  • 暴力搜索(逐条比对)在大数据量下不可行:100万条约需2秒,1000万条约20秒
  • 索引的核心思路:先分区,再局部搜索(ANN - 近似最近邻)
  • Approximate(近似):不保证绝对最优,但足够相似,速度快几百倍

主流索引算法

算法思路特点
IVF数据分成 N 个区,搜索时只去最可能的几个区简单高效
HNSW层层缩小范围(类似社交网络找人)精度最高,吃内存
PQ压缩向量维度,牺牲精度换空间数据量特别大时用

核心调参(以 HNSW 为例)

  • ef_construction:建索引时的精度,值越大索引质量越高但建索引越慢
  • ef_search:搜索时的精度,值越大结果越准但搜索越慢
  • 平衡方式:先用默认参数,再根据准确率和性能测试结果调整

九、企业级设计要点

隔离策略

级别做法场景
物理隔离不同的向量库实例不同租户/子公司
应用隔离不同的 Collection(集合)不同业务模块(HR vs 销售)
数据隔离同一集合内用元数据标记+查询时过滤同一模块内不同用户权限

应用隔离的必要性(不只是安全)

  • 搜索质量:不同业务语义互相干扰
  • 索引效率:语义空间混杂,聚类质量下降
  • 运维灵活性:独立操作,互不影响

多集合搜索

  • 实现方式:分别搜索 → 合并结果 → 重新排序
  • 路由判断:用户手动选 / 规则路由 / 大模型判断
  • 关键约束:所有集合最好用同一个向量模型,否则相似度分数不可比较

数据源管理

  • 企业数据源多样:OA、文档系统、邮件、数据库、外部数据
  • 每种数据源需要对应的解析器
  • 结构化数据(数据库记录)→ 先拼成自然语言再向量化
  • 增量同步:企业数据每天在变,需要只处理新增和修改的数据

数据更新同步的触发方式

触发方式怎么做适合场景
手动触发改完文档后自己调一下同步脚本最简单,个人使用足够
文件监听脚本监听目录的文件变更(如 Python watchdog),有变化自动调 API实时性好,需常驻后台进程
定时任务cron 定时扫描文件修改时间,变化的文件调 API 更新简单可靠,如每天凌晨同步一次
Git Hook笔记在 Git 仓库时,commit 触发同步笔记用 Git 管理时很自然
平台内置如 Dify 2.0 的知识管道(Knowledge Pipeline),支持多数据源自动采集使用支持此功能的平台时

增量同步的核心逻辑:扫描数据源 → 比对文件修改时间或 hash → 变化的文件调更新 API → 新文件调创建 API。

企业产品需要管理的配置

  • 数据源接入与解析
  • 切片策略选择与参数配置(按知识库级别)
  • 向量模型选择
  • 元数据结构设计(权限、业务标签等)
  • 检索增强策略(多路召回、Rerank 开关)
  • 效果评估与持续优化

十、大模型记忆体系全景图

五种"记住东西"的方式

方式知识存在哪更新方式成本知识量上限
Context WindowPrompt 里随时换内容Token 消耗大受窗口限制
RAG外部向量库更新向量库中等理论无限
Fine-tuning模型参数里重新训练训练成本高受模型容量限制
Agent Memory外部存储自动积累中等理论无限
Knowledge Graph + LLM图数据库更新图谱构建成本高理论无限

Context Window vs RAG

Context Window 越来越大(GPT-3 的 4K → Gemini 的 1M+),但不能完全取代 RAG:

  • 数据量大(企业百万篇文档)→ 塞不进窗口,必须 RAG
  • 需要精准溯源(回答标注来自哪个文件)→ RAG 才能做
  • 成本敏感(每次只发相关片段 vs 每次发全文)→ RAG 更省
  • 需要元数据过滤/权限控制 → Context Window 做不了
  • 个人少量笔记、不需要溯源 → Context Window 够用

智能体长期记忆技术细分

记忆方式原理适合场景典型例子
向量知识库(RAG)外挂知识,语义检索后注入上下文大量文档/知识的查询Dify 知识库、自建 RAG 系统
对话历史持久化把对话记录存数据库,下次对话时加载连续多轮对话的延续ChatGPT 的历史记录
记忆摘要/压缩用大模型把长对话压缩成摘要存储,下次加载摘要长期对话不丢失关键信息MemGPT 的方案
结构化记忆(数据库/文件)提取关键信息存成结构化数据(JSON/数据库/文件)用户偏好、事实性记录Claude Code 的 MEMORY.md
知识图谱(Graph RAG)把信息组织成实体-关系网络,支持多跳推理"张三的上级负责的项目"这种链式查询Neo4j + LLM
参数化记忆(微调/LoRA)通过微调把知识写入模型权重高频使用的领域知识内化企业定制模型
超长上下文直接把大量信息塞进上下文窗口信息量可控时的"暴力"方案Gemini 的百万 token 上下文

实际趋势:组合使用

一个成熟的 AI 应用可能同时用多种方式:

  • 简单问题 → Context Window
  • 复杂问题 → RAG 检索后塞入 Context
  • 跨对话偏好 → Agent Memory
  • 企业结构化知识 → 知识图谱 + RAG
  • 领域专业术语/风格 → Fine-tuning

什么数据值得向量化

  • 高频检索 + 语义模糊的内容(用自然语言搜的)→ 值得向量化
  • 低频访问的归档数据 → 不值得,浪费存储和计算
  • 结构化且查询条件明确的数据 → 用传统数据库更合适
  • 重复/过时/低质量的内容 → 先清洗再决定
  • 敏感数据 → 需要评估安全风险后再决定

十一、非文本数据的 RAG 处理难点

各类数据格式的处理方式

数据类型难点处理方式成本
Markdown/纯文本直接切片向量化
PDF排版复杂、表格/图片混排PDF 解析器(marker、pdfplumber)
PPT图文混排、布局信息解包提取文字(PPT 本质是 zip 包),图表信息可能丢失
手写内容OCR 识别率不稳定视觉模型(qwen-vl 等)中高
视频同时有音频和画面语音转文字(ASR)+ 截帧图像理解,画面信息易丢失

多模态处理的成本考虑

  • 文本类数据:本地向量模型(如 bge-small,90M)即可,CPU 够用
  • 图片/视频等多模态:需要视觉模型,本地跑吃配置,用 API 有成本
  • 低成本视觉 API 选择:qwen-vl、gemini-flash 等
  • 务实策略:先跑通文本 RAG,多模态数据后续再处理

十二、多路召回的实现层级

多路召回(关键词搜索 + 向量语义搜索)总要有人做,区别在于做在哪一层:

实现层级怎么做适合场景
Agent 自主做Agent 分别调不同工具(如 Claude Code 内置 Grep + MCP 向量检索),自己综合结果有 Agent 能力的客户端(Claude Code、Cursor)
MCP Server 内部做MCP 内部同时做关键词搜索和向量搜索,合并结果后返回客户端没有内置文件搜索能力(如 Cherry Studio)
平台配置做平台直接提供混合检索选项(如 Dify 知识库节点选"混合检索")使用支持此功能的平台
后端代码做自建后端服务,代码中编排多路召回逻辑给别人用的产品

越接近底层做,对上层客户端的要求越低。


十三、Agentic RAG(智能体驱动的检索)

普通 RAG vs Agentic RAG

普通 RAG 是单次检索:用户问题 → 向量化 → 检索 → 拼 Prompt → 生成回答。

Agentic RAG 加了一个循环

用户问题
  ↓
查询改写(把模糊问题转成明确的检索查询)
  ↓
检索(向量搜索 + 关键词搜索)
  ↓
结果评估(大模型判断:检索到的信息够不够回答问题?)
  ↓ 不够 → 换角度改写查询,回到"检索"步骤(循环)
  ↓ 够了 → 基于所有收集到的片段生成回答

核心差异:有没有**"判断够不够 → 不够就换角度再检索"的循环**。

为什么需要 Agentic RAG

简单向量检索解决不了的场景:

  • "上次跟客户聊的方案" → 需要理解"上次"指什么时间、"客户"是谁,拆解后检索
  • "跟竞品比我们的优势" → 需要分别检索"竞品信息"和"我方产品信息",多次检索后综合
  • "最近三个月的项目进展" → 需要时间过滤 + 多次检索不同项目

共性特征:用户的问题不能直接当检索关键词用,需要先理解、拆解、改写。

实现方式(按场景)

实现方式Agentic 逻辑在哪灵活性开发成本适合场景
Agent 客户端(Claude Code)Agent 自身(大模型自主循环)最高个人使用
平台工作流(Dify)可视化编排(循环节点 + 条件分支)中等需要可视化管理的团队
MCP Server 内部MCP 厚封装(内部自己跑检索循环)中等客户端能力弱时
后端代码自己写循环逻辑最高开发产品
Agent 框架(LangChain/LlamaIndex)框架封装好的组件快速原型、中型项目

核心模块

不管在哪一层实现,Agentic RAG 都需要这几个模块:

模块职责实现方式
查询改写器把模糊问题变成明确的检索查询LLM 调用(提示词工程)
检索执行器实际去向量库/关键词引擎搜API 调用
结果评估器判断当前检索结果够不够LLM 调用
循环控制器控制最多几轮、什么时候停程序逻辑(max_rounds + 停止信号)
最终生成器基于所有收集到的信息生成回答LLM 调用

与多路召回实现层级的关系

和多路召回的逻辑一致:越往底层做,对上层客户端要求越低。Claude Code 天然支持 Agentic RAG 是因为它本身就是 Agent,会自主决定"搜一次不够再换个角度搜"。如果客户端不是 Agent(普通聊天框),Agentic 逻辑就得自己在封装层或后端实现。