当前位置: 首页 > news >正文

05-RAG 核心概念与向量存储:检索增强生成原理

RAG 核心概念与向量存储:检索增强生成原理

系列文章:RAG 与 LangChain 开发实战(5/7)
阅读时间:约 20 分钟
前置知识:LangChain 记忆与文档处理:让 AI 拥有长期记忆


一、为什么需要 RAG?

1.1 大模型的固有问题

问题说明影响
知识时效性训练数据有截止时间无法获取最新信息
领域知识缺乏训练数据来自公开互联网无法覆盖专业/内部知识
幻觉问题生成看似合理但错误的信息降低可信度
数据安全敏感数据不能发送给公共模型限制应用场景

1.2 RAG 的核心价值

RAG(Retrieval-Augmented Generation,检索增强生成)

在提问之前,先从知识库检索相关信息,将检索结果作为参考上下文提供给模型,让回答更准确、更专业。

核心价值

  • ✅ 解决知识时效性 — 接入最新文档
  • ✅ 降低幻觉 — 基于事实回答
  • ✅ 无需重新训练 — 只需更新知识库
  • ✅ 数据安全 — 敏感数据留在本地

二、RAG 工作原理

2.1 整体架构

┌─────────────────────────────────────────────────────────┐ │ RAG 系统架构 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 离线流程(知识库构建) 在线流程(问答) │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 文档 → 分割 │ │ 用户提问 │ │ │ │ ↓ │ │ ↓ │ │ │ │ 向量化 │ │ 向量化 │ │ │ │ ↓ │ │ ↓ │ │ │ │ 存入向量库 │ │ 检索相似文档 │ │ │ └──────────────────┘ │ ↓ │ │ │ │ 组装 Prompt │ │ │ │ ↓ │ │ │ │ LLM 生成回答 │ │ │ └──────────────────┘ │ └─────────────────────────────────────────────────────────┘

2.2 RAG 标准流程

┌──────────────────────────────────────────────────────────┐ │ RAG 三阶段 │ ├──────────────────────────────────────────────────────────┤ │ │ │ 1. Indexing(索引) │ │ 文档 → 分割 → 向量化 → 存入向量库 │ │ │ │ 2. Retrieval(检索) │ │ 用户问题 → 向量化 → 相似度搜索 → 获取参考文档 │ │ │ │ 3. Generation(生成) │ │ 问题 + 参考文档 → Prompt → LLM → 回答 │ │ │ └──────────────────────────────────────────────────────────┘

三、向量(Vector)核心概念

3.1 什么是向量?

向量(Vector)是文本的"数学身份证":

把一段文字的语义信息转换成一串固定长度的数字列表,让计算机能"看懂"文字含义并做相似度计算。

示例

"我喜欢你" → [0.1, -0.5, 0.8, 0.3, -0.2, ...] (1536 维) "我讨厌你" → [0.2, -0.6, 0.7, 0.2, -0.3, ...] (1536 维)

3.2 文本嵌入模型

Embedding Model将文本转换为向量:

fromlangchain_community.embeddingsimportDashScopeEmbeddings emb=DashScopeEmbeddings(model="text-embedding-v4")vector=emb.embed_query("我喜欢你")print(len(vector))# 1536

3.3 向量维度

维度表示向量有多少个数字:

维度说明特点
低维 (如 3 维)情绪、动作、倾向计算快,精度低
中维 (如 768 维)平衡选择适中
高维 (如 1536 维)更多语义特征精度高,计算慢

推荐:1536 维是精度和性能的较好平衡点。

3.4 余弦相似度(Cosine Similarity)

如何判断两个向量是否相似?

余弦相似度公式

cos(θ) = (A·B) / (|A| × |B|) 其中: - A·B = 点积 = Σ(Ai × Bi) - |A| = 模长 = √(ΣAi²)

示例计算

importnumpyasnp A=np.array([0.5,0.4])B=np.array([0.7,0.6])# 点积dot_product=np.dot(A,B)# 0.5×0.7 + 0.4×0.6 = 0.59# 模长norm_A=np.linalg.norm(A)# √(0.5² + 0.4²)norm_B=np.linalg.norm(B)# √(0.7² + 0.6²)# 余弦相似度similarity=dot_product/(norm_A*norm_B)print(similarity)# 越接近 1 越相似

解读

  • 1.0— 完全相同方向
  • 0.0— 正交(无关)
  • -1.0— 完全相反

四、RAG 中的向量检索

4.1 检索流程

用户问题:"怎么减肥?" ↓ 向量化 ↓ [0.1, -0.5, 0.8, ...] ↓ 在向量库中计算余弦相似度 ↓ 找到最相似的文档: 1. "减肥就是要少吃多练" (相似度 0.92) 2. "跑步是很好的运动" (相似度 0.85) ↓ 组装 Prompt 给 LLM

4.2 LangChain 实现

fromlangchain_core.vectorstoresimportInMemoryVectorStorefromlangchain_community.embeddingsimportDashScopeEmbeddings# 初始化vector_store=InMemoryVectorStore(embedding=DashScopeEmbeddings(model="text-embedding-v4"))# 添加文档vector_store.add_texts(["减肥就是要少吃多练","清淡少油控制卡路里摄入并运动起来","跑步是很好的运动哦"])# 检索results=vector_store.similarity_search("怎么减肥?",k=2)fordocinresults:print(f"内容:{doc.page_content}")print(f"相似度:{doc.metadata.get('score','N/A')}")

五、add_texts vs add_documents

5.1 add_texts - 快速添加文本

vector_store.add_texts(["文本 1","文本 2"])

内部自动转换

defadd_texts(self,texts):documents=[]fortextintexts:doc=Document(page_content=text,metadata={})documents.append(doc)returnself.add_documents(documents)

5.2 add_documents - 添加带元数据的文档

fromlangchain_core.documentsimportDocument docs=[Document(page_content="减肥就是要少吃多练",metadata={"source":"健康知识","author":"张三"}),Document(page_content="跑步是好运动",metadata={"source":"运动指南","rating":5})]vector_store.add_documents(docs)

选择建议

  • 简单场景 →add_texts()
  • 需要元数据 →add_documents()

六、向量存储对比

类型类名存储适用场景
内存存储InMemoryVectorStore内存测试、小数据
外部存储Chroma磁盘/数据库生产、大数据

Chroma 配置示例

fromlangchain_chromaimportChroma vector_store=Chroma(collection_name="my_knowledge_base",embedding_function=DashScopeEmbeddings(model="text-embedding-v4"),persist_directory="./chroma_db"# 持久化路径)

七、RAG 提示词构建

7.1 基础模板

fromlangchain_core.promptsimportChatPromptTemplate prompt=ChatPromptTemplate.from_messages([("system","以提供的参考资料为主,简洁专业地回答用户问题。参考资料:{context}"),("user","用户提问:{input}")])

7.2 完整 RAG 链

fromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.documentsimportDocument# 检索器retriever=vector_store.as_retriever(search_kwargs={"k":2})# 文档格式化defformat_docs(docs:list[Document]):ifnotdocs:return"无相关参考资料"return"\n\n".join([doc.page_contentfordocindocs])# 构建链chain=({"input":RunnablePassthrough(),"context":retriever|format_docs}|prompt|model|StrOutputParser())# 执行response=chain.invoke("怎么减肥?")

八、关键知识点总结

8.1 RAG 核心概念

概念说明
检索(Retrieval)从知识库找到相关文档
增强(Augmented)用检索结果增强 Prompt
生成(Generation)LLM 基于增强 Prompt 生成回答

8.2 向量基础

概念说明
向量文本的数学表示(数字列表)
嵌入模型文本 → 向量
维度向量的数字个数(如 1536)
余弦相似度衡量向量相似程度(-1 到 1)

8.3 向量存储 API

方法作用
add_texts()添加文本
add_documents()添加带元数据的文档
similarity_search()相似度搜索
as_retriever()转为检索器(入链用)

九、下一步

现在我们已经理解了 RAG 的核心原理。从下一篇开始,我们将进入实战环节,完整实现一个智能客服系统:

  • 第 6 篇:离线流程 — 知识库构建(文件上传、向量化、存储)
  • 第 7 篇:在线流程 — 智能客服对话(检索、增强、生成)

系列文章导航

  1. LLM 基础与提示词工程:从 API 调用到 Prompt 优化技巧
  2. LangChain 框架入门:模型抽象与 Prompt 模板
  3. LangChain 进阶:Chain 链与输出解析器
  4. LangChain 记忆与文档处理:让 AI 拥有长期记忆
  5. RAG 核心概念与向量存储:检索增强生成原理(本文)
  6. RAG 实战 (上):知识库构建
  7. RAG 实战 (下):智能客服系统

版权声明:本文基于学习笔记整理,转载请注明出处。

http://www.cnnetsun.cn/news/1281735.html

相关文章:

  • OpenClaw安装与基本使用记录-Windows篇
  • OpenClaw 生成测试用例
  • API Key deepseek 硅基流动(有免费的配合open claw)
  • 改进人工势场法实现动态环境下的避障:Matlab编程,包含静态障碍物、动态障碍物与动态目标的完...
  • 当座椅悬架开始玩“自由度叠叠乐“:从3到5的仿真踩坑实录
  • 采用数据标签化建设高质量数据集的方法
  • 二次分配优化问题的Matlab实现:使用粒子群算法(PSO)和火焰算法(FA)的代码
  • 从原理到调优:HaplotypeCaller在肿瘤WGS中的7个实战技巧
  • SpringBoot项目实战:5分钟搞定License授权验证(附完整代码)
  • 20260314_113912_2026_SRC漏洞挖掘全攻略|从入门到变现,网安新手必看
  • SpringBoot + 腾讯地图实战:打造全能型地理位置服务平台,开箱即用!
  • 从零到一:STM32驱动LoRa模块的实战配置与数据传输解析
  • LeaguePrank:打造个性化英雄联盟展示方案的开源工具
  • 突破百度网盘限速壁垒:baidu-wangpan-parse直链解析技术全攻略
  • STM32-Modbus-RTU功能码实战:从波特率动态调整到继电器状态持久化
  • HR202L湿敏电阻的‘驯服指南‘:如何用ESP32S3的ADC实现可靠湿度检测(含温度补偿方案)
  • B站缓存视频一键转MP4:无需FFMPEG命令行的懒人工具(附下载)
  • Emacs verilog-mode实战:5分钟搞定AUTOINST模块实例化(附避坑指南)
  • MogFace-large与YOLOv11多目标检测模型对比评测与应用选型
  • MedGemma-X部署教程:Python 3.10+CUDA 0环境下的Gradio服务搭建
  • 【大模型提示词框架解析】CRISPE实战指南:从角色设定到例外处理的完整流程
  • 卡帕西:编程从写文件变成管龙虾!IDE不会凉但得换个用法
  • 前端Long类型精度丢失问题:@JsonFormat与Jackson全局配置的实战对比
  • RePKG:突破Wallpaper Engine资源处理瓶颈的全栈解决方案
  • RexUniNLU中文-base教程:NLI任务中三类标签(蕴含/矛盾/中立)Schema写法
  • ARS408毫米波雷达在域控制器上的实战配置与调试
  • RePKG:Wallpaper Engine资源处理的性能突破与技术革新
  • 深度deepin系统安装全攻略:从零开始打造国产Linux工作环境
  • 告别格式焦虑:Paperxie 如何用智能排版让毕业论文一键达标
  • 实战对比:六大LLM可视化工具如何重塑智能代理开发流程