RAG 知识库怎么存?
向量数据库选型、元数据管理及索引结构设计要点
原题:在检索增强生成(RAG)系统中,知识库通常以何种形式进行存储?请说明向量数据库的选择、元数据管理以及索引结构的设计考虑。
向量检索 · 安克科技真题
30 秒回答
- 向量数据库选型需考虑规模、延迟、成本三要素
- 元数据设计要支持过滤和排序
- 索引结构需权衡召回率与速度
- 实际落地常用混合检索(向量+关键词)
回答与解析
答案要点
- 向量数据库选型需考虑规模、延迟、成本三要素
- 元数据设计要支持过滤和排序
- 索引结构需权衡召回率与速度
- 实际落地常用混合检索(向量+关键词)
- 需考虑数据更新和版本管理
知识库存储形式
RAG知识库采用双轨存储:向量存储(语义检索)+ 文档存储(原文召回),二者通过doc_id关联。
向量数据库选择
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 百万级/快速验证 | FAISS、Milvus Lite | 轻量、易部署 |
| 千万级/生产环境 | Milvus、Pinecone、Weaviate | 分布式、高可用 |
| 十亿级/超大规模 | 自研或云厂商方案(阿里云OpenSearch、AWS OpenSearch) | 成本可控、深度定制 |
核心考量:延迟(<100ms)、召回率(Top5>90%)、成本(向量存储比原文大5-10倍)。
元数据管理
# 典型元数据结构
{
"doc_id": "uuid",
"source": "api_doc_v2.3", # 来源追溯
"category": "payment", # 业务分类
"chunk_index": 3, # 分块序号
"timestamp": 1699123456, # 版本控制
"access_level": "internal", # 权限标记
"title": "退款流程" # 用于重排序
}
设计要点:
- 支持预过滤(如
where category='payment'),减少向量搜索空间 - 保留原文存储位置,避免向量库膨胀
索引结构设计
- 向量索引:HNSW(平衡速度与召回)或 IVF(内存受限时)
- 倒排索引:BM25/关键词索引,用于混合检索
- 分层索引:热点数据内存HNSW + 冷数据磁盘索引
生产实践:90%场景用向量+关键词混合检索(RRF融合),纯向量检索在专有名词、ID查询上效果差。
口语版讲法(约4分钟)
- 本质是存储与检索的权衡
- 向量库选型分场景
- 元数据是过滤利器
- 索引结构要混搭
- 风险与取舍
这道题其实在问,RAG系统的知识库存储,本质上是怎么在语义理解效率和工程成本之间做权衡。说白了,知识库不是简单存一堆文本,而是要同时支持两种检索:一种是向量检索,靠语义相似度找内容;另一种是关键词检索,靠精确匹配。真正落地的系统,通常两条腿走路,通过doc id把向量库和文档库关联起来。
先说向量数据库的选型。很多人一上来就问哪个库最好,其实得看场景。如果你只是百万级数据量做快速验证,FAISS或者Milvus Lite就够了,轻量好部署,成本也低。但如果是千万级的生产环境,比如电商客服系统,每天几百万次查询,那就要上Milvus、Pinecone或者Weaviate这种分布式方案,保证高可用和低延迟。要是到了十亿级,比如超大规模的文档库,我倾向于用云厂商的托管服务,像阿里云OpenSearch,或者自己定制,因为这时候成本是主要矛盾,向量存储比原文大5到10倍,得精打细算。核心指标就三个:延迟要低于100毫秒,召回率Top5要超过90%,成本要可控。
再一个关键是元数据管理。很多人只关注向量本身,忽略了元数据,其实元数据是提升检索效率的利器。举个例子,在客服退款场景里,知识库里既有支付相关的文档,也有物流相关的,如果不加过滤,用户问退款时可能会把物流文档也召回来。所以我会在每条向量旁边挂元数据,比如业务分类、时间戳、权限等级。查询时先根据元数据做预过滤,比如只查category等于payment的,这样向量搜索空间能缩小一半以上,召回质量也更高。另外元数据还能做版本控制,比如文档更新了,通过时间戳就能只查最新版本。
索引结构上,我倾向混合方案。向量索引用HNSW,它在速度和召回率之间平衡得最好,如果内存受限可以用IVF。但纯向量检索有硬伤,比如用户查订单号‘ORD123456’,向量检索几乎找不到,因为语义上它和任何文本都不像。这时候就得配合倒排索引,用BM25做关键词匹配。生产实践中,90%的场景我都会用向量加关键词的混合检索,用RRF算法融合两个结果集。这样既保语义又保精确。另外还可以做分层,热点数据放内存HNSW,冷数据放磁盘索引,提升整体吞吐。
这里有个坑:索引设计不能光看检索速度,还得考虑数据更新。如果知识库频繁改动,比如每天新增几万条文档,那索引重建就是个大问题。常见失败场景是,为了追求实时性直接增量插入,结果图索引的局部性被破坏,召回率慢慢下降。我上线时会特别关注这个问题,通常用双缓冲策略,一个主索引服务查询,一个影子索引后台重建,重建完原子切换。前提是业务能接受分钟级的更新延迟。
另外还有一点,元数据的过滤顺序也很讲究。是先过滤再向量搜索,还是先向量搜索再过滤?这直接影响延迟,不同数据库的实现不一样,像Pinecone是先过滤再搜索,而Milvus可以配置。我通常会根据过滤条件的筛选率来选,如果过滤能把候选集压到10%以下,那就先过滤,否则先搜索再过滤更高效。
所以整体来看,我更倾向把知识库存储看作一个系统工程,不是选个向量库就完事了。元数据的设计、索引的混合策略、更新的容错机制,每块都得根据业务场景做取舍。
关键一句:元数据过滤顺序影响延迟,需根据筛选率决定先过滤还是先搜索
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服的RAG系统,用户问“退款到哪了”,系统得先去知识库里找退款流程。那这个知识库里的文档,你具体是怎么存的?是只存向量,还是也要存原文?
- 问法 2 · 层层追问
RAG系统里知识库的数据一般怎么存?……那向量数据库你怎么选?……除了向量,元数据怎么管理?比如我要按产品类别过滤搜索结果,你会在索引里怎么设计?
- 问法 3 · 直球架构
直接说下RAG知识库的存储架构:向量数据库选型、元数据设计、索引结构,这三块你分别怎么考虑?比如千万级数据,延迟要求100ms以内,你会怎么搭?