新闻详情

新闻详情

首页 / 资讯中心 / 详情

RAG知识梳理(2)

发布时间:2026/9/29 9:56:49来源:尧图网络
RAG知识梳理(2)
作者没有四次元口袋的蓝胖日期2026-09-28标签RAG, FAISS, 向量检索, AI应用开发RAG知识梳理(2)上篇我们学习了文档切分策略和 Embedding 向量检索的原理知道了如何把文本变成向量、如何计算相似度。这篇继续往下走——把向量存进向量数据库然后用 LangChain 把检索和大模型串起来实现一个完整的基于文档的问答系统。核心掌握FAISS 和 Chroma 的使用与对比、RAG 完整流程检索→拼接→LLM回答、LCEL 链式调用。一、向量数据库FAISS / Chroma1.1 向量数据库是做什么的把文档块的向量全部存起来需要检索时快速找到最相似的 Top-K 个。这本质上是一个最近邻搜索ANN问题。存入[{text: Spring IoC..., vector: [0.023, ...]}, {text: Spring AOP..., vector: [0.019, ...]}, {text: 天气不错..., vector: [-0.056, ...]}, ...] 查询什么是控制反转 → [0.025, -0.040, ...] → 找到最相似的Spring IoC相似度0.981.2 FAISSFacebook AI Similarity SearchFAISS 是 Meta 开源的向量检索库纯内存操作速度极快适合中小规模数据fromlangchain.vectorstoresimportFAISSfromlangchain.embeddingsimportOpenAIEmbeddings embeddingsOpenAIEmbeddings(modeltext-embedding-3-small)# 从文档创建向量库 fromlangchain.schemaimportDocument docs[Document(page_contentSpring IoC控制反转是Spring框架的核心对象的创建和依赖关系由容器管理而非手动new对象。),Document(page_contentSpring AOP面向切面编程用于将日志、事务等横切关注点从业务代码中分离通过代理模式实现。),Document(page_contentSpring Boot通过自动配置和起步依赖大幅简化了Spring项目的初始搭建和开发配置。),Document(page_contentHashMap在JDK1.8中使用数组链表红黑树实现当链表长度超过8时转为红黑树。),Document(page_contentConcurrentHashMap通过CASsynchronized实现线程安全锁粒度为桶bucket级别。),Document(page_contentJVM内存分为堆、方法区、虚拟机栈、本地方法栈、程序计数器等区域。),]# 一行代码完成文档切块→向量化→存入FAISSvectorstoreFAISS.from_documents(docs,embeddings)# 检索 # 相似度搜索返回最相似的Document对象resultsvectorstore.similarity_search(Spring的核心思想是什么,k2)fordocinresults:print(doc.page_content)# 输出Spring IoC... 和 Spring AOP... 的相关内容# 相似度搜索返回分数results_with_scorevectorstore.similarity_search_with_score(线程安全的数据结构,k2)fordoc,scoreinresults_with_score:print(f[相似度:{score:.4f}]{doc.page_content[:50]}...)# 持久化保存 # 保存到磁盘下次启动不用重新向量化vectorstore.save_local(./faiss_index)# 从磁盘加载vectorstore_loadedFAISS.load_local(./faiss_index,embeddings)1.3 Chroma轻量级向量数据库Chroma 是一个开箱即用的向量数据库自带持久化和元数据过滤fromlangchain.vectorstoresimportChroma# 创建自动持久化到指定目录vectorstoreChroma.from_documents(documentsdocs,embeddingembeddings,persist_directory./chroma_db# 数据持久化目录)# 检索resultsvectorstore.similarity_search(什么是AOP,k2)# 带元数据过滤的检索# 给文档添加元数据docs_with_meta[Document(page_contentSpring IoC...,metadata{source:spring_ch1,topic:spring}),Document(page_contentHashMap...,metadata{source:java_ch3,topic:collection}),# ...]vectorstoreChroma.from_documents(docs_with_meta,embeddings,persist_directory./chroma_db)# 只检索topic为spring的文档resultsvectorstore.similarity_search(核心思想,k2,filter{topic:spring}# 元数据过滤)# 持久化vectorstore.persist()1.4 FAISS vs Chroma对比项FAISSChroma定位高性能向量检索库轻量级向量数据库持久化需手动save/load自动持久化元数据过滤不支持需自行实现内置支持性能极高C底层较好适用场景大规模数据、高性能场景快速原型、中小项目部署方式嵌入式嵌入式/独立服务1.5 面试要点向量数据库是 RAG 的关键组件。面试时说清楚 FAISS高性能纯检索和 Chroma带持久化和过滤的数据库的定位差异即可。核心功能就两个存向量和按相似度查向量。二、AI基于文档回答完整流程2.1 检索→拼接→回答 的代码实现把前面几个模块串起来就是 RAG 的核心流程fromlangchain.chat_modelsimportChatOpenAIfromlangchain.promptsimportChatPromptTemplatefromlangchain.schemaimportStrOutputParserfromlangchain.schema.runnableimportRunnablePassthrough# 1. 假设已经有向量库前面创建的# vectorstore FAISS.from_documents(docs, embeddings)retrievervectorstore.as_retriever(search_kwargs{k:3})# 2. 构建RAG Prompt模板rag_promptChatPromptTemplate.from_messages([(system,你是一个专业的Java面试辅导助手。根据以下参考资料回答问题。 规则 1. 优先使用参考资料中的信息回答 2. 如果参考资料不足以回答可以补充你的知识但要说明哪些来自参考资料 3. 回答要简洁准确控制在200字以内 参考资料 {context}),(human,{question})])# 3. 辅助函数格式化检索结果defformat_docs(docs):把多个Document拼接成一个字符串return\n\n---\n\n.join(doc.page_contentfordocindocs)# 4. 用LCEL构建RAG链rag_chain({context:retriever|format_docs,# 检索 → 格式化question:RunnablePassthrough()# 问题原样传递}|rag_prompt# 拼接Prompt|ChatOpenAI(modelgpt-4,temperature0)# 调用LLMtemperature0保证确定性|StrOutputParser()# 提取文本)# 5. 提问answerrag_chain.invoke(Spring IoC和AOP分别解决什么问题)print(answer)# Spring IoC控制反转解决的是对象创建和依赖管理的问题...# Spring AOP面向切面编程解决的是横切关注点如日志、事务的复用和解耦问题...2.2 完整执行流程图用户提问Spring IoC和AOP分别解决什么问题 │ ▼ ┌─────────────────────────────────────────────┐ │ Retriever检索器 │ │ ① 问题 → Embedding向量 │ │ ② 在FAISS中搜索最相似的Top-3文档块 │ │ ③ 返回3个Document对象 │ └─────────────────────────────────────────────┘ │ [Document(IoC...), Document(AOP...), Document(Boot...)] ▼ ┌─────────────────────────────────────────────┐ │ format_docs格式化 │ │ 把3个Document的文本拼接成一个大字符串 │ └─────────────────────────────────────────────┘ │ Spring IoC... \n\n---\n\n Spring AOP... \n\n---\n\n Spring Boot... ▼ ┌─────────────────────────────────────────────┐ │ ChatPromptTemplatePrompt拼接 │ │ System: 根据参考资料回答... 参考资料:{context} │ │ Human: {question} │ └─────────────────────────────────────────────┘ │ Messages列表 ▼ ┌─────────────────────────────────────────────┐ │ ChatOpenAI大模型 │ │ 基于参考资料 问题 → 生成回答 │ └─────────────────────────────────────────────┘ │ AIMessage ▼ ┌─────────────────────────────────────────────┐ │ StrOutputParser输出解析 │ │ 提取文本内容 │ └─────────────────────────────────────────────┘ │ ▼ 最终回答文本2.3 LCEL 链式调用解析上面的rag_chain使用了 LangChain 的LCELLangChain Expression Language语法每一行的含义rag_chain(# 第一步构建输入字典{context:retriever|format_docs,# 问题 → 检索 → 格式化文本question:RunnablePassthrough()# 问题原样传递}|rag_prompt# 第二步拼接Prompt|ChatOpenAI(modelgpt-4,temperature0)# 第三步调用LLM|StrOutputParser()# 第四步提取文本)|管道符类似 Unix 管道左边模块的输出自动作为右边模块的输入。这种链式写法让数据流清晰可读也方便替换和调试单个模块。2.4 Prompt 设计要点RAG 的 Prompt 设计有几个关键原则明确角色和规则告诉模型基于参考资料回答避免它凭空编造预留兜底策略加入资料不足时说明的规则防止模型硬答控制输出长度指定字数限制避免回答冗长分隔参考资料用---分隔多个文档块帮助模型区分不同来源️ 思维导图速览向量库与文档问答 ├── 向量数据库 │ ├── 核心功能存向量 按相似度查Top-K │ ├── FAISSMeta开源 │ │ ├── 高性能纯检索C底层 │ │ ├── 手动save/load持久化 │ │ ├── 不支持元数据过滤 │ │ └── 适合大规模数据、高性能场景 │ ├── Chroma轻量级 │ │ ├── 自动持久化 │ │ ├── 内置元数据过滤 │ │ ├── 开箱即用 │ │ └── 适合快速原型、中小项目 │ └── 选择依据性能 vs 便捷性 │ ├── 完整RAG流程LCEL实现 │ ├── ① Retriever问题→向量→检索Top-K文档 │ ├── ② format_docs拼接检索结果为字符串 │ ├── ③ PromptTemplate拼接系统指令参考资料用户问题 │ ├── ④ ChatModelLLM基于资料生成回答 │ └── ⑤ OutputParser提取文本输出 │ ├── LCEL语法要点 │ ├── | 管道符串联模块数据流清晰 │ ├── RunnablePassthrough原样传递输入 │ └── 每个模块可独立替换调试 │ ├── Prompt设计要点 │ ├── 明确角色和规则基于资料回答 │ ├── 预留兜底策略资料不足时说明 │ ├── 控制输出长度 │ └── 分隔参考资料用---区分不同块 │ └── 面试要点 ├── FAISS vs Chroma定位差异 ├── RAG完整流程5个步骤 └── LCEL链式调用的理解 写在最后学习建议重点理解流程而非背代码RAG 的核心流程是固定的——检索→拼接→回答理解每一步的作用比记住代码更重要。面试时能画出流程图、说清每步做什么就足够了。LCEL 是 LangChain 的核心语法|管道符的链式写法贯穿整个 LangChain 框架花点时间理解它的设计思想后面学到 Agent、Chain 等模块时会轻松很多。向量数据库选型建议学习阶段用 FAISS简单高效实际项目推荐 Chroma自带持久化和过滤省心。如果数据量特别大百万级以上可以考虑 Milvus 等专业向量数据库。和上篇配合看上篇的文档切分Embedding 是数据准备阶段这篇的向量库问答流程是应用阶段两篇合在一起就是 RAG 基础的全部知识。下一篇会讲解完整项目实战和进阶优化。面试高频问题速答QFAISS 和 Chroma 有什么区别怎么选FAISS 是 Meta 开源的高性能向量检索库纯内存操作速度极快适合大规模数据和高性能场景但不自带持久化和元数据过滤。Chroma 是轻量级向量数据库自带持久化和元数据过滤功能开箱即用适合快速原型和中小规模项目。面试场景说清定位差异即可。QRAG 的完整流程是什么请描述每一步。① Retriever把用户问题通过 Embedding 转为向量在向量数据库中检索最相似的 Top-K 个文档块② format_docs将检索到的多个 Document 的文本内容拼接为一个字符串③ PromptTemplate将系统指令 参考资料 用户问题拼接成完整的 Prompt④ ChatModel大模型基于参考资料和问题生成回答⑤ OutputParser提取 LLM 输出的文本内容作为最终答案。QLCEL 的|管道符是什么意思类似 Unix 管道的思想|用于串联 LangChain 中的各个模块左边模块的输出自动作为右边模块的输入。这种链式写法让数据流清晰可读每个模块可以独立替换和调试也方便在中间插入自定义的处理逻辑。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

详解系统路径与文件名长度限制:从Windows 260字符到Linux 4096字节的破解之道 2026/9/29 11:03:54

详解系统路径与文件名长度限制:从Windows 260字符到Linux 4096字节的破解之道

1. 内容整体设计与思路拆解1.1 为什么这个老问题今天还在坑人先说个真实场景。你辛辛苦苦配好了Python环境,结果pip install一个依赖包时直接报错“ERROR: Could not install packages due to an OSError: [Errno 22] Invalid argument”。你以为是网络问题、源的问…

阅读更多 →
从Claude Code到Pi:AI编程助手成本与场景适配实测 2026/9/29 11:03:54

从Claude Code到Pi:AI编程助手成本与场景适配实测

1. 从Claude Code到Pi:这个切换话题为什么突然火了1.1 一个真实的周末项目账单我有个做独立开发的朋友,上个月用Claude Code写一个自动化脚本,一个周末下来API账单跑了差不多40多美元。他当时就愣了一下——因为他那个项目本身商业价值还没验…

阅读更多 →
2011款iMac装Win10蓝屏:根源在Bootcamp旧显卡驱动,换新即可解决 2026/9/29 11:03:54

2011款iMac装Win10蓝屏:根源在Bootcamp旧显卡驱动,换新即可解决

简介:针对二零一一年中发布的苹果二十七英寸一体机,这份压缩包提供了来自芯片官网的较新显卡驱动,比原厂引导程序自带的二零一三年版驱动更新,可以有效解决播放视频时偶发蓝屏的问题。资源面向需要在全新系统下稳定使用该机型显示…

阅读更多 →
从socket到HTTP服务器:C语言网络编程实战指南 2026/9/29 11:03:53

从socket到HTTP服务器:C语言网络编程实战指南

简介:这是一份面向1–3年经验C语言开发者的网络编程实战指南,聚焦TCP与HTTP协议的底层实现,帮助读者从零构建聊天室和轻量HTTP服务器。资源为单文件PDF(1.89MB),共35页,支持目录跳转与左侧大纲导…

阅读更多 →
高并发轮询场景下UDP与TCP性能对比:48台以太网温湿度记录仪基准测试 2026/9/29 11:03:46

高并发轮询场景下UDP与TCP性能对比:48台以太网温湿度记录仪基准测试

以太网温湿度记录仪这个品类,做过的朋友都知道,硬件本身不难,难的是"多台设备、高频轮询、长时间稳定"这三件事叠在一起。我手上这个项目,现场有 48 台以太网温湿度记录仪挂在同一台采集服务器下,要求 1 秒轮…

阅读更多 →
2026年AI编程工具全景指南:Cursor与国产平替怎么选 2026/9/29 11:03:46

2026年AI编程工具全景指南:Cursor与国产平替怎么选

1. 先给结论:2026年还盯着Cursor一家看,已经不够了2026年再聊AI编程工具,画面和两年前完全不一样了。那时候大家的问题集中在“要不要用”,现在的问题已经变成“用哪个、怎么组合、怎么迁移、怎么控成本”。我身边不少团队&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉