基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例
以下是一个基于RAG(Retrieval Augmented Generation)架构的简单问答系统的Python实现示例。这个系统使用langchain
库进行文档处理、检索,以及与大语言模型交互。
import os
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = "your_openai_api_key"
def setup_rag_system(doc_path):
# 加载文档
loader = TextLoader(doc_path)
documents = loader.load()
# 文本分割
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 生成嵌入
embeddings = OpenAIEmbeddings()
docsearch = FAISS.from_documents(texts, embeddings)
# 加载问答链
chain = load_qa_chain(OpenAI(), chain_type="stuff")
return docsearch, chain
def answer_question(docsearch, chain, question):
# 检索相关文档
docs = docsearch.similarity_search(question)
# 生成回答
answer = chain.run(input_documents=docs, question=question)
return answer
if __name__ == "__main__":
doc_path = "your_document_path.txt"
docsearch, chain = setup_rag_system(doc_path)
while True:
question = input("请输入你的问题(输入 '退出' 结束): ")
if question == "退出":
break
response = answer_question(docsearch, chain, question)
print("回答:", response)
代码说明:
- 设置环境:设置OpenAI API密钥,这是使用OpenAI模型和嵌入服务所必需的。
- 文档加载与处理:使用
TextLoader
加载文档,然后使用CharacterTextSplitter
将文档分割成小块。 - 嵌入生成与向量存储:使用
OpenAIEmbeddings
生成文档块的嵌入向量,并使用FAISS
存储这些向量,以便后续检索。 - 问答链设置:使用
load_qa_chain
加载问答链,该链将使用OpenAI模型生成回答。 - 问题回答:对于用户输入的问题,系统会检索相关文档,并使用问答链生成回答。
使用方法:
- 替换
your_openai_api_key
为你自己的OpenAI API密钥。 - 替换
your_document_path.txt
为你实际的文档路径。 - 运行脚本,输入问题,输入“退出”结束程序。