当前位置: 首页 > article >正文

基于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)
    

代码说明:

  1. 设置环境:设置OpenAI API密钥,这是使用OpenAI模型和嵌入服务所必需的。
  2. 文档加载与处理:使用TextLoader加载文档,然后使用CharacterTextSplitter将文档分割成小块。
  3. 嵌入生成与向量存储:使用OpenAIEmbeddings生成文档块的嵌入向量,并使用FAISS存储这些向量,以便后续检索。
  4. 问答链设置:使用load_qa_chain加载问答链,该链将使用OpenAI模型生成回答。
  5. 问题回答:对于用户输入的问题,系统会检索相关文档,并使用问答链生成回答。

使用方法:

  1. 替换your_openai_api_key为你自己的OpenAI API密钥。
  2. 替换your_document_path.txt为你实际的文档路径。
  3. 运行脚本,输入问题,输入“退出”结束程序。

http://www.kler.cn/a/595498.html

相关文章:

  • 网络安全学习-博客文序记
  • PbootCMS经常被黑怎么办?
  • Java 中 PriorityQueue 的底层数据结构及相关分析
  • java 并发编程之线程池与自定义线程池介绍
  • 如何 使用 Docker 部署 ollama 和 MaxKB
  • 如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化
  • Linux系统-TCPDump流量
  • C++Primer学习(13.1 拷贝、赋值与销毁)
  • 通过Knife4j在gateway中对swagger文档进行聚合
  • 流程优化的可配置文档结构化系统设计
  • 计算机网络精讲day1——计算机网络的性能指标(上)
  • 【人工智能】如何理解transformer中的token?
  • 【AI知识】pytorch手写Attention之Self-Attention,Multi-Head-Attention
  • vue3源码分析 -- computed
  • 深度解析学术论文成果评估(Artifact Evaluation):从历史到现状
  • 【问题解决】Postman 测试报错 406
  • 深入理解Java虚拟机(学习笔记)
  • java基础--序列化与反序列化的概念是什么?
  • 关于FastAPI框架的面试题及答案解析
  • 查看visual studio的MSVC版本的方法