rag第三章,向量嵌入、多模态嵌入、向量数据库、索引优化
向量嵌入就是把文本、图片等复杂数据,转成计算机能处理的固定长度数字向量,核心规律是语义越相似,向量空间距离越近,常用余弦相似度衡量,是 RAG 检索的核心。
在 RAG 中,先把知识库文档切块转向量存向量库,用户提问也转成向量,匹配最相似的文档块给大模型做参考,嵌入模型质量直接决定检索准确性。
嵌入模型从静态词嵌入(Word2Vec,无法处理一词多义),发展到动态上下文嵌入(BERT,结合语境生成向量),再到适配 RAG 的新一代模型(需支持领域适配、多粒度 / 多模态、混合检索)。
主流模型基于 BERT/Transformer 编码器,靠掩码语言模型等自监督学习训练,还会用度量 / 对比学习优化检索效果;选型先看 MTEB 排行榜,重点关注参数量、得分、向量维度、最大 Token 数,最终要结合自身业务数据做私有测试验证。
多模态嵌入就是打破文本、图片等不同数据类型的 “模态墙”,把它们映射到同一个共享向量空间,让描述内容的文字和对应图片的向量距离相近,核心是解决跨模态语义对齐的问题,靠对比学习、视觉 Transformer 这些技术实现。
CLIP 是图文多模态的经典模型,用图像 + 文本双编码器架构,通过对比学习让正确图文对的向量更接近,错误的更远,还能实现零样本识别,不用微调就能做图文检索类的分类。
当下代表性的多模态模型比如智源的 bge-visualized-m3,基于文本嵌入模型拓展了图像能力,支持百余种语言、多种检索范式,还能处理长文本,它会把图像特征转成和文本同维度的 token,再和文本 token 联合建模生成统一向量。
这类模型能单独编码文本 / 图像,也能图文联合编码,常用矩阵乘法计算余弦相似度,适合多模态知识检索、组合图像检索等场景。
向量数据库靠四层架构工作,核心是 HNSW、LSH 等索引算法实现高效检索;主流的有托管型 Pinecone、开源分布式的 Milvus、轻量的 Chroma、高性能的 Qdrant 等,新手 / 小项目用 Chroma/FAISS 就行,生产环境 / 大规模场景选 Milvus/Pinecone 更合适。
FAISS 是轻量的本地向量存储算法库,不是数据库服务,索引存本地文件,搭配 LangChain 能快速做原型开发,几行代码就能完成向量库的创建、保存、加载和相似查询。
Milvus 的核心能力是 ANN 近似最近邻检索,还支持过滤检索(向量检索 + 标量条件)、范围检索(按相似度阈值查)、多向量混合检索(多字段检索 + 结果融合)、分组检索(保证结果多样性)等增强功能;也能结合 Visualized-BGE 多模态模型,实现图文多模态检索的端到端落地。
RAG 里做索引优化,核心就是解决两个头疼的问题:要么检索准了但上下文太少,LLM 答得干巴巴;要么上下文够了但检索又不准,还慢。这节主要讲了两个超实用的优化方法,都是基于 LlamaIndex 来做的。
第一个是句子窗口检索,这个方法特别巧,就是检索的时候用小的句子块保证精准,给 LLM 生成答案的时候再扩展成大的上下文窗口。
第二个是结构化索引,适合知识库特别大的情况,比如几百个 PDF 的场景。传统做法全库搜又慢又容易搜到无关内容,这个方法就是给每个文本块加元数据,比如文件名、章节、年份这些标签,检索时先按元数据过滤出相关子集,再在子集里做向量搜索,范围小了自然又快又准。如果是多数据源比如多 sheet 的 Excel,还能用来递归检索:先建个顶层的摘要索引做路由,先匹配到目标数据源,再进去精准查;也能搞两个索引,一个摘要索引路由,一个内容索引加元数据过滤,还能避开原生递归检索的代码执行安全坑。
2 条踩坑记录
- 忽略嵌入模型的最大 Token 数限制,文档分块尺寸超出阈值,模型自动截断内容导致核心信息丢失,检索和生成效果大幅下降。
- 使用 bge-visualized-m3 时,忽略模型文本处理的 token 上限,输入超长文本做图文联合编码,模型截断文本后丢失核心信息,让生成的向量无法准确匹配对应图像。
- 用 LlamaIndex 做向量存储开发课后作业,加载本地 JSON 格式的存储数据做相似性搜索时,直接用自定义的嵌入模型加载,未匹配 LlamaIndex 存储数据时使用的原嵌入模型,导致向量维度 / 语义编码不一致,搜索结果完全不相关,甚至报向量维度不匹配的错误。
- 做 Milvus 多模态检索实践作业时,编写代码连接 Milvus 服务后直接创建 Collection 并插入向量数据,未提前为向量字段创建合适的索引,导致海量向量检索时直接触发暴力搜索,查询延迟极高,甚至出现服务超时的情况。
- 做句子窗口检索的实操作业时,光用 SentenceWindowNodeParser 切了句子建了索引,构建查询引擎的时候忘了加 MetadataReplacementPostProcessor 这个后处理器,结果检索出来的就只是孤零零的句子,没扩展上下文,直接传给 LLM 后,生成的答案缺东少西,逻辑也不连贯,完全没达到优化的效果。
更多推荐

所有评论(0)