一、检索增强生成简介     

1. 传统LLM应用的弊端       

        自OpenAI革命性的ChatGPT发布以来,在人工智能领域,特别是大型语言模型(Large Language Model,LLM)的能力进化速度之快令人惊叹,大模型浪潮已经席卷了几乎各行业。通过利用LLM的强大功能来解决复杂任务、增强自然语言理解和生成类人文本,从而可能颠覆各个领域。

       但是当涉及到专业场景或行业细分领域时,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几方面原因:

  • 知识的局限性:模型自身的知识完全源于它的训练数据,而现有的主流大模型(ChatGPT、文心一言、通义千问)的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或离线的数据是无法获取到的,这部分知识也就无从具备。
  • 幻觉问题:所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
  • 数据安全性:对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。既要保证安全,又要借助AI能力,那么最好的方式就是把数据全部放在本地,企业数据的业务计算全部在本地完成。

        其实问题还有很多,包括tokens的限制,虽然这个长期来看不是问题,各LLM供应商的tokens数量限制肯定会越来越大。但是,费用也许就是另外一个需要考虑的问题了。

2.  检索增强生成原理     

        检索增强生成(Retrieval-Augmented Generation,RAG),是一种使用外部知识库来补充大语言模型的上下文并生成响应的技术。 RAG结合了LLM中的参数化知识和非参数化外部知识,缓解了幻觉问题,通过检索技术识别及时的信息,并增强了响应的准确性。 此外,通过引用来源,RAG增加了模型输出的透明度和用户信任度。 RAG还可以通过索引相关文本语料库进行定制以适应特定领域。

       RAG的架构如图所示,简单来讲,RAG就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将RAG的核心理解为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案。

        完整的RAG应用流程主要包含数据准备和应用两个阶段。

        数据准备主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等环节。文本分割主要考虑两个因素:1)embedding模型的Tokens限制情况;2)语义完整性对整体的检索效果的影响。向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程。

        应用阶段根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。

        我们可以化繁为简。把RAG——Retrieval Augmented Generation理解为Retrieval And  Generation,也就是检索与生成,在加上一个数据向量和索引的工作,我们对RAG就可以总概方式地理解为“索引、检索和生成”。

        可以看到,RAG与LLM相结合,成为现阶段自动构建私有/本地知识库的主要手段。

        构建本地知识库有三个方面,一是LLM,懂得怎么处理自然语言;二是嵌入模型,它的工作就是把复杂的数据简化,转化成易于处理的格式;最后是向量数据库,专门存储和管理那些转化后的数据。

        本文介绍利用Ollama和AnythingLLM构建自己的本地知识库。

二、Ollama安装 

        Ollama 是一个专注于本地运行大型语言模型(LLM)的框架,它使得用户能够在自己的计算机上轻松地部署和使用大型语言模型,而无需依赖昂贵的GPU资源。Ollama 提供了一系列的工具和服务,旨在简化大型语言模型的安装、配置和使用过程,让更多人能够体验到人工智能的强大能力。Ollama的下载和安装可以参考我之前写的另一篇文章(Window 11本地部署 Meta Llama3-8b),这里不再赘述。

三、安装AnythingLLM

1. AnythingLLM 简介

        AnythingLLM 是 Mintplex Labs 开发的一款可以与任何内容聊天的私人ChatGPT,是高效、可定制、开源的企业级文档聊天机器人解决方案。它能够将任何文档、资源或内容片段转化为大语言模型(LLM)在聊天中可以利用的相关上下文。

        AnythingLLM 支持多种文档类型(PDF、TXT、DOCX等),具有对话和查询两种聊天模式。

支持多种 LLM、嵌入模型和向量数据库:

        LLM:包括任何开源的 llama.cpp 兼容模型、OpenAI、Azure OpenAI、Anthropic ClaudeV2、LM Studio 和 LocalAi。
        嵌入模型:AnythingLLM 原生嵌入器、OpenAI、Azure OpenAI、LM Studio 和 LocalAI。
        向量数据库:LanceDB(默认)、Pinecone、Chroma、Weaviate 和 QDrant。

        AnythingLLM 主要由三部分组成:收集器、前端和服务器。

  • collector:Python 工具,可快速将在线资源或本地文档转换为 LLM 可用格式。
  • frontend:ViteJS + React 前端,用于创建和管理 LLM 可使用的所有内容。
  • server:NodeJS + Express 服务器,处理所有向量数据库管理和 LLM 交互。

        可见,AnythingLLM是一个功能丰富,集成度很高的RAG框架,其在github上的开源项目(anything-llm),已经有1万2千多Star。它不仅仅是一个聊天机器人,是一个全栈应用程序,旨在通过一个精心设计的用户界面,为客户提供与文档、资源等进行智能对话的最简单方式。该工具的一个独特之处在于,它可以在后台简单地运行,而不需要使用大量的内存或资源。

        AnythingLLM将文档的容器化作为其基础。在这种情况下,不同的工作区可以共享相同的记录,但不能相互交互,从而允许用户为不同的用例维护不同的工作区。AnythingLLM包括两种聊天模式:对话模式,其中保留以前的问题;查询模式,指针对用户指定的文档进行简单的问答聊天。此外,对于公开可访问的文档,每个聊天响应还包括一个引用,链接到原始内容。

2. AnythingLLM 安装

        AnythingLLM安装有很多方式,一是到官方网站(Download AnythingLLM for Desktop)下载桌面版,然后双击即可。

        但是,与Docker版本相比,Desktop版本的功能要少很多,所以还是安装Docker版的吧。

        首先下拉一个镜像:

docker pull mintplexlabs/anythingllm

        按照官方说明,输入下列命令: 

# 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;

        然后就开源打开浏览器,输入网址http://localhost:3001/,显示Anyting LLM入口。

3. AnythingLLM 配置

        LLM选择

        选择 Ollama,填入 Ollama 的 http://localhost:11434 端口,然后选择你下载的模型。

 

        咦,报错了!

Failed to save LLM settings: Port is not reacjable sevice on loopback address from inside the Anything LLM container. Please use host.docker.internal, a real machine IP, or domain to connect to your service.

        哦,原因是AnythingLLM是运行在Docker容器中的,无法连接本地环回地址,得用这个地址:http://host.docker.internal:11434 ,并选择LLM(llama3)。

4. AnythingLLM 测试

Embedding 和向量数据库配置

可以选择AnythingLLM 自带的 AnythingLLMEmbedder,以及默认使用内置的向量数据库 LanceDB。

四、AnythingLLM 测试

        1. 配置worksapce

        点击New Workspace新建文档库,填写名称testanythingllm。

        我们将本笔记存储为简单的txt文件,作为LLM的外部文档。点击按钮开始添加文档,并将文档Move to Workspace,然后点击Save and Embed,出现Workspace updated successfully就表示配置已经完成。

2. 比较测试

        回到主页面,输入问题“如何基于ollama+anything构建知识库”,结果见下图,可以看到结果基本正确。

        作为对比,我们看一下,llama3本身的答案:是很通用的答案,与ollama和anythingllm没有联系。

        我们把llm换成对中文支持比较好的llama2 chinese版,看看这个问题的结果。

        可以看到,基于llama2中文版的AnythingLLM结果还是比较理想的。类似的,后面直接基于llama2的回答结果就有点“胡思乱语”了。

五、小结

        本文首先介绍了LLM在落地应用中的不足,引入了RAG这个框架和原理,介绍了RAG在私有知识库中的重要作用。以Ollama和AnythingLLM为实现手段,构建了并测试了本地知识库。测试结果表明,有了RAG的加持,LLM的回答结果更加贴切,有效。

参考文献

一文搞懂大模型RAG应用

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐