from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
import requests
embeddings = OpenAIEmbeddings()
response = requests.get("https://api.example.com/calendar/2026")
calendar_data = response.json()
db = FAISS.from_texts([str(calendar_data)], embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever()
)
result = qa_chain.run("2026 年的春节是哪一天?")
print(result)
四、RAG 与 SFT 的对比
维度
RAG
SFT
数据类型
动态数据,不断查询外部源,确保信息最新
相对静态数据,动态场景中容易过时
外部知识利用
擅长利用外部资源,适合结构化/非结构化库
对频繁更改的数据源不太实用
模型定制
关注信息检索,难以完全定制行为风格
允许调整语气、术语或领域知识
减少幻觉
基于检索证据,不易产生幻觉
面对陌生输入仍可能产生幻觉
透明度
分解响应阶段,提供检索匹配度参考
黑匣子,推理过程不透明
技术要求
需高效检索策略及数据库维护
需高质量数据集及计算资源
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
defextract_text_from_pdf(pdf_path):
text = ""withopen(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()
defcreate_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 并通过聊天界面提问。先将 PDF 转为文本,再用 Embedding API 向量化,最后基于向量回答问题。
import requests
import PyPDF2
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
defextract_text_from_pdf(pdf_path):
text = ""withopen(pdf_path, "rb") as f:
reader = PyPDF2.PdfReader(f)
for page in reader.pages:
text += page.extract_text()
return text
defcreate_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")
defchat_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. Multi-modal retrieval-based LMs
RA-CM3 等模型结合 CLIP 检索器和 Transformer 生成器,处理图文多模态数据。
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 和算法
如果 embedding 模型无法准确表示语义,或检索算法不够精准,会导致无关信息干扰输出。
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 = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever()
)
result = qa_chain.run("如何训练一只狗?")
print(result)
2. 信息利用仍是黑盒
大模型如何利用检索到的信息生成回答并不透明,可能存在与检索信息冲突的情况。
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 = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever()
)
result = qa_chain.run("猫是一种什么动物?")
print(result)