RAG原理-文本向量化
RAG 原理文本向量化Embedding文本向量化的核心是把人类语言映射成计算机可比较的数值向量。语义越接近的文本在向量空间中的距离通常越近。1. 为什么 RAG 需要文本向量化计算机无法直接判断两段自然语言在“语义上是否相似”。Embedding 模型会把词、句子或文档片段转换为固定维度的向量例如什么是 RAG - [0.0241, -0.3187, 0.1056, ...]向量化后就可以通过余弦相似度、点积或欧氏距离计算文本之间的相关性从而找出与用户问题最相关的知识片段。2. 文本向量化的本质文本向量化完成了从“符号空间”到“向量空间”的映射自然语言文本 - Embedding 模型 - 固定维度的稠密向量好的文本向量应尽量满足语义保持意思相近的文本向量更接近长度固定不同长度的文本都映射到相同维度可计算能够使用距离或相似度函数进行比较可检索可以建立向量索引快速完成 Top-K 召回。例如“如何重置密码”和“忘记密码怎么办”虽然用词不同但语义接近因此它们的向量也应该靠得较近。3. 常见向量化方式方法向量特点优点局限One-Hot高维、稀疏简单直观无法表达词义和词间关系词袋模型BoW统计词频、稀疏实现简单忽略词序与上下文TF-IDF稀疏、强调关键词适合关键词检索难以表达深层语义Word2Vec低维、稠密能表达词语相似性同一个词通常只有一个静态向量上下文 Embedding高维、稠密能理解上下文和句子语义计算与存储成本更高在现代 RAG 系统中通常使用句子级或段落级的稠密 Embedding实际工程中也常把稠密检索与关键词检索组合成混合检索。4. 文本向量化在 RAG 中的位置RAG 包含“离线建库”和“在线查询”两条链路。4.1 离线建库原始文档 - 文档解析与清洗 - 文本分块Chunk - Embedding 模型编码 - 向量 原文 Metadata - 写入向量数据库4.2 在线查询用户问题 - 使用同一 Embedding 模型编码 - 在向量数据库中计算相似度 - 召回 Top-K 文本片段 - 将问题与检索结果组成 Prompt - 交给大模型生成答案关键约束建库和查询必须使用同一个 Embedding 模型并保持向量维度、归一化方式和距离度量一致。否则两个向量不在同一语义空间中检索结果将失去意义甚至会直接出现维度不匹配错误。5. 如何计算向量相似度5.1 余弦相似度余弦相似度关注两个向量的方向而不是绝对长度是文本语义检索中最常见的度量方式cosine⁡(A,B)A⋅B∥A∥ ∥B∥ \operatorname{cosine}(A,B)\frac{A\cdot B}{\|A\|\,\|B\|}cosine(A,B)∥A∥∥B∥A⋅B​结果越接近1方向越一致通常表示语义越相似结果越接近0相关性通常越弱是否出现负值取决于具体 Embedding 模型和向量分布。5.2 点积与欧氏距离点积Inner Product值越大通常越相似但会受到向量模长影响欧氏距离L2 Distance值越小表示距离越近对向量做 L2 归一化后点积、余弦相似度与欧氏距离之间存在确定的换算关系。选择哪种度量方式应以 Embedding 模型说明和向量数据库的索引配置为准。6. 余弦相似度的 Python 实现下面的实现不依赖第三方库并对维度和零向量进行了检查frommathimportsqrtfromtypingimportSequencedefcosine_similarity(vector_a:Sequence[float],vector_b:Sequence[float],)-float:计算两个等长非零向量的余弦相似度。iflen(vector_a)!len(vector_b):raiseValueError(两个向量的维度必须一致)dot_productsum(a*bfora,binzip(vector_a,vector_b))norm_asqrt(sum(a*aforainvector_a))norm_bsqrt(sum(b*bforbinvector_b))ifnorm_a0.0ornorm_b0.0:raiseValueError(余弦相似度不能用于零向量)returndot_product/(norm_a*norm_b)query_vector[0.2,0.1,0.7]document_vector[0.3,0.2,0.6]scorecosine_similarity(query_vector,document_vector)print(f相似度{score:.4f})7. RAG 向量化代码结构下面展示的是框架无关的核心流程。实际项目中只需把embedding_model和vector_db替换成选定模型与数据库的客户端即可。# 离线阶段文档分块并写入向量数据库forchunk_id,chunk_textinenumerate(document_chunks):chunk_vectorembedding_model.encode(chunk_text,normalizeTrue,)vector_db.upsert(item_idstr(chunk_id),vectorchunk_vector,metadata{text:chunk_text,source:document_source,chunk_id:chunk_id,},)# 在线阶段向量化问题并召回最相关的文本块query_vectorembedding_model.encode(user_question,normalizeTrue,)resultsvector_db.search(vectorquery_vector,top_k3,)context\n\n.join(item.metadata[text]foriteminresults)8. Embedding 模型选型要关注什么语言与领域是否适合中文、代码、法律、医疗等目标场景向量维度维度越高并不必然越好同时会增加存储和检索成本最大输入长度超长文本可能被截断因此需要合理设置 Chunk 大小检索任务类型查询和文档是否需要不同的前缀或编码方式归一化要求确认模型输出是否需要 L2 归一化性能与成本综合评估批处理吞吐、延迟、显存占用和 API 费用真实数据评测最终应使用业务查询集通过 RecallK、MRR、nDCG 等指标验证效果。9. 常见问题与避坑9.1 建库和查询使用了不同模型即使向量维度恰好相同不同模型的语义空间通常也不兼容。更换模型后应重新生成全部文档向量并重建索引。9.2 文本块太大或太小太大主题混杂向量语义被稀释还可能超过模型输入上限太小上下文不足召回内容难以支撑回答建议根据文档结构切分并保留适量重叠区域。9.3 只保存向量不保存原文和元数据向量负责检索真正交给大模型的是原始文本。因此应同时保存id vector text source chunk_id page/section version这样才能完成上下文拼接、来源引用、权限过滤和数据更新。9.4 只看相似度不做效果评估相似度高不代表一定能回答问题。生产系统通常还需要设置 Top-K、相似度阈值、Metadata 过滤、关键词混合召回和 Rerank并通过真实问答集持续评估。10. 总结文本向量化是 RAG 检索链路的桥梁它把自然语言转换为可计算、可索引、可比较的向量使系统能够按语义而不只是按关键词查找内容。可以记住下面这条主线文本分块 - 向量化 - 向量存储 - 问题向量化 - 相似度检索 - Top-K 上下文 - 大模型生成其中最容易影响最终效果的因素是Embedding 模型、Chunk 策略、距离度量、Top-K 与重排策略。只有整条链路保持一致并经过业务数据评测RAG 的检索质量才会稳定。