【大模型】书生·浦语大模型实战营 第三节

本文介绍了如何使用InternLM和LangChain搭建个人知识库,包括大模型开发范式、知识库助手的构建、向量数据库的构建、WebDemo部署,以及如何解决大模型的局限性,如知识时效性和专业能力不足,以及定制化成本问题。
摘要由CSDN通过智能技术生成

基于InternLM和LangChain搭建你的知识库

请添加图片描述

by Datawhale prompt-engeering-for-developers开源项目负责人 邹雨衡
本节主要内容:基于书生·浦语大模型和LangChain搭建个人知识库的核心思路、基本概念,并手把手教大家实战如何搭建个人知识库。

请添加图片描述

本节内容分为六个部分:

  1. 首先,简要介绍目前基于大模型进行应用开发的两种核心范式——RAG和Finetune,并对比展示两者之间的优劣;
  2. 其次,将聚焦RAG开发,介绍目前主流的RAG开发框架LangChain,并分析如何使用LangChain的各种组件来开发RAG应用;
  3. 接下来,将深入RAG开发的具体流程,分别介绍如何基于个人私域数据构建向量知识库;
  4. 基于InternLM大模型搭建知识库助手;
  5. 并使用Gradio完成知识库助手的Web Demo部署;
  6. 最后将通过实际代码演练,来手把手教大家基于InternLM和LangChain搭建你的知识库。

1. 大模型开发范式在这里插入图片描述

目前的核心大模型应用开发范式
在这里插入图片描述

以InternLM为例的通用大模型,具有强大的语言理解、指令跟随和语言生成的能力,它们可以理解用户自然语言的指令、具有强大的知识储备和一定的逻辑推理能力,能够作为基座模型支持多元应用,是解决复杂问题和应用于多领域的强大工具。

1. 知识时效性受限:如何让LLM能够获取最新的知识

然而,当下的大模型也存在着一定的局限性,限制了大模型投入真正的落地应用,例如,大模型的知识时效性受限。大模型是在确定的时间点训练,会使用到大量的训练语料,因此具有强大的知识储备,但这些知识仅包含训练时间点之前的知识,对于更新的知识大模型是不具有也无法做出回答的。例如,对于在2023年训练的模型无法回答2024年1月1日发生了什么重要事件。而大模型高昂的训练成本,也使通过多次训练来保证知识时效性无法实现。因此如何让大模型能够获取到最新的知识,是将大模型投入实际生产应用的一个重要问题。

2. 专业能力有限:如何打造垂域大模型

其次,通用大模型的专业能力有限。以InternLM等通用大模型为例,他们可以在多个领域上解答简单问题、具有较强的知识广度,但对于垂直领域的专业问题,针对一些需要专业知识、复杂底蕴才能解决的问题,通用大模型往往捉襟见肘。但是,在如医学、法学等专业性较强的垂直领域,能够表现良好的模型,才具有最广阔的应用前景和发展潜力。因此,如何打造垂域大模型是大模型发展的一个重要方向。

3. 定制化成本高:如何打造个人专属的LLM应用

同时,大模型高昂的训练成本使其定制化成本极高,但是通用的非定制化的应用,解决用户需求的能力又往往受限。因此,如何打造个人专属的大模型应用,也是大模型应用的一个重要问题。

请添加图片描述
针对上述大模型的局限性,目前有两种核心的大模型开发范式,通过不同的思路来拓展大模型能力,解决其面临的局限性。这两种开发范式分别是检索增强生成(RAG)和源自传统自然语言处理算法的微调(Finetune)。
RAG的核心思想是给大模型外挂一个知识库,对于用户的提问会首先从知识库中匹配到提问对应回答的相关文档,然后将文档和提问一起提交给大模型来生成回答,从而提高大模型的知识储备。而Finetune的核心思想是,在一个新的较小的训练集上进行轻量级的训练微调,从而提升模型在这个新数据集上的能力。
这两种开发范式都能够突破通用大模型的自身局限,但也存在不同的优劣势:

  1. RAG:
    1. 核心优势:成本低且可实时更行。RAG范式的应用无需对大模型进行重新训练,不需要GPU算力。对于新的知识只需组织加入到外挂知识库中即可。加入新知识成本极低,可以实时更新。
    2. 缺陷:其能力受基座模型影响大。基座模型的能力上限极大程度决定了RAG应用的能力天花板。同时,RAG应用每次需要将检索到的相关文档和用户提问一起交给大模型进行回答,占用了大量的模型上下文。因此,回答知识有限,对于一些需要大跨度收集知识,进行总结性回答的问题表现不佳。
  2. Finetune:
    1. 核心优势:可个性化微调且知识覆盖面广。Finetune范式的应用将在个性化数据上微调,因此可以充分拟合个性化数据,尤其是对于非可见知识,如回答风格的模拟效果非常好。同时Finetune范式的应用是一个新的个性化大模型,其仍然具有大模型的广阔知识域,因此可以回答的问题知识覆盖面广。
    2. 缺陷:但是Finetune应用需要在新的数据集上进行训练,成本高昂,需要很多的GPU算力和个性化数据。同时Finetune范式无法解决实时更新的问题,因为其更新的成本仍然很高。
      请添加图片描述
      在本节课中,我们将围绕RAG范式,深入剖析RAG范式的原理、特点和开发步骤,帮助大家学会如何基于InternLM模型来开发RAG应用。
      RAG原理:
      对于每一个用户输入,应用会首先将基于向量模型Sentence Transformer将输入文本转化为向量,并在向量数据库中匹配相似的文本段。(在这里,我们认为与问题相似的文本段,大概率包含了问题的答案。)然后将用户的输入和检索到的相似文本段一起嵌入到模型的Prompt中,传递给InternLM,要求它对问题做出最终的回答,作为最后的输出。这就是RAG的基本思想。

2. LangChain简介

请添加图片描述
如何快速高效的开发一个RAG应用?
开源框架LangChain为我们提供了这样的可能性。
请添加图片描述

LangChain是一个针对大模型开发的第三方开源框架,旨在通过为各种大模型提供通用接口,来简化基于大模型的应用程序开发流程,从而帮助开发者自由构建大模型应用。
LangChain封装了很多组件,通过这些组件的组合,可以构建多种类型的RAG应用。开发者可以直接将私域数据嵌入到LangChain中的组件,然后通过对这些组件进行组合,来构建适用于自己业务场景的RAG应用。
LangChain最主要也最核心的组成模块是链(Chains)。一个链,是指将多个组件组合在一起的端到端应用,即通过一个链可以封装一系列的大模型操作。例如,最经典的链接为检索问答链,也就是本节将使用到的组件。检索问答链通过将大模型、向量数据库等多个组件组合在一起,覆盖实现了RAG的全部流程。我们可以直接将我们的数据库和大模型引入到检索问答链中,从而高效地搭建RAG应用。

请添加图片描述
这张图展示了如何基于LangChain来搭建RAG应用:
首先,对于以本地文档形式存在的个人知识库,会使用Unstructed Loader组件来加载本地文档,这个组件会将不同格式的本地文档统一转换为纯文本格式。然后通过Text Splitter组件对提取出来的纯文本进行分割成Chunks。在通过开源词向量模型Sentence Transformer来将文本段转化为向量格式,存储到基于Chroma的向量数据库中。接下来,对于用户的每一个输入,会首先通过Sentence Transformer将输入转化为同样维度的向量,通过在向量数据库中进行相似度的匹配,找到和用户输入相关的文本段,将相关的文本段嵌入到已经写好的Prompt Template中,再交给InternLM进行最后的回答即可。
上述这一整个过程都会被封装在检索问答链中,我们可以直接将个性化的配置引入到检索问答链对象,即可构建属于自己的RAG应用。

3. 构建向量数据库

请添加图片描述
接下来,将深入基于LangChain搭建RAG应用的基本步骤,讲解如何一步步搭建自己的知识库。
首先,需要基于个人数据构建向量数据库。

请添加图片描述
向量数据库的构建:加载源文档—>文档分块—>文档向量化。
由于个人数据可能有多种数据类型,例如TXT、Markdown或PDF等。首先需要确定源文档的类型,针对不同类型的源文件选用不同的加载器。这些加载器的核心功能都是将带格式的文本转化为无格式的字符串。后续构造向量数据库的操作中,输入都是无格式的纯文本。
然后,由于大模型的输入上下文往往都是有限的,单个文档的长度往往会超过模型上下文的上限,我们需要对加载的文本进行切分,将它划分到多个不同的Chunk,后续检索相关的Chunk来实现问答。文本分割一般按字符串长度进行分割,例如设定最长的字符串长度为500,那么每500个字符会被切分为一个Chunk。我们还可以手动控制分割块的长度和重叠区域的长度,从而提升向量数据库的检索效果。
最后,为了使用向量数据库来支持语义检索,也就是我们想要输入问题检索到相关的答案,需要将文档向量化并存入向量数据库。可以使用任意一种Embedding模型来进行向量化。在本节课后续的实战环节,我们会使用开源词向量Sentence Transformer来进行向量化。同时我们也可以使用多种支持语义检索的向量数据库,我们一般使用轻量级适合入门的Chroma数据库来搭建。

4. 搭建知识库助手

请添加图片描述

在完成向量数据库的构建之后,我们就可以基于InternLM模型来搭建知识库助手。

请添加图片描述

LangChain支持多种LLM,也支持自定义的LLM。我们可以将InternLM部署在本地,将它封装成一个LangChain的自定义LLM类。在这个类中调用本地部署的InternLM,来将InternLM接入到LangChain框架中,从而高效使用LangChain的检索问答链组件。
请添加图片描述

构建检索问答链
LangChain的检索问答链组件可以自动实现知识检索、Prompt嵌入、大模型回答的全部流程。我们可以将基于InternLM的自定义LLM和已构建的向量数据库直接接入到检索问答链的上游。然后调用检索问答链,它会自动完成对用户输入进行向量化,在向量数据库中检索相关文档片段,基于InternLM的自定义大模型进行问题回答的全部过程。调用这样一个检索问答链,就可以实现知识库助手的核心功能。
请添加图片描述

不过这是一个最简单的知识库助手,其问答的性能还是有所局限。基于RAG的问答系统性能核心受限于两个因素:一个是检索精度;一个是Prompt的性能。在这里我们提出一些可能的优化建议,如果您搭建起了最简单的知识库助手,还想进一步提升知识库助手的回答性能,可以参考这些建议进行优化。
从检索方面出发,可以考虑基于语义而不是字符串长度来进行Chunk的切分,从而保证每一个Chunk的语义完整性。由于我们的检索是以Chunk为单位进行检索的,如果部分Chunk的语义不完整,那么模型可能会丢失一些重要信息。同时,我们可以考虑给每一个Chunk生成概括性的词索引,在检索时匹配索引而不是全文来找到相关文档片段,从而提高检索召回的精度。
而从Prompt的方面,我们可以迭代优化Prompt的策略,来不断激发模型的潜在能力,提高回答的性能。

5. Web Demo 部署

请添加图片描述
在完成上述核心功能的构建之后,可以将我们的应用构建成一个Web Demo,并部署在网页上。

请添加图片描述
有很多支持简易Web Demo部署的框架,例如Gradio、Streamlit等。图示是一个使用Gradio来进行Web Demo部署的截图。

6. 动手实战环节

请添加图片描述
代码实战环节将带领实战如何基于InternLM和LangChain搭建属于你的个人知识库。

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值