【LLM】五、open-webui+ollama搭建自己的RAG服务

news2024/11/26 16:23:53

系列文章目录

往期文章回顾:

【LLM】四、RAG简介

【LLM】三、open-webui+ollama搭建自己的聊天机器人

【LLM】二、python调用本地的ollama部署的大模型

【LLM】一、利用ollama本地部署大模型


文章目录

​​​​​​​

目录

系列文章目录

文章目录

前言

一、RAG是什么

二、搭建自己的RAG服务

1.准备自己的知识库文件

2.open-webui 前期准备工作

3.导入知识库并写入向量库

4.搭建并使用自己的RAG服务

三、扩展知识

1.词向量

2.向量数据库

3.文档切割

总结



前言

        往期文章中,已经讲解了如何用ollama部署本地模型,并通过open-webui来部署自己的聊天机器人,同时也简单介绍了RAG的工作流程,本篇文章将会基于之前的内容来搭建自己的RAG服务,正文开始。


一、RAG是什么

        RAG的相关简介可以去“系列文章四” 中查看,这里不在赘述     

二、搭建自己的RAG服务

1.准备自己的知识库文件

        常见的文档格式一般为txt、doc、PDF等,这里我将选择最简单的txt文档进行导入,需要注意以下几点:

  • 由于目前LLM均有token的限制,所以在写入向量库时会对我们上传的文档进行分割、切块,将较长的文本切分成较小的文本,每段文本即为一个单位的知识。
  • 当PDF、doc中设计到表格、图片时,需要特殊处理,现有框架如open-webui或者lang chain等在加载该类文档时,仅仅会处理文字部分,图片和表格部分均会忽略,如果图片内容对你来说也非常重要的话,需要自己转换下,如OCR识别或者WPS转换(效果针对与具体文档而言,这里不给评价)

这里,我以一个最简单的txt来作为参考,为了方便演示,内容相对简单且简洁,具体如下:

2.open-webui 前期准备工作

        文档准备完成后,写入向量库之前,我们需要先在open-web ui中进行一些前置设置,open-webui的搭建指南可参考“系列文章三”。

  •  首先,我们需要选择选择我们的词向量模型,如m3e,bge等,这里我们拿ollama支持的向量模型,如nomic-embed-text、mxbai-embeded-large来作为示例,模型需要提前在自己的o llama服务中下载,下载方式可参考“系列文章一”。
  • 其次,我们进入我们open-webui的界面,点击“文档”栏,如下:        

       点击文档之后,再点击右上角的文档设置,会出现如下图的设置页面:

                

        点击红框中的箭头,然后会看到我们当前ollama下载的所有模型,如下图:

        

        如果没有列出模型,说明你的ollama中没有模型,可以结合我的往期文章来看看自己少了哪一步。这里我以mxbai-embeded-large为例,选择好模型之后,按照下方指示进行保存设置。如下图:

                

        注意:这里的块参数表示将你的文档切块的大小以及块和块之间文本的重叠度,相关介绍见末尾扩展知识,这个参数按照自己的需求进行设置。因为上方我提供的知识库文字较少,所以这里的块大小我设置为30,块重叠设置为5。

3.导入知识库并写入向量库

        经历了前边几步的配置,我们的所需的基础建设就基本搭建完成了,现在我们便可以导入我们的文档并写入向量数据库。

  • 导入:首先我们在“文档”界面点击“+”,以上传自己的文档,如图:

        

选择我们要上传的文档即可,如图:      

         

  • 查看:上传成功后,等段时间我们的文档会显示在当前界面里,如图:

            ​​​​​​​

     <font color="red">注意:你上传完文档后,会等一段时间(耗时根据文档的大小而定)才会显示出来,这段时间是embedding的过程</font>

  • 另外,我们还可以在“系列文章三中”设置的open-webui挂载的宿主机目录下的vector_db里查看是否有新生成的文件,如图:

  • 如上所示,正常写入向量库时,会在这里生成文件,如果没有,先确定自己查看的目录有没有问题,其次再去查看embedding的过程中是否出现了问题。

4.搭建并使用自己的RAG服务

        经历如上几步,我们的知识库便挂载进去了,现在我们便可以利用我们的知识库进行聊天。

      

        如上图所示,我们新建个聊天窗口并选择所要用的模型,这里以qwen2:1.5b为例,当不使用知识库时间,大模型回答如下:        

        当使用知识库时,只需要在输入问题之前输入“#”,然后选择要挂载的文档即可,如:

        这里选择我门要使用的知识库,然后再输入问题即可,如下:

        

        可以看到,挂了知识库后,大模型的回答和我们想要的基本一致,如此,我们便可以使用自己的知识库来搭建自己的RAG服务了。

三、扩展知识

1.词向量

        在机器学习和自然语言处理(NLP)中,词向量(Embeddings)是一种将非结构化数据,如单词、句子或者整个文档,转化为实数向量的技术。这些实数向量可以被计算机更好地理解和处理。如图所示:

        

它的优势主要包括以下两点:

  • 词向量比文字更适合检索。当我们在数据库检索时,如果数据库存储的是文字,主要通过检索关键词(词法搜索)等方法找到相对匹配的数据,匹配的程度是取决于关键词的数量或者是否完全匹配查询句的;但是词向量中包含了原文本的语义信息,可以通过计算问题与数据库中数据的点积、余弦距离、欧几里得距离等指标,直接获取问题与数据在语义层面上的相似度;
  • 词向量比其它媒介的综合信息能力更强,当传统数据库存储文字、声音、图像、视频等多种媒介时,很难去将上述多种媒介构建起关联与跨模态的查询方法;但是词向量却可以通过多种向量模型将多种数据映射成统一的向量形式。

2.向量数据库

        向量数据库是用于高效计算和管理大量向量数据的解决方案。向量数据库是一种专门用于存储和检索向量数据(embedding)的数据库系统。它与传统的基于关系模型的数据库不同,它主要关注的是向量数据的特性和相似性。

        在向量数据库中,数据被表示为向量形式,每个向量代表一个数据项。这些向量可以是数字、文本、图像或其他类型的数据。向量数据库使用高效的索引和查询算法来加速向量数据的存储和检索过程。

        常见的向量数据库如下:

  •         Chroma:一个轻量级、易用的向量数据库,专注于提供高效的近似最近邻搜索(ANN)。它支持多种向量数据类型和索引方法,使得用户可以轻松集成到现有的应用程序中。Chroma特别适用于小型到中型数据集,是初学者和小型项目的理想选择
  •         Pinecone:一个实时、高性能的向量数据库,专为大规模向量集的高效索引和检索而设计。
  •         Weaviate:结合了向量搜索和图数据库特性的多模态语义搜索引擎。它支持多模态数据(文本、图像等)的语义搜索,让用户能够以前所未有的方式探索和理解数据。
  •         Milvus:支持多种索引类型和查询优化策略,提供卓越的查询性能和扩展性。它特别适用于大规模内容检索、图像和视频搜索等场景
  •         Faiss:提供高效的相似度搜索和稠密向量聚类能力,支持多种索引构建方法和查询策略优化。Faiss易于与深度学习框架集成(如PyTorch),使得用户可以轻松将向量检索功能嵌入到深度学习应用中


                

3.文档切割

        在二.2中我们提到了两个概念,一个是“块大小”,一个是“块重叠”。这里我们简单介绍下这两个的由来及作用。

        由来:由于单个文档的长度往往会超过模型支持的上下文,导致检索得到的知识太长超出模型的处理能力,因此,在构建向量知识库的过程中,我们往往需要对文档进行分割,将单个文档按长度或者按固定的规则分割成若干个块,然后将每个块转化为词向量,存储到向量数据库中。在检索时,我们会以块作为检索的元单位,也就是每一次检索到 k 个块作为模型可以参考来回答用户问题的知识,这个 k 是我们可以自由设定的。

        块大小:每个块包含的字符或 Token (如单词、句子等)的数量

        块重叠:两个块之间共享的字符数量,用于保持上下文的连贯性,避免分割丢失上下文信息


总结

以上就是本篇的全部内容,如有问题,欢迎评论区交流,或+企鹅群:995760755交流,如觉得有用,直接三连带回家,后面将会基于现有框架(如lang chain)自由搭建自己的RAG服务,敬请期待🐶

参考文档:https://zhuanlan.zhihu.com/p/690259710

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

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

相关文章

计算机网络必会面经

1.键入网址到网页显示&#xff0c;期间发生了什么 2.在TCP/IP网络模型中。TCP将数据进行分段后&#xff0c;为什么还需要IP层继续分片 3.详细说明tcp三次握手&#xff0c;为什么是三次&#xff0c;若每次握手丢了&#xff0c;解决办法是什么 4.详细说明tcp四次挥手&#xff…

基于Docker搭建ELK

目录 1.系统操作 2.搭建es 3.kibana(新起终端跟es一起启动) 4.logstash&#xff08;新起终端和es一起启动&#xff09; 5.修改logstash配置文件 6. 创建索引 7. exit #退出容器 8. 在logstash节点插入数据&#xff0c;测试是否能拿取到&#xff08;下面如果本身有数据…

前端如何实现更换项目主题色的功能?

1、场景 有一个换主题色的功能&#xff0c;如下图&#xff1a; 切换颜色后&#xff0c;将对页面所有部分的色值进行重新设置&#xff0c;符合最新的主题色。 2、实现思路 因为色值比较灵活&#xff0c;可以任意选取&#xff0c;所以最好的实现方式是&#xff0c;根据设置的…

springboot文献检索系统-计算机毕业设计源码48521

摘要 文献检索系统主要功能模块包括用户管理、公告信息、新闻资讯、文献信息等&#xff0c;采取面对对象的开发模式进行软件的开发和硬体的架设&#xff0c;能很好的满足实际使用的需求&#xff0c;完善了对应的软体架设以及程序编码的工作&#xff0c;采取MySQL作为后台数据的…

[Git场景]常用工作场景演练

场景1:开发到一半的代码&#xff0c;还没提交&#xff0c;git拉下 对方的代码&#xff0c;但是其中有一个 commit 不想要怎么做 在 Git 中&#xff0c;如果你想拉取远程分支的代码&#xff0c;但不想要某个特定的提交&#xff0c;可以使用以下方法来解决&#xff1a; 方法1&a…

【Python】pandas:排序、重复值、缺省值处理、合并、分组

pandas是Python的扩展库&#xff08;第三方库&#xff09;&#xff0c;为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。 pandas官方文档&#xff1a;User Guide — pandas 2.2.2 documentation (pydata.org) 帮助&#xff1a;可使用help(...)查看函数说明文…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep &#xff08;秒&#xff09;& usleep&#xff08;微秒&#xff09; sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git&#xff08;git版本控制器&#xff09; git的主要…

外卖项目day10---缓存商品/Spring Cache初学、购物车功能

缓存菜品&#xff0c;只需要在DishController中修改一下代码即可 /*** 菜品管理*/ RestController RequestMapping("/admin/dish") Api(tags "菜品相关接口") Slf4j public class DishController {Autowiredprivate DishService dishService;Autowiredpri…

【排序算法】Java实现三大非比较排序:计数排序、桶排序、基数排序

非比较排序概念 非比较排序是一种排序算法&#xff0c;它不通过比较元素之间的大小关系来进行排序&#xff0c;而是基于元素的特征或属性进行排序。这种方法在特定情况下可以比比较排序方法&#xff08;如快速排序、归并排序等&#xff09;更有效率&#xff0c;尤其是在处理大…

时间序列分析方法之 -- 长短期记忆网络(LSTM)原理及Python代码示例

目录 原理 适用情况 Python示例代码 结论 原理 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory Networks&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;设计用于克服传统RNN在处理长序列数据时的梯度消失和梯度爆炸问…

如何在基于滤波框架的绝对定位系统中融合相对观测

文章目录 1 LIO、VIO propagation来代替IMU propagation2 TRO paper: Stochastic Cloning Kalman filter【有待填坑】 以无人驾驶定位系统为例&#xff0c;融合gnss&#xff0c;imu&#xff0c;轮速&#xff0c;camera LaneMatch(frame to map)&#xff0c;lidar scan match(fr…

Qgis 插件升级:3.28到3.34

1、下载 osgeo4w-setup 安装包 下载 获取 osgeo4w-setup.exe 的安装软件&#xff0c;每次下一步就可以了&#xff0c;安装位置可以自己调整 osgeo4w:https://download.osgeo.org/osgeo4w/osgeo4w-setup.exe 2、安装3.34 开发包 搜索qigs&#xff0c;将 desktop&#xff0c;…

开始使用OKR创建注重结果的文化

亚马逊对客户很痴迷。Facebook 行动迅速。成功企业的文化是传说中的东西&#xff0c;而且是正确的。正如管理顾问的名言&#xff1a;文化把战略当早餐吃。 无论行业或规模如何&#xff0c;文化的主要目标是激发企业获胜所需的行为。越来越多的成功要求企业关注结果而非任务&am…

Kafka的入门及简单使用

文章目录 前言一、Kafka 的基本架构&#xff1f;1. Producer&#xff08;生产者&#xff09;2. Broker&#xff08;代理/服务器&#xff09;3. Consumer&#xff08;消费者&#xff09;4. Consumer Group&#xff08;消费者组&#xff09;5. Topic&#xff08;主题&#xff09;…

docker前端部署

挂载&#xff0c;把自己的目录位置&#xff0c;挂载到容器内的HTML

万亿赛道!AI 大模型典型应用深度分析 2024

大模型由于其强大的自然语言与多模态信息处理能力&#xff0c;可以应对不同语义粒度下的任务,进行复杂的逻辑推理&#xff0c;还具有超强的迁移学习和少样本学习能力, 可以快速掌握新的任务, 实现对不同领域、不同数据模式的适配&#xff0c;这些特点使得大模型较容易的赋能其他…

吴恩达机器学习C1W2Lab05-使用Scikit-Learn进行线性回归

前言 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做scikit-learn。这个工具包包含了你将在本课程中使用的许多算法的实现。 目标 在本实验中&#xff0c;你将: 利用scikit-learn实现使用梯度下降的线性回归 工具 您将使用scikit-learn中的函数以及matplotli…

付费进群系统源码原版最新修复全开源版

付费进群&#xff0c;和平时所见到的别人拉你进群是不一样的&#xff0c;付费进群需要先缴费以后&#xff0c;才会看到群的二维码&#xff0c;扫码进群或者是长按二维码图片识别进群&#xff0c;付费进群这个功能广泛应用于拼多多的砍价群&#xff0c;活动的助力群&#xff0c;…

Chapter 21 深入理解JSON

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、JSON数据格式1. 什么是JSON&#xff1f;2. JSON数据的格式 二、JSON格式数据转化三、格式化JSON数据的在线工具 前言 在当今数据驱动的世界中&#xff0c;JSON&…

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM&#xff08;大型语言模型&#xff09;的生成式人工智能。简而言之&#xff0c;这些模型是在大量数据&#xff08;包括一堆在线可用的 SQL 查询&#xff09;上进行训练的&#xff0c;并通过预测响应提示中最…