一、LangChain官方解释六大模块
模型(models) : LangChain 支持的各种模型类型和模型集成。
提示(prompts) : 包括提示管理、提示优化和提示序列化。
内存(memory) : 内存是在链/代理调用之间保持状态的概念。LangChain 提供了一个标准的内存接口、一组内存实现及使用内存的链/代理示例。
索引(indexes) : 与您自己的文本数据结合使用时,语言模型往往更加强大——此模块涵盖了执行此操作的最佳实践。
链(chains) : 链不仅仅是单个 LLM 调用,还包括一系列调用(无论是调用 LLM 还是不同的实用工具)。LangChain 提供了一种标准的链接口、许多与其他工具的集成。LangChain 提供了用于常见应用程序的端到端的链调用。
代理(agents) : 代理涉及 LLM 做出行动决策、执行该行动、查看一个观察结果,并重复该过程直到完成。LangChain 提供了一个标准的代理接口,一系列可供选择的代理,以及端到端代理的示例。
核心架构图
二、基础层
包括:Models、LLM、Index三层:
1.Models层:
可以看出各家大模型的演进历史,其中Google、OpenAI、Meta、DeepMind领先优势非常大,国内大厂唯独腾讯缺席。有几个点:
- 目前最主要的几个大模型为: Google的LaMDA、Meta的LLaMa、OpenAI的GPT-4、DeepMind的:Chinchilla
- 另外目前投入应用的智能终端基本都是基于模型的Fine-Tuning或者RLHF技术,并且需要大量的相关行业训练集,典型比如code领域、财经领域BloombergGPT、学术论文编写等,其中在作者最关注的Code细分领域,目前的模型有:
- DeepMind的AlphaCode
- OpenAI的Codex
- Saleforce的CodeGen
Models层的输出包括:
- 文本自动生成
- embeding向量化输出
- 多模态输出
2.LLMS层:
这一层主要强调对models层能力的封装以及服务化输出能力,主要有:
- 各类LLM模型管理平台:强调的模型的种类丰富度以及易用性
- 一体化服务能力产品:强调开箱即用
- 差异化能力:比如聚焦于Promp管理、基于共享资源的模型运行模式等等
3.Index层:
对用户私域文本、图片、PDF等各类文档进行存储和检索,这里有两个方案:
- Vector方案:即对文件先切分为Chunks,在按Chunks分别编码存储并检索
- KG方案:这部分利用LLM抽取文件中的三元组,将其存储为KG供后续检索
二、能力层
如果基础层提供了最核心的能力,能力层则给这些能力安装上手、脚、脑,让其具有记忆和触发万物的能力,包括:Chains、Memory、Tool三部分
1.Chains层:
按照不同的需求抽象并定制化不同的执行逻辑,Chain可以相互嵌套并串行执行,通过这一层,让LLM的能力链接到各行各业比如面向私域数据的load_qa_with_sources_chain; 比如面向SQL数据源的SQLDatabaseChain;再比如能自动生成代码并执行的LLMMathChain等等,这里面比较让人眼前一亮的点有:
- ConstitutionalChain:对最终结果进行偏见、合规问题处理的逻辑,保证最终的结果符合价值观
- LLMCheckerChain:能让LLM自动检测自己的输出是否有没有问题的逻辑
2.Memory层:
这层主要有两个核心点:
- 对Chains的执行过程中的输入、输出进行记忆并结构化存储,为下一步的交互提供上下文,这部分简单存储在Redis即可
- 根据交互历史构建知识图谱,根据关联信息给出准确结果
3.Tools层:
其实Chains层可以根据LLM + Prompt执行一些特定的逻辑,但是如果要用Chain实现所有的逻辑不现实,可以通过Tools层也可以实现,Tools层理解为技能比较合理。典型的比如搜索、维基百科、天气预报、chatGPT服务等等。
四、应用层
有了基础层和能力层,我们可以构建各种各样好玩的,有价值的服务,这里就是Agent
1.Agent层:
Agent层可以根据Tool和Chain组合出特定的服务来,最终实现以更自然的文本交互形态完成用户特定需求的目标,比如用自然语言的方式实现sql的操作等等
五、必知概念
1.Chat Models:
聊天模型是语言模型的一个变体,聊天模型以语言模型为基础,其内部使用语言模型,不再以文本字符串为输入和输出,而是将聊天信息列表为输入和输出,他们提供更加结构化的 API。通过聊天模型可以传递一个或多个消息。LangChain 目前支持四类消息类型:分别是 AIMessage、HumanMessage、SystemMessage 和 ChatMessage 。
SystemMessage:系统消息是用来设定模型的一种工具,可以用于指定模型具体所处的环境和背景,如角色扮演等;
HumanMessage:人类消息就是用户信息,由人给出的信息,如提问;使用 Chat Model 模型就得把系统消息和人类消息放在一个列表里,然后作为 Chat Model 模型的输入
AIMessage:就是 AI 输出的消息,可以是针对问题的回答
ChatMessage:Chat 消息可以接受任意角色的参数
2. Loader 加载器
顾名思义,这个就是从指定源进行加载数据的。比如:
- 文件夹
DirectoryLoader
、- Azure 存储
AzureBlobStorageContainerLoader
- CSV文件
CSVLoader
- 印象笔记
EverNoteLoader
- Google网盘
GoogleDriveLoader
- 任意的网页
UnstructuredHTMLLoader
PyPDFLoader
- S3
S3DirectoryLoader
/S3FileLoader
、- Youtube
YoutubeLoader
3.Prompts
提示(Prompt)指的是模型的输入,这个输入一般很少是硬编码的,而是从使用特定的模板组件构建而成的,这个模板组件就是 PromptTemplate 提示模板,可以提供提示模板作为输入,模板指的是我们希望获得答案的具体格式和蓝图。LangChain 提供了预先设计好的提示模板,可以用于生成不同类型任务的提示。当预设的模板无法满足要求时,也可以使用自定义的提示模板。
在 LangChain 中,我们可以根据需要设置提示模板,并将其与主链相连接以进行输出预测。此外,LangChain 还提供了输出解析器的功能,用于进一步精炼结果。输出解析器的作用是指导模型输出的格式化方式,以及将输出解析为所需的格式。
LangChain 提供了几个类和函数,使构建和处理提示变得容易:
PromptTemplate 提示模板
可以生成文本模版,通过变量参数的形式拼接成完整的语句
FewShotPromptTemplate 选择器
将提示的示例内容同样拼接到语句中,让模型去理解语义含义进而给出结果。
ChatPromptTemplate 聊天提示模版
以聊天消息作为输入生成完整提示模版。
StructuredOutputParser 输出解析器
输出解析器是指对模型生成的结果进行解析和处理的组件。它的主要功能是将模型生成的文本进行解析,提取有用的信息并进行后续处理。如对模型生成的文本进行解析、提取有用信息、识别实体、分类和过滤结果,以及对生成文本进行后处理,从而使生成结果更易于理解和使用。它在与大型语言模型交互时起到解析和处理结果的作用,增强了模型的应用和可用性。
语言模型输出文本。但是很多时候,可能想要获得比文本更结构化的信息。这就是输出解析器的作用。即输出解析器是帮助结构化语言模型响应的类,LangChain 中主要提供的类是 PydanticOutputParser。