吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭,考验耐力与毅力,每有所进,心甚喜之。
吾以为,编程似布阵,算法如谋略,需精心筹谋,方可成就佳作。篮球乃团队之艺,协作共进,方显力量。跑步与马拉松,乃磨炼身心之途,愈挫愈勇,方能达至远方。愿交志同道合之友,共探此诸般妙趣。诸君,此文尚佳,望点赞收藏,谢之!
这篇文章主要探讨在LangChain框架中连接外部的数据做数据增强的能力。我们的生活周围充斥着各种各样的数据,例如本地的文档、网页上的知识、企业内部的知识库、各类研究报告、软件数据库以及聊天的历史记录等。这些数据,无论是广泛的互联网数据,还是具有特定价值的其他内部数据,都是构建和优化大语言模型的重要资源。
数据增强模块的相关概念
你可能会问,既然已经有了强大的大语言模型,例如OpenAI的GPT-4,为什么还需要连接外部数据呢?原因其实很简单,那就是大语言模型的知识是有限的。以GPT-4为例,它的数据集只训练到2023年4月,也就是说,这个时间之后的数据并没有被模型学习和理解。所以,到2023年下半年,仍会看到ChatGPT在其界面上显示:ChatGPT可能会产生关于人、时间、地点或事件不准确的信息。这是因为模型在训练数据集之外的知识领域中,其预测能力是受限的。
除此之外,还需要个性化的知识,比如企业的内部知识。想象一下,如果你有一个企业,你可能希望你的聊天机器人能够理解和回答一些关于你的产品或服务的具体问题,这些问题的答案往往需要依赖你的企业内部的专有知识。大语言模型无法直接访问这些知识,因此需要将这些知识以某种方式连接到大语言模型。
连接外部数据不仅可以填补大语言模型的知识缺失,而且还能让开发的应用程序更加可靠。当模型需要回答一个问题时,它可以根据真实的外部数据进行回答,而不是仅仅依赖于它在训练时学习的知识。例如,当询问模型“2023年的新冠病毒疫苗有哪些副作用?”时,模型可以根据最近的医学研究报告来提供答案,而不是依赖于它在两年前学习的可能已经过时的知识进行回答。
这些大语言模型不仅需要连接外部的数据,填补缺失的知识,同时还收到了提示词的限制,因为构建好的提示词往往需要外部数据的加持。但是,这种提示词的字符数量是有限的,这就是我们通常所说的max tokens的概念。
为了解决大语言模型的这些限制问题,LangChain设计了数据增强模块。设计这个模块的目的是检索与用户输入的问题相关的外部数据,包括筛选相关问题的相关的文档。然后,这些相关数据会形成提示词模板,提交给LLM或Chat Model类型的模型包装器。这些模型包装器封装了各个大语言模型平台的底层API,使得我们可以方便的与这些平台进行交互,获取大语言模型平台的输出。
然而,加载了这些外部的文档数据后,我们经常希望对它们进行转换以更好的适应应用程序。最简单的例子是将一个长文档切割成多个较小的文档,避免文档长度超过max tokens限制。为了实现这一目标,LangChain框架提供了一系列内置的文档转换器,这些文档转换器可以对文档进行切割、组合、过滤等。
LEDVR工作流
数据增强模块是一个多功能的数据增强集成工具,我们可以方便地称作LEDVR。其中,L表示加载器Loader、E代表嵌入模型包装器Text Embedding Model、D代表文档转换器Document Transformers、V表示向量数据库VectorStore、R表示检索器Retriever。
加载器
加载器负责从各种来源加载数据作为文档,其中文档是由文本和相关元数据组成的。无论是简单的txt文档,还是任意网页文本内容,加载器都可以将他们加载为文档。
嵌入模型包装器
嵌入模型包装器是一个专门为各种文本嵌入模型交互而设计的类。它的作用与LLM模型包装器和聊天模型包装器一样。
文档转换器
文档转换器主要用来对文档进行切割、组合、过滤等各种转换。数据增强模块提供了一系列内置的文档转换器。最常见的文档转换是切割文档,例如,将大型文档切割为小片段文档。文本切割器是最常见的文档转换器工具。文档转换器的目的是将加载的文档转换为可被嵌入模型包装器操作的文档数据格式。
向量数据库
向量数据库是用于存储和检索嵌入向量的工具,处理的数据是通过模型平台的文本嵌入模型(Text Embedding Model)转换的向量数据,这是处理非结构化数据的一种常见方法。向量数据库负责存储嵌入数据并执行向量检索。在建索时,可以嵌入非结构化查询,以建索与嵌入数据最相似的嵌入向量。
检索器
检索器是一个接口,返回非结构化查询的文档。它比向量存储库更通用。检索器无需存储文档,只需要返回检索后的文档。