2023年可以说是人工智能领域不平凡的一年,随着人工智能领域的飞速发展,开发者们都在寻找能够轻松、高效地构建应用的工具。
尤其对于那些不熟悉大语言模型领域,或者初入此领域的开发者来说,选择一个合适的工具尤为重要。
在众多的选择中,有一个名字越来越受到大家的关注——LangChain,相信它会在今年大放异彩,所以今天就来给大家详细介绍一下LangChain。
01
为什么需要LangChain
首先想象一个开发者在构建一个LLM应用时的常见场景。
当你开始构建一个新项目时,你可能会遇到许多API接口、数据格式和工具。对于一个非AI领域的开发者来说,要去研究每一个工具、接口都有着巨大的负担。
现在,假设你要构建一个涉及语言处理的应用,比如一个智能聊天机器人,你可能会想:我难道要一步步去学习如何训练一个语言模型,如何处理各种数据,还要解决所有的兼容性问题吗?
这就是LangChain的价值所在。
LangChain是一个集成框架,它为开发者提供了一系列的工具和组件,使得与语言模型中各种数据(如Google Analytics、Stripe、SQL、PDF、CSV等)的连接、语言模型的应用和优化变得简单直接。
其实,LangChain就好比一把“瑞士军刀”,你不再需要为每一个任务找一个新工具,它提供了一站式的解决方案。正如你要修理一个小小的家用电器,而你已经拥有了一个完整的工具箱。不管你遇到什么问题,打钉子、拧螺丝、剪线,工具箱里总有一个合适的工具等着你。LangChain为你提供了这样的工具箱,不仅涵盖了基础工具,还为个性化需求提供了自定义组件解决方案。
现在,随着LangChain在开发者社区中的受欢迎程度逐渐上升,可以明显地看到使用LangChain的开发者数量呈现激增的趋势。
2023年8月,LangChain开源框架已经收获了惊人的数据:5.82万个星标、557位专注开发者,以及7800位积极的分支开发者。这些数字从深层次上代表了众多开发者对LangChain实用性和未来潜力的坚定认可。
正是因为LangChain连接了开发者和复杂的LLM应用,因此,开发变得更为简单、高效。也因为这种受欢迎程度和媒体报道的广泛传播,越来越多的开发者,不论是LLM领域的还是非LLM领域的,都选择使用LangChain。
02
LLM应用开发的最后1公里
想象一下,一个对编程完全陌生的初学者,正面临着如何与模型进行交互的诸多问题,哪怕是简单的GET或POST请求,都可能成为其开发路上的第一道门槛。而LangChain的存在恰恰能跨越这道门槛,使得LLM应用开发变得触手可及。
首先,LangChain的简洁性让它脱颖而出。开发者只需要写几行代码,就能运行一个大型LLM程序,甚至快速构建一个响应式的机器人。这种简洁性意味着,无论是对于有经验的开发者还是初入此领域的新手,LangChain都能为他们进入LLM应用开发的世界铺平道路。
LangChain还为开发者集成了丰富的内置链组件,为开发者解决了重复编写代码的问题。面对特定的任务,如摘要或问答,LangChain提供了专门的摘要链和问答链,简化了开发流程。Agent的引入将工具和数据库的整合提升到了一个新的层次,使得开发者可以全心投入任务。
借助LangChain,开发者除了可以实现LLM与真实世界的在线数据增强,即RAG(检索增强生成),还能在私有环境中部署模型,或是针对特定任务选择更精确的模型平台及型号,甚至随时切换各大平台推出的新模型。
而对于那些未选择使用LangChain的开发者来说,他们很可能会被各模型平台的接口选择、提示词的编写,以及输出格式的处理等问题所困扰,这些复杂的问题会成为开发过程中的巨大障碍,甚至导致开发者“从入门到放弃”。
在LLM应用开发中,一个经常被遗漏但至关重要的环节是,如何为LLM编写合适的提示词,确保LLM能够准确理解开发者的意图。对于许多开发者,特别是初学者来说,这可能是一个具有挑战性的任务。然而,LangChain为这一问题提供了有力的解决方案。
对于那些在模型提示词编写上感到困惑的开发者来说,LangChain提供了多种模板供选择。这并不仅仅是一些随意整合的模板,而是与各种应用、工具紧密集成的组件,其中包含了大量已经经过实际验证的提示词模板。这意味着开发者无须从零开始编写程序,只需要在LangChain提供的模板中找到与任务相匹配的部分,并进行相应的调整即可。
以SQL查询为例,这是一个对许多开发者来说相对熟悉,但在与LLM结合时可能存在困惑的领域。如果一个开发者刚开始接触如何为SQL编写提示词,他可以轻松地在LangChain中找到SQL组件的提示词模板。这些模板中包括如何编写语法正确的PostgreSQL查询、如何查看查询结果,以及如何返回针对输入问题的答案。更进一步,LangChain提供的提示词模板也包括各种查询的最佳实践,如限制PostgreSQL查询结果、正确使用列名、注意使用当前日期的函数等。
例如,LangChain提供了以下格式化SQL提示词模板(翻译):
1 你是一个PostgreSQL专家。给定一个输入问题,首先创建一个语法正确的PostgreSQL查询来运行,然后查看查询结果,并返回针对输入问题的答案。
2 除非用户明确指定了要返回的结果数量,否则应使用PostgreSQL的LIMIT子句来限制查询结果,最多返回top_k条记录。你可以对结果进行排序,以返回数据库中最有信息价值的数据。
3 绝对不要查询表中的所有列。你只能查询回答问题所需的列。用双引号(")将每个列名包裹起来,表示它们是界定的标识符。
4 注意只使用你在表中可以看到的列名,不要查询不存在的列。此外,要注意哪一列在哪个表中。
5 如果问题涉及“今天”,请注意使用CURRENT_DATE函数获取当前日期。
6
7 使用以下格式:
8
9 问题:这里的问题
10 SQL查询:要运行的SQL查询
11 SQL结果:SQL查询的结果
12 答案:这里的最终答案
13
14 只使用以下表:
15
16 {table_info}
17
18 问题:{input}
想象一下,如果没有LangChain提供的这个提示词模板,当你要开始编写一段SQL查询代码时,会走多少弯路?
LLM应用开发的最后1公里,其意义是确保开发者无须为了一个小细节而多走弯路,正如居民无须跑很远坐公交车一样,每一个关键的细节都能得到及时而准确的处理,使得整个开发过程更为高效。
03
LangChain的2个关键词
在现代软件工程中,如何将庞大复杂的系统划分为更小、更易于管理和使用的部分,已经成了设计和开发的核心考量。在这个背景下,LangChain以“组件”和“链”作为2个关键概念,为LLM应用开发者提供了便利。
首先来谈谈“组件”。
在LangChain中,组件不是代码的拼凑,而是一个具有明确功能和用途的单元。组件包括LLM模型包装器、聊天模型包装器及与数据增强相关的一系列工具和接口。这些组件就是LangChain中的核心,你可以把它们看作数据处理流水线上的各个工作站。每个组件都有其特定的职责,如处理数据的输入输出、转化数据格式。
然而,单纯的组件还不足以满足复杂应用的需求,这时“链”便显得尤为关键。在LangChain的体系中,链是将各种组件连接在一起的纽带,它能够确保组件之间的无缝集成和在程序运行环境中的高效调用。无论是对于LLM还是其他工具,链都扮演着至关重要的角色。举个例子,LLMChain,这是LangChain中最常用的链,它可以整合LLM模型包装器和记忆组件,让聊天机器人拥有“记忆”。
值得一提的是,LangChain并没有止步于提供基础的组件和链。反之,它进一步为这些核心部分提供了标准的接口,并与数据处理平台及实际应用工具紧密集成。这样的设计不仅强化了LangChain与其他数据平台和实际工具的连接,也确保了开发者能在一个开放且友好的环境中轻松地进行LLM应用开发。
以最常见的聊天机器人为例,为了在各种场景中为用户提供自然、流畅的对话体验,聊天机器人需要具备多种功能,包括与用户进行日常交流、获取天气信息及实时搜索。这一设计目标意味着要处理的任务范围覆盖了从简单的日常对话到复杂的信息查询,因此,一个结构化、模块化的设计方案是必要的。
在此背景下,LangChain 的“组件”和“链”提供了极大的帮助。利用LangChain的组件,开发者可以为聊天机器人设计不同的模块,如与用户进行日常交流的模块、获取天气信息的模块及进行实时搜索的模块。每个模块中的组件都具备特定的功能,并专门处理与之相关的任务。例如,当需要回答关于天气的问题时,机器人可以调用“搜索工具组件”来获取天气信息数据。
但是,单纯的组件无法满足机器人的整体运作。为了确保组件之间可以协同工作并为用户提供顺畅的体验,需要用到LangChain的“链”来整合这些组件。例如,当用户询问一个涉及多个组件的问题时,如“今天天气怎么样,同时告诉我量子力学是什么”,LangChain的链就可以确保“搜索工具组件”和“维基百科查询组件”协同工作,为用户提供完整的回答。
具体来说,当用户提出问题时,LangChain提供的API允许机器人执行以下操作:
(1)请求LLM解释用户的输入,并根据输入内容生成对应的查询请求,这可能涉及一个或多个组件;
(2)根据生成的查询请求,激活对应的组件以获取必要的数据或信息;
(3)利用LLM生成基于自然语言的回答,将各组件的返回结果整合为用户可以理解的回答。
通过这种方式,开发者无须深入每一个复杂的处理细节,只需要利用LangChain的API输入用户的问题,并将得到的答案呈现给用户即可。这不仅使聊天机器人能够提供丰富的信息服务,还能确保LLM应用自然而然地融入人们的日常生活,达到设计初衷。
04
LangChain的3个场景
LangChain正在重新定义LLM应用的开发方式,尤其是在问答系统、数据处理与管理、自动问答与客服机器人这3个场景下。以下是对LangChain在这3个场景下作用的分析。
第1个场景是问答系统。问答系统已经成为许多LLM应用的重要组成部分,从简单的搜索工具到复杂的知识库查询工具。LangChain在这方面展现了其出色的能力。当开发者面临需要从长篇文章或特定数据源中提取信息的挑战时,LangChain 可以轻松地与这些外部数据源交互,迅速提取关键信息,然后执行生成操作,以生成准确的回答。
第2个场景是数据处理与管理,如RAG。在数据驱动的当下,RAG成了一个非常热门的LLM应用落地方向。RAG结合了检索和生成两个阶段,为用户提供了更为精准和富有深度的回答。LangChain采用了LEDVR工作流,实现了RAG的功能。
LEDVR工作流将数据处理的每一个步骤标准化,确保了数据从输入到输出的完整性和准确性。首先,开发者会使用文档加载器,如WebBaseLoader,从外部数据源导入所需的数据。这一步确保了数据的完整性和原始性。
接着,数据会被传输到嵌入包装器,如OpenAIEmbeddings中。这一步的主要目的是将每一份文档转化为一个能够在机器学习模型中使用的向量。这个向量能够捕获文档的主要特征,使得后续的处理更为高效。
为了更好地处理大量的数据,LangChain中引入了分块转化步骤。通过使用如RecursiveCharacterTextSplitter这样的工具,文档被切割成更小的数据块。这不仅提高了处理速度,还使得每一个数据块都能得到更为精准的处理。
当所有的数据块都被处理完毕,它们会被存储到向量存储系统,如FAISS中。这个存储系统能够确保数据的安全,同时也能提供一个高效的查询接口。
最后,检索器(如ConversationalRetrievalChain)被用来从向量存储系统中检索相关的文档。这一步结合了用户查询和向量存储系统中的数据,为用户提供了最为相关的回答。
第3个场景是自动问答与客服机器人。在许多在线平台上,客服机器人已经成为用户与公司之间的首要交互点。利用LangChain,开发者成功构建了能够实时响应用户查询的客服机器人。这种实时响应得益于LangChain的Agent功能,其中涉及LLM决策,并根据反馈不断优化交互的过程。这样的设计使客服机器人不仅能够及时响应,还能提供更加精确的信息或解决方案。
LangChain已经在这3个关键场景中展现了强大的潜力,为开发者提供了实用且强大的工具,使开发者可以更加高效地实现各种开发需求。
05
LangChain的6大模块
针对LLM应用开发者的需求,LangChain推出了6大核心模块。
如图1所示,这些模块覆盖了从模型I/O到数据增强,从链到记忆,以及从Agent到回调处理器的全方位功能。
借助这些模块中的包装器和组件,开发者能够更为方便地搭建LLM应用。
图1
1. 模型I/O(Model IO):对于任何大语言模型应用来说,其核心无疑都是模型自身。LangChain提供了与任何大语言模型均适配的模型包装器(模型I/O的功能),分为LLM和聊天模型包装器(Chat Model)。模型包装器的提示词模板功能使得开发者可以模板化、动态选择和管理模型输入。LangChain自身并不提供大语言模型,而是提供统一的模型接口。模型包装器这种包装方式允许开发者与不同模型平台底层的API进行交互,从而简化了大语言模型的调用,降低了开发者的学习成本。此外,其输出解析器也能帮助开发者从模型输出中提取所需的信息。
2. 数据增强(Data Connection):许多LLM应用需要的用户特定数据并不在模型的训练集中。LangChain提供了加载、转换、存储和查询数据的构建块。开发者可以利用文档加载器从多个来源加载文档,通过文档转换器进行文档切割、转换等操作。矢量存储和数据检索工具则提供了对嵌入数据的存储和查询功能。
3. 链(Chain):单独使用LLM对于简单应用可能是足够的,但面对复杂的应用,往往需要将多个LLM模型包装器或其他组件进行链式连接。LangChain为此类“链式”应用提供了接口。
4. 记忆(Memory):大部分的LLM应用都有一个对话式的界面,能够引用之前对话中的信息是至关重要的。LangChain提供了多种工具,帮助开发者为系统添加记忆功能。记忆功能可以独立使用,也可以无缝集成到链中。记忆模块需要支持两个基本操作,即读取和写入。在每次运行中,链首先从记忆模块中读取数据,然后在执行核心逻辑后将当前运行的输入和输出写入记忆模块,以供未来引用。
5. Agent:核心思想是利用LLM选择操作序列。在链中,操作序列是硬编码的,而在Agent代理中,大语言模型被用作推理引擎,确定执行哪些操作,以及它们的执行顺序。
6. 回调处理器(Callback):LangChain提供了一个回调系统,允许开发者在LLM应用的各个阶段对状态进行干预。这对于日志记录、监视、流处理等任务非常有用。通过API提供的callbacks参数,开发者可以订阅这些事件。
本文摘自《LangChain入门指南:构建高可复用、可扩展的LLM应用程序》一书!