目录
大模型开发范式
目前LLM具有强大的语言理解、指令跟随和语言生成的能力,具有强大的知识储备和一定的逻辑推理能力,能够作为基座模型支持多元应用,是解决复杂问题和应用于多领域的强大工具。然而当下的大模型也具有一定的局限性:
- 知识时效性受限:大模型是在确定的时间点训练, 这些知识仅包含训练时间点之前的知识。对于更新的知识,LLM是无法回答的。如何让LLM能够获取最新的知识;
- 专业能力有限:目前通用大模型可以在多个领域上回答简单问题,但是针对专业问题,通用大模型往往表现不佳。如何打造垂域大模型;
- 定制化成本高:大模型训练成本极高。如何打造个人专属的LLM应用
目前有两种开发方式: RAG和Finetune。RAG的核心思想是给LLM外挂一个知识库,就像开卷考试允许学生带相关资料。Finetune是在一个新的较小的数据集上进行轻量级的训练微调,从而提升模型在这个新数据集上的能力。这两种方式个有优缺点,如下图所示:
RAG
核心思想: 对于每个用户的输入,首先基于向量模型将输入文本转化为向量,并在向量数据库中匹配相似的文本段,主要是因为相似的文本段大概率包含了问题的答案。最后将用户的输入和检索到的相似文本段嵌入到模型的prompt中,然后传递给LLM,并得到最终的答案。
LangChain
LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。
LangChain中核心的模块——链(Chains):是指将组件组合实现端到端的应用,通过一个对象封装一系列的LLM操作,例如检索问答链。
基于LangChain搭建RAG应用关键的一个步骤是如何把本地的文档保存到向量数据库中。这一过程包含了文档加载、文档拆分、Embedding以及保存等过程。
构建向量数据库
这个过程主要包含三个步骤:加载源文件、文档分块以及文档向量化。
- 确定源文件类型,针对不同类型源文件选用不同的加载器。核心在于将带格式文本转化为无格式字符串;
- 由于单个文档往往超过模型上下文上限,我们需要对加载的文档进行切分。一般是按照字符串长度进行分割,可以手动控制分割块的长度和重叠区间的长度;
- 使用向量数据库来支持语义检索,需要将文档向量化存入向量数据库。选择任意一种Embedding 模型进行向量化,并选择一种向量数据库(支持语义检索)
搭建知识库助手
- 可以将自定义LLM接入LangChain;
- 检索问答链模板可以自动实现知识检索、Prompt嵌入、 LLM 问答全部流程。可以将自定义LLM和构建好的向量数据库接入检索问答链;
目前RAG的性能核心受限于检索精度和Prompt 性能。可能的优化点:
- 基于语义进行分割,保证每一个chunk的语义完整(如何实现);
- 给每一个chunk生成概括性索引,检索时匹配索引;
- 持续迭代优化prompt;