Web 应用中 RAG 的快速入门指南
你正在为 Web 应用构建一个由 LLM 驱动的功能——可能是支持聊天机器人、文档搜索工具或产品助手。模型本身很强大,但它对你的数据一无所知。你可以对其进行微调,但这成本高昂、更新缓慢,而且对大多数使用场景来说过于复杂。
检索增强生成(Retrieval-Augmented Generation,RAG)能够优雅地解决这个问题。它是一种广泛使用的架构模式,用于将 LLM 的响应基于你自己的内容,并且能够自然地融入现代 Web 技术栈。
核心要点
- RAG 通过在请求时检索相关内容,将 LLM 响应基于你自己的数据,从而消除了大多数 Web 应用场景中重新训练或微调的需求。
- 典型的 RAG 流程包括:摄取和分块文档、生成嵌入向量、将其存储在向量数据库中、检索匹配的上下文,并将其传递给 LLM 进行生成。
- RAG 可以舒适地存在于标准后端架构中——前端发送查询,服务器处理检索和 LLM 调用,响应以流式方式返回到 UI。
- 与微调相比,RAG 更快交付、维护成本更低,并且当内容频繁变化或属于专有内容时更容易更新。
什么是 RAG,为什么它对 Web 应用很重要?
RAG 结合了两个要素:从知识源获取相关内容的检索系统,以及使用该内容生成响应的语言模型。
核心思想很简单:不是仅仅依赖模型在训练期间学到的内容,而是在请求时为其提供相关上下文。模型根据你提供的内容进行回答——你的文档、你的数据、你的领域知识。
这对 Web 应用很重要,因为:
- 你的数据会变化。 产品目录、支持文章和政策不断更新。RAG 让你无需重新训练即可反映这些变化。
- 你的数据是私有的。 模型从未在你的内部知识库上进行训练。RAG 是将其引入的方式。
- 用户期望有来源的答案。 RAG 使得在响应旁边返回引用变得简单直接,从而建立信任。
RAG 流程在 Web 应用中的工作原理
为 Web 应用构建 RAG 流程遵循一个通用模式,无论你使用什么工具。
1. 摄取和分块文档 加载你的内容——PDF、Markdown 文件、数据库记录、API 响应——并将其拆分为较小的块。块大小很重要:太大会检索到噪音,太小会丢失上下文。一个常见的起点是 512-1,024 个 token,块之间有一些重叠。
2. 生成嵌入向量 使用嵌入模型将每个块转换为向量嵌入。这种数值表示捕获语义含义,因此”取消我的订阅”和”如何停止我的计划”在向量空间中最终会彼此接近。嵌入向量使得在检索期间能够高效地定位语义相似的文本。
3. 存储在向量数据库中 嵌入向量存储在向量存储中——选项包括 Pinecone、Weaviate、Chroma,或者如果你已经在使用 Postgres,可以选择 pgvector。在查询时,用户的输入被嵌入并使用相似性搜索与存储的向量进行匹配。
4. 检索和组装上下文 检索匹配度最高的块并将其组装成上下文块。更复杂的流程会在这里添加重排序步骤——第二个模型在将检索到的块传递给 LLM 之前对其相关性进行评分。当你的内容包含结构化标识符或精确术语时,混合搜索(结合关键词和语义检索)也值得考虑。
5. 生成响应 组装好的上下文连同原始查询一起在提示中传递给 LLM。模型生成基于你检索内容的响应——而不是基于通用训练数据。
Discover how at OpenReplay.com.
现代 Web 应用中的 RAG 架构
现代 Web 应用中的 RAG 架构通常位于后端。你的前端向 API 路由发送查询,路由处理检索并调用 LLM,响应(通常是流式的)返回到 UI。
你不需要从头开始构建自定义编排栈。LangChain 和 LlamaIndex 等框架可以帮助处理检索流程、文档处理和编排。许多 AI SDK 和托管 API 现在直接捆绑了检索功能,因此集成界面可以非常简洁。
RAG vs. 微调:实际区别
微调调整模型权重以改变模型的行为方式。RAG 改变模型在推理时看到的信息。对于大多数 Web 应用场景——特别是内容频繁更新或数据是专有的情况——RAG 更快交付、维护成本更低且更容易更新。
两者并不互斥,但 RAG 通常是正确的第一步。
结论
Web 应用中的 RAG 并不像听起来那么神秘。它是检索加生成,连接到你现有的请求生命周期中。一旦你理解了流程——摄取、嵌入、存储、检索、生成——实现选择就变得简单明了。在考虑微调之前先从 RAG 开始,你会发现在 Web 应用中运行一个基于事实的、可维护的 AI 功能比你预期的要快得多。
常见问题
没有通用的数字,但检索 3 到 5 个块是一个常见的起点。太少可能导致模型缺乏足够的上下文。太多则可能超出上下文窗口或用噪音稀释相关性。针对你的具体内容进行实验并衡量答案质量,以找到正确的平衡点。
可以。RAG 与模型无关。你可以将本地嵌入模型与开源 LLM(如 Llama 或 Mistral)配对使用。检索流程保持不变。主要权衡是自托管模型需要更多基础设施来运行,但它们让你完全控制数据隐私和成本。
最常见的方法是设置一个摄取流程,重新分块和重新嵌入更新的文档,然后将新向量更新插入到你的存储中。你可以按计划触发此操作,或通过 webhook 响应内容变化。删除过时的向量同样重要,以避免提供过时的信息。
纯向量搜索使用嵌入向量基于语义相似性将查询与文档匹配。混合搜索将此与传统关键词匹配相结合。当你的内容包含产品代码或错误编号等精确标识符时,这很有用,因为单独的语义搜索可能会遗漏这些内容。许多现代向量数据库和检索平台现在都支持混合搜索。
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.