跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI算法

大模型 RAG 技术深度解析:低成本实现 AI 升级

大模型面临幻觉与数据滞后挑战,检索增强生成(RAG)通过外挂知识库有效降低成本。解析 RAG 架构、优势及实现方案,对比 SFT 差异,并提供 Python 代码示例,助您快速落地企业级 AI 应用。

无尘发布于 2026/3/24更新于 2026/5/89 浏览
大模型 RAG 技术深度解析:低成本实现 AI 升级

大模型 RAG 技术深度解析:从入门到进阶

一、大语言模型(LLM)的三大痛点

在实际应用中,我们常发现通用大模型存在几个明显短板。首先是幻觉问题,模型基于概率生成文本,并不真正理解语义,容易一本正经地胡说八道。比如询问'太阳为什么从西边升起',它可能会编造地球自转改变的理由。

其次是时效性。训练成本高导致模型知识更新慢,无法回答最新事件。例如 2026 年的春节日期,若训练数据截止 2023 年,模型将无法给出正确答案。

最后是数据安全。企业敏感信息不能直接输入公共 LLM。通常做法是在本地处理脱敏后,再让在线模型进行归纳。

from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')
result = generator("太阳为什么从西边升起?", max_length=100, num_return_sequences=1)
print(result[0]['generated_text'])

对于时效性和安全需求,我们可以结合外部工具解决:

from datetime import datetime
import requests

def get_current_time():
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

def get_latest_news():
    response = requests.get("https://newsapi.org/v2/top-headlines?country=cn&apiKey=YOUR_API_KEY")
    return response.json()

print(f"当前时间:{get_current_time()}")
print(f"最新新闻:{get_latest_news()}")

在处理敏感数据时,建议先本地脱敏:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 本地处理敏感数据
def process_sensitive_data():
     data.replace(, )

llm = OpenAI(temperature=)
prompt = PromptTemplate(input_variables=[], template=)
chain = LLMChain(llm=llm, prompt=prompt)

sensitive_data = 
processed_data = process_sensitive_data(sensitive_data)
result = chain.run(processed_data)
(result)
data
return
"敏感信息"
"***"
0
"data"
"分析以下数据:{data}"
"用户的敏感信息:1234567890"
print

二、RAG 技术:检索增强生成

RAG(Retrieval-Augmented Generation)通过检索相关文档再基于此生成回答,有效提升了预测质量。就像学生考试可以查阅课本,而不是仅凭记忆瞎蒙。

1. 架构组成

RAG 包含两个核心模块:检索器和生成器。

检索器负责从知识库中找出最相关的 k 个文档。构建高质量检索器需解决语义表示、空间对齐等问题。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
documents = ["Python 学习资源 1...", "Python 学习资源 2..."]
db = FAISS.from_texts(documents, embeddings)

query = "如何学习 Python"
docs = db.similarity_search(query, k=2)
for doc in docs:
    print(doc.page_content)

生成器将检索到的信息转化为自然文本。输入不仅包含上下文,还有检索片段,使回答更准确。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0)
prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="基于以下上下文回答问题:\n{context}\n\n问题:{question}"
)

context = "Python 是一种高级编程语言,易于学习和使用。"
question = "Python 是什么?"
result = llm(prompt.format(context=context, question=question))
print(result)

完整流程示例:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["红烧肉的做法:1. 准备食材..."], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

result = qa_chain.run("如何做红烧肉?")
print(result)

三、使用 RAG 的八大优势

相比传统微调,RAG 具备显著优势:

  1. 可扩展性:无需重训大模型,外挂知识库即可提供额外信息。
  2. 准确性:引用信息来源增强信任,用户可核实答案。
  3. 可控性:轻松更新知识库,无需重新训练模型。
  4. 可解释性:检索项目作为参考,提高透明度。
  5. 多功能性:适用于 QA、摘要、对话等多种任务。
  6. 及时性:识别最新信息,不受训练数据截止时间限制。
  7. 定制性:为不同领域提供专业支持。
  8. 安全性:敏感数据存本地,通过权限控制访问。

以企业知识库为例:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
db = FAISS.load_local("enterprise_knowledge_base", embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

result = qa_chain.run("公司的请假政策是什么?")
print(result)

支持来源引用的代码:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0)
prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="基于以下上下文回答问题,并引用信息来源:\n{context}\n\n问题:{question}"
)

context = "根据《Python 编程从入门到精通》一书,Python 是一种高级编程语言。"
question = "Python 是什么?"
result = llm(prompt.format(context=context, question=question))
print(result)

知识库更新示例:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
documents = ["公司的请假政策是:病假需要提供医院证明..."]
db = FAISS.from_texts(documents, embeddings)

new_document = "公司的请假政策已更新:病假需要提供三甲医院证明..."
db.add_texts([new_document])

query = "公司的请假政策是什么?"
docs = db.similarity_search(query, k=1)
print(docs[0].page_content)

带来源追踪的实现:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQAWithSourcesChain
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts([
    {"content": "Python 是一种高级编程语言", "metadata": {"source": "《Python 编程从入门到精通》"}}
], embeddings)

llm = OpenAI(temperature=0)
qa_chain = RetrievalQAWithSourcesChain.from_chain_type(
    llm=llm, chain_type="stuff", retriever=db.as_retriever()
)

result = qa_chain({"question": "Python 是什么?"})
print(f"回答:{result['answer']}")
print(f"来源:{result['sources']}")

四、RAG 与 SFT 的对比

维度RAGSFT
数据类型动态数据,查询外部源,保持最新静态数据,频繁更改场景不适用
外部知识利用擅长整合外部资源,适合结构化/非结构化库微调对齐预训练知识,不适合频繁变更
模型定制关注检索,难以完全定制行为风格允许调整语气、术语或特定领域知识
减少幻觉基于检索证据,不易产生幻觉依赖训练数据,面对未知输入仍可能幻觉
透明度分解响应阶段,提供检索匹配度黑匣子,推理不透明
技术要求高效检索策略、数据库集成高质量数据集、计算资源

代码对比示例:

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from transformers import pipeline

# RAG 示例
embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["最新科技进展:GPT-5 发布..."], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
rag_result = qa_chain.run("最新的科技进展是什么?")
print(f"RAG 回答:{rag_result}")

# SFT 示例
sft_model = pipeline('text-generation', model='fine_tuned_model')
sft_result = sft_model("最新的科技进展是什么?", max_length=100, num_return_sequences=1)
print(f"SFT 回答:{sft_result[0]['generated_text']}")

五、RAG 的典型实现方法

1. 数据索引

离线过程,将私域数据向量化后存入数据库。包括提取、分割、向量化及建索引。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
import PyPDF2

def extract_text_from_pdf(pdf_path):
    text = ""
    with open(pdf_path, "rb") as f:
        reader = PyPDF2.PdfReader(f)
        for page in reader.pages:
            text += page.extract_text()
    return text

text_splitter = CharacterTextSplitter()
embeddings = OpenAIEmbeddings()

def create_index(pdf_path):
    text = extract_text_from_pdf(pdf_path)
    texts = text_splitter.split_text(text)
    db = FAISS.from_texts(texts, embeddings)
    db.save_local("pdf_index")

create_index("example.pdf")

2. 数据检索

获取有效信息的关键,支持元数据过滤、向量相似度检索等。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
db = FAISS.load_local("pdf_index", embeddings)

query = "Python 学习教程"
docs = db.similarity_search(query, k=3)
for doc in docs:
    print(doc.page_content)

3. 文本生成

组合 Query 和检索文本输入模型,本质是 Prompt Engineering。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
db = FAISS.load_local("pdf_index", embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

result = qa_chain.run("如何学习 Python?")
print(result)

六、RAG 的典型案例

1. ChatPDF 复刻版

上传 PDF 并通过聊天提问。先将文件转为文本,分段向量化,再回答问题。

import requests
import PyPDF2
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

def extract_text_from_pdf(pdf_path):
    text = ""
    with open(pdf_path, "rb") as f:
        reader = PyPDF2.PdfReader(f)
        for page in reader.pages:
            text += page.extract_text()
    return text

def create_chat_pdf(pdf_path):
    text = extract_text_from_pdf(pdf_path)
    embeddings = OpenAIEmbeddings()
    db = FAISS.from_texts([text], embeddings)
    db.save_local("chat_pdf_index")

def chat_with_pdf(question):
    embeddings = OpenAIEmbeddings()
    db = FAISS.load_local("chat_pdf_index", embeddings)
    llm = OpenAI(temperature=0)
    qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
    result = qa_chain.run(question)
    return result

create_chat_pdf("example.pdf")
answer = chat_with_pdf("本文的主要内容是什么?")
print(answer)

2. Baichuan 搜索增强

融合意图理解、智能搜索和结果增强,减少幻觉。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["红烧肉的做法:1. 准备食材..."], embeddings)
llm = OpenAI(temperature=0)

prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="理解用户意图:{question}\n基于以下上下文回答问题:{context}\n\n问题:{question}"
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm, chain_type="stuff", retriever=db.as_retriever(),
    chain_type_kwargs={"prompt": prompt}
)

result = qa_chain.run("如何做红烧肉?")
print(result)

3. 多模态检索

处理文本、图像等多模态数据。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from PIL import Image
import requests
from io import BytesIO

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["猫在草地上玩耍的图片:https://example.com/cat.jpg"], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

result = qa_chain.run("生成一只猫在草地上玩耍的图片")
print(result)

image_url = result.split(":")[-1].strip()
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))
image.show()

七、RAG 存在的问题

尽管 RAG 优势明显,但仍面临挑战:

  1. 检索效果依赖 Embedding:若语义表示不准或算法不佳,会检索到无关信息。
  2. 信息利用黑盒:模型如何利用检索信息仍不透明,可能生成冲突内容。
  3. 效率问题:无差别检索所有任务会增加输入长度,降低生成速度。
  4. 事实查证难:无法精准引用来源,真实性取决于数据源质量。

效率测试示例:

import time
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["猫是一种哺乳动物...", "狗是一种哺乳动物...", "鸟是一种脊椎动物...", "鱼是一种脊椎动物..."], embeddings)
llm = OpenAI(temperature=0)

qa_chain_2 = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever(search_kwargs={"k": 2}))
qa_chain_4 = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever(search_kwargs={"k": 4}))

start_time = time.time()
result_2 = qa_chain_2.run("猫是一种什么动物?")
end_time = time.time()
print(f"检索 2 个文档耗时:{end_time - start_time}秒")

start_time = time.time()
result_4 = qa_chain_4.run("猫是一种什么动物?")
end_time = time.time()
print(f"检索 4 个文档耗时:{end_time - start_time}秒")

八、RAG 的拓展方案

1. 多模态 RAG

处理图像、音频、视频等数据,转化为向量检索。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from PIL import Image
import pytesseract

def extract_text_from_image(image_path):
    image = Image.open(image_path)
    text = pytesseract.image_to_string(image)
    return text

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["猫是一种哺乳动物..."], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

image_text = extract_text_from_image("cat.jpg")
result = qa_chain.run(f"这张图片中的动物是什么?图片文本:{image_text}")
print(result)

2. 实时 RAG

集成新闻 API 等实时数据源,确保回答及时性。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
import requests

def get_latest_tech_news():
    response = requests.get("https://newsapi.org/v2/top-headlines?country=us&category=technology&apiKey=YOUR_API_KEY")
    news = response.json()
    return news['articles'][0]['content']

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts([get_latest_tech_news()], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

result = qa_chain.run("最新的科技新闻是什么?")
print(result)

3. 个性化 RAG

根据用户偏好调整检索策略。

from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

embeddings = OpenAIEmbeddings()
db = FAISS.from_texts(["《肖申克的救赎》是一部经典的剧情片...", "《阿甘正传》是一部励志的剧情片...", "《星际穿越》是一部科幻片..."], embeddings)
llm = OpenAI(temperature=0)
user_preference = "剧情片"

prompt = PromptTemplate(
    input_variables=["context", "question", "user_preference"],
    template="用户偏好:{user_preference}\n基于以下上下文回答问题:{context}\n\n问题:{question}"
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm, chain_type="stuff", retriever=db.as_retriever(),
    chain_type_kwargs={"prompt": prompt}
)

result = qa_chain.run({"question": "推荐一些适合我的电影", "user_preference": user_preference})
print(result)

目录

  1. 大模型 RAG 技术深度解析:从入门到进阶
  2. 一、大语言模型(LLM)的三大痛点
  3. 本地处理敏感数据
  4. 二、RAG 技术:检索增强生成
  5. 1. 架构组成
  6. 三、使用 RAG 的八大优势
  7. 四、RAG 与 SFT 的对比
  8. RAG 示例
  9. SFT 示例
  10. 五、RAG 的典型实现方法
  11. 1. 数据索引
  12. 2. 数据检索
  13. 3. 文本生成
  14. 六、RAG 的典型案例
  15. 1. ChatPDF 复刻版
  16. 2. Baichuan 搜索增强
  17. 3. 多模态检索
  18. 七、RAG 存在的问题
  19. 八、RAG 的拓展方案
  20. 1. 多模态 RAG
  21. 2. 实时 RAG
  22. 3. 个性化 RAG
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 金融数据分析工具 Mootdx 使用指南
  • StructBERT WebUI 权限管理扩展:RBAC 角色控制及审计日志实现
  • Android WebRTC 音视频开发:开源方案全解析与集成实践
  • DeepSeek 大模型在三大云电脑平台的部署与性能实测
  • Qwen3-4B-Instruct 技术架构与 CPU 推理优化解析
  • 长亭 Xray Web 漏洞扫描器实战指南
  • STL stack 与 queue 底层模拟实现及算法实战
  • AI 绘画提示词逻辑优化:从语义理解到生成效率提升
  • C语言快速排序算法详解及多种变式实现
  • 鸿蒙金融理财全栈项目:生态合作与用户运营优化
  • Java 模拟算法实战:LeetCode 经典题解
  • MyBatis 动态 SQL 标签详解
  • 人工智能、机器学习与深度学习的本质区别
  • C++11 右值引用与移动语义详解:从性能瓶颈到零拷贝优化
  • AI 产品经理进阶路线图:产业链、分类与核心能力提升
  • AI Agent 核心在于流程设计:Harness 才是决胜关键
  • Llama-Factory 强化学习微调支持与 RLHF 模块进展解析
  • Python 人脸识别控制 ESP8266 LED 灯实战
  • 数据结构核心:链表详解与实现
  • Windows 11 下 WSL Ubuntu 安装与配置实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online