本地私有化RAG知识库搭建—基于Ollama+AnythingLLM保姆级教程

news2024/11/26 13:26:27

一、关于RAG

1.1 简介

检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合了信息检索和语言模型的技术,它通过从大规模的知识库中检索相关信息,并利用这些信息来指导语言模型生成更准确和深入的答案。这种方法在2020年由Meta AI研究人员提出,旨在解决大型语言模型(LLM)在信息滞后、模型幻觉、私有数据匮乏和内容不可追溯等问题。

即:RAG 就是可以开卷回复的 LLM

8888

1.2 发展

RAG技术的发展历程可以分为三个主要阶段:

  1. Naive RAG:这是RAG技术的基础阶段,它包括了索引(Indexing)、检索(Retrieval)和生成(Generation)三个基本步骤。在这个阶段,RAG通过整合外部知识库来增强LLMs,但是存在一些限制,例如准确性低、召回低、组装prompt的问题以及灵活性问题。
  2. Advanced RAG:为了解决Naive RAG的不足,Advanced RAG阶段引入了预检索和后检索策略,改进了索引方法,并引入了各种方法来优化检索过程。这一阶段的RAG通过更精细的数据清洗、设计文档结构和添加元数据等方法提升文本的一致性、准确性和检索效率。
  3. Modular RAG:在模块化RAG阶段,RAG结构提供了更大的灵活性和适应性。它整合了各种方法来增强功能模块,例如加入搜索模块进行相似性检索,并在检索器中应用微调方法。模块化RAG允许通过多个模块进行序列化流水线或端到端训练,提供了更大的灵活性和适应性。

随着技术的发展,RAG技术也在不断进步,包括个性化、可自定义行为、可扩展性、混合模型和实时的低延迟部署等方面。这些趋势预示着RAG技术将在未来变得更加智能和高效,为各种应用程序提供更多样化的支持。RAG技术的应用已经不仅仅局限于问答系统,其影响力正在扩展到更多领域,如推荐系统、信息抽取和报告生成等。

1.3 背景

自 ChatGPT 发布以来,大型语言模型(Large Language Model,LLM,大模型)得到了飞速发展,它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。

然而,在一些垂直领域,这些开源或闭源的通用基础大模型也暴露了一些问题,主要体现在以下 3 个方面:

  1. 知识的局限性: 大模型的知识源于训练数据,目前主流大模型(如:通义千问、文心一言等)的训练数据基本来源于网络公开的数据。因此,非公开的、离线的、实时的数据大模型是无法获取到(如:团队内部实时业务数据、私有的文档资料等),这些数据相关的知识也就无从具备。
  2. 幻觉问题: 大模型生成人类文本底层原理是基于概率(目前还无法证明大模型有意识),所以它有时候会一本正经地胡说八道,特别是在不具备某方面的知识情况下。当我们也因缺乏这方面知识而咨询大模型时,大模型的幻觉问题会各我们造成很多困扰,因为我们也无法区分其输出的正确性。
  3. 数据的安全性: 对于个人、创新团队、企业来说,数据安全至关重要,老牛同学相信没有谁会愿意承担数据泄露的风险,把自己内部私有数据上传到第三方平台进行模型训练。这是一个矛盾:我们既要借助通用大模型能力,又要保障数据的安全性!

为了解决以上通用大模型问题,检索增强生成(Retrieval-Augmented Generation,RAG)方案就应运而生。

1.4 工作原理

6666

RAG 的主要流程主要包含以下 2 个阶段:

  1. 数据准备阶段: 管理员将内部私有数据向量化后入库的过程,向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果;入库即将向量数据构建索引,并存储到向量数据库的过程。
  2. 用户应用阶段: 根据用户的 Prompt 提示词,通过检索召回与 Prompt 提示词相关联的知识,并融入到原 Prompt 提示词中,作为大模型的输入 Prompt 提示词,通用大模型因此生成相应的输出。

从上面 RAG 方案我们可以看出,通过与通用大模型相结合,我们可搭建团队私有的内部本地知识库,并能有效的解决通用大模型存在的知识局限性幻觉问题隐私数据安全等问题。

1.5 实现方案

目前市面上已经有多个开源 RAG 框架,这里将选择AnythingLLM框架(16.8K ☆ ,https://github.com/Mintplex-Labs/anything-llm)与大家一起来部署我们自己或者团队内部的本地知识库。整个部署过程将涉及以下几个方面:

  1. 环境准备: AnythingLLM框架推荐使用 Docker 部署,因此我们需要提前把 Docker 安装和配置好
  2. 大模型准备: 老牛同学继续使用Qwen2-7B大模型,大家可以根据自己实际情况选择,无特殊要求
  3. RAG 部署和使用: 即 AnythingLLM 安装和配置,并最终使用我们大家的 RAG 系统

二、环境准备

Windows 打开虚拟化功能(Hyper-V 和 WSL)

友情提示: 这里用的是 Windows 操作系统,因此下面是 Windows 的配置方式。

安装 Docker 需要用到虚拟化,因此需要 Windows 系统打开Hyper-VWSL 子系统功能。如果是 Windows 11 家庭版,默认并没有安装Hyper-V功能,可以通过以下方式进行安装:

image

【第一步(家庭版):安装 Hyper-V 依赖包】

  1. 新建一个 txt 临时文本,并复制以下代码并保存,之后把该临时文件重命名为Hyper-V.bat
  2. 右键以管理员方式运行Hyper-V.bat​,本代码自动安装相关包,完成之后输入Y​重启电脑后即可
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

【第二步:开启虚拟化功能】

首先,打开 Windows 功能(即:控制面板):

image

然后,勾选以下 3 个选项(Hyper-V适用于 Linux 的 Windows 子系统虚拟机平台),打开虚拟化功能:

image
打开虚拟化功能

点击确定之后重启电脑即可!

三、Docker Desktop安装配置

这里之前文章有介绍,可参考,这里不再赘述

image

四、AnythingLLM 安装和配置

接下来,开始安装和部署AnythingLLM框架,包含以下 3 步:

4.1 下载 AnythingLLM 镜像

docker pull mintplexlabs/anythingllm

image

image

4.2 启动AnythingLLM 镜像

Windows 系统: AnythingLLM 镜像挂载和启动命令(因为命令有多行,需要通过PowerShell执行):

# Run this in powershell terminal
$env:STORAGE_LOCATION="$HOME\Documents\anythingllm"; `
If(!(Test-Path $env:STORAGE_LOCATION)) {New-Item $env:STORAGE_LOCATION -ItemType Directory}; `
If(!(Test-Path "$env:STORAGE_LOCATION\.env")) {New-Item "$env:STORAGE_LOCATION\.env" -ItemType File}; `
docker run -d -p 3001:3001 `
--cap-add SYS_ADMIN `
-v "$env:STORAGE_LOCATION`:/app/server/storage" `
-v "$env:STORAGE_LOCATION\.env:/app/server/.env" `
-e STORAGE_DIR="/app/server/storage" `
mintplexlabs/anythingllm;

image

image

启动完成,通过浏览器打开AnythingLLM界面:http://localhost:3001

image

4.3 配置 AnythingLLM

点击Get started 按钮,进入LLM 选择页面。在这里选择Ollama方式。

如果大家重新设置了端口号,则需要看下 Ollama URL 端口号是否正确,默认值为:http://host.docker.internal:11434

image

这里可以根据情况,配置当前用户使用,还是团队使用

image

image

image

image

AnythingLLM 设置确认,包括:大模型提供方、词嵌入和向量数据库,这些配置后续还可以修改。

最后,创建一个工作区,这里设置的名称为:My workspace

五、AnythingLLM 导入数据和使用

上一步配置完成之后,无需任何其他配置,就可以和大模型对话聊天了,和通过其他客户端与大模型对话没有区别。接下来,我们需要导入我们内部私有数据,并进行验证。

5.1 导入内部数据

我们在电脑本地新建一个 txt 文件,文件名为:为什么个人、团队等均有必要部署私有化的RAG知识库系统.txt​,文件内容就是本文的开头内容:

自ChatGPT发布以来,大型语言模型(Large Language Model,LLM,大模型)得到了飞速发展,它在解决复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。


然而,在一些垂直领域,这些开源或闭源的通用的基础大模型也暴露了一些问题,主要有以下3个方面:


1. **知识的局限性:** 大模型的知识源于训练数据,目前主流大模型(如:通义千问、文心一言等)的训练数据基本来源于网络公开的数据。因此,非公开的、离线的、实时的数据大模型是无法获取到(如:团队内部实时业务数据、私有的文档资料等),这些数据相关的知识也就无从具备。
2. **幻觉问题:** 大模型生成人类文本底层原理是基于概率(目前还无法证明大模型有意识),所以它有时候会**一本正经地胡说八道**,特别是在不具备某方面的知识情况下。当我们也因缺乏这方面知识而咨询大模型时,大模型的幻觉问题会各我们造成很多困扰,因为我们也无法区分其输出的正确性。
3. **数据的安全性:** 对于个人、创新团队、企业来说,**数据安全**至关重要,老牛同学相信没有谁会愿意承担数据泄露的风险,把自己内部私有数据上传到第三方平台进行模型训练。这是一个矛盾:我们既要借助通用大模型能力,又要保障数据的安全性!


为了解决以上3个大模型通用问题,**检索增强生成**(Retrieval-Augmented Generation,**RAG**)方案就应运而生了!

首先,点击RAG-ClassmateWX工作空间右边的上传图标,准备上传本 txt 文件:

image

准备上传文件;然后,点击 txt 文件并上传,并点击Move to workspace导入到工作空间:

image

image

image

上传txt外部文件。最后,点击Save and Embed完成 txt 文本文件数据准备步骤(导入、向量化和入库等)。

5.2 内部数据使用和验证

回到主界面,输入刚才 txt 内部文件名:为什么个人、团队等均有必要部署私有化的 RAG 知识库系统

image

同时,用同样的问题,咨询 AnythingLLM 的底层模型,大家可以对比看下:

image

六、总结和问题

和之前的大模型部署和应用过程相比,基于 AnythingLLM 的 RAG 实现整个部署过程比较繁琐,包括环境准备、Docker 安装和配置、AnythingLLM 配置等。然而,AnythingLLM 的使用过程却相对比较简单,只需要上传数据文件,AnythingLLM 框架屏蔽了中间的数据提取分割、向量化处理、向量索引和入库、检索召回和重组 Prompt 提示词等过程。

同时,通过构建本地知识库,做了一个简单的测试验证,测试结果表明,在使用 RAG 的情况下,大模型的回答结果更加有效、更符合我们期望,同时具备了一定的创造性!

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

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

相关文章

UEC++学习(十七)利用SceneCaptureComponent2d进行截图

最近有个需求是需要将场景中的actor进行截图,并且将截图保存成png,png中需要将场景背景忽略掉,只显示特定的actor。 这里是通过SceneCapture2d组件捕捉场景后,将背景的alpha通道设置为0,实现背景透明的功能。 &#x…

2024年音频转文字软件哪家强?4 款等你来测

hello,今天来聊聊一个超级方便的小工具,它能帮你把声音直接变成文字!想想看,现在谁没有几个音频文件要处理的,比如记笔记的声音、开会的录音、做采访的素材,这些都能搞定。别着急,我现在就给你们…

static 的作用,static 在类中使用的注意事项(定义、初始化和使用),static 全局变量和普通全局变量的异同

目录 1. static 的基本作用 2. static 在类中的使用 2.1 静态成员变量 2.2 静态成员函数 3. static 变量在全局作用域中的使用 3.1 static 全局变量 3.2 普通全局变量 4. static 局部变量 5. static 全局变量与普通全局变量的异同 static 在类中的静态成员变量和成员函…

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等…

mingw c++/qt使用grpc方法详细教程

1. RPC框架 RPC框架是什么 RPC 框架说白了就是让你可以像调用本地方法一样调用远程服务提供的方法,而不需要关心底层的通信细节。简单地说就让远程服务调用更加简单、透明。 RPC包含了客户端(Client)和服务端(Server) 业界主流的 RPC 框架整体上分为三类: 1> 支持多语…

Springboot课堂评测系统的设计与实现---附源码82642

目 录 摘要 Abstract 1 绪论 1.1 研究背景与意义 1.2 开发技术和开发特点 1.3论文结构与章节安排 2 课堂评测系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.…

MyBatis-pulsdruid数据源

MyBatis-Plus 是 MyBatis 的增强工具,主要用于简化数据库操作和提升开发效率。Druid 是阿里巴巴开源的数据库连接池组件,提供了高效的数据库连接管理和监控功能。将这两者结合使用可以更好地管理和操作数据库。以下是 MyBatis-Plus 和 Druid 数据源的总结…

数据重删技术

目录 一、名词介绍 二、重删概述 三、重删分类 四、源端重删 一、名词介绍 指纹:不同数据块数据通过哈希算法所生成的唯一标识。 重删率:(1 - 实际备份数据量 / 已完成数据量)* 100%。 重删卷:存放指纹库的物理卷。…

JAVA一键开启缘分之旅红娘相亲交友系统小程序源码

一键开启缘分之旅 —— 红娘相亲交友系统 💖 初遇心动,一键启程 在这个快节奏的时代,找到那个对的人似乎成了一种奢侈。但别担心,有了“红娘相亲交友系统”,你的缘分之旅只需一键即可开启!无需复杂的注册流…

【网页播放器】播放自己喜欢的音乐

// 错误处理 window.onerror function(message, source, lineno, colno, error) {console.error("An error occurred:", message, "at", source, ":", lineno);return true; };// 检查 particlesJS 是否已定义 if (typeof particlesJS ! undefi…

【Day10-配置文件日志多线程】

配置文件 介绍 配置文件 在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死我们把这种存放程序配置信息的文件,统称为配置文件 Properties 是一个Map集合(键值对集合)&am…

推荐系统的基础_协同过滤(CF)

协同过滤(Collaborative Filtering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型: 1. 用户基协同过滤(User-based Collaborative Filt…

OceanMind海睿思“一种业务驱动数据治理的方法和系统”获国家发明专利!

近日,中新赛克海睿思最新技术:一种业务驱动数据治理的方法和系统(专利号ZL 202410567107.8),获得国家知识产权局的正式授权,并取得专利证书。 当前,现有的数据治理方法论和平台工具主要聚焦于数…

IDEA 常用插件推荐,美观又实用!

1、 TONGYl Lingma - Your Al Coding Assistant. Type less, Code more. 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 二 实操案例 2.1 设置和查看栈大小 1.代码 /*** 演示栈中的异常:StackOverflowError** author shkstart* create 2020 下午 9:08** 设置栈的大小: -Xss (-XX:ThreadStackSize)** -XX:PrintFlagsFinal*/ public class S…

【C++】C++ STL 探索:List使用与背后底层逻辑

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现 本文将通过模拟实现List,从多个角度深入…

第J3周:DenseNet算法实战与解析(pytorch版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 📌 本周任务: ●1.请根据本文 Pytorch 代码,编写出相应的 TensorFlow 代码(建议使用…

《黑神话·悟空》背后的佛学义理探析

《黑神话悟空》不仅是一款备受期待的动作冒险游戏,其背后的深厚文化内涵,尤其是佛教义理的体现,更是吸引了不少玩家和佛学爱好者的关注。本文将通过对游戏剧情的解析,结合佛教思想,探讨《黑神话悟空》中所蕴含的哲学智…

冯·诺依曼体系结构

纯硬件的计算机结构应该就是输入设备——CPU——输出设备 冯诺依曼体系结构加入了存储器(内存) 因为数据是要在计算机体系结构中流动的,流动过程中对数据进行加工处理,数据从一个设备到另流动到另一个设备本质是一种数据拷贝。C…

HDFS常用命令及Python连接HDFS操作

目录 一、HDFS常用命令 二、Python连接HDFS操作 一、HDFS常用命令 HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)是Hadoop集群中的一部分,用于存储大量数据,并运行在商用硬件集群上。以下是HDFS中常用…