导语 :在上一篇文章中,我们聊到了如何用 DAG 调度引擎把大模型接入企业级业务流。但在 RAG(检索增强生成)架构中,大模型并不是凭空知道你们公司的内部文档的。我们必须把文本“喂”给它。今天,我们就来扒一扒这条流水线的核心基石: 向量化(Embedding)与向量数据库 。 作为传统后端老兵,我们不需要去死磕底层微积分,我们需要的是: 懂原理、会选型、能扛住高并发 。
在传统数据库里,我们搜“苹果”,就是精确匹配
WHERE name = '苹果'
。
但在 AI 时代,用户搜“苹果”,他可能指的是水果,也可能指的是苹果手机。精确匹配直接失效。
怎么让计算机懂“语义”?答案是:降维打击,变成一串数字。
文本向量化(Embedding),就是通过深度学习模型(如 BGE、OpenAI Embedding),把一段文本(一段话、一篇文章)映射到一个高维的数学空间里。
通俗理解
:想象一个巨大的坐标系,有 1024 个维度。每个词、每句话,都变成这个空间里的一个“点”(比如
[0.12, -0.54, 0.99, ...]
)。
语义相似度 :在这个空间里,“猫”和“狗”这两个点的距离,一定会比“猫”和“汽车”的距离更近。哪怕用户搜的是“猫咪”,数据库也能通过计算两个向量点的 余弦相似度(Cosine Similarity) ,把“狗”也给你找出来。
工程上的坑 :
模型选型
:英文场景 OpenAI 的
text-embedding-3
很强;中文场景首选开源的
BGE
(智源)或
M3E
。如果数据极度机密(如银行),必须私有化部署 Embedding 模型。
成本控制 :调用云端 Embedding 接口也是按 Token 收费的。海量数据清洗时,务必做好批次处理(Batch),并发度不能过高,否则会被限流。
既然文本变成了向量,我们怎么存、怎么搜?
把向量存进 MySQL?用
TEXT
字段存 JSON,然后一行行算余弦相似度?
不行!
100 万条数据,遍历计算一遍,CPU 直接冒烟,用户等到天荒地老。
我们需要 向量数据库(Vector Database) 。它的核心使命只有一个: 在极短的时间内,从千万级甚至亿级向量中,找出距离最近的那几个。
在数学上,找绝对最相似的那个点叫 KNN(K-Nearest Neighbors,精确最近邻),但这太慢了。 工程上,我们采用 ANN(Approximate Nearest Neighbor,近似最近邻搜索) 。 “我不要绝对的 100% 准,我只要 99% 的准,但速度要快 100 倍。”
常见的 ANN 算法(面试必考):
HNSW(分层可导航小世界图) :目前工业界最火的算法。它就像建了一个高速公路网,把距离近的点连起来。搜索时先走高速(上层),再进市区(下层),极快。Milvus、Qdrant、pgvector 都在用。
IVF(倒排文件索引) :先把空间聚成很多个类(K-Means),搜索时先找类,再在类里找点。相当于先查字典目录,再翻页。
作为架构师,选型不能只看性能,还要看 运维成本、数据持久化、生态兼容性 。目前主流的有三大阵营:
定位 :企业级分布式向量数据库(国产之光)。
原理 :存算分离架构,底层依赖 etcd、MinIO、Pulsar/Kafka。
优缺点 :能扛 十亿级 海量数据,极速。但运维极重,至少要 3-4 台机器集群部署。
适用场景 :大型政企、搜索平台、大厂。
定位 :高性能、Rust 写的轻量级向量库。
优缺点
:用 Rust 编写,性能极高,单机就能跑,Docker 一键启动。支持强过滤(比如先过滤
tenant_id
,再搜向量)。
适用场景 :中小型团队、需要多租户隔离的 SaaS 平台。
定位 :PostgreSQL 的向量扩展插件。
优缺点 : 最大的优点是“不用学新数据库” 。它直接嵌在 PG 里,你的业务数据(表 A)和向量数据(表 B)可以通过主键直接 Join。支持事务。
适用场景 :数据量在千万级以内,团队本来就是 PG 重度用户,不想引入新中间件的企业。
(另外还有 Elasticsearch 的 kNN 插件、Redis 的 Vector Similarity 等,适合在原有技术栈上拓展。)
在企业级 RAG 流程中, 如果只用纯向量搜索,往往会被业务方骂得很惨。
为什么?
因为向量搜索擅长“模糊语义”,但极度不擅长“精确匹配”。比如用户搜一个特定的产品型号
XR-2000
,或者搜员工工号
A1234
,向量搜索经常会给你返回一堆语义相近但毫无卵用的废话。
在 DAG 调度引擎里,我们会设计一个并行的“检索节点”:
分支 A(向量搜索) :去向量库里做语义召回。
分支 B(关键词搜索) :去 ES(Elasticsearch)里用 BM25 算法 做精准关键字匹配。
合并与 Rerank(重排) :把两路召回的数据合并,然后丢给一个专门的 Rerank 模型 (如 BGE-Reranker)进行交叉打分,选出最匹配的前 3 条。
面试话术 :“不要迷信纯向量搜索,在企业级落地中,一定是 BM25 + 向量混合检索 + Rerank 重排 的天下。这样既保证了模糊语义的召回,又保证了专有名词的精准命中。”
结合我们之前聊的架构,把向量库接入系统时,依然离不开传统后端的兜底策略:
Redis 缓存前置 :用户问的高频问题,向量化后生成的 Query 向量,其命中的结果直接存 Redis。下次同样的查询,直接秒回,根本不打向量库。
读写分离与分片(Sharding)
:千万级数据,可以在写库时,根据
TenantID
做分片。多租户查询时,直接路由到对应的分片,防止大客户查询拖垮全局。
降级策略 :如果向量库集群宕机(或者响应超过 500ms),DAG 引擎立刻熔断,降级去调用传统的 ES 关键字搜索,或者直接提示“知识库正在升级”,绝对不能把系统拖死。
对于咱们后端老兵来说, Embedding 只是一个把文本变成字节流的清洗步骤;向量数据库,就是一个支持特殊索引(HNSW)的 NoSQL 存储 。
不要被那些高大上的概念唬住。只要我们发挥出后端架构的优势:
用 Kafka 控制 Embedding 接口的限流;
用 DAG 编排混合检索与 Rerank;
用 Redis 兜底高并发查询;
根据业务体量合理选择 Milvus/Qdrant/pgvector 。
那么,这套企业级的 RAG 检索底座就被你稳稳拿捏了。下一步,就是把它们变成大模型最爱的“精饲料”。
面试官 :为什么不用 MySQL 存向量?
你 :MySQL 缺乏对高维向量空间索引(如 HNSW)的原生支持,千万级数据下做 KNN 精确查找会导致全表扫描,CPU 崩溃。
面试官 :ANN 搜索搜不准怎么办?
你
:调整 HNSW 的参数(如增大
ef_search
和
M
值),或者在业务层引入
混合检索(BM25 + 向量)
配合
Rerank 重排
来提升准确率。
面试官 :大模型吃不下太多文档怎么办?
你 :做好切分(Chunking),并用 Rerank 把 Top 20 压缩到 Top 3,控制 Token 数量,或者提前做摘要(Summary)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69949806/viewspace-3186356/ ,如需转载,请注明出处,否则将追究法律责任。