向量库到底有什么用
从"SQL 加个列不就行了"到理解向量检索和 RAG 的完整链路,以及小数据量场景下到底该怎么选。
SQL 存个相同列 join 一下不就行了?
这是我最初的问题。看起来很合理:embedding 不就是一串数字吗,存个字段,SQL join 一下就完事了。
但 SQL 擅长的是 WHERE A = B 这种精确匹配。Embedding 是高维浮点数组,代表语义特征。两句话语义相似,它们的向量数值却绝不相等。WHERE Va = Vb 直接返回空。
所以向量库真正在做的事情有两层:
- 数学计算:用余弦相似度等算法算高维空间的"距离",而不是判等。
- 专属索引(ANN 算法):传统 B-Tree 索引对高维数据失效,会退化成全表扫描。向量库用 HNSW 之类的索引在高维空间建"地图",做到毫秒级近似最近邻检索。
那 RAG 到底是怎么跑的
搞清楚向量库的作用之后,整个 RAG 链路就顺了:
- 用户提问 -> 经过 Embedding 模型 -> 转成向量
- 拿向量去向量库里找最近的文档片段
- 找到的相关资料 + 用户原问题一起拼成 Prompt 发给大模型
- 大模型结合资料回答,减少幻觉
核心就是:输入给大模型之前,先用向量检索把相关上下文捞回来,拼在一起再喂进去。
全量召回还是选几条?
这是第二个直觉问题:如果数据库里相关的东西很多,比如 50 页文本都沾边,全部塞进大模型?还是挑几条最相关的?
答案是必须精选截断。原因有三个:
- 上下文窗口有限:大模型的 Context Window 有上限,塞不下就是塞不下。
- 中间迷失:上下文太长时,大模型容易忽略中间的内容。
- Token 费用:输入越长越贵。
所以标准做法是设置 top_k(比如 limit=5),只取相似度最高的前 N 个片段。入库之前也先把长文本切成小块(比如每段 500 字),精准匹配局部内容,避免带入无关段落。
但我的数据量没那么大
说到这里我反应过来了--我的复盘日志根本没多少数据。几万字而已,全塞进去不就完了?
确实可以。小数据量下"全上下文注入"更简单有效:
- 逻辑完整:保留完整的时间线和因果链,不会因为切片断章取义。
- 架构极简:直接 SQL
SELECT *,全部喂给大模型,不需要向量索引和切片逻辑。
那向量库还有没有意义
有。即便是小数据量,向量库(或 SQL 的向量插件)仍然有几个不可替代的能力:
- 模糊语义匹配:日志里写的是"肝到两点"或"披星戴月",向量检索能匹配到"加班"的语义。传统 SQL
LIKE搜不到这种。 - 扩展性:日志会越积越多,一两年后可能就塞不进上下文窗口了。向量检索的成本随数据量亚线性增长,全量注入则是线性上升。
- 聚类与挖掘:基于向量距离可以做无标签的主题归类和情绪分析,这是全量注入给大模型做不到的。
所以比较务实的方案是:短周期(比如近一周)的分析直接 SQL 全量提取,喂给大模型;跨年度的特定问题搜索走向量匹配。两条路各管各的,不冲突。