theme: orange
LangChain是一个软件开发工具包,它通过将组件链接在一起并公开简单统一的API,简化了大型语言模型和应用程序的集成。本篇文章将会简要介绍,让各位开发者对其有一个整体的认识。
前言
如果你是一名软件开发人员,努力跟上有关大型语言模型的最新热点,你可能会感到不知所措或困惑,就像我一样。似乎每天我们都会看到一个新的开源模型的发布,或者一个商业模型提供商宣布的重大新功能。
大型语言模型(LLMs)正迅速成为现代软件技术栈的一个重要组成部分。然而,无论您是想使用像OpenAI这样的提供商提供的模型API,还是将开源模型嵌入到您的应用程序中,构建大型语言模型驱动的应用程序不仅仅是发送一个提示并等待回应。有许多因素需要考虑,从调整参数到增强提示再到适度地回应。
大型语言模型(LLMs)是无状态的,这意味着它们不会记住对话中的先前消息。维护历史记录并将上下文提供给LLM是开发人员的责任。这些对话可能需要存储在一个持久化数据库中,以便在新的对话中恢复上下文。因此,为LLMs添加短期和长期记忆是开发人员的关键责任之一。
另一个挑战是,对于LLMs并没有通用的规则。您可能需要使用针对不同场景的多个专用模型,如情感分析、分类、问答和总结。处理多个LLMs非常复杂,需要相当多的管道工作。
为构建LLM应用程序的统一API层
LangChain是一个旨在简化LLM和应用程序集成的SDK。它解决了我们之前讨论的大部分挑战。LangChain类似于ODBC或JDBC驱动程序,它通过让您专注于标准SQL语句来抽象底层数据库。LangChain通过公开简单统一的API来抽象底层LLM的实现细节。这个API使得开发人员可以轻松地更换模型,而无需对代码进行重大更改。
LangChain与ChatGPT大约同时出现。其创建者Harrison Chase在2022年10月底进行了第一次提交,就在LLM浪潮全面爆发之前。从那时起,社区一直在积极贡献,使LangChain成为与LLM互动的最佳工具之一。
LangChain是一个强大的框架,可以与外部工具集成形成一个生态系统。让我们了解一下它如何协调从LLM获得期望结果的流程。
数据源 (Data sources)
应用程序需要从外部来源(如PDF、网页、CSV和关系数据库)获取数据,以构建LLM的上下文。LangChain无缝集成了可以访问和检索来自不同来源数据的模块。
词嵌入 (Word embeddings)
从某些外部来源获取的数据必须转换为向量。这是通过将文本传递给与LLM关联的词嵌入模型来完成的。例如,OpenAI的GPT-3.5模型有一个关联的词嵌入模型,需要用它来发送上下文。LangChain会根据选择的LLM选择最佳的嵌入模型,消除了配对模型的猜测。
向量数据库 (Vector databases)
生成的嵌入存储在向量数据库中以进行相似性搜索。LangChain可以轻松地从各种来源(从内存数组到托管的向量数据库,如Pinecone)存储和检索向量。
大型语言模型 (Large language models)
LangChain支持OpenAI、Cohere和AI21提供的主流LLM,以及Hugging Face上可用的开源LLM。支持的模型和API端点的列表正在迅速增长。
以上流程代表了LangChain框架的核心。位于堆栈顶部的应用程序通过Python或JavaScript SDK与LangChain模块之一进行交互。让我们了解这些模块的作用。
模型I/O (Model I/O)
模型I/O模块处理与LLM的交互。它主要帮助创建有效的提示,调用模型API,并解析输出。作为生成式AI的核心,提示工程得到了LangChain的良好处理。此模块抽象了LLM提供商公开的认证、API参数和端点。最后,它可以将模型发送的响应解析为应用程序可以使用的所需格式。
数据连接(Data connection)
可以将数据连接模块看作是您的LLM应用程序的ETL管道。它处理加载外部文档(如PDF或Excel文件),将它们转换为批量处理成词嵌入的数据块,将嵌入存储在向量数据库中,并通过查询最终检索它们。正如我们之前讨论的,这是LangChain最重要的构建模块。
链(Chains)
在很多方面,与LLM交互就像使用Unix管道。一个模块的输出被作为另一个模块的输入发送。我们通常需要依赖LLM来澄清和提炼响应,直到我们得到期望的结果。LangChain中的链旨在构建高效的管道,利用构建模块和LLM获得预期的响应。一个简单的链可能有一个提示和一个LLM,但也可以构建高度复杂的链,多次调用LLM(如递归)以实现结果。例如,一个链可能包括一个提示来总结一个文档,然后对同一个文档进行情感分析。
内存(Memory)
LLM是无状态的,但需要上下文来准确响应。LangChain的内存模块使得向模型添加短期和长期记忆变得容易。短期内存通过简单机制保持对话历史。消息历史可以持久化到外部资源,如Redis,代表长期记忆。
回调(Callbacks)
LangChain为开发者提供了一个回调系统,允许他们挂接到LLM应用程序的各个阶段。这对于日志记录、监控、流处理和其他任务非常有用。可以编写自定义回调处理程序,在管道内发生特定事件时调用。LangChain的默认回调指向stdout,它只是将每个阶段的输出打印到控制台。
代理(Agents)
代理是迄今为止LangChain最强大的模块。LLM具有推理和行动能力,称为ReAct提示技术。LangChain的代理简化了制作利用LLM将提示提炼为行动计划的ReAct提示。代理可以被认为是动态链。代理背后的基本思想是使用LLM选择一组操作。一系列操作在链中(在代码中)硬编码。在代理中,语言模型用作推理引擎,以确定采取哪些行动以及以何种顺序。
结论
LangChain正迅速成为GenAI驱动的应用程序中最重要的组件。得益于不断扩展的繁荣生态系统,它可以支持各种各样的构建模块。对开源和商业LLM、向量数据库、数据源和嵌入的支持使得LangChain成为开发者不可或缺的工具。