AI百事通

从零搭建RAG系统:使用LangChain与OpenAI实现智能问答

📅 2026-07-13📰 ai_generated👁 1 次阅读
从零搭建RAG系统:使用LangChain与OpenAI实现智能问答
RAGLangChainOpenAI教程知识库问答系统

简介

检索增强生成(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服务。