检索增强生成(RAG):从理论到 LangChain 实践 [译]

检索增强生成(RAG):从理论到 LangChain 实践 [译]

💡 原文中文,约5600字,阅读约需14分钟。
📝

内容提要

本文介绍检索增强生成(RAG):将LLM的参数化知识与外部向量库中的非参数化知识相结合,以减少幻觉。流程包括检索、增强和生成。作者使用LangChain、OpenAI和Weaviate进行演示:加载并分块拜登国情咨文,嵌入后存入向量库,检索相关片段填入提示模板,再由GPT-3.5生成简洁回答。

🔎

延伸解读

RAG 与微调:互补而非替代

文章指出,微调虽能让模型适应特定领域,但计算资源消耗大、成本高且不够灵活;而 RAG 通过外挂可更新的知识源,能快速适应信息变化。作者强调两者都很关键,并非互相取代。读者应理解 RAG 更适合需要频繁更新知识的场景,而微调可能更适合改变模型行为或风格。

分块策略影响检索质量

在实践部分,作者使用 CharacterTextSplitter 将文档切分为约 500 字符的块,并设置 50 字符的重叠以确保连贯性。这种简单的分块方式可能影响检索的粒度:块太大可能引入无关信息,块太小可能丢失上下文。读者在实现 RAG 时需根据文档类型调整块大小和重叠量,以平衡检索精度与上下文完整性。

提示模板约束生成行为

示例中的提示模板明确要求模型仅使用检索到的上下文回答,不知道就说不知道,并限制回答为三句话。这种设计能减少模型编造答案的风险,同时保持回答简洁。读者可以借鉴这种思路,通过提示词明确边界和格式,但需注意模板中的指令需与任务目标匹配,避免过度限制导致有用信息被遗漏。

❓

Q&A

RAG 是什么?它主要解决大语言模型的什么问题?

RAG(检索增强生成)是一种为大语言模型提供外部知识源信息的技术,旨在减少模型产生误导性信息(幻觉)的可能,同时生成更精确、更贴合上下文的答案。

RAG 的工作流程包含哪几个步骤?

RAG 工作流程包含三个步骤:检索(利用用户查询从外部知识源获取相关信息)、增强(将查询和检索到的额外信息嵌入预设提示模板)、生成(将增强后的提示输入大语言模型生成输出)。

RAG 和微调(fine-tuning)有什么区别?为什么说 RAG 更灵活?

微调需要耗费大量计算资源、成本高昂且需要丰富技术知识,在快速适应信息变化方面不灵活;而 RAG 将事实性知识存储在易于访问和及时更新的外部知识源中,因此更灵活。文章指出两种方法都很关键。

在 LangChain 实现 RAG 时,如何准备向量数据库?

准备向量数据库需三步:1)收集并加载数据(如使用 TextLoader 加载拜登国情咨文);2)对文档进行分块(如使用 CharacterTextSplitter,设置 chunk_size 约 500、chunk_overlap 为 50);3)对分块内容进行嵌入并存储(使用 OpenAI 嵌入模型和 Weaviate 向量数据库,通过 .from_documents() 自动填充)。

RAG 中的“参数化知识”和“非参数化知识”分别指什么?

参数化知识是模型在训练过程中学习得到的、隐式地储存在神经网络权重中的知识;非参数化知识是存储在外部知识源(如向量数据库)中的知识。

在 LangChain 中如何将检索器、提示模板和 LLM 组合成 RAG 链?

使用 LangChain 的 Runnable 接口组合:rag_chain = ({"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser())。其中 retriever 是向量数据库的检索器,prompt 是包含上下文和问题的提示模板,llm 是语言模型(如 ChatOpenAI),最后通过 StrOutputParser 解析输出。

🏷️

标签

➡️

继续阅读