LangChain入门:代理、链、索引
本系列参考LangChain中文教程
代理
代理执行器
代理执行器( Agent Executor )是一个代理( Agent )和一组工具( Tools )
代理执行器负责调用代理,获取动作和动作输入,根据动作引用的工具以及相应的输入调用工具,获取工具的输出,然后将所有这些信息传递回代理,以获取它应该采取的下一个动作。
代理
代理( Agent )是围绕模型的封装,它接收用户输入并返回与 “动作 action ”相对应的响应,以及相应的 “动作输入 action input ”
工具Tool
工具(Tool)是围绕函数的具体抽象,使语言模型可以与之进行交互变得简单。具体而言,工具的接口具有单一的文本输入和单一的文本输出。
工具包 Toolkits
工具包( Toolkits )是一组工具的集合,可以用于解决特定问题或完成特定任务。这些工具包是为了一起使用、相互协作以实现更复杂的目标而组织起来的。使用工具包可以提供更全面、高效的解决方案,因为它们涵盖了解决特定问题所需的各个方面或阶段。
链
链( Chains )是一个非常通用的概念,它指的是将一系列模块化组件(或其他链)以特定方式组合起来,以实现共同的用例。
最常用的链类型是LLMChain(LLM链),它结合了PromptTemplate(提示模板)、Model(模型)和Guardrails(守卫)来接收用户输入,进行相应的格式化,将其传递给模型并获取响应,然后验证和修正(如果需要)模型的输出。
链
链(Chain)是对多个独立组件进行端到端封装的一种方式
索引链 Index-related chains
这类链用于与索引进行交互。这些链的目的是将自己的数据(存储在索引中)与LLM结合起来。其中最好的例子是对自己的文档进行问答。
其中一个重要部分是了解如何将多个文档传递给语言模型。有几种不同的方法或链来实现这一点。
LangChain 支持其中四种常见的方法
Stuffing(填充)
Stuffing 是最简单的方法,您只需将所有相关数据作为上下文直接添加到提示中,然后传递给语言模型。LangChain 中的 StuffDocumentsChain 便是采用了这种方法。
优点: 只需向LLM发出一次调用。在生成文本时,LLM 可以一次性访问所有数据。
缺点: 大多数LLM具有上下文长度限制,对于大型文档(或许多文档),这种方法将不起作用,因为提示的长度将超过上下文长度。
Map Reduce(映射-归约)
该方法涉及对每个数据块运行初始提示(对于摘要任务,可以是该块的摘要;对于问答任务,可以是仅基于该块的答案)。然后运行不同的提示来组合所有初始输出。LangChain中实现了这种方法,称为 MapReduceDocumentsChain。
优点: 可以扩展到比 StuffDocumentsChain 更大的文档(以及更多的文档)。对各个文档进行的LLM调用是独立的,因此可以并行化处理。
缺点: 比 StuffDocumentsChain 需要更多对 LLM 的调用。在最终的组合调用中会丢失一些信息。
Refine(优化)
该方法涉及在第一个数据块上运行初始提示,生成一些输出。对于剩余的文档,将该输出与下一个文档一起传递给LLM,要求LLM基于新文档优化输出。
优点: 可以获取更多相关的上下文,并且可能比 MapReduceDocumentsChain 更少损失信息。
缺点: 比 StuffDocumentsChain 需要更多对LLM的调用。这些调用也不是独立的,这意味着无法像 MapReduceDocumentsChain 那样进行并行化处理。还可能对文档的顺序造成潜在的影响。
Map-Rerank(映射-重新排序)
这种方法涉及在每个数据块上运行初始提示,该提示不仅尝试完成任务,还为其答案的确定程度给出一个分数。然后根据这个分数对响应进行排序,返回最高分的响应。
优点: 与MapReduceDocumentsChain类似的优点。与MapReduceDocumentsChain相比,需要更少的调用。
缺点: 无法在文档之间合并信息。这意味着当您期望在单个文档中有一个简单的单一答案时,这种方法最为有用。
LLM链 LLMChain
LLMChain(LLM链)是最常见的链类型。
它由 PromptTemplate(提示模板)、模型(可以是 LLM 或 ChatModel )和可选的输出解析器组成。该链接受多个输入变量,使用 PromptTemplate 将它们格式化为提示。然后将提示传递给模型。最后,它使用 OutputParser(如果提供)将LLM的输出解析为最终格式。
提示选择器 Prompt Selector
在 LangChain 中,链的一个目标是让人们尽快开始使用特定的用例。这其中一个重要部分是拥有良好的提示。
但对一个模型有效的提示对另一个模型可能效果不佳。我们希望链对所有类型的模型都能够良好工作。因此,我们没有在链中硬编码默认提示的使用方式,而是引入了 PromptSelector 的概念。PromptSelector 负责根据传入的模型选择一个默认提示。
索引
加载文档 Document Loaders
Document Loaders负责加载文档对象列表的类。
检索数据 Retriever
一种存储数据的方式,使其可以被语言模型查询。该对象必须提供的唯一接口是get_relevant_texts方法,它接收一个字符串作为输入,并返回一个文档列表。
文档拆分 Text Splitters
TextSplitters 负责将文档拆分成较小的文档。
向量存储库 Vectorstore
最常见的索引类型是为每个文档创建数值嵌入(通过嵌入模型(Embedding Model)生成)。向量存储库(Vector Store)存储文档和相关的嵌入,并提供通过嵌入快速查找相关文档的方法。