面包屑图标 当前位置: 首页
AI资讯
热点详情

从零搭建RAG系统完整教程(附代码)

AI热点日报
AI热点日报时间:2026-07-10
热点解读

大语言模型的确展现出强大的推理能力与丰富的通用知识储备,但在面对需要精确信息、实时数据或可验证答案的场景时,往往显得力不从心。检索增强生成(RAG)正是为解决这一痛点而设计——它将大语言模型与外部知识源深度融合,使模型的表现实现质的飞跃。本文将从概念、重要性入手,并借助Python与主流开源库,从零

大语言模型的确展现出强大的推理能力与丰富的通用知识储备,但在面对需要精确信息、实时数据或可验证答案的场景时,往往显得力不从心。检索增强生成(RAG)正是为解决这一痛点而设计——它将大语言模型与外部知识源深度融合,使模型的表现实现质的飞跃。本文将从概念、重要性入手,并借助Python与主流开源库,从零开始手把手搭建一套完整的RAG系统。

一、RAG是什么

RAG的全称是Retrieval-Augmented Generation,可理解为一种“先检索、后生成”的架构。其核心思想简洁明了:在模型生成答案之前,先从外部知识库中检索出相关材料,再将这些材料馈送给语言模型,使其基于证据进行回答。整个流程分为三个步骤:

  1. 检索:系统收到用户问题后,检索器会在知识库中搜索最相关的文档片段。例如,当用户询问“苹果公司最新产品有哪些”,检索器会自动扫描苹果产品的知识库。
  2. 增强:检索到的信息被嵌入到发送给模型的提示词中,相当于为模型提供了额外的上下文“小灶”。
  3. 生成:模型结合自身预训练的知识与刚注入的特定信息,输出最终答案。沿用上面的例子,模型会给出“苹果公司最新产品包括iPhone 15系列手机、Apple Watch Series 9等”这类有据可查的回答。

回顾传统大语言模型的短板,RAG恰好能一一破解:

  1. 知识局限:标准模型的知识被训练数据锁定,而RAG通过连接外部信息源(如最新的医学数据库),让模型能够接触到更新或更专业的内容。
  2. 幻觉问题:模型有时会一本正经地编造信息,RAG强制模型基于可验证的来源作答,大幅降低胡编乱造的概率。例如,回答历史问题时,RAG会依据文献,不会自行杜撰细节。
  3. 透明度:RAG系统能够明确指出信息来源,这对学术研究尤其重要——用户可以顺着来源进行核实。
  4. 适应性:更新知识库即可让系统与时俱进,无需重新训练整个模型。对于金融数据、科技新闻等变化迅速的信息,RAG能够瞬间跟上节奏。

二、RAG的发展历程

RAG这一概念正式登场于2020年,Facebook AI Research(现为Meta AI)发表了一篇题为“Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”的论文,提出将稀疏/密集检索器与序列到序列模型相结合,专门处理知识密集型的NLP任务。

不过,RAG背后的思想其实渊源更深:

  1. 问答系统:早期问答系统在回答前就会利用文档检索获取信息,这种“先检索后回答”的思路为RAG奠定了基础。
  2. 信息检索:搜索引擎几十年的研究为高效文档检索提供了支撑,从关键词匹配到语义理解,技术在不断演进。
  3. 神经信息检索:神经网络让检索能够理解语义层面的相似性,将文本转为向量,通过距离度量相关性。
  4. NLP中的迁移学习:BERT这类预训练语言模型的出现,使文档表示与检索更加精准,成为RAG的得力助手。

随后,GPT-3、GPT-4、Claude以及LLaMA等开源模型相继亮相,RAG的热度也随之飙升。企业很快发现,尽管这些模型功能强大,但要在商业场景中落地,必须绑定可靠的信息源。如今,RAG已成为大语言模型应用的基石,LangChain、LlamaIndex等框架大大降低了实现RAG的门槛。

三、RAG为何重要

RAG在AI领域带来了诸多实实在在的好处:

  1. 获取最新信息:模型的知识存在截止日期,RAG绕开了这一限制,新闻、科技动态都能实时跟进。
  2. 领域专业化:为RAG配备特定领域的知识库,通用模型就能摇身一变成为专家。法律、金融、医疗等每个领域均可定制。
  3. 减少幻觉:回答基于检索到的文档,可靠性大幅提升,尤其在医疗健康等容不得半点虚假的领域。
  4. 降低成本:适应新领域时无需重新训练或微调,只需更换知识库,开发成本直线下降。
  5. 可验证性:系统可以引用信息来源,输出变得透明、可核查。在学术研究或商业报告中,这一特性尤为加分。
  6. 隐私和安全:敏感数据可以留在受控的知识库中,无需塞入训练数据,有效保护个人记录或商业机密。

四、构建RAG系统:核心组件

一个典型的RAG系统由以下关键部件构成:

  1. 文档加载器:从PDF、网页、数据库等来源导入文档,例如从PDF中提取文字。
  2. 文本分块器:将长文档切成适合索引与检索的小块。分块过大容易夹带无关信息,过小又会丢失上下文,需要把握平衡。
  3. 嵌入模型:把文本块转化为数值向量,通过向量间的距离来衡量语义相似度。
  4. 向量存储:为向量建立索引并存储,方便快速检索。FAISS是常见的选择。
  5. 检索器:根据用户查询,在向量存储中找到最相关的文档。
  6. 语言模型:基于查询和检索到的信息生成回答。
  7. 提示模板:指导语言模型如何利用检索内容,设计得当的回答会更贴合需求。

五、实现:逐步构建RAG系统

(一)设置环境

动手搭建需要安装几个Python库:langchain、langchain-core、langchain-community、langchain-experimental、pymupdf、langchain-text-splitters、faiss-cpu、langchain-ollama、langchain-openai。每个库各司其职:LangChain提供整体框架,PyMuPDF处理PDF文本提取,FAISS做向量相似性搜索,Ollama和OpenAI集成则让你灵活选择不同的语言模型。

用pip一次性安装:

pip install langchain langchain-core langchain-community langchain-experimental pymupdf langchain-text-splitters faiss-cpu langchain-ollama langchain-openai

(二)组件1:PDF加载器

from langchain_community.document_loaders import PyMuPDFLoader


class PdfLoader:
    def __init__(self):
        pass

    def read_file(self, file_path):
        loader = PyMuPDFLoader(file_path)
        docs = loader.load()
        return docs

上面这个PdfLoader类,通过PyMuPDFLoader从指定PDF路径加载文档。PyMuPDF基于fitz库,能高效处理文字、表格,甚至通过OCR处理图片。load()方法返回一个Document对象列表,每个对象对应PDF的一页,包含文本内容(page_content)和元数据(比如文件路径和页码)。当然,实际应用中可扩展它,支持Word、网页等其他格式。

(三)组件2:文本分块

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document


class Chunker:
    def __init__(self, chunk_size=1000, chunk_overlap=100):
        self.text_splitter = RecursiveCharacterTextSplitter(
            separators=["nn", "n", " ", ".", ",", "u200b", "uff0c", "u3001", "uff0e", "u3002", ""],
            chunk_size=chunk_size,
            chunk_overlap=chunk_overlap,
            length_function=len,
            is_separator_regex=False
        )

    def chunk_docs(self, docs):
        list_of_docs = []
        for doc in docs:
            tmp = self.text_splitter.split_text(doc.page_content)
            for chunk in tmp:
                list_of_docs.append(
                    Document(
                        page_content=chunk,
                        metadata=doc.metadata
                    )
                )
        return list_of_docs

Chunker负责把加载的文档切成小块。初始化时设置chunk_size(默认1000字符)和chunk_overlap(默认100字符),用RecursiveCharacterTextSplitter配合一系列分隔符,优先在自然边界处分割。chunk_docs方法遍历文档列表,为每个文本块创建新的Document对象,同时保留原始元数据。

(四)组件3:向量存储

import faiss
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings
from uuid import uuid4


class VectorStore:
    def __init__(self):
        self.embeddings = OllamaEmbeddings(model="llama3.2:3b")
        self.index = faiss.IndexFlatL2(len(self.embeddings.embed_query("hello world")))
        self.vector_store = FAISS(
            embedding_function=self.embeddings,
            index=self.index,
            docstore=InMemoryDocstore(),
            index_to_docstore_id={}
        )

    def add_docs(self, list_of_docs):
        uuids = [str(uuid4()) for _ in range(len(list_of_docs))]
        self.vector_store.add_documents(documents=list_of_docs, ids=uuids)

    def search_docs(self, query, k=5):
        results = self.vector_store.similarity_search(
            query,
            k=k
        )
        return results

VectorStore是整个检索系统的核心。初始化时,创建OllamaEmbeddings(这里用llama3.2:3b模型),基于FAISS建一个L2距离索引,然后初始化向量存储。add_docs方法给每个文档生成唯一ID并添加进存储,向量存储会自动计算文档的嵌入并建索引。search_docs方法把查询转成嵌入,在存储中做相似性搜索,返回最相似的k个文档。如果用于生产环境,可考虑持久化存储、添加元数据过滤或混合搜索。

(五)组件4:RAG系统

from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI
from langchain_ollama import OllamaLLM
from pdf_loader import PdfLoader
from vector_store import VectorStore
from chunk_text import Chunker


class RAG:
    def __init__(self):
        self.instructor_prompt = """Instruction: You're an expert problem solver you answer questions from context given below. You strictly adhere to the context and never move away from it. You're honest and if you do not find the answer to the question in the context you politely say "I Don't know!"
        So help me answer the user question mentioned below with the help of the context provided
        User Question: {user_query}
        Answer Context: {answer_context}
        """
        self.prompt = PromptTemplate.from_template(self.instructor_prompt)
        self.llm = OllamaLLM(model="llama3.2:3b")  # OpenAI()
        self.vectorStore = VectorStore()
        self.pdfloader = PdfLoader()
        self.chunker = Chunker()

    def run(self, filePath, query):
        docs = self.pdfloader.read_file(filePath)
        list_of_docs = self.chunker.chunk_docs(docs)
        self.vectorStore.add_docs(list_of_docs)
        results = self.vectorStore.search_docs(query)
        answer_context = "nn"
        for res in results:
            answer_context = answer_context + "nn" + res.page_content
        chain = self.prompt | self.llm
        response = chain.invoke(
            {
                "user_query": query,
                "answer_context": answer_context
            }
        )
        return response


if __name__ == "__main__":
    rag = RAG()
    filePath = "investment.pdf"
    query = "How to invest?"
    response = rag.run(filePath, query)
    print(response)

RAG类把前面各个组件整合成一个完整的系统。初始化时,定义了一个指导模型的提示模板,创建PromptTemplate对象,并初始化语言模型、向量存储、PDF加载器和文本分块器。run方法实现了完整工作流:加载PDF→分块→添加到向量存储→根据查询搜索相关文本块→拼接上下文→调用语言模型生成回答。主程序里创建RAG实例,指定PDF路径和查询,运行后打印结果。

六、高级考虑与改进

上述实现为RAG打下了良好基础,但若要投入生产环境,还有很多优化与加强的空间:

  1. 文档处理增强:支持更多格式(Word、网页、数据库);提取元数据(创建日期、作者等);集成OCR处理扫描件;专门提取表格数据。
  2. 分块策略优化:基于语义进行分割,而非按字符数硬切;实现层次分块,维护文档结构(如章节-段落关系);在元数据中携带章节标题,便于后续检索。
  3. 嵌入和检索改进:增加重排序步骤,对初始结果再筛选;结合向量相似性与BM25等关键词方法做混合搜索;自动扩展查询;使用交叉编码器重排序,虽慢但更精准。
  4. 大语言模型集成优化:实现流式响应,提升体验;优化提示词让模型做逐步推理;让模型自我评估答案;将复杂查询拆解为子问题逐步解决。
  5. 评估和监测:评估检索到的文档与查询的相关性;对比生成答案与标准答案(若有);检测幻觉;建立用户反馈循环,持续改进。

七、生产环境中的RAG扩展

(一)安全和合规

生产环境中,RAG系统处理的数据很可能涉及企业商业机密或客户个人数据,必须做好安全合规。

  1. 访问控制:对敏感文档设置多级权限,只有授权的人或服务才能访问特定知识库。按角色、部门、数据敏感度划分,例如财务部门只能查看财务文档,且不同职级权限不同。
  2. 日志记录:详细记录文档访问、查询内容、模型响应等操作日志,便于追踪使用情况和安全审计。分析日志可发现异常行为或未授权访问。
  3. 数据合规:处理PII(个人可识别信息)时需遵守GDPR、CCPA等法规,对PII加密存储和传输,防止泄露。

(二)性能优化

要支撑大量用户和高频查询,性能优化是必修课。

  1. 预计算嵌入:对大规模文档集合,在初始化或更新时提前计算好嵌入,查询时无需实时计算,响应速度大幅提升。还可定期重新计算,使用更新更好的模型。
  2. 缓存机制:在查询、嵌入、响应等多个层面设置缓存。常见查询直接返回缓存结果;已计算的嵌入不再重复计算;模型生成的回答也可缓存,相同问题秒级响应。
  3. 量化技术:将高维嵌入向量转为低精度(如从32位浮点降到16位或8位),存储和计算量都减小,相似性搜索更快,且语义信息损失很小。

(三)基础设施

合理的基础设施是RAG系统稳定、可扩展的保障。

  1. 容器化部署:用Docker将各个组件(文档加载器、分块器、向量存储、语言模型等)封装成独立容器,部署、管理、更新便捷,环境隔离也提升稳定性。
  2. 微服务架构:将系统拆分为多个微服务(文档处理服务、检索服务、语言模型服务等),每个服务独立扩展,降低耦合度,维护和升级更灵活。
  3. 队列系统:处理大量文档的异步任务(如文档加载、嵌入计算)时,使用Kafka或RabbitMQ等消息队列,任务排队让后台工作进程逐步处理,避免服务器过载。

(四)持久性

确保系统数据和模型状态能持久保存,重启或故障后能快速恢复。

  1. 持久化存储:选择可靠的数据库存储嵌入和文档信息。向量数据库(如Pinecone、Weaviate、Chroma)或关系型/NoSQL数据库均可,关键是要能持久化、高效查询。
  2. 增量更新:新文档添加或旧文档更新时,只处理变化的部分,无需重新处理整个集合。例如,只更新新增或修改文档的嵌入向量,省时省力。

检索增强生成作为大语言模型发展中的重要突破,通过结合外部知识源,大幅提升了模型的实用性、可靠性和可信度。本文从概念、发展历程到重要性进行了梳理,并手把手展示了用Python和开源库构建完整RAG系统的过程——文档加载、文本分块、向量存储、响应生成,每一个关键组件都落实到代码。

同时,针对生产环境的需求,也讨论了一系列高级改进和扩展方向,包括文档处理、分块策略、嵌入检索、LLM集成、系统评估,以及部署中的安全、性能、基础设施和持久性要点。沿着这些方向不断打磨,RAG系统就能更好地适应真实世界的各种应用场景。

热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:从零搭建RAG系统完整教程(附代码)要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://www.53ai.com/news/RAG/2025051557213.html
ai 人工智能

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-07-10 12:34
专业Logo设计打造令人难忘的品牌形象

DiffusionLogoStudio是一款面向个人创业者、小型企业主和创业公司的AI工具,无需设计知识即可生成独特、可商用的品牌标识。它支持Logo定制、无限可伸缩、添加文字及模拟场景预览,低成本解决传统设计成本高、易撞脸的问题。

AI热点2026-07-10 12:33
Stratup.ai AI创业点子与工具平台

Stratup ai是一款基于人工智能的创业点子生成与探索工具,面向创业者、企业家和投资者。它能发现商业创意、分析市场需求与竞争格局,生成包括市场规模、风险评估在内的详细报告,辅助商业决策,将创意转化为系统流程。

AI热点2026-07-10 12:33
猫眼人工智能反欺凌软件学校智能监控与预警

猫眼是一套基于人工智能的校园反欺凌系统,通过分析音频与视频信号实时检测言语威胁和肢体冲突,秒级向教职工发送警报,将被动监控升级为主动防御,助力学校及时干预欺凌事件。

AI热点2026-07-10 12:33
SAP旗下最新推出的商业智能AI助手Joule全面介绍

SAP推出商业智能AI助手Joule,将生成式AI嵌入企业工作流,覆盖HR、财务、供应链等领域。能撰写招聘广告、分析销售业绩、提供供应链改善方案并自动联系系统,核心特色是理解业务语境,提供情景化建议并协助完成日常工作。

延伸阅读