要想开发出优秀的AI应用程序,除了有性能强大的大语言模型(后续简称LLM)作基础,优秀的提示词工程技术,借助检索增强生成从外部知识库获取LLM不具备的专有知识,通过智能体对接外部工具扩展LLM能力,缺一不可。此外AI应用程序通常都需要经过多轮提示以及解析输出,并有机连接成一个整体,本质上是个链的过程,如何快速高效实现也是一个问题。
基于以上这些痛点,哈里森·蔡斯 (Harrison Chase) 于2022年10月创建了LangChain,使我们能更方便和快捷的开发出功能强大的AI应用程序。可以说,LangChain是目前最强的AI应用程序开发框架之一,从Java程序员的视角来说,它的地位就相当于Java界的Spring一样。
如何学习LangChain,官网上的使用说明文档最权威,但是官网文档的一大特定或者说是弊端就是,知识点不聚焦,比较零散,初学者一上来很难抓住重点。此外LangChain迭代速度很快,网上虽然也有不少此类文章,但大部分都有所过时。
基于此,我实践并整理了最新版的LangChain结合国内性价比最高的智谱AI GLM-4大模型的系列文章,希望能给大家起到一定的参考作用,同时也欢迎共同探讨。本篇文章是第一篇,从零开始带大家快速入门LangChain开发AI应用程序。
二、LangChain简介
LangChain本质上是一个用于开发由LLM驱动的应用程序的框架。它通过连接LLM和外部一切可以利用的能力,给应用程序赋能,使得应用程序能够具备上下文意识和推理能力。
整个LangChain由六层组成,架构图如下。
最底层是协议层,包括LangChain表达语言(LCEL)和一些基础抽象类。主要是提示词模板、输出解析器、链的抽象类,通过LCEL语法以及管道的概念,来简化代码的开发。
第二层是集成组件层,包括各种大语言模型输入输出、外部知识库检索、智能体工具等第三方集成。具体的比如智谱AI大语言模型包装类、嵌入模型HuggingFaceEmbeddings、向量数据库FAISS等,都在这一层。
第三层是认知架构层,包括构成应用程序认知架构的链、智能体和检索策略。主要是链(Chains)、智能体(Agents)和检索策略的具体实现类。
第四层是应用模板层,包括各种参考应用模板。有多种可以快速运行部署的应用示例,参考价值还是比较高的。
第五层是部署层,LangServe,是一个用于将LangChain部署为REST API的库。
第六层是表现层,LangSmith,一个开发平台,允许调试、测试、评估和监控LangChain应用。
三、环境准备
在使用LangChain进行AI应用程序开发前,需要准备好相应的开发环境,包括Conda、Jupyter Notebook、使用的智谱AI GLM-4大模型。
1、安装Conda
使用Python的人都会遇到库的安装、环境的管理问题,Conda就是解决这些问题的一个工具,目前有AnaConda和MiniConda两种,都是Continuum Analytics的开源项目。这两种的区别就是:AnaConda大而全,预装了大部分科学计算库(99%其实用不上),提供了图形界面,适合初学者;MiniConda小而精,只有命令行。个人推荐使用MiniConda,比较轻量,节省时间和空间,需要什么再安装就可以。
创建虚拟环境:
激活虚拟环境:
2、安装Jupyter Notebook
为了能更方便编程和调试,及时执行代码块,我们使用Jupyter Notebook来作为Python集成开发工具。
在虚拟环境中安装Jupyter Notebook:
启动Jupyter notebook:
3、安装LangChain
在Jupyter Notebook中进行操作,安装LangChain的最小集。
4、调用智谱AI的GLM-4大模型
LLM的选择有多种方案。
方案一:远程调用OpenAI的ChatGPT系统API,效果较好,token花费较贵;
方案二:远程调用智谱AI的GLM-4的API,效果较好,token花费较低;
方案三:本地部署开源大语言模型ChatGLM3-6B,效果较差,不需要收费,但电脑需要有13GB以上的GPU。
下面的操作都在Jupyter Notebook中进行。
安装智谱的SDK包:
由于最新的LangChain 0.1.7集成的ChatZhipuAI类和最新zhipuai SDK版本兼容性方面有问题,需要重新包装一个类。代码如下:
创建调用的对话大模型对象,api key需要修改成你自己的:
四、AI应用程序开发入门
环境准备好之后,就可以开始使用LangChain进行AI应用程序开发了。LangChain其实就是通过各种链(Chain)将外部数据和计算连接到LLM,从而构建面向AI的应用程序。AI应用程序开发的入门,介绍了简单LLM链、检索链、智能体三个示例程序,通过一步一步操作,让大家快速入门。
1、简单LLM链(LLM Chain)
1)上面已经安装并创建了智谱AI大模型,现在可以直接调用它。
结果:
2)在LangChain中,可以使用提示词模板,将原始用户输入转换为更好的 LLM 输入。提示词模板是LangChain的一大提效法宝。
然后可以将提示词、LLM组合成一个简单的LLM链。Chain是LangChain的核心,最新的版本使用了Unix经典的管道方式来连接,相比之前简洁了很多。
调用LLM链。
结果:
3)可以看到,输出结果是一个AIMessage消息对象。很多情况使用字符串要方便得多,可以添加一个字符串输出解析器来将聊天消息转换为字符串。输出解析器也是LangChain的一大提效法宝。
输出结果变成了字符串类型:
本示例通过提示词模板、LLM、输出解析器,以管道的方式组成一个链,可以快速的调用AI大模型,实现一个简单的AI应用程序。
2、检索链(Retrieval Chain)
之前简单LLM链示例里问的问题(“langsmith 如何帮助测试?”),完全是依赖大语言模型已有的知识来进行回答。当我们有更专业更准确的知识时,可以通过检索的方式从外部获取最相关的知识,然后作为背景知识传递给大语言模型,来获得更精准的结果。
1)首先从互联网获取数据
需要先安装BeautifulSoup:
2)接下来需要使用嵌入模型进行向量化,再存储到向量数据库。
因为OpenAIEmbeddings嵌入模型需要和OpenAI ChatGPT配套使用。我们换成更通用的HuggingFaceEmbeddings。
现在可以使用此嵌入模型将文档提取到向量存储中了,为了简单起见,使用了本地向量数据库FAISS 。
首先安装FAISS所需的软件包:
然后在向量数据库中建立索引:
首先,建立一个文档链,该链接受问题和检索到的文档并生成答案。
调用检索链,得到答案。
结果:
本示例首先获取外部互联网页面数据,经过嵌入模型对数据进行向量化,存储到向量数据库,当用户输入提示词时,到向量数据库中获取相关信息作为背景知识一起输入给LLM,最后LLM输出更准确的信息。通过这种检索增强生成的方式,可以方便的构建一些面向特定私有化知识领域的专用AI应用程序。后续会有一篇文章专门深入的介绍检索增强生成方面的应用。
3、智能体(Agent)
所谓智能体,实际上是指预先提供多种工具(tools),智能体调用LLM根据我们的问题决定使用某种工具,进而调用工具获得需要的信息,再把需要的信息发送给LLM,获得最终结果。工具可以是LangChain内置的工具,也可以是自定义的工具,比如通过网络进行搜索获取信息的工具、数学计算的工具、我们自己定义的特定功能函数等。
在这个示例中,我们给智能体提供了两个工具:一个是刚才创建的有关 LangSmith的检索器,另一个是能够回答最新信息的搜索工具。
1)首先,为刚才创建的检索器设置一个工具,名字叫"langsmith_search":
然后设置为环境变量:
创建搜索工具:
3)创建智能体使用的工具列表:
4)接下来可以创建智能体来使用这些工具。
首先安装langchain hub,这个网站上提供了很多提示词模板,可以直接使用。
获取提示词和创建智能体执行器。这里做了些优化,create_openai_functions_agent换成了create_openai_tools_agent,"hwchase17/openai-functions-agent"换成了"hwchase17/openai-tools-agent"。
4)现在可以调用智能体了。先向它询问有关 LangSmith 的问题:
结果如下,可以看到LLM先根据问题确定要使用"langsmith_search"工具,然后LangChain调用"langsmith_search"工具从向量数据库中获得相关信息,最后返回信息给LLM得到最终结果。
5)再询问下天气情况:
结果如下,可以看到LLM先根据问题确定要使用"tavily_search_results_json"工具,然后LangChain调用"tavily_search_results_json"工具从互联网上获得相关信息,最后返回信息给LLM得到最终结果。
本示例通过给智能体提供多种工具(有关LangSmith的检索器、回答最新信息的搜索工具),智能体调用LLM根据我们的问题决定使用某种工具,进而调用工具获得需要的信息,再把需要的信息发送给LLM,获得最终结果。通过这种工具增强的方式,可以构建集成特定应用的AI应用程序,比如在应用程序中集成在线购物、自定义的数据计算等实用功能。后续会有一篇文章专门深入的介绍智能体工具方面的应用。
五、总结
首先对LangChain做了介绍,LangChain是哈里森·蔡斯 (Harrison Chase) 于2022年10月创建的,对于AI应用程序开发来说,它的地位就相当于Java界的Spring。LangChain的整体架构分为六层,它的核心概念就是链,链接外部一切能链接的东西赋予LLM力量。
然后从零基础开始介绍了LangChain环境的安装和配置,包括Conda、Jupyter Notebook、LangChain,以及智谱AI GLM-4在LangChain的最新调用API。
最后再通过LLM链、检索链、智能体三个经典的示例,带大家一步一步的快速上手了提示词模板、输出解析器、管道、LLM链、检索链、智能体等功能的使用和开发。