以下是一个基于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, chaindef answer_question(docsearch, chain, question):# 检索相关文档docs = docsearch.similarity_search(question)# 生成回答answer = chain.run(input_documents=docs, question=question)return answerif __name__ == "__main__":doc_path = "your_document_path.txt"docsearch, chain = setup_rag_system(doc_path)while True:question = input("请输入你的问题(输入 '退出' 结束): ")if question == "退出":breakresponse = 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
为你实际的文档路径。 - 运行脚本,输入问题,输入“退出”结束程序。