🦜🔗Langchain 的学习(概念篇)

date
Apr 13, 2023
slug
Langchain_Doc
status
Published
tags
LearningNote
DeepLearning
document
summary
langchain也许会变成基础设施
type
Post
 

Langchain 组件

Schema 模式

介绍下整个代码库中使用的基本数据类型和模式。

Text 文本

Langchain的基本交互界面是文本的。所有的界面是以文本为中心的,也可以说基本的语言是文本。

ChatMessages 聊天信息

  • System Chat Message
  • Human Chat Message
  • AI Chat Message

Examples 示例

示例是一种输入输出对,表示函数输入和预期的输出,可以用于模型的训练和评估。
示例可以分为模型的示例,也可以是链的。模型的示例用于微调模型,链的示例用于评估端到端链,也可以训练模型来替换整条链。

Document 文档

文档是一大块无结构的数据,由 page_content 数据内容和 metadata 辅助描述数据的信息组成。

Models 模型

模型接受输入,返回输出,你可以把整个模型看作一个函数。

LLMs 大规模语言模型

没什么好说的,现在的GPT3、BERT这些都是。

Chat Models 聊天模型

背后的本质还是语言模型,但是API更有结构,可以接受一个完整的聊天信息(和普通文本信息有所不同)作为输入,之后再返回一个聊天信息。

Text Embedding Models 文本嵌入模型

接受文本作为输入,返回一个浮点数列表的嵌入。

Prompts 提示指令

PromptValue 提示指令值

提示指令值类,将一个输入作为提示指令输入给模型。
“提示”是指传递给基础模型的内容。主要抽象在 LangChain 中有提示,因此所有处理文本数据。对于其他数据类型(图像、音频),我们正在努力添加抽象,但目前还没有。 不同的模型可能需要不同的数据格式。在可能的情况下,我们希望允许在不同的模型类型中使用相同的提示。出于这个原因,我们有一个 PromptValue 的概念。这是一个类,它公开要转换为每个模型类型期望的确切输入类型的方法(目前是文本或 ChatMessages)

Prompt Template 提示模版

提示模版类,建立提示指令值类的模版。PromptValue 是最终传递给模型的内容。大多数时候,这个值不是硬编码的,而是根据用户输入、其他非静态信息(通常来自多个来源)和固定模板字符串的组合动态创建的。我们将负责创建 PromptValue 的对象称为 PromptTemplate。该对象公开了一种用于获取输入变量并返回 PromptValue 的方法。
简单来说就是一种以输入变量和模版组合的形式来构造PromptValue

Example Selectors 示例选择器

通常,在提示中包含提示示例很有用。这些示例可以硬编码,但如果它们是动态选择的,通常会更强大。 ExampleSelectors 是接受用户输入然后返回要使用的示例列表的对象。

Outputs Parsers 输出解析器

输出解析器是帮助构建语言模型响应的类。输出解析器必须实现两个主要方法:
  • get_format_instructions() -> str:一种返回字符串的方法,该字符串包含有关如何格式化语言模型输出的说明。
  • parse(str) -> Any:一种接收字符串(假设是来自语言模型的响应)并将其解析为某种结构的方法。
  • parse_with_prompt(str) -> Any:一种接收字符串(假设是来自语言模型的响应)和提示(假设生成此类响应的提示)并将其解析为某种结构的方法。提示主要是在 OutputParser 想要以某种方式重试或修复输出的情况下提供的,并且需要来自提示的信息才能这样做。

Index 索引

索引指的是构建文档的方式,以便 LLM 可以最好地与它们交互。该模块包含用于处理文档、不同类型索引的实用函数,以及在链中使用这些索引的示例。 在链中使用索引的最常见方式是在“检索”步骤中。此步骤指的是接受用户的查询并返回最相关的文档。我们之所以做出这种区分,是因为 (1) 索引可以用于检索以外的其他用途,以及 (2) 检索可以使用索引以外的其他逻辑来查找相关文档。因此,我们有一个“检索器”接口的概念——这是大多数链使用的接口。 大多数时候,当我们谈论索引和检索时,我们谈论的是索引和检索非结构化数据(如文本文档)。要与结构化数据(SQL 表等)或 API 进行交互,请参阅相应的用例部分以获取相关功能的链接。 LangChain 支持的主要索引和检索类型目前以矢量数据库为中心,因此我们深入研究了这些主题的许多功能。

Document Loaders 文档加载器

文档加载器负责加载文档对象列表。

Text Splitters 文本分离器

通常,您希望将大型文本文档拆分为更小的块,以便更好地使用语言模型。 TextSplitter 负责将文档拆分成更小的文档。

VectorStores 矢量存储

最常见的索引类型是为每个文档创建数字嵌入(使用嵌入模型)的索引。 vectorstore 存储文档和关联的嵌入,并提供通过嵌入查找相关文档的快速方法。

Retrievers 检索器

一种存储数据的方式,这样它就可以被语言模型查询。该对象必须公开的唯一接口是 get_relevant_texts 方法,该方法接受一个字符串并返回一个文档列表。

Memory 内存记忆

记忆是在对话过程中存储和检索数据的概念。主要有两种方法:
  1. 根据输入,获取任何相关数据
  1. 根据输入和输出,相应地更新状态
有两种主要类型的记忆:短期记忆和长期记忆。
短期记忆是在单个对话的上下文中传递数据。
长期记忆在对话历史中获取和更新信息。

Chat Message History

目前与语言模型的主要界面是通过聊天界面。 ChatMessageHistory 类负责记住所有以前的聊天交互。然后可以将这些直接传递回模型,以某种方式或某种组合进行汇总。 ChatMessageHistory 公开了两种方法和一个属性。它公开的两个方法是 add_user_messageadd_ai_message,用于存储来自用户的消息和来自 AI 的相应响应。它公开的属性是一个消息属性,用于访问所有以前的消息。

Chains 链

链是一个令人难以置信的通用概念,它返回以特定方式组合以完成常见用例的一系列模块化组件(或其他链)。 最常用的链类型是 LLMChain,它结合了 PromptTemplate、Model 和 Guardrails 以获取用户输入,相应地格式化,将其传递给模型并获得响应,然后验证和修复(如有必要)模型输出。

Chain

原文 A chain is just an end-to-end wrapper around multiple individual components.
从这个意义上说,链是一个端到端的多组件的wrapper,是pipeline的更抽象。

LLMChain

LLMChain 是最常见的链类型。它由一个 PromptTemplate、一个模型(LLM 或 ChatModel)和一个可选的输出解析器组成。此链采用多个输入变量,使用 PromptTemplate 将它们格式化为提示。然后它将其传递给模型。最后,它使用 OutputParser(如果提供)将 LLM 的输出解析为最终格式。

Index-related chains

此类链用于与索引交互。这些链的目的是将您自己的数据(存储在索引中)与 LLM 相结合。最好的例子是对您自己的文档进行问答。 其中很大一部分是了解如何将多个文档传递给语言模型。有几种不同的方法或链可以这样做。 LangChain 支持四种更常见的
  • Stuffing 填充,填充是最简单的方法,您只需将所有相关数据填充到提示中作为上下文传递给语言模型。这在 LangChain 中实现为StuffDocumentsChain
    • 优点:只对 LLM 进行一次调用。生成文本时,LLM 可以一次访问所有数据。
    • 缺点:大多数 LLM 都有上下文长度,对于大型文档(或许多文档),这将不起作用,因为它会导致提示大于上下文长度。
  • Map Reduce 映射减缩,此方法涉及对每个数据块运行初始提示(对于摘要任务,这可能是该块的摘要;对于问答任务,它可能是仅基于该块的答案)。然后运行不同的提示以组合所有初始输出。这在 LangChain 中实现为 MapReduceDocumentsChain
    • 优点:可以扩展到比 StuffDocumentsChain 更大的文档(和更多文档)。对单个文档的 LLM 调用是独立的,因此可以并行化。
    • 缺点:比 StuffDocumentsChain 需要更多的 LLM 调用。在最后的联合通话中丢失了一些信息。
  • Refine 提纯,此方法涉及对第一个数据块运行初始提示,生成一些输出。对于其余文档,该输出与下一个文档一起传入,要求 LLM 根据新文档改进输出。
    • 优点:可以引入更相关的上下文,并且可能比 MapReduceDocumentsChain 的损耗更小
    • 缺点:比 StuffDocumentsChain 需要更多的 LLM 调用。这些调用也不是独立的,这意味着它们不能像 MapReduceDocumentsChain 那样并行。文档的排序也有一些潜在的依赖性。
  • Map-Rerank 映射重排序,这种方法涉及对每个数据块运行一个初始提示,它不仅会尝试完成一项任务,还会给出答案的确定性分数。然后根据这个分数对响应进行排序,并返回最高分。
    • 优点:与 MapReduceDocumentsChain 类似的优点。与 MapReduceDocumentsChain 相比,需要更少的调用。
    • 缺点:无法合并文档之间的信息。这意味着当您希望在单个文档中有一个简单的答案时,它最有用。

Prompt Selector

LangChain 中链的目标之一是使人们能够尽快开始使用特定的用例。其中很大一部分是有好的提示。 问题是适用于一种型号的提示可能不适用于另一种型号。我们希望链能够很好地适用于所有类型的模型。因此,我们没有硬编码默认提示以在链中使用,而是有了 PromptSelector 的概念。此 PromptSelector 负责根据传入的模型选择默认提示。 PromptSelectors 最常见的用例是为 LLM 和聊天模型设置不同的默认提示。然而,这也可以用于为不同的模型提供者设置不同的默认提示,应该选择。

Agents 代理

某些应用程序不仅需要预先确定的对 LLM/其他工具的调用链,还可能需要依赖于用户输入的未知链。在这些类型的链中,有一个“代理”可以访问一套工具。根据用户输入,代理可以决定调用这些工具中的哪一个(如果有的话)
用人话说就是利用LangChain来调用APIs

Tools

围绕函数的特定抽象,使语言模型可以轻松地与之交互。具体来说,工具的界面具有单一的文本输入和单一的文本输出。

Agents

代理是模型的包装器,它接收用户输入并返回对应于要采取的“动作”和相应的“动作输入”的响应。

Toolkits

解决特定问题可以使用/必需的工具组。

Agent Executor

代理执行器是一个代理和一组工具。代理执行器负责调用代理,取回动作和动作输入,用相应的输入调用动作引用的工具,获取工具的输出,然后将所有信息传递回代理以获取它应该采取的下一步行动
用人话说就是Agent+Tools的打包。
 
 
 

© Kenny Ni 2018 - 2025