简介
检索增强生成(RAG)是一种结合信息检索与文本生成的技术,能够使大语言模型基于私有知识库回答问题。本文将手把手教你使用LangChain和OpenAI搭建一个RAG系统。
环境准备
安装依赖
pip install langchain openai chromadb pypdf
设置API密钥
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"
步骤一:加载文档
假设你有一个PDF文档作为知识库,使用LangChain的文档加载器:
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()
步骤二:文本分割
将长文档分割为小块:
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
docs = text_splitter.split_documents(documents)
步骤三:创建向量存储
使用OpenAI的嵌入模型和Chroma向量数据库:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
步骤四:构建检索链
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
步骤五:查询测试
query = "什么是RAG?"
response = qa_chain.run(query)
print(response)
进阶优化
1. 多轮对话
添加记忆组件:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
memory=memory
)
2. 自定义提示模板
from langchain.prompts import PromptTemplate
prompt_template = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道。
{context}
问题: {question}
答案:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
3. 多种文档支持
支持PDF、网页、数据库等:
from langchain.document_loaders import WebBaseLoader, CSVLoader
完整代码示例
# rag_system.py
import os
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
os.environ["OPENAI_API_KEY"] = "your-api-key"
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(docs, embeddings)
llm = OpenAI(temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever())
while True:
query = input("请输入问题(输入exit退出):")
if query.lower() == "exit":
break
response = qa_chain.run(query)
print("回答:", response)
结语
通过本教程,你已经成功搭建了一个基于RAG的智能问答系统。你可以进一步扩展它,支持更多文档类型、添加用户认证、部署为Web服务。