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.mzph.cn/web/67509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 标准库 - `<errno.h>`

C 标准库 - <errno.h> 引言 在C语言编程中,正确处理错误是保证程序稳定性和可靠性的关键。C标准库中的<errno.h>头文件提供了错误码定义和宏,使得开发者能够更好地管理和处理程序运行过程中可能出现的错误。本文将详细介绍<errno.h>头文件的作用、常用错…

爱书爱考平台说明

最近我开发了一个综合性的考试平台&#xff0c;内容包括但不限于职业资格证考试、成人教育、国家公务员考试等内容。目前1.0版本已经开发完成&#xff0c;其他的功能陆续完善中。 微信小程序搜索"爱书爱考" 微信小程序图标如下图: 目前维护了java相关的面试题的考题…

ZZNUOJ(C/C++)基础练习1011——1020(详解版)

目录 1011 : 圆柱体表面积 C语言版 C版 1012 : 求绝对值 C语言版 C版 1013 : 求两点间距离 C语言版 C版 1014 : 求三角形的面积 C语言版 C版 1015 : 二次方程的实根 C语言版 C版 1016 : 银行利率 C语言版 C版 1017 : 表面积和体积 C语言版 C版 代码逻辑…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

认识小程序的基本组成结构

1.基本组成结构 2.页面的组成部分 3.json配置文件 4.app.json文件(全局配置文件&#xff09; 5.project.config.json文件 6.sitemap.json文件 7.页面的.json配置文件 通过window节点可以控制小程序的外观

git中有关old mode 100644、new mode 10075的问题解决小结

在 Git 版本控制系统中&#xff0c;文件权限变更是一种常见情况。当你看到类似 old mode 100644 和 new mode 100755 的信息时&#xff0c;这通常表示文件的权限发生了变化。本文将详细解析这种情况&#xff0c;并提供解决方法和注意事项。 问题背景 在 Git 中&#xff0c;文…

20个整流电路及仿真实验汇总

0、 前言 以下是关于“20个整流电路及仿真实验汇总”的前言部分: 在现代电力电子技术领域,整流电路作为将交流电(AC)转换为直流电(DC)的关键电路,广泛应用于各类电源设计、信号处理以及电力电子设备中。整流电路不仅能够为电子设备提供稳定的直流电源,还在电力传输、…

截取窗口的完整矩形不包括阴影区域(含边框和标题栏)

在Windows编程中&#xff0c;GetWindowRect 函数用于获取窗口的矩形区域&#xff0c;包括窗口的边框和标题栏。如果你希望获取窗口的客户区&#xff08;不包含窗口边框、标题栏和阴影区域&#xff09;&#xff0c;可以使用 GetClientRect 函数。 区别 GetWindowRect&#xff1…

第30章 测试驱动开发中的设计模式解析(Python 版)

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

2025美赛复盘总结反思(论文手)

充实的经历&收获 美赛这个过程&#xff0c;确实逼着自己学了不少东西&#xff0c;excel本身&#xff0c;以及发现Ai确实能帮忙处理不少的了&#xff0c;也第一次发现原来自己熬通宵也能很精神&#xff08;当然确实是伤身体的&#xff09; 好的经验&#xff1a; 积极搜索…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)

目录 协议层设计&#xff0c;以IIC为例子 关于软硬件IIC 设计的一些原则 完成协议层的抽象 刨析我们的原理 如何完成我们的抽象 插入几个C语言小技巧 完成软件IIC通信 开始我们的IIC通信 结束我们的IIC通信 发送一个字节 &#xff08;重要&#xff09;完成命令传递和…

举例说明python单利模式的必要性

单例模式的核心目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种设计模式在某些场景下非常必要&#xff0c;尤其是在需要严格控制资源访问、共享状态或配置管理的场景中。下面通过几个具体的例子来说明Python中单例模式的必要性。 1. 数据库…

【腾讯云】腾讯云docker搭建单机hadoop

这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…

设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用

文章目录 概述1. 核心思想2. 结构3. 示例代码4. 优点5. 缺点6. 适用场景7. 案例&#xff1a;模板方法模式在数据处理中的应用案例背景UML搭建抽象基类 - 数据处理的 “总指挥”子类定制 - 适配不同供应商供应商 A 的数据处理器供应商 B 的数据处理器 在业务代码中整合运用 8. 总…

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…

C基础寒假练习(3)

一、求数组中的第二大值 #include <stdio.h> int main() {int arr[] {12, 35, 1, 10, 34, 1};int size sizeof(arr) / sizeof(arr[0]);if (size < 2) {printf("数组元素不足两个\n");return 0;}int first -2147483648, second -2147483648; // 使用IN…

【linux三剑客】grep练习题

题目 进入/lianxi目录&#xff0c;复制/etc/passwd到当前目录下&#xff0c;然后对passwd进行操作查找出当前passwd文件中以ftp或者mail开头的行&#xff0c;在屏幕上输出。查找出当前passwd文件中有没有以r、m、f开头的行&#xff0c;在屏幕上输出。查找出当前passwd文件中以…

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…

【Node.js】Koa2 整合接口文档

部分学习来源&#xff1a;https://blog.csdn.net/qq_38734862/article/details/107715579 依赖 // koa2-swagger-ui UI视图组件 swagger-jsdoc 识别写的 /***/ 转 json npm install koa2-swagger-ui swagger-jsdoc --save配置 config\swaggerConfig.js const Router requir…

Maven的单元测试

1. 单元测试的基本概念 单元测试&#xff08;Unit Testing&#xff09; 是一种软件测试方法&#xff0c;专注于测试程序中的最小可测试单元——通常是单个类或方法。通过单元测试&#xff0c;可以确保每个模块按预期工作&#xff0c;从而提高代码的质量和可靠性。 2.安装和配…