AI
· 62 min read
向量库
嵌入模型:nomic-embed-text
Qdrant是我们前期调研和测试时使用的方案。PGVector是我们项目中最终选用的方案。
- 它的最大优势是:它是一个PostgreSQL的扩展插件,而不是一个独立的数据库。这意味着我们可以直接在我们现有的业务数据库(我们用的就是PostgreSQL)上增加向量存储和检索的能力,不需要引入和维护一套全新的数据库系统。这对于我们团队来说,大大降低了运维成本和技术栈的复杂性。
- 功能上:它支持常见的相似度计算方式,比如余弦相似度、L2距离等。我们通过给存储文本块(chunks)的表增加一个
vector类型的列,就把文本的向量 embedding 存进去了。查询的时候,直接在SQL里使用类似于<->这样的操作符,就可以进行向量的相似度查询,并且可以和WHERE、JOIN等标准的SQL语句结合使用。比如,我们可以很方便地查询“某个特定业务线下,和用户问题最相似的5个知识点”,业务线筛选用WHERE,相似度查询用向量操作符,非常灵活。 - 关于索引:为了加速检索,PGVector支持HNSW(分层可导航小世界图)和IVFFlat(倒排文件)索引。我们项目中后期数据量上来之后,就使用了HNSW索引,检索速度得到了几个数量级的提升。
HNSW的全称是 Hierarchical Navigable Small World,中文翻译过来是分层可导航小世界图。它是一种用于在高维空间中进行**近似最近邻(ANN)**搜索的算法和数据结构。
简单来说,它的目标不是100%精确地找到“最”相似的那个向量,而是在牺牲极小的精度的情况下,换取搜索速度成百上千倍的提升。这对于需要实时响应的AI应用来说是至关重要的。
RAG 的核心逻辑:
- 用户问题 → 转成 embedding
- 在向量数据库里检索最相似的文档片段
- 将这些文档作为上下文 prompt 给 LLM,让模型基于检索结果生成答案
具体实现
- Embedding
- 使用 OpenAI Embedding 或本地 Sentence-BERT,将规则文档、历史案例、风控知识库中的条目都转成向量。
- 存入 PGVector,建立索引(cosine similarity 或 inner product)。
- 检索流程
- 用户输入问题 → 转 embedding → PGVector 搜索 top-K(比如 top-5)
- 对检索结果做简单过滤:去掉低相似度或过时条目,保证上下文质量。
- Prompt 构建
- 将检索到的 top-K 文档片段拼成上下文 prompt
- 加上问题 → 输入 LLM(例如 GPT-3.5/4)生成答案
- 结果后处理
- 对生成内容做规则校验(关键字段、数值合法性)
- 如果生成答案与检索结果明显冲突,触发 fallback 或重生成