RAG由浅入深01

RAG(检索增强生成)是目前构建专业、可靠智能体应用最核心的技术之一,它很好地解决了大模型“不懂”私有知识和“凭空捏造”的难题。

🧠 第一部分:由浅入深,理解RAG是什么?

为了让你更好地理解,我们用比萨店做菜的比喻来解释:

  • 传统大模型(类比:只靠记忆做菜的厨师):这位厨师在厨师学校学习时,记住了海量菜谱。现在你点一道“意大利海鲜烩饭”,他凭记忆做。但如果他的记忆里没有这道菜,或者食材(知识)已经更新,他可能会做错,甚至编造一个不存在的做法(这就是AI的“幻觉”)。

  • RAG模型(类比:边查菜谱边做菜的厨师):现在,同样做“意大利海鲜烩饭”,这位厨师会立刻从你提供的食材库(知识库)里,找到最相关的几页官方菜谱(检索),然后照着菜谱上的步骤和方法来烹饪(生成)。这样,他每次都能根据最新、最准确的资料来操作,出错率大大降低。

RAG的技术本质是:在用户提问和模型生成回答之间,插入了一个“检索”步骤。

  1. 检索(Retrieval):当用户提问时,系统会先去一个外部的、用户指定的知识库(比如产品手册、公司文档、法规条文)中进行搜索,找出和问题最相关的一小段文本。
  2. 增强(Augmented):将用户的原问题,连同检索到的相关文本,一起组合成一个新的、更丰富的提示词。
  3. 生成(Generation):将增强后的提示词发送给大模型,让它“根据我提供的这些资料”来生成最终的回答。

🚀 第二部分:RAG的三大核心优势

  1. 让AI“消除幻觉”,回答更可靠:这是最根本的优势。模型不再“凭空想象”,而是有据可查,回答的准确性和可信度大幅提升。
  2. 知识可以“动态更新”,成本极低:当你的业务知识、产品信息发生变化时,只需要更新或上传新文档到知识库即可。不需要对大模型本身进行昂贵、复杂的重新训练,实现了知识的实时迭代。
  3. 保护“私有数据”,安全可控:企业可以不将核心商业数据用于训练公共大模型。只需将内部资料构建成私有知识库,就能让AI基于这些专属信息提供服务,确保了数据安全和合规性。

💻 第三部分:实战!典型代码示例

为了让你直观感受RAG的性能优势,这里我们用Python和langchain社区版,在Coze平台之外搭建一个极简的本地RAG原型。我们通过“是否使用RAG”来对比回答的质量(注:鉴于API调用网络延迟,此示例重点演示逻辑流程)。

# 请先安装: pip install langchain langchain-community chromadb openai

import time
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OpenAIEmbeddings  # 这里需要OpenAI的API密钥
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

# 1. 准备一份“公司内部员工手册”(模拟私有知识)
text = """
公司年假规定:员工入职满一年后,享有每年10个工作日的带薪年假。年假需要提前3个工作日申请。
公司考勤制度:标准工作时间为上午9:00至下午6:00,午休1小时。
公司福利政策:正式员工享有每年一次的健康体检福利,由公司统一预约。
"""
with open("employee_handbook.txt", "w") as f:
    f.write(text)

# 2. 构建RAG系统(知识库构建与检索链)
def build_rag_chain():
    # 加载文档并分块
    loader = TextLoader("employee_handbook.txt")
    documents = loader.load()
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
    docs = text_splitter.split_documents(documents)
    
    # 创建向量数据库并建立检索器
    embeddings = OpenAIEmbeddings()  # 请设置好您的OPENAI_API_KEY环境变量
    db = Chroma.from_documents(docs, embeddings)
    retriever = db.as_retriever()
    
    # 创建RAG问答链
    qa_chain = RetrievalQA.from_chain_type(
        llm=ChatOpenAI(model="gpt-3.5-turbo"),
        retriever=retriever,
        return_source_documents=True
    )
    return qa_chain

# 3. 定义测试问题(精确指向私有知识)
question = "我们公司的带薪年假有多少天?"

# 4. 性能与效果对比
print("=== 对比测试:不采用RAG ===")
start_time = time.time()
llm_naive = ChatOpenAI(model="gpt-3.5-turbo")
response_naive = llm_naive.invoke(f"回答用户问题:{question}")
print(f"回答: {response_naive.content}")
print(f"耗时: {time.time() - start_time:.2f} 秒")
print("-" * 40)

# 采用RAG
print("=== 对比测试:采用RAG ===")
rag_chain = build_rag_chain()
start_time = time.time()
response_rag = rag_chain.invoke({"query": question})
print(f"回答: {response_rag['result']}")
print(f"参考文档: {[doc.metadata for doc in response_rag['source_documents']]}")
print(f"耗时: {time.time() - start_time:.2f} 秒")

运行结果分析

  • 不采用RAG:模型很可能回答“我不知道”或“根据一般规定,带薪年假通常是……”,因为它不具备你公司的私有知识。
  • 采用RAG:模型会精准回答“公司员工入职满一年后,享有每年10个工作日的带薪年假”,并且能告诉你它参考了“员工手册”这个文档。

性能说明:虽然RAG因多了一步检索和网络调用,耗时通常会略长(如从0.5秒变为0.8秒),但回答的可用性天壤之别。这正是RAG的核心价值——用可以接受的小幅性能开销,换取从“不可用”到“可用”的质的飞跃


💎 小结与下一步

通过这个比喻和代码,可以看到RAG本质上就是给大模型外挂了一个“即时可查的数据库”。它让AI从“懂装不懂”或“不懂装懂”的处境,变成了一个诚实、严谨的“专家助理”。

在Coze等智能体平台上,RAG的构建过程被进一步抽象和产品化(即知识库功能),只需要上传文档,平台会自动处理后端的分块、向量化、检索等复杂工程,让开发者更专注于应用本身。

posted @ 2026-07-17 20:55  yuangu  阅读(2)  评论(0)    收藏  举报