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

1、开始简单使用rag

文章目录

  • 前言
  • 数据存放
  • 申请api
  • 开始代码
    • 安装依赖
    • 从文件夹中读取文档
    • 文档切块
    • 将分割嵌入并存储在向量库中
    • 检索部分代码
    • 构造用户接口
    • 演示提示
  • 整体代码

前言

本章只是简单使用rag的一个示例,为了引出以后的学习,将整个rag的流程串起来

数据存放

一个示例的文件夹OneFlower下,存放了三种不同类型的文档:

在这里插入图片描述

申请api

本文档中使用的在线api为gpt4,所以需要先申请,如果是国内也可以按照文档使用glm:glm使用文档

开始代码

下面会对每一部分的代码进行说明

安装依赖

pip install langchain
pip install openai
pip install qdrant-client

从文件夹中读取文档

通过便利文件夹OneFlower下,找到所以文件,通过文件的后缀,使用不同的解析器,将解析后的文档存放到documents中

import os
os.environ["OPENAI_API_KEY"] = 'sk-openai的key'# 1.Load 导入Document Loaders
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.document_loaders import TextLoader# 加载Documents
documents = []
for file in os.listdir('OneFlower'): if file.endswith('.pdf'):pdf_path = './OneFlower/' + fileloader = PyPDFLoader(pdf_path)documents.extend(loader.load())elif file.endswith('.docx') or file.endswith('.doc'):doc_path = './OneFlower/' + fileloader = Docx2txtLoader(doc_path)documents.extend(loader.load())elif file.endswith('.txt'):text_path = './OneFlower/' + fileloader = TextLoader(text_path)documents.extend(loader.load())

文档切块

一大片的文档对检索是不友好的,我们需要按照小块进行切分,也就是chunk,每块的大小为200个字符(并且在api中对乱码进行了处理),块与块之间有10个长度的重叠,这种形式的切块使用RecursiveCharacterTextSplitter这个api来操作

# 2.Split 将Documents切分成块以便后续进行嵌入和向量存储
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)

将分割嵌入并存储在向量库中

向量库我们使用的是Qdrant,当然还可以使用faiss或者chromedb都是可以的

# 3.Store 将分割嵌入并存储在矢量数据库Qdrant中
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Qdrant.from_documents(documents=chunked_documents, # 以分块的文档embedding=OpenAIEmbeddings(), # 用OpenAI的Embedding Model做嵌入location=":memory:",  # in-memory 存储collection_name="my_documents",) # 指定collection_name

检索部分代码

这个部分,我们主要狗见了一个大模型的检索,他接收的是vectorstore返回的检索,MultiQueryRetriever的意思是我们需要llm帮我们生成多个MultiQuery,比如:

  • “区块链如何运作?”
  • “区块链的核心技术是什么?”
  • “区块链的数据结构是如何设计的?”
    然后MultiQueryRetriever 依次执行这些查询,并合并结果,最终返回更多相关的文档,提高召回率。

logging的引入,方便我们进行提问的输出

# 4. Retrieval 准备模型和Retrieval链
import logging # 导入Logging工具
from langchain.chat_models import ChatOpenAI # ChatOpenAI模型
from langchain.retrievers.multi_query import MultiQueryRetriever # MultiQueryRetriever工具
from langchain.chains import RetrievalQA # RetrievalQA链# 设置Logging
logging.basicConfig()
logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO)# 实例化一个大模型工具 - OpenAI的GPT-3.5
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)# 实例化一个MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)# 实例化一个RetrievalQA链
# qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever()) # 单个的问题
qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever_from_llm)

构造用户接口

输出一个input,让用户进行提问,只要不是exit就继续,ask_question是执行langchain的调用

# 5. 问答展示
def ask_question(query):# 使用RetrievalQA链来获取答案response = qa_chain(query)# 返回得到的答案return response# 为用户提供交互界面进行问答
while True:# 获取用户的问题user_query = input("请随意提问 (或者输入'exit'退出): ")# 如果用户输入"exit",则退出循环if user_query.lower() == 'exit':break# 使用定义的函数获取答案,并打印answer = ask_question(user_query)print("答案:", answer)print("谢谢使用 QA 系统!")

演示提示

在这里插入图片描述

对应pdf文档中可以看到对应的内容

在这里插入图片描述

在这里插入图片描述

整体代码

整体代码如下,方便在PyCharm中直接运行

import os
os.environ["OPENAI_API_KEY"] = 'sk-openai的key'# 1.Load 导入Document Loaders
from langchain.document_loaders import PyPDFLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.document_loaders import TextLoader# 加载Documents
documents = []
for file in os.listdir('OneFlower'): if file.endswith('.pdf'):pdf_path = './OneFlower/' + fileloader = PyPDFLoader(pdf_path)documents.extend(loader.load())elif file.endswith('.docx') or file.endswith('.doc'):doc_path = './OneFlower/' + fileloader = Docx2txtLoader(doc_path)documents.extend(loader.load())elif file.endswith('.txt'):text_path = './OneFlower/' + fileloader = TextLoader(text_path)documents.extend(loader.load())import os# 设置环境变量
os.environ['http_proxy'] = 'http://127.0.0.1:7890'
os.environ['https_proxy'] = 'http://127.0.0.1:7890'
os.environ['all_proxy'] = 'http://127.0.0.1:7890'# export HTTP_PROXY=http://127.0.0.1:7890; #换成你自己的代理地址
# export HTTPS_PROXY=http://127.0.0.1:7890; #换成你自己的代理地址
# export ALL_PROXY=socks5://127.0.0.1:7890#换成你自己的代理地址# 2.Split 将Documents切分成块以便后续进行嵌入和向量存储
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10)
chunked_documents = text_splitter.split_documents(documents)# 3.Store 将分割嵌入并存储在矢量数据库Qdrant中
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
vectorstore = Qdrant.from_documents(documents=chunked_documents, # 以分块的文档embedding=OpenAIEmbeddings(), # 用OpenAI的Embedding Model做嵌入location=":memory:",  # in-memory 存储collection_name="my_documents",) # 指定collection_name# 4. Retrieval 准备模型和Retrieval链
import logging # 导入Logging工具
from langchain.chat_models import ChatOpenAI # ChatOpenAI模型
from langchain.retrievers.multi_query import MultiQueryRetriever # MultiQueryRetriever工具
from langchain.chains import RetrievalQA # RetrievalQA链# 设置Logging
logging.basicConfig()
logging.getLogger('langchain.retrievers.multi_query').setLevel(logging.INFO)# 实例化一个大模型工具 - OpenAI的GPT-3.5
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)# 实例化一个MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)# 实例化一个RetrievalQA链
# qa_chain = RetrievalQA.from_chain_type(llm,retriever=vectorstore.as_retriever())
qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever_from_llm)# 5. 问答展示
def ask_question(query):# 使用RetrievalQA链来获取答案response = qa_chain(query)# 返回得到的答案return response# 为用户提供交互界面进行问答
while True:# 获取用户的问题user_query = input("请随意提问 (或者输入'exit'退出): ")# 如果用户输入"exit",则退出循环if user_query.lower() == 'exit':break# 使用定义的函数获取答案,并打印answer = ask_question(user_query)print("答案:", answer)print("谢谢使用 QA 系统!")

资源csdn链接:等待更新

http://www.lryc.cn/news/529028.html

相关文章:

  • Linux Samba 低版本漏洞(远程控制)复现与剖析
  • 安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】
  • 【 AI agents】letta:2024年代理堆栈演进(中英文翻译)
  • Java中 instanceof 的用法(详解)
  • 联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸
  • 【RocketMQ 存储】- 一文总结 RocketMQ 的存储结构-基础
  • S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)
  • Cocos Creator 3.8 2D 游戏开发知识点整理
  • 梯度提升用于高效的分类与回归
  • 【单细胞第二节:单细胞示例数据分析-GSE218208】
  • 设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用
  • 新春登蛇山:告别岁月,启航未来
  • hive:基本数据类型,关于表和列语法
  • 安装最小化的CentOS7后,执行yum命令报错Could not resolve host mirrorlist.centos.org; 未知的错误
  • 图论——spfa判负环
  • 软件工程概论试题三
  • 21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)
  • 未来无线技术的发展方向
  • Qt5离线安装包无法下载问题解决办法
  • qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别
  • doris:导入时实现数据转换
  • 新版231普通阿里滑块 自动化和逆向实现 分析
  • 如何构建树状的思维棱镜认知框架
  • openRv1126 AI算法部署实战之——ONNX模型部署实战
  • Vue 组件开发:构建高效可复用的前端界面要素
  • Vue.js组件开发-实现全屏平滑移动、自适应图片全屏滑动切换
  • 水果实体店品牌数字化:RWA + 智能体落地方案
  • DeepSeek模型:开启人工智能的新篇章
  • Kubernetes 环境中的自动化运维实战指南
  • 深入解析 C++17 中的 std::not_fn