要想开发出优秀的AI应用程序,除了有性能强大的大语言模型(后续简称LLM)作基础,优秀的提示词工程技术,借助检索增强生成从外部知识库获取LLM不具备的专有知识,通过智能体对接外部工具扩展LLM能力,缺一不可。此外AI应用程序通常都需要经过多轮提示以及解析输出,并有机连接成一个整体,本质上是个链的过程,如何快速高效实现也是一个问题。
基于以上这些痛点,哈里森·蔡斯(HarrisonChase)于2022年10月创建了LangChain,使我们能更方便和快捷的开发出功能强大的AI应用程序。可以说,LangChain是目前最强的AI应用程序开发框架之一,从Java程序员的视角来说,它的地位就相当于Java界的Spring一样。
二、LangChain简介
LangChain本质上是一个用于开发由LLM驱动的应用程序的框架。它通过连接LLM和外部一切可以利用的能力,给应用程序赋能,使得应用程序能够具备上下文意识和推理能力。
整个LangChain由六层组成,架构图如下。
最底层是协议层,包括LangChain表达语言(LCEL)和一些基础抽象类。主要是提示词模板、输出解析器、链的抽象类,通过LCEL语法以及管道的概念,来简化代码的开发。
第二层是集成组件层,包括各种大语言模型输入输出、外部知识库检索、智能体工具等第三方集成。具体的比如智谱AI大语言模型包装类、嵌入模型HuggingFaceEmbeddings、向量数据库FAISS等,都在这一层。
第三层是认知架构层,包括构成应用程序认知架构的链、智能体和检索策略。主要是链(Chains)、智能体(Agents)和检索策略的具体实现类。
第四层是应用模板层,包括各种参考应用模板。有多种可以快速运行部署的应用示例,参考价值还是比较高的。
第五层是部署层,LangServe,是一个用于将LangChain部署为RESTAPI的库。
第六层是表现层,LangSmith,一个开发平台,允许调试、测试、评估和监控LangChain应用。
三、环境准备
在使用LangChain进行AI应用程序开发前,需要准备好相应的开发环境,包括Conda、JupyterNotebook、使用的智谱AIGLM-4大模型。
1、安装Conda
创建虚拟环境:
condacreate-nlangchainpython=3.9激活虚拟环境:
condaactivatelangchain2、安装JupyterNotebook
为了能更方便编程和调试,及时执行代码块,我们使用JupyterNotebook来作为Python集成开发工具。
在虚拟环境中安装JupyterNotebook:
condainstalljupyternotebook启动Jupyternotebook:
jupyternotebook3、安装LangChain
在JupyterNotebook中进行操作,安装LangChain的最小集。
pipinstall--upgradelangchain4、调用智谱AI的GLM-4大模型
LLM的选择有多种方案。
方案一:远程调用OpenAI的ChatGPT系统API,效果较好,token花费较贵;
方案二:远程调用智谱AI的GLM-4的API,效果较好,token花费较低;
方案三:本地部署开源大语言模型ChatGLM3-6B,效果较差,不需要收费,但电脑需要有13GB以上的GPU。
下面的操作都在JupyterNotebook中进行。
安装智谱的SDK包:
pipinstallzhipuai由于最新的LangChain0.1.7集成的ChatZhipuAI类和最新zhipuaiSDK版本兼容性方面有问题,需要重新包装一个类。代码如下:
#填写您自己的APIKeyZHIPUAI_API_KEY="..."llm=ChatZhipuAI(temperature=0.1,api_key=ZHIPUAI_API_KEY,model_name="glm-4",)四、AI应用程序开发入门
环境准备好之后,就可以开始使用LangChain进行AI应用程序开发了。LangChain其实就是通过各种链(Chain)将外部数据和计算连接到LLM,从而构建面向AI的应用程序。AI应用程序开发的入门,介绍了简单LLM链、检索链、智能体三个示例程序,通过一步一步操作,让大家快速入门。
1、简单LLM链(LLMChain)
1)上面已经安装并创建了智谱AI大模型,现在可以直接调用它。
llm.invoke("langsmith如何帮助测试")结果:
fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserprompt=ChatPromptTemplate.from_messages([("system","你是世界级的技术文档作者。"),("user","{input}")])然后可以将提示词、LLM组合成一个简单的LLM链。Chain是LangChain的核心,最新的版本使用了Unix经典的管道方式来连接,相比之前简洁了很多。
chain=prompt|llm调用LLM链。
chain.invoke({"input":"langsmith如何帮助测试"})结果:
fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserprompt=ChatPromptTemplate.from_messages([("system","你是世界级的技术文档作者。"),("user","{input}")])output_parser=StrOutputParser()chain=prompt|llm|output_parserchain.invoke({"input":"langsmith如何帮助测试"})输出结果变成了字符串类型:
2、检索链(RetrievalChain)
1)首先从互联网获取数据
需要先安装BeautifulSoup:
因为OpenAIEmbeddings嵌入模型需要和OpenAIChatGPT配套使用。我们换成更通用的HuggingFaceEmbeddings。
fromlangchain_community.embeddingsimportHuggingFaceEmbeddingsembeddings=HuggingFaceEmbeddings()现在可以使用此嵌入模型将文档提取到向量存储中了,为了简单起见,使用了本地向量数据库FAISS。
首先安装FAISS所需的软件包:
pipinstallfaiss-cpu然后在向量数据库中建立索引:
首先,建立一个文档链,该链接受问题和检索到的文档并生成答案。
fromlangchain.chainsimportcreate_retrieval_chainretriever=vector.as_retriever()retrieval_chain=create_retrieval_chain(retriever,document_chain)调用检索链,得到答案。
response=retrieval_chain.invoke({"input":"langsmith如何帮助测试"})print(response["answer"])结果:
3、智能体(Agent)
所谓智能体,实际上是指预先提供多种工具(tools),智能体调用LLM根据我们的问题决定使用某种工具,进而调用工具获得需要的信息,再把需要的信息发送给LLM,获得最终结果。工具可以是LangChain内置的工具,也可以是自定义的工具,比如通过网络进行搜索获取信息的工具、数学计算的工具、我们自己定义的特定功能函数等。
在这个示例中,我们给智能体提供了两个工具:一个是刚才创建的有关LangSmith的检索器,另一个是能够回答最新信息的搜索工具。
1)首先,为刚才创建的检索器设置一个工具,名字叫"langsmith_search":
然后设置为环境变量:
exportTAVILY_API_KEY=...创建搜索工具:
fromlangchain_community.tools.tavily_searchimportTavilySearchResultssearch=TavilySearchResults()3)创建智能体使用的工具列表:
tools=[retriever_tool,search]4)接下来可以创建智能体来使用这些工具。
首先安装langchainhub,这个网站上提供了很多提示词模板,可以直接使用。
pipinstalllangchainhub获取提示词和创建智能体执行器。这里做了些优化,create_openai_functions_agent换成了create_openai_tools_agent,"hwchase17/openai-functions-agent"换成了"hwchase17/openai-tools-agent"。
fromlangchainimporthubfromlangchain.agentsimportcreate_openai_tools_agentfromlangchain.agentsimportAgentExecutor#Gettheprompttouse-youcanmodifythis!prompt=hub.pull("hwchase17/openai-tools-agent")agent=create_openai_tools_agent(llm,tools,prompt)agent_executor=AgentExecutor(agent=agent,tools=tools,verbose=True)4)现在可以调用智能体了。先向它询问有关LangSmith的问题:
五、总结
首先对LangChain做了介绍,LangChain是哈里森·蔡斯(HarrisonChase)于2022年10月创建的,对于AI应用程序开发来说,它的地位就相当于Java界的Spring。LangChain的整体架构分为六层,它的核心概念就是链,链接外部一切能链接的东西赋予LLM力量。
然后从零基础开始介绍了LangChain环境的安装和配置,包括Conda、JupyterNotebook、LangChain,以及智谱AIGLM-4在LangChain的最新调用API。
最后再通过LLM链、检索链、智能体三个经典的示例,带大家一步一步的快速上手了提示词模板、输出解析器、管道、LLM链、检索链、智能体等功能的使用和开发。