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 的对比
维度
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 并通过聊天提问。先将文件转为文本,分段向量化,再回答问题。
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. 多模态检索
处理文本、图像等多模态数据。
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()