从零到一构建你的第一个检索增强生成应用

简介: 本文将带你深入了解检索增强生成(RAG)技术的核心思想,解决大型语言模型(LLM)固有的知识局限和“幻觉”问题。我们将一步步拆解RAG的工作流程,从文档处理到向量检索,并提供一份基于Python的简易代码实现,助你快速上手,构建你的第一个RAG应用。

RAG革命:从零到一构建你的第一个检索增强生成应用


一、为什么我们需要RAG?大型语言模型的“记忆”困境

大型语言模型(LLM),如GPT-4,虽然在语言理解和生成方面表现惊艳,但它们并非无所不知。其知识受限于训练数据的截止日期,对于新近发生的事件或特定领域的私有知识一无所知。更重要的是,LLM有时会产生“幻akj觉”(Hallucination)——自信地编造出看似合理但完全错误的信息。

这两种缺陷极大地限制了LLM在企业级应用中的可靠性。我们如何才能让模型既能利用其强大的推理能力,又能基于最新、准确、可信的知识来回答问题呢?

检索增强生成(Retrieval-Augmented Generation, RAG) 应运而生,它通过一种“开卷考试”的模式,完美地解决了这个问题。

核心思想:在回答问题前,先从外部知识库(如公司文档、产品手册、数据库等)中检索出最相关的信息,然后将这些信息连同用户的问题一起“喂”给LLM,让它基于给定的材料进行回答。


二、RAG的工作流程:一场精心编排的“开卷考试”

一个完整的RAG系统主要包含两个阶段:索引构建(离线)检索生成(在线)

阶段一:索引构建 (Indexing) - 为知识库“划重点”

这个阶段的目标是将你的原始文档转换成一个可被快速检索的格式,通常是向量索引。

  1. 加载 (Load):首先,我们需要加载各种来源的文档。这些文档可以是PDF、TXT、Markdown、HTML网页,甚至是数据库中的记录。

  2. 切分 (Split):直接将整篇文档丢给模型是不现实的,因为存在Token长度限制。因此,我们需要将长文档切分成更小的、语义完整的块(Chunks)。

    • Token切分:最简单粗暴的方式,按固定Token数量切分。
    • 语义切分:更智能的方式,例如按段落、标题,或者使用专门的算法(如SpacyNLTK)来识别句子边界,确保每个Chunk包含相对完整的语义。
    • Markdown切分:针对Markdown格式,可以按标题层级进行切分,这是一种非常高效且保留了文档结构的策略。
  3. 向量化 (Embed):计算机无法直接理解文本,我们需要将每个文本块(Chunk)通过一个嵌入模型(Embedding Model) 转换成一个高维的数字向量。这个向量可以被看作是该文本块在语义空间中的“坐标”。语义相近的文本,其向量在空间中的距离也更近。

  4. 存储 (Store):最后,我们将所有文本块的向量表示存储在一个专门的向量数据库(Vector Database) 中,如FAISS、ChromaDB或Milvus。这个数据库能够进行极其高效的向量相似度搜索。

阶段二:检索生成 (Retrieval & Generation) - 查找资料并作答

这个阶段是用户与系统交互的实时过程。

  1. 用户提问:用户输入一个查询(Query)。
  2. 查询向量化:将用户的查询同样通过嵌入模型转换成一个向量。
  3. 检索 (Retrieve):在向量数据库中,使用这个查询向量去搜索与之最相似的N个文本块向量。这个过程通常使用余弦相似度等算法。
  4. 增强 (Augment):将检索到的这N个文本块(我们称之为“上下文”或Context)与用户的原始问题组合成一个新的、更丰富的提示词(Prompt)。
  5. 生成 (Generate):将这个增强后的提示词发送给LLM。由于LLM现在有了明确的参考资料,它就能生成一个基于事实、更加准确和忠实的答案。

三、快速上手:用Python构建一个迷你RAG应用

下面我们使用langchain框架来演示如何快速搭建一个RAG流程。

# 1. 安装必要的库
# pip install langchain langchain-community langchain-openai chromadb

import os
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 设置你的OpenAI API Key
# os.environ["OPENAI_API_KEY"] = "sk-..."

# -- 阶段一:索引构建 --

# 1. 加载文档
loader = TextLoader("./my_document.txt")
documents = loader.load()

# 2. 切分文档
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)

# 3. 向量化并存储到Chroma向量数据库
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(chunks, embeddings)

# -- 阶段二:检索生成 --

# 4. 创建一个检索器
retriever = vector_store.as_retriever()

# 5. 创建一个LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo")

# 6. 创建一个RetrievalQA链
# 这条链封装了“检索->增强->生成”的完整流程
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff", # "stuff"表示将所有检索到的内容"塞"进一个Prompt
    retriever=retriever
)

# 7. 提问!
query = "What is the core idea of RAG?"
response = qa_chain.invoke(query)

print(response['result'])

将你的知识内容保存在my_document.txt中,运行以上代码,你就拥有了一个具备基本功能的RAG问答机器人!


四、结语

RAG技术通过“检索”这一简单而强大的机制,为大型语言模型架起了一座通往外部实时、私有知识的桥梁。它不仅是缓解模型“幻觉”的有效手段,更是推动LLM从“通用聊天工具”走向“专业领域助手”的关键一步。虽然我们今天只实现了一个基础版本,但在下一篇文章中,我们将深入探讨如何对RAG的各个环节进行优化,并建立科学的评估体系,打造生产级别的RAG应用。

相关文章
|
4月前
|
数据采集 文字识别 算法
精通RAG:从“能用”到“好用”的进阶优化与评估之道
你的RAG应用是否总是答非所问,或者检索到的内容质量不高?本文聚焦于RAG系统的进阶优化,深入探讨从查询转换、多路召回与重排序(Rerank)等高级检索策略,到知识库构建的最佳实践。更重要的是,我们将引入强大的`Ragas`评估框架,教你如何用数据驱动的方式,科学地量化和提升你的RAG系统性能。
464 7
|
4月前
|
人工智能 前端开发 API
一人挑战一支研发团队,3步搞定全栈开发
本文是 Qwen3-Coder 挑战赛教程第四期,我将带你完整走通一个真实项目案例:从零搭建一个“AI 舞蹈生成器”网站——上传一张人物照片,点击“立即生成”,即可获得一段该人物跳舞的动态视频。 整个过程仅需三步,无需前端、后端或模型部署经验,真正实现“说话即开发”。
396 0
|
4月前
|
人工智能 自然语言处理 前端开发
最佳实践2:用通义灵码以自然语言交互实现 AI 高考志愿填报系统
本项目旨在通过自然语言交互,结合通义千问AI模型,构建一个智能高考志愿填报系统。利用Vue3与Python,实现信息采集、AI推荐、专业详情展示及数据存储功能,支持响应式设计与Supabase数据库集成,助力考生精准择校选专业。(239字)
455 12
|
4月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
714 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
4月前
|
人工智能 Kubernetes 调度
ModelDistribution:高效的大模型管理、分发和预热方案
阿里云ACK One舰队推出ModelDistribution方案,创新性采用OCI标准封装模型,实现跨地域高效分发与预热,解决大模型部署中的管理复杂、拉取慢、多集群同步难等痛点,助力企业平滑演进至多地域AI推理架构。
325 1
ModelDistribution:高效的大模型管理、分发和预热方案
|
4月前
|
自然语言处理 测试技术 API
通义Qwen3-Max:大就是好
通义千问Qwen3-Max正式发布,参数超1T,训练稳定高效,在代码、推理、多语言等任务中表现卓越。预览版已登顶LMArena榜单前三,支持阿里云百炼API调用与Qwen Chat体验,敬请试用。
2571 32
|
4月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
270 1
|
4月前
|
存储 人工智能 前端开发
超越问答:深入理解并构建自主决策的AI智能体(Agent)
如果说RAG让LLM学会了“开卷考试”,那么AI智能体(Agent)则赋予了LLM“手和脚”,使其能够思考、规划并与真实世界互动。本文将深入剖析Agent的核心架构,讲解ReAct等关键工作机制,并带你一步步构建一个能够调用外部工具(API)的自定义Agent,开启LLM自主解决复杂任务的新篇章。
827 6
|
4月前
|
人工智能 移动开发 小程序
市面上的小程序平台对比
市面上的小程序平台对比
1052 138

热门文章

最新文章