大型语言模型(LLMs)如GPT-4已经展示了在生成类似人类文本方面的巨大能力。然而,仅通过API访问LLMs存在一些局限性。相反,将它们与其他数据源和工具结合使用可以实现更强大的应用。在本章中,我们将介绍LangChain作为一种克服LLMs局限性并构建创新语言应用的方法。我们旨在演示如何将最近的AI进展与像LangChain这样强大的框架相结合的潜力。
我们将首先概述在单独使用LLMs时面临的一些挑战,例如缺乏外部知识、错误的推理和无法采取行动。LangChain通过不同的集成和特定任务的现成组件解决了这些问题。我们将通过示例演示开发人员如何利用LangChain的功能来创建定制的自然语言处理解决方案,概述所涉及的组件和概念。
目标是说明LangChain如何实现构建动态、数据感知的应用程序,超越仅通过API调用LLMs时的可能性。最后,我们将讨论与LangChain相关的重要概念,如chains(链)、action plan generation(行动计划生成)和memory(内存),这些概念对于理解LangChain的工作原理非常重要。
本章的主要部分包括:
- 超越随机鹦鹉
- 什么是LangChain?
- 探索LangChain的关键组件
- LangChain如何工作?
- 将LangChain与其他框架进行比较
超越随机鹦鹉
概述:由于它们能够生成类似人类文本并理解自然语言,大型语言模型(LLMs)因其在围绕内容生成、文本分类和摘要等方面的能力而受到重视和普及。然而,它们表面上的流畅性掩盖了限制其在实际应用中的效用的严重缺陷。随机鹦鹉的概念有助于阐明这一基本问题。
随机鹦鹉指的是能够产生令人信服的语言但缺乏对词语背后真实含义的任何真正理解的LLMs。这个术语由研究人员Emily Bender、Timnit Gebru、Margaret Mitchell和Angelina McMillan-Major在他们具有影响力的论文《On the Dangers of Stochastic Parrots》(2021)中创造,该术语批评那些毫无根据地模仿语言模式的模型。如果没有扎根于现实世界,模型可能会产生不准确、不相关、不道德或逻辑不通的响应。
仅仅通过提升计算和数据规模并不能赋予推理能力或常识。LLMs在面临诸如组合性差距(Ofir Press等人的《测量和缩小语言模型中的组合性差距》;2023)等挑战时表现出困难。这意味着LLMs无法连接推理或使响应适应新情况。要克服这些障碍,需要通过采用真正理解的技术来增强LLMs。仅仅通过原始模型规模不能将随机模仿转化为有益系统。需要创新,如提示、思维链推理、检索基础和其他方法来教育模型。
让我们稍微详细地看一下这个论点。如果您希望跳过这些详细信息,请继续下一节。我们将在这里深入了解LLMs的局限性,克服这些局限性的方法以及LangChain如何促使应用程序系统地减轻这些缺陷并扩展LLMs的功能。
LLMs的限制是什么?
正如已经确认的那样,LLMs提供了令人印象深刻的功能,但也存在一些限制,这些限制阻碍了它们在某些情境中的有效性。在开发应用程序时了解这些限制是至关重要的。与LLMs相关的一些痛点包括:
- 过时的知识: LLMs仅依赖于它们的训练数据。如果没有外部集成,它们无法提供最新的实时信息。
- 无法采取行动: LLMs无法执行交互式操作,如搜索、计算或查找。这严重限制了其功能。
- 缺乏上下文: LLMs难以整合相关上下文,如先前的对话和为了一致和有用的响应所需的补充细节。
- 产生幻觉的风险: 对某些主题了解不足可能导致LLMs生成不正确或荒谬的内容,如果不经过适当的基础支撑。
- 偏见和歧视: 根据它们的训练数据,LLMs可能表现出宗教、意识形态或政治性质的偏见。
- 透明度不足: 大型复杂模型的行为可能是不透明且难以解释的,这对与人类价值观的一致性提出了挑战。
- 缺乏上下文: LLMs可能难以理解和整合来自先前提示或对话的上下文。它们可能不记得先前提到的细节,也可能未能提供超出给定提示的额外相关信息。
让我们更详细地说明其中一些限制,因为它们非常重要。如前所述,LLMs在实时知识的缺乏和无法自行采取行动方面存在显著限制,这限制了它们在许多现实情境中的有效性。例如,LLMs没有与外部信息源的固有连接。它们受限于用于开发它们的训练数据,这在随着时间的推移不可避免地变得越来越过时。对于发生在其训练数据截止日期之后的当前事件,LLM将毫无察觉。询问LLM有关最新新闻或社会动态的问题将使其无法在没有外部支持的情况下构建响应。
此外,LLMs无法与其周围的世界进行动态交互。它们无法检查天气,查找本地数据或访问文档。没有进行网页搜索、与API进行接口、运行计算或根据新的提示采取任何实际行动的能力,LLMs仅在预先存在的信息范围内运行。即使在讨论其训练数据中包含的主题时,LLM在没有检索外部知识的情况下难以整合实时上下文和具体信息。例如,LLM可以流利地讨论用于财务分析的宏观经济原则,但在检索当前业绩数据并计算相关统计数据方面,它将无法进行实际分析。没有动态查找的能力,它的财务讨论保持一般和理论性。同样,LLM可能在生动描述过去的新闻事件时表现出色,但如果要求其提供有关今天同一故事的最新发展,它可能会犹豫不决。
通过将LLMs与外部数据源、分析程序和工具集成,可以帮助克服这些限制。但是单独使用时,LLMs缺乏与现实环境的联系,这通常对于有用的应用程序是至关重要的。它们令人印象深刻的自然语言能力需要适当的基础和行动,以产生实质性的见解,而不仅仅是华丽但空洞的文本。
让我们通过一些LLMs问题的例子更详细地了解这些限制。在OpenAI ChatGPT界面中询问有关LangChain的问题中,涉及到了截止日期问题:
在这种情况下,模型能够正确捕捉问题并给出正确的反馈,尽管并非总是如此。如果您通过其他端点访问模型或使用其他模型,它可能会捏造信息(产生幻觉)。此外,它可能对某些实体没有知识,或者可能完全涉及不同的实体。在OpenAI游乐场中询问相同的问题,我得到了这个回答:
在这种情况下,我们可以看到该模型谈论了一个不同的LangChain,这是一个基于去中心化区块链的翻译平台。这是一个关于相关性的问题,可以称为幻觉。通过访问外部数据,如天气API、用户偏好或来自网络的相关信息,可以纠正这个问题,这对于创建个性化和准确的语言驱动应用至关重要。
LLMs在涉及逻辑推理或数学问题的某些任务上表现不佳。例如,即使是先进的LLMs在高中水平的数学方面表现也较差,不能执行它们之前没有见过的简单数学运算。我们可以通过一个简单的演示来说明这一点:
正如您所见,该模型对第一个问题给出了正确的回答,但在第二个问题上失败了。如果您想知道真实的结果是什么,如果我们使用计算器,我们得到的是:
LLM没有存储计算结果,或者在训练数据中没有足够的频繁出现,无法可靠地记住编码在其权重中。因此,它无法正确地提出解决方案。在这种情况下,LLM不是合适的工具。
部署使用LLM的聊天机器人和其他应用程序需要深思熟虑的设计和监控,以解决偏见和不适当内容等风险。例如,微软的Tay聊天机器人在2016年上线后不久由于毒性互动导致的冒犯性推文而被下线。
至于推理,例如,当单独询问水果的密度和水的密度时,LLM可能会正确识别它们,但它会很难综合这些事实来确定水果是否会漂浮(这是一个多跳问题)。该模型无法弥合其不连贯的知识。
让我们看看如何解决这些挑战。
我们如何缓解LLM的限制呢?
缓解这些限制的技术包括:
-
检索增强:该技术通过访问知识库来补充LLM过时的训练数据,提供外部背景并减少产生虚构内容的风险。
-
链接:该技术整合了搜索和计算等操作。
-
提示工程:这涉及通过提供关键上下文精心制作提示,以引导适当的响应。
-
监控、过滤和审核:这涉及对应用程序输入和输出的新问题进行持续而有效的监督,以检测问题。然后,手动审核和自动过滤器纠正输出的潜在问题。包括以下内容:
- 过滤器,如屏蔽列表、敏感分类器和禁止词过滤器,可以自动标记问题。
- 宪法原则监视和过滤不道德或不适当的内容。
- 人工审核提供有关模型行为和输出的见解。
-
记忆:通过在交互之间保留对话数据和上下文,保留对话上下文。
-
微调:在应用程序领域和原则上使用更合适的数据对LLM进行训练和调整。这使模型的行为适应了其具体目的。
要再次强调之前提到的,仅仅通过原始模型规模无法赋予组合推理或其他缺失功能。需要使用显式技术,如引导提示和思维链推理,来弥补组合性差距。通过自问提示等方法,可以减轻这些缺陷,鼓励模型有条不紊地分解问题。
将这些工具整合到培训流水线中提供了原本缺失的能力。提示提供了上下文,链接实现了推理步骤,而检索则整合了事实。总体而言,这将随机鹦鹉转变为推理引擎。
深思熟虑的提示工程和微调使模型适用于实际应用。通过自动化和人工审核,持续监控可以发现任何新出现的问题。过滤器是第一道防线。采用宪法人工智能原则还鼓励构建能够道德行为的模型。这种综合方法结合了准备、警惕和固有的有益设计。
将LLM连接到外部数据源进一步降低了虚构风险,并通过准确、最新的信息增强了响应。然而,安全地集成诸如数据库之类的来源会增加复杂性。像LangChain这样的框架简化了这一过程,同时为负责任的LLM使用提供了结构和监督。它们允许组合提示的模型查询和数据源,以克服独立LLM的缺陷。通过勤奋的增强,我们可以创建以前由于固有的模型限制而无法实现的AI系统。这引出了我们下一个讨论的主题。
什么是LLM应用?
将LLM与其他工具结合起来,使用专门的工具,LLM驱动的应用有潜力改变我们的数字世界。通常,这是通过对LLM进行一个或多个提示的链式调用完成的,但也可以利用其他外部服务(如API或数据源)来执行任务。
传统的软件应用通常遵循多层架构:
客户层处理用户交互。前端层处理呈现和业务逻辑。后端层处理逻辑、API、计算等。最后,数据库存储和检索数据。
相比之下,LLM应用是一种利用LLM理解自然语言提示并生成响应文本输出的应用程序。LLM应用通常具有以下组件:
- 客户层,用于收集用户输入,如文本查询或决策。
- 提示工程层,用于构建引导LLM的提示。
- LLM后端,用于分析提示并生成相关的文本响应。
- 输出解析层,用于解释LLM响应以适应应用程序界面。
- 通过函数API、知识库和推理算法的可选集成,以增强LLM的能力。
在最简单的情况下,前端、解析和知识库部分有时可能没有明确定义,只留下客户端、提示和LLM:
LLM应用可以通过以下方式集成外部服务:
- 使用函数API访问Web工具和数据库。
- 用于复杂逻辑链的高级推理算法。
- 通过知识库的检索增强生成。
我们将在第5章《构建像ChatGPT的聊天机器人》中讨论检索增强生成(RAG),它通过外部知识增强LLM。这些扩展将LLM应用的能力拓展到超越LLM知识本身。例如:
- 函数调用允许带有参数的API请求。
- SQL函数支持会话式数据库查询。
- 像链式思考这样的推理算法促进多步逻辑。
这在这里有所体现:
正如前图所示,客户层收集用户的文本查询和决策。提示工程构造引导LLM的提示,考虑到外部知识或能力(或先前的交互),而不对模型本身进行更改。LLM后端根据其训练动态理解和响应提示。输出解析解释LLM文本以供前端使用。知识库可以增强LLM的信息,而可选地,就像传统应用程序中的数据库后端一样,信息可以写入其中。
LLM应用具有以下几个重要原因:
- LLM后端以一种细致入微、类似人类的方式处理语言,而无需硬编码规则。
- 基于过去的互动,响应可以个性化和情境化。
- 先进的推理算法支持复杂的多步推理链。
- 基于LLM或实时检索到的最新信息的动态响应。 LLM应用使用的关键能力是能够理解提示中的微妙语言并生成连贯、类似人类的文本响应。与传统代码相比,这有助于更自然的交互和工作流程。
LLM提供了类似人类的语言能力,无需手动编码。因此,无需提前手动预测和编码每种语言场景。LLM与外部服务、知识和推理算法的集成简化了创新应用程序的开发。
但是负责任的数据实践至关重要-PII应该远离公共平台,并在需要时应在内部进行模型微调。前端和输出解析器都可以包含有关行为、隐私和安全性的审查和强制规则。未来的研究必须解决有关潜在滥用、偏见和限制的担忧。
我们将在本书中看到很多LLM应用的例子;以下是我们将遇到的一些例子:
- 聊天机器人和虚拟助手:这些应用使用像ChatGPT这样的LLM与用户进行自然对话,并协助进行日程安排、客户服务和信息查找等任务。
- 智能搜索引擎:LLM应用可以解析用自然语言编写的搜索查询,并生成相关的结果。
- 自动内容生成:应用可以利用LLM生成文章、电子邮件、代码等内容,基于文本提示。
- 问答:用户可以用通俗的语言向LLM应用提问,并从模型的知识中快速获得信息性的答案。
- 情感分析:您可以使用LLM应用分析客户反馈、评论和社交帖子,以总结情感并提取关键主题。
- 文本摘要:您可以使用LLM后端自动生成长文档和文章的简洁摘要。
- 数据分析:您可以使用LLM进行自动数据分析和可视化,以提取洞察。
- 代码生成:您可以设置软件协同编程助手,可以帮助解决业务问题。
LLM的真正力量不在于独立使用LLM,而在于将LLM与其他知识和计算源结合使用。LangChain框架旨在实现这种精确集成,促进基于上下文和推理的定制NLP解决方案的开发。LangChain解决了与LLM相关的痛点,并为创建定制NLP解决方案提供了直观的框架。
什么是LangChain?
LangChain由Harrison Chase于2022年创建,是一个用于构建LLM驱动应用程序的开源Python框架。它为开发人员提供了模块化、易于使用的组件,用于将语言模型与外部数据源和服务连接起来。该项目已经吸引了来自Sequoia Capital和Benchmark等公司的数百万美元的风险投资,这些公司曾为苹果、思科、谷歌、WeWork、Dropbox等许多成功的公司提供过资金。
LangChain通过提供可重用的组件和预先组装的链条简化了复杂LLM应用程序的开发。其模块化架构将对LLM和外部服务的访问抽象为一个统一的接口。开发人员可以组合这些构建块来执行复杂的工作流程。
构建有影响的LLM应用程序涉及到提示工程、偏见缓解、生产化和整合外部数据等挑战。LangChain通过其抽象和可组合的结构减少了这个学习曲线。
除了基本的LLM API使用外,LangChain还通过其代理和内存支持高级交互,如对话上下文和持久性。这允许聊天机器人、收集外部数据等。
特别是,LangChain对链、代理、工具和内存的支持使开发人员能够构建能够以更复杂的方式与其环境交互,并能够随时间存储和重用信息的应用程序。其模块化设计使其易于构建适用于各种领域的复杂应用程序。对于行动计划和策略的支持提高了应用程序的性能和稳健性。对于内存和对外部信息的访问的支持降低了幻觉,从而增强了可靠性。
LangChain为开发人员提供的主要优势包括:
- 灵活可调整的LLM集成的模块化架构。
- 将多个服务链接在一起,不仅仅是LLM。
- 面向目标的代理交互,而不是孤立的调用。
- 在执行过程中的状态持久性的内存。
- 开源访问和社区支持。
正如前文所述,LangChain是开源的,用Python编写,尽管存在用JavaScript或更确切地说是TypeScript(LangChain.js)实现的伴随项目,以及为Ruby提供代码执行的新兴Langchain.rb项目。在本书中,我们专注于该框架的Python版本。
虽然资源如文档、课程和社区有助于加速学习过程,但培养在应用LLM方面的专业知识需要投入专注的时间和努力。对于许多开发人员来说,学习曲线可能是影响有效利用LLM的阻碍因素。
在Discord聊天服务器上有着活跃的讨论,多个博客和定期的见面会在各个城市举行,包括旧金山和伦敦。甚至有一个聊天机器人ChatLangChain,可以回答有关LangChain文档的问题。它是使用LangChain和FastAPI构建的,并通过文档网站在线提供!
LangChain带有许多扩展和一个正在围绕它发展的更大生态系统。正如前文所述,它已经有大量的集成,每周都在添加许多新的集成。这个截图突显了一些集成(来源:integrations.langchain.com):
至于更广泛的生态系统,LangSmith是一个平台,通过为LLM应用程序提供强大的调试、测试和监控功能,来补充LangChain。例如,开发人员可以通过查看详细的执行跟踪来快速调试新的链。可以根据数据集评估备用提示和LLMs,以确保质量和一致性。使用分析功能使基于数据的决策围绕优化成为可能。
LlamaHub和LangChainHub提供了可重用元素的开放库,以简化构建复杂的LLM系统。LlamaHub是由LlamaIndex社区创建的数据加载器、阅读器和工具库。它提供实用程序,可以轻松将LLMs连接到各种知识源。加载器摄取用于检索的数据,而工具使模型能够读取/写入外部数据服务。LlamaHub简化了创建定制数据代理以解锁LLM功能的过程。
LangChainHub是在LangChain中共享用于提示、链和代理的工件的中央存储库。受Hugging Face Hub启发,它旨在成为一个一站式资源,用于发现用于构建复杂LLM应用程序的高质量构建块。最初的发布重点是一组可重用的提示。未来计划包括添加对链、代理和其他关键LangChain组件的支持。
LangFlow和Flowise是UI,允许通过将侧边栏组件拖放到画布上并将它们连接在一起来创建可执行流程图中的LangChain组件。这是进行实验和原型制作流程的快速方式,如Flowise的以下截图所示(来源:github.com/FlowiseAI/F...:
您可以看到一个代理(在本章后面讨论),它连接到一个搜索界面(Serp API),一个LLM和一个计算器。LangChain和LangFlow可以在本地部署,例如,使用Chainlit库,也可以在不同的平台上部署,包括Google Cloud。langchain-serve库有助于使用单个命令将LangChain和LangFlow部署到Jina AI云上,作为LLM应用程序即服务。
尽管仍然相对较新,但LangChain通过其对组件(如内存、链和代理)的组合,解锁了更先进的LLM应用。它旨在简化本可以复杂的LLM应用程序开发。因此,在本章的这一部分,我们将关注LangChain及其组件的工作原理。
LangChain的关键组件
Chains、agents、memory和tools使得创建复杂的LLM应用成为可能,这些应用不仅仅局限于对单个LLM的基本API调用。在接下来专门讨论这些关键概念的子章节中,我们将考虑它们如何通过将语言模型与外部数据和服务结合起来,实现强大系统的开发。 在本章中,我们不会深入讨论具体的实现模式;然而,我们将更详细地讨论这些组件在哪些方面表现出色。到最后,您应该具备足够的理解水平,能够使用LangChain构建系统。让我们从链开始!
什么是Chains?
在LangChain中,链是将模块化组件组合成可重用流水线的关键概念。例如,开发人员可以将多个LLM调用和其他组件按顺序组合在一起,创建用于社交互动、数据提取和数据分析等复杂应用的应用。以最一般的术语来说,链是对组件的一系列调用,其中可以包括其他链。最无害的链的例子可能是PromptTemplate,它将格式化的响应传递给语言模型。
Prompt chaining是一种可以用来改善LangChain应用性能的技术,它涉及将多个提示链接在一起以自动完成更复杂的响应。更复杂的链集成了与LLMMath(用于数学相关查询)或SQLDatabaseChain(用于查询数据库)等工具相结合的模型。这些被称为实用链,因为它们将语言模型与特定工具结合在一起。
链甚至可以强制执行策略,例如监管有毒的输出或符合道德原则。LangChain实现了链,以确保输出的内容既不是有毒的,也不违反OpenAI的审核规则(OpenAIModerationChain),也符合道德、法律或定制原则(ConstitutionalChain)。
一个LLMCheckerChain通过一种称为自反思的技术来验证语句,以减少不准确的响应。LLMCheckerChain可以通过验证提供的语句和问题的基本假设来防止幻觉并减少不准确的响应。在2023年5月的一篇由卡内基梅隆大学、艾伦研究所、华盛顿大学、NVIDIA、加利福尼亚大学圣地亚哥分校和谷歌研究等研究人员共同发表的论文中(SELF-REFINE: Iterative Refinement with Self-Feedback),发现这种策略平均可以提高大约20%的任务性能,其中包括对话响应、数学推理和代码推理。
一些链可以做出自主决策。与代理一样,路由链可以根据其描述来决定使用哪个工具。RouterChain可以动态选择使用哪种检索系统,例如提示或索引。
链提供了几个关键优势:
- 模块化:逻辑被分解为可重用的组件。
- 组合性:组件可以灵活地进行排序。
- 可读性:管道中的每个步骤都很清晰。
- 可维护性:可以添加、删除和交换步骤。
- 可重用性:通用流水线变成可配置的链。
- 工具集成:轻松集成LLMs、数据库、API等。
- 生产力:快速构建可配置链的原型。
这些优势共同使复杂的工作流程封装成易于理解和适应的链接流水线成为可能。
通常,开发LangChain链涉及将工作流程分解为逻辑步骤,如数据加载、处理、模型查询等。设计良好的链将单一职责组件串联在一起。步骤应该是无状态函数,以最大程度地提高可重用性。配置应该是可定制的。强大的错误处理与异常和错误同样重要以确保可靠性。监控和日志记录可以通过不同的机制启用,包括回调。
接下来让我们讨论代理及其决策的工作方式!
什么是agents?
代理是LangChain中创建与用户和环境动态交互系统的关键概念。代理是一个能够采取行动来实现目标和任务的自治软件实体。
链和代理是类似的概念,值得剖析它们的区别。LangChain的核心思想是将LLMs和其他组件组合在一起共同工作。链和代理都是这样做的,但方式不同。两者都扩展了LLMs,但代理通过编排链来实现,而链则组合了更低层次的模块。链通过排序组件定义可重用的逻辑,而代理利用链来采取以目标为驱动的行动。代理组合和编排链。代理观察环境,根据观察结果决定执行哪个链,执行链的指定操作,然后重复此过程。
代理使用LLMs作为推理引擎来决定采取哪些行动。LLM被提示可用的工具、用户输入和先前步骤。然后,它选择下一步操作或最终响应。
工具(在本章后面讨论)是代理调用以采取现实世界行动的功能。为代理提供正确的工具并有效地描述它们对于代理实现目标至关重要。
代理执行时期编排了查询代理、执行工具操作和反馈观察的循环。这处理了低层次的复杂性,如错误处理、日志记录和解析。
代理提供了几个关键优势:
- 目标导向执行:代理可以计划针对特定目标的逻辑链。
- 动态响应:观察环境变化使代理能够做出反应和适应。
- 有状态性:代理可以在交互过程中保持内存和上下文。
- 鲁棒性:通过捕获异常并尝试替代链处理错误。
- 组合性:代理逻辑结合了可重用的组件链。
总的来说,这使代理能够处理复杂的多步工作流程和像聊天机器人这样持续互动的应用。
在关于LLMs限制的部分,我们已经看到对于计算来说,一个简单的计算器优于一个包含数十亿参数的模型。在这种情况下,代理可以决定将计算传递给计算器或Python解释器。我们可以在这里看到一个简单的应用程序,其中代理连接到OpenAI模型和Python函数:
根据输入,代理可以决定运行一个Python函数。每个代理还决定使用何种工具以及何时使用。我们将在第4章《构建功能强大的助手》中更详细地讨论这是如何运作的机制。
代理和链的一个关键局限性是它们的状态无关性------每次执行都是在孤立的环境中进行,不保留之前的上下文。这就是记忆概念变得关键的地方。在LangChain中,记忆是指在链执行之间持久保存信息以实现状态保持的能力。
什么是memory?
在LangChain中,记忆指的是链或代理执行之间持久存在的状态。强大的记忆方法为开发人员构建会话式和交互式应用程序提供了关键的优势。例如,在记忆中存储聊天历史上下文可以提高随着时间推移的LLM响应的一致性和相关性。
与将每个用户输入视为孤立提示不同,链可以在每次调用时传递会话记忆到模型,以提供一致性。代理还可以将有关世界的事实、关系和推断持久保存在记忆中。即使真实世界的条件发生变化,这些知识仍然可用,保持代理在上下文中得知。记忆目标和已完成任务允许代理跟踪跨对话的多步目标的进度。此外,在记忆中保留信息可减少对LLMs获取重复信息的调用次数。这降低了API使用和成本,同时仍然为代理或链提供所需的上下文。
LangChain提供了记忆的标准接口、与数据库等存储选项的集成,以及有效将记忆整合到链和代理中的设计模式。
存在多种记忆选项,例如:
- ConversationBufferMemory 存储模型历史中的所有消息。这会增加延迟和成本。
- ConversationBufferWindowMemory 仅保留最近的消息。
- ConversationKGMemory 将交流总结为知识图,以整合到提示中。
- 由数据库支持的EntityMemory 持久保存代理状态和事实。
此外,LangChain集成了许多数据库选项用于持久存储:
- 像Postgres和SQLite这样的SQL选项支持关系数据建模。
- 像MongoDB和Cassandra这样的NoSQL选择支持可扩展的非结构化数据。
- Redis提供了用于高性能缓存的内存数据库。
- AWS DynamoDB等托管云服务消除了基础设施负担。
除了数据库外,专为记忆服务的服务器(如Remembrall和Motörhead)为优化的会话上下文提供了选择。正确的记忆方法取决于持久性需求、数据关系、规模和资源等因素,但强大地保留状态对于会话式和交互式应用程序至关重要。
LangChain的记忆集成,从短期缓存到长期数据库,使得构建有状态、上下文感知的代理成为可能。设计有效的记忆模式将开启下一代功能强大且可靠的AI系统。LangChain带有许多可用于应用程序的工具,虽然一个简短的部分可能无法完全介绍,但我将尝试给出一个简要的概述。
什么是tools?
工具提供了模块化接口,使代理能够集成外部服务,如数据库和API。工具包将共享资源的工具进行分组。工具可以与模型结合以扩展其功能。LangChain提供了诸如文档加载器、索引和向量存储等工具,用于促进在LLMs中增强数据检索的数据的检索和存储。
有许多可用的工具,以下只是其中的一些例子:
- 机器翻译:语言模型可以使用机器翻译工具更好地理解和处理多种语言的文本。该工具使非专门用于翻译的语言模型能够理解并回答不同语言的问题。
- 计算器:语言模型可以利用简单的计算器工具解决数学问题。计算器支持基本的算术运算,使模型能够准确解决专门设计用于数学问题解决的数据集中的数学查询。
- 地图:通过与Bing Map API或类似服务连接,语言模型可以检索位置信息,协助路线规划,提供驾驶距离计算,并提供有关附近兴趣点的详细信息。
- 天气:天气API为语言模型提供全球各个城市的实时天气信息。模型可以回答关于当前天气状况或特定位置在不同时间段内的天气预报的查询。
- 股票:通过与Alpha Vantage等股票市场API连接,语言模型可以查询特定股票市场信息,如开盘和收盘价格、最高和最低价格等。
- 幻灯片:配备制作幻灯片工具的语言模型可以使用python-pptx库等API提供的高级语义或根据给定主题从互联网中检索图像来创建幻灯片。这些工具有助于在各种专业领域需要的幻灯片创建任务中。
- 表格处理:使用pandas DataFrames构建的API使语言模型能够在表格上执行数据分析和可视化任务。通过连接到这些工具,模型可以为用户提供处理表格数据的更简化和自然的体验。
- 知识图:语言模型可以使用模拟人类查询过程的API查询知识图,例如查找候选实体或关系、发送SPARQL查询并检索结果。这些工具有助于基于知识图中存储的事实知识回答问题。
- 搜索引擎:通过利用Bing Search等搜索引擎API,语言模型可以与搜索引擎互动,提取信息并对实时查询提供答案。这些工具增强了模型从网络中获取信息并提供准确响应的能力。
- 维基百科:配备维基百科搜索工具的语言模型可以搜索维基百科页面上的特定实体,查找页面内的关键词,或通过消除相似名称的实体进行消歧义。这些工具有助于使用从维基百科检索的内容执行问答任务。
- 在线购物:将语言模型与在线购物工具连接,使其能够执行搜索物品、加载有关产品的详细信息、选择项目特征、浏览购物页面,并根据特定用户说明做出购买决策等操作。
其他工具包括AI绘画,允许语言模型使用AI图像生成模型生成图像;3D模型构建,使语言模型能够使用先进的3D渲染引擎创建3D模型;化学性质,使用像PubChem这样的API解决有关化学性质的科学问题;以及数据库工具,促使自然语言访问数据库数据以执行SQL查询和检索结果。
这些各种工具为语言模型提供了额外的功能和能力,使其能够执行超越文本处理的任务。通过通过API与这些工具连接,语言模型可以增强其在翻译、数学问题解决、基于位置的查询、天气预测、股票市场分析、幻灯片创建、表格处理和分析、图像生成、文本转语音转换等领域的能力。
所有这些工具都可以为我们提供先进的AI功能,几乎没有工具的限制。我们可以轻松构建定制工具,以扩展LLMs的功能,正如我们将在下一章中看到的那样。使用不同的工具扩展了语言模型应用的范围,使其能够更有效地处理各种实际任务。在讨论了链、代理、记忆和工具之后,让我们将所有这些组合在一起,形成LangChain如何将它们作为运动部分组合在一起的整体图景。
LangChain是如何工作的?
LangChain框架通过提供模块化组件简化了构建复杂的LLM(语言模型)应用程序,这些组件有助于将语言模型与其他数据和服务进行连接。该框架将功能组织成模块,涵盖了从基本的LLM交互到复杂的推理和持久化的各个方面。
这些组件可以组合成管道,也称为链,按照以下操作的顺序进行排列:
- 加载文档
- 用于检索的嵌入
- 查询LLMs
- 解析输出
- 写入内存
链将模块与应用程序目标相匹配,而代理则利用链与用户进行目标导向的交互。它们根据观察结果重复执行操作,规划最优逻辑链,并在对话中持续存储记忆。
这些模块从简单到高级包括:
- LLMs和聊天模型:提供连接和查询语言模型(如GPT-3)的接口。支持异步、流式和批量请求。
- 文档加载器:从各种来源摄取数据到包含文本和元数据的文档中。支持加载文件、网页、视频等。
- 文档转换器:通过拆分、合并、过滤、翻译等方式操作文档,以适应模型的数据。
- 文本嵌入:为语义搜索创建文本的向量表示。提供嵌入文档和查询的不同方法。
- 向量存储:存储嵌入文档向量以进行高效的相似性搜索和检索。
- 检索器:基于查询返回文档的通用接口。可以利用向量存储。
- 工具:代理用于与外部系统交互的接口。
- 代理:基于环境观察使用LLMs规划动作的目标驱动系统。
- 工具包:初始化共享资源(如数据库)的工具组。
- 内存:通过读取/写入会话数据在对话和工作流之间持续保存信息。
- 回调:连接到管道阶段进行日志记录、监控、流式传输等的回调。回调使监控链成为可能。
综上所述的功能使使用LangChain构建强大、高效、有能力的LLM应用程序成为可能。每个功能都有其复杂性和重要性,因此有必要详细解释。
LangChain提供了与LLMs(如GPT-3)和聊天模型连接和查询的接口。这些接口支持异步请求、流式响应和批量查询,为集成不同语言模型提供了灵活的API。
虽然LangChain本身不提供模型,但通过LLM包装器支持与各种语言模型提供者的集成,使应用程序能够与聊天模型以及文本嵌入模型提供者进行交互。支持的提供者包括OpenAI、HuggingFace、Azure和Anthropic。提供标准化接口意味着可以轻松替换模型以节省成本和能源,或获得更好的性能。我们将在第3章《使用LangChain入门》中详细介绍一些选项。
LangChain的核心构建块之一是prompt类,允许用户通过提供简洁的指令或示例与LLMs进行交互。prompt工程有助于优化提示以实现最佳模型性能。模板在输入方面提供了灵活性,并在各种应用程序中经过了实战测试。我们将在第3章《使用LangChain入门》中开始讨论prompt,并在第8章《定制LLMs及其输出》中深入探讨prompt工程。
文档加载器允许从各种来源摄取数据到包含文本和元数据的文档中。然后,通过文档转换器(拆分、合并、过滤、翻译等)操作这些文档,以适应LLMs的使用。
数据加载器包括用于存储数据以及与外部系统交互的实用程序,如Web搜索或数据库,尤其是数据检索。示例包括Microsoft Word文档(.docx)、HTML、以及其他常见格式,如PDF、文本文件、JSON和CSV。其他工具可能会向潜在客户发送电子邮件,为您的关注者发布有趣的双关语,或向同事发送Slack消息。我们将在第5章《构建像ChatGPT一样的聊天机器人》中详细讨论这些工具。
文本嵌入模型创建捕捉语义含义的文本向量表示。这使得通过查找具有最相似向量表示的文本进行语义搜索成为可能。向量存储通过索引嵌入文档向量以实现高效的基于相似性的检索。
当处理大型文档时,向量存储就变得重要,其中文档需要被分块以传递给LLM。文档的这些部分将被存储为嵌入,这意味着它们是信息的向量表示。所有这些工具都增强了LLMs的知识,并提高了它们在问答和摘要等应用中的性能。
有许多用于向量存储的集成,包括Alibaba Cloud OpenSearch、AnalyticDB for PostgreSQL、Meta AI的Annoy库(用于近似最近邻搜索)、Cassandra、Chroma、Elasticsearch、Facebook AI相似性搜索(Faiss)、MongoDB Atlas Vector Search、PGVector(用于Postgres的向量相似性搜索)、Pinecone、scikit-learn(用于k最近邻搜索的SKLearnVectorStore)等。我们将在第5章《构建像ChatGPT一样的聊天机器人》中探讨这些集成。
虽然接下来的章节将深入探讨LangChain组件的一些使用模式和用例的细节,但以下资源提供了关于LangChain组件以及它们如何组装成管道的宝贵信息。
要获取有关数十个可用模块的详细信息,请参阅全面的LangChain API 参考文档:api.python.langchain.com/。此外,还有数百个代码示例演示实际应用场景:python.langchain.com/docs/use_ca...。
除了LangChain之外,还有一些其他框架;然而,我们会看到LangChain是其中最突出且功能丰富的之一。
与其他框架比较LangChain
LLM(语言模型)应用程序框架的开发旨在提供专门的工具,能够有效地利用LLMs的力量来解决复杂的问题。已经涌现出一些库,它们满足有效地将生成式AI模型与其他工具结合起来构建LLM应用程序的需求。
有几个用于构建动态LLM应用程序的开源框架。它们在开发先进的LLM应用程序方面都提供了价值。以下图表显示了它们随时间的流行程度(数据来源:GitHub星标历史,star-history.com/):
我们可以看到每个项目随时间在GitHub上获得的星标数量。Haystack是比较的框架中最老的,始于2020年初(根据最早的GitHub提交记录)。在GitHub上的星标方面,它也是最不受欢迎的。LangChain、LlamaIndex(之前称为GPTIndex)和SuperAGI始于2022年末或2023年初,与LangChain相比,它们在短时间内的受欢迎程度显著不足,而LangChain则取得了令人瞩目的增长。AutoGen是微软最近发布的项目,已经引起了一些关注。在本书中,我们将看到LangChain的许多功能,并探索其特点,这是其受欢迎程度爆发增长的原因。
LlamaIndex专注于高级检索而不是LLM应用程序的更广泛方面。同样,Haystack专注于创建具有用于可伸缩信息检索的检索器、读取器和其他数据处理程序的组件的大规模搜索系统,同时通过预训练模型实现语义索引。
LangChain擅长使用代理将LLMs链接在一起,以委派动作给模型。其用例强调提示优化和上下文感知的信息检索/生成;然而,借助其Pythonic高度模块化的界面和庞大的工具集合,它是实施复杂业务逻辑的头号工具。
SuperAGI具有与LangChain类似的功能。它甚至配备了一个市场,一个用于工具和代理的存储库。然而,与LangChain相比,它的范围和支持程度没有那么广泛。
AutoGen简化了由LLMs驱动的复杂工作流的构建、编排和优化。其关键创新在于实现可定制的对话代理,通过自动聊天在不同的LLMs、人类和工具之间自动协调。AutoGen简化了代理定义和交互,以自动组合最优的基于LLM的工作流。
我没有包括AutoGPT(以及类似的工具如AutoLlama),这是一个递归应用,它分解任务,因为与LangChain相比,它基于人类和LLM反馈的推理能力非常有限。因此,它经常陷入逻辑循环并定期重复步骤。我还省略了一些专注于提示工程的库,例如Promptify。
还有其他使用Rust、JavaScript、Ruby和Java等语言的LLM应用程序框架。例如,用Rust编写的Dust专注于LLM应用程序的设计和部署。
像LangChain这样的框架旨在通过提供护栏、约定和预构建模块来降低障碍,但基础知识仍然是重要的,以避免陷阱并从LLMs中最大化价值。在交付功能强大、负责任的应用程序时,投资于教育将带来回报。
总结
LLMs产生令人信服的语言,但在推理、知识和访问工具方面存在显著的限制。LangChain框架简化了由LLMs驱动的复杂应用程序的构建,可以缓解这些缺点。它为开发人员提供了像链一样的模块化、可重用的构建块,用于组合管道,以及像代理一样用于目标导向交互。这些构建块组合在一起形成LLM应用程序,并具有扩展功能。
正如我们在本章中所见,链允许按顺序调用LLMs、数据库、API等,以完成多步骤的工作流。代理利用链基于观察采取行动来管理动态应用程序。内存跨执行持久保存信息以维护状态。总体而言,这些概念使开发人员能够通过集成外部数据、操作和上下文来克服单个LLM的限制。换句话说,LangChain将复杂的编排简化为可定制的构建块。
在接下来的章节中,我们将在这些LangChain基础上构建能力强大的实际应用程序。我们将实现结合LLMs、知识库和先进推理算法的对话代理。通过利用LangChain的功能,开发人员可以释放LLMs的全部潜力,推动下一代人工智能软件的发展。在下一章中,我们将使用LangChain实现我们的第一个应用程序!