在大语言模型(LLM)飞速发展的今天,其在自然语言理解、生成等领域展现出强大能力,但同时也存在"知识滞后""事实性错误"等固有缺陷。检索增强生成(Retrieval-Augmented Generation,简称RAG)技术应运而生,通过将"检索外部知识库"与"LLM生成"相结合,有效弥补了LLM的不足,让生成内容更具准确性、时效性和专业性。本文将从RAG技术的核心原理、工作流程、核心组件出发,结合完整代码示例,带大家从零搭建一个简单的RAG系统。

一、RAG技术核心原理

RAG的核心思想是"先检索,后生成":在LLM生成回复之前,先从外部知识库中检索与用户问题相关的信息,将这些信息作为"上下文"与用户问题一起输入给LLM,让LLM基于检索到的准确信息进行回复。其核心价值在于:

  • 解决知识滞后:外部知识库可实时更新,无需重新训练庞大的LLM,就能让模型掌握最新信息(如行业动态、政策更新等);

  • 提升事实准确性:减少LLM"一本正经地胡说八道"的概率,生成内容有外部知识支撑;

  • 降低应用成本:相较于微调LLM,RAG无需大量标注数据和高额计算资源,落地门槛更低。
  • 二、RAG技术工作流程

    一个完整的RAG系统主要包含两大阶段:数据准备阶段查询推理阶段

    RAG工作流程图

    数据准备阶段

  • 数据采集:收集领域相关的文档(如PDF、Word、网页文本等);

  • 文档分割:将长文档拆分为短文本片段(Chunk),避免因文本过长导致检索不准确;

  • 向量编码:使用嵌入模型(Embedding Model)将文本片段转换为高维向量(Embedding);

  • 向量存储:将向量片段存入向量数据库(Vector Database),构建检索知识库。
  • 查询推理阶段

  • 用户提问:用户输入自然语言问题;

  • 问题编码:使用与文档编码相同的嵌入模型,将用户问题转换为向量;

  • 相似检索:在向量数据库中检索与问题向量最相似的Top N文本片段;

  • Prompt构建:将检索到的文本片段作为上下文,与用户问题组合成新的Prompt;

  • 生成回复:将新Prompt输入LLM,生成基于准确上下文的回复。
  • 三、RAG核心组件选型

    RAG核心组件选型

    组件推荐方案说明
    文档分割LangChain RecursiveCharacterTextSplitter自适应不同文档格式,可自定义片段长度和重叠度
    嵌入模型Hugging Face all-MiniLM-L6-v2轻量高效,开源免费,支持多语言
    向量数据库Chroma轻量级,无需复杂部署,支持内存模式
    大语言模型OpenAI GPT-3.5-turbo 或 Llama 2GPT生成质量高,Llama 2可本地部署
    开发框架LangChain封装了RAG全流程组件,降低开发难度

    四、实战:从零搭建RAG系统

    从零搭建RAG系统

    4.1 环境准备

    pip install langchain sentence-transformers chromadb openai python-dotenv

    4.2 完整代码实现

    代码分为5个模块:环境配置、数据准备(加载+分割+编码+存储)、检索模块、生成模块、RAG整体流程封装。

    import os
    from dotenv import load_dotenv
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from langchain.embeddings import HuggingFaceEmbeddings
    from langchain.vectorstores import Chroma
    from langchain.chat_models import ChatOpenAI
    from langchain.prompts import PromptTemplate
    from langchain.chains import RetrievalQA
    
    

    1. 环境配置

    load_dotenv() openai_api_key = os.getenv("OPENAI_API_KEY") CHUNK_SIZE = 500 CHUNK_OVERLAP = 50 EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2" VECTOR_DB_PATH = "./chroma_python_knowledge" LLM_MODEL_NAME = "gpt-3.5-turbo"

    2. 数据准备:构建知识库

    def build_knowledge_base(document_paths): texts = [] for path in document_paths: with open(path, "r", encoding="utf-8") as f: texts.append(f.read()) text_splitter = RecursiveCharacterTextSplitter( chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP, length_function=len ) splits = text_splitter.split_text("\\n\\n".join(texts)) embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL_NAME) db = Chroma.from_texts(texts=splits, embedding=embeddings, persist_directory=VECTOR_DB_PATH) db.persist() retriever = db.as_retriever(search_kwargs={"k": 3}) return retriever

    3. 构建RAG生成链

    def build_rag_chain(retriever): prompt_template = \"\"\" 你是一个Python学习助手,仅基于提供的上下文信息回答用户问题。 如果上下文没有相关信息,直接说明"没有找到相关知识点",不要编造内容。

    上下文信息:{context}

    用户问题:{question}

    回答:\"\"\"
    prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
    llm = ChatOpenAI(model_name=LLM_MODEL_NAME, api_key=* temperature=0.3)
    rag_chain = RetrievalQA.from_chain_type(
    llm=llm, chain_type="stuff", retriever=retriever,
    chain_type_kwargs={"prompt": prompt}, return_source_documents=True
    )
    return rag_chain

    4. 核心查询函数

    def rag_query(rag_chain, question): result = rag_chain({"query": question}) return result["result"], result["source_documents"]

    5. 测试运行

    if __name__ == "__main__": test_documents = ["./python_basics.txt"] retriever = build_knowledge_base(test_documents) rag_chain = build_rag_chain(retriever) for q in ["Python中如何定义函数?", "列表和元组的区别是什么?", "Python的装饰器有什么作用?"]: answer, sources = rag_query(rag_chain, q) print(f"问题:{q}\\n回答:{answer}\\n")

    五、RAG技术的优化方向

  • 文档分割优化:针对不同文档类型使用专用分割工具,采用语义分割避免将完整语义拆分;

  • 嵌入模型优化:专业领域使用领域专用嵌入模型,通过微调提升检索准确性;

  • 检索策略优化:使用混合检索(关键词+向量),引入重排序二次筛选;

  • Prompt工程优化:设计更精准的Prompt模板,使用Map-Reduce策略处理长文档;

  • 向量数据库优化:大规模场景替换为Milvus、Pinecone等分布式向量数据库。
  • 六、RAG技术的应用场景

  • 企业知识库问答:内部文档查询、员工培训、客户服务机器人;

  • 领域专业问答:医疗问诊、法律咨询、金融研报分析;

  • 实时信息问答:新闻资讯总结、股市动态分析;

  • 个人知识管理:笔记检索问答、学习助手。
  • 七、总结

    RAG技术通过"检索增强生成"的核心逻辑,有效弥补了LLM的知识滞后和事实性缺陷,是当前LLM落地应用的关键技术之一。随着技术的发展,RAG与微调、Agent等技术的结合,将进一步拓展LLM的应用边界,推动AI在各行业的深度落地。


    原文来源:腾讯云开发者社区

    标签: none

    添加新评论