通过 Ollama、Langchain 实现 RAG

RAG 是什么

RAG 在 Langchain 上的定义是,作为大语言模型最常用的场景就是问答系统,可以针对特别来源数据做问题回答,就是私有数据,这就是 RAG,英文全称是Retrieval Augmented Generation。就是对现有模型数据的增广,大语言模型都是在公众数据上训练,而且只是拿到了某一个时间点之前的数据。我查了一下 GPT,他最新的数据是 2023年 12 月,数据还是很新的。但是对于一些私有数据,模型肯定是没有的,对数据的增广就很有必要。

RAG 架构

RAG主要包括两个主要部分,首先是索引,从源头获取数据并进行索引的流程,例如从 PDF 获取数据,这通常在离线进行。第二步是搜索和生成,在运行时接收用户查询语句,从索引中检索相关数据,然后传递给模型。其实这个很像 ES 的全文检索,只是 ES 没有那么高级,ES 用的是分词,通过匹配进行查找。而 RAG 这里的分词用的是向量数据库,查找方式是相似度。

索引
  1. 首先导入文件,通过文件 Loader 可以导入 PDF、Word 等。
  2. 切分,将大文档进行切分,切分文档对索引和模型都有好处,搜索大文档对性能是很大的挑战,对于模型而言,模型的上下文是有限的,短小的上下文肯定更好,虽然现在模型的上下文都已经很大了。
  3. Embedding, 将切分的文档进行 embedding,向量化。
  4. 存储,要将索引进行保存,以便后续进行搜索。

在这里插入图片描述

搜索并生成

最后,根据用户输入的查询语句向量化后,在向量数据库中进行查询匹配,并将数据库的返回的结果和用户的查询语句一起发送给模型。
在这里插入图片描述

下面我们通过一个例子实现 chatpdf,用 langchain 加 ollama 进行实现RAG,运行在 Mac 上,性能可以接受。

安转依赖
conda create --name rag python=3.10
conda activate rag
pip install langchain
pip install streamlit
pip install chromadb
pip install pypdf
运行 chatpdf

模型用的 qwen:7b,需要把 ollama 运行起来。

from langchain.chains import RetrievalQA
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.callbacks.manager import CallbackManager
from langchain_community.llms import Ollama
from langchain_community.embeddings.ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
import streamlit as st
import os
import timeif not os.path.exists('files'):os.mkdir('files')if not os.path.exists('jj'):os.mkdir('jj')if 'template' not in st.session_state:st.session_state.template = """You are a knowledgeable chatbot, here to help with questions of the user. Your tone should be professional and informative.Context: {context}History: {history}User: {question}Chatbot:"""
if 'prompt' not in st.session_state:st.session_state.prompt = PromptTemplate(input_variables=["history", "context", "question"],template=st.session_state.template,)
if 'memory' not in st.session_state:st.session_state.memory = ConversationBufferMemory(memory_key="history",return_messages=True,input_key="question")
if 'vectorstore' not in st.session_state:st.session_state.vectorstore = Chroma(persist_directory='jj',embedding_function=OllamaEmbeddings(base_url='http://localhost:11434',model="qwen:7b"))
if 'llm' not in st.session_state:st.session_state.llm = Ollama(base_url="http://localhost:11434",model="qwen:7b",verbose=True,callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),)# Initialize session state
if 'chat_history' not in st.session_state:st.session_state.chat_history = []st.title("PDF Chatbot")# Upload a PDF file
uploaded_file = st.file_uploader("Upload your PDF", type='pdf')for message in st.session_state.chat_history:with st.chat_message(message["role"]):st.markdown(message["message"])if uploaded_file is not None:if not os.path.isfile("files/"+uploaded_file.name+".pdf"):with st.status("Analyzing your document..."):bytes_data = uploaded_file.read()f = open("files/"+uploaded_file.name+".pdf", "wb")f.write(bytes_data)f.close()loader = PyPDFLoader("files/"+uploaded_file.name+".pdf")data = loader.load()# Initialize text splittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=1500,chunk_overlap=200,length_function=len)all_splits = text_splitter.split_documents(data)# Create and persist the vector storest.session_state.vectorstore = Chroma.from_documents(documents=all_splits,embedding=OllamaEmbeddings(model="qwen:7b"))st.session_state.vectorstore.persist()st.session_state.retriever = st.session_state.vectorstore.as_retriever()# Initialize the QA chainif 'qa_chain' not in st.session_state:st.session_state.qa_chain = RetrievalQA.from_chain_type(llm=st.session_state.llm,chain_type='stuff',retriever=st.session_state.retriever,verbose=True,chain_type_kwargs={"verbose": True,"prompt": st.session_state.prompt,"memory": st.session_state.memory,})# Chat inputif user_input := st.chat_input("You:", key="user_input"):user_message = {"role": "user", "message": user_input}st.session_state.chat_history.append(user_message)with st.chat_message("user"):st.markdown(user_input)with st.chat_message("assistant"):with st.spinner("Assistant is typing..."):response = st.session_state.qa_chain(user_input)message_placeholder = st.empty()full_response = ""for chunk in response['result'].split():full_response += chunk + " "time.sleep(0.05)# Add a blinking cursor to simulate typingmessage_placeholder.markdown(full_response + "▌")message_placeholder.markdown(full_response)chatbot_message = {"role": "assistant", "message": response['result']}st.session_state.chat_history.append(chatbot_message)else:st.write("Please upload a PDF file.")

启动chatpdf

streamlit run app.py

上传 PDF,输入问题,就可以和模型对话PDF 中的内容了。
在这里插入图片描述

RAG 是数据增广,也可以说是数据过滤,按照今天大模型的发展,上下文的长度已经卷到200 万个汉字的无损上下文,那么 RAG 会不会以后就不需要了,每次对话都把文档带上,让我们拭目以待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821563.shtml

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

相关文章

强化学习(二)马尔科夫决策过程 MDP

文章目录 1. 什么是马尔科夫过程2. 强化学习与MDP的关系3. 价值函数的贝尔曼方程3.1 状态价值函数的贝尔曼方程3.2 动作价值函数的贝尔曼方程3.3 价值函数递推关系的转换 4. 最优价值函数5. MDP计算最优值函数实例 1. 什么是马尔科夫过程 马尔科夫过程(Markov Deci…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序,通常位于用户设备上。也称为用户端,是相对于服务器而言的。它主要指安装在用户设备上的程序,这些程序能够与服务器进行通信,从而获取服务或者执行特定功能。在…

Spark安装教程

Spark安装教程 文章目录 Spark安装教程1. 检查jdk版本2. 获取Spark版本安装资源3.环境变量4.配置文件5. 重启Hadoop集群(使配置生效)6. 启动Spark集群6.1 查看Spark服务6.2 访问Spark WEB UI 7. 启动 Spark-Shell 测试 Scala 交互式环境8. 测试Spark On Yarn9.关闭Spark集群 1.…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件…

STM32-ADC(独立模式、双重模式)

ADC简介 18个通道:外部信号源就是16个GPIO回。在引脚上直接接模拟信号就行了,不需要侄何额外的电路。引脚就直接能测电压。2个内部信号源是内部温度传感器和内部参考电压。 逐次逼近型ADC: 它是一个独立的8位逐次逼近型ADC芯片,这个ADC0809是…

性能测试 Jmeter 非 GUI 模式 -CLI 命令详解

我们在使用Jmeter做性能测试的时候,大部分同学用的是图形化界面进行脚本编写和执行性能测试的。但是其实真正在公司执行性能测试的时候,我们基本上不会用图形化界面去执行测试,这是因为工具渲染这些图形本身会让Jmeter结果存在很多不稳定的因…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天,可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点,深受消费者喜爱。然而,随着可穿戴设备市场的快速扩张,其安全性和可靠性问题也日益凸显。为了确保产品质量,…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下: ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学?为什么随机性很重要?三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

Spring、SpringMVC、SpringBoot核心知识点(持续更新中)

Spring、SpringMVC、SpringBoot核心知识点(持续更新中) Spring Bean 的生命周期Spring 的 IOC 与 AOPSpring Bean 循环依赖Spring MVC 处理请求的过程Spring Boot 自动装配原理Spring Boot 启动流程 Spring Bean 的生命周期 参考文章:一文读…

HBase的数据模型与架构

官方文档:Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文,HBase建立在Hadoop之上,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于…

mac上 Sublime Text 无法使用 Package Control

我也不知道什么时候用不了的,平时就是用来看看文本文件,因为觉得这个玩意真的很快 今天想安装一个包,发现 cmd shift P 是出来那个窗口了,但是输入什么都没反应,于是在 github 上找到了解决方案 打开终端执行以下命…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 , System ILA 核已被废 弃。现在 , 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

安达发|体育产业体育装备生产车间APS排产软件

在体育产业中,体育装备的生产是保障运动员成绩和安全的关键一环。随着市场需求的多样化和个性化,传统的生产排程方法已经难以满足现代体育装备生产的复杂性和灵活性。因此,应用高级排产软件(APS)进行生产计划和控制成为…

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型)

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型) RD77MS2用户手册,RD77MS2外部连接,RD77MS2规格。RD77MS2参数说明:2轴;SSCNETⅢ/H连接,位置控制、同步控制、速度.转矩控制、轨迹控制;控制单位mm、inch、degree、pulse;定位数据600数据轴。 RD77MS2图…

APIGateway的认证

APIGateway的支持的认证如下: 我们从表格中可以看到,HTTP API 不支持资源策略的功能,另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证,这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…

AR、VR、MR 和 XR——它们的含义以及它们将如何改变生活

我们的工作、娱乐和社交方式正在发生巨大变化。远程工作的人比以往任何时候都多,屏幕已成为学习和游戏的领先平台。这种演变为元宇宙铺平了道路——如今,像 Meta Quest 2 这样的流行设备将您无缝地带入一个身临其境的世界,您可以在其中购物、创作和玩游戏、与同事协作、探索…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码:https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件,感觉自己被困在数字迷宫中吗?无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档?好吧,不用再担心了!本指南解开了在 Windows 上掌握 PDF 的秘密,其中包含 10 款适用于 …

04 MySQL --DQL 专题--Union、exists

1. UNION、UNION ALL UNION 关键字的作用? 合并两个或多个 SELECT 语句的结果。发挥的作用与 or 非常相似 UNION关键字生效的前提? 每个 SELECT 语句必须拥有相同数量的列。每个 SELECT 语句中的列的顺序必须相同。列必须拥有相似的数据类型。 SELEC…