目录
引言
上文我们说到AI Agent的概念以及实现它的框架目前有很多且各具特点。本文先简单整理下LangChain实现Agent的实践案例作为抛砖引玉,迈进LangChain实践的第一小步。
一、什么是LangChain
LangChain是一个开源框架,旨在帮助开发人员使用大型语言模型(LLMs)构建应用程序。它通过提供一系列工具、组件和接口,简化了创建由LLMs和聊天模型提供支持的应用程序的过程。
有网友猜测,之所以选择鹦鹉作为 LangChain 的 logo,是因为大模型常被戏称为“随机鹦鹉”,即它只是模仿人类输出的文本,缺乏真正的理解能力。而 LangChain 则别出心裁地将鹦鹉(🦜)与链条(🔗)组合在一起,寓意其在提高大模型能力方面的作用。
以下是LangChain的详细介绍:
LangChain的主要特点和功能
- 模块化构建:提供一套模块化的构建块和组件,便于集成到第三方服务中。
- 生命周期支持:涵盖应用程序的整个生命周期,从开发、生产化到部署。
- 开源与集成:支持与多种第三方服务的集成,如数据库、API等。
- 生产化工具:提供LangSmith用于调试、测试、评估和监控基于LLM的应用程序。
- 部署:LangServe允许将LangChain链作为REST API部署,方便应用程序的访问和使用。
LangChain的核心组件
- 模型输入/输出(Model I/O):负责与语言模型进行交互,处理输入和输出数据。
- 数据连接(Data Connection):管理主要用于建设私域知识(库)的向量数据存储、内容数据获取和转化,以及向量数据查询。
- 链(Chains):构建调用序列,用于完成特定的高级任务。
- 记忆(Memory):在链/代理调用之间持久化状态,帮助维护上下文。
- 代理(Agents):基于Chains决定采取哪些行动、执行该行动、看到一个观察结果,并重复这个过程直到完成。
- 回调(Callbacks):记录并流式传输任何链的中间步骤。
LangChain通过其强大的功能和灵活的组件,为开发人员提供了一个强大的工具,用于构建和部署基于大型语言模型的应用程序。
源码: https://github.com/langchain-ai/langchain
文档(英文):https://python.langchain.com/v0.1/docs/get_started/introduction
文档似乎也已经告诉了我们它所具备的所有基础能力了。
有的同学似乎也道出了LangChain的弊端,LangChain试图通过隐藏细节,用更少的代码做更多的事情来让你的生活更轻松。但当这以牺牲简单性和灵活性为代价时,抽象就失去了价值。 LangChain还习惯于在其他抽象之上使用抽象,过度抽象使代码的可读性和扩展性收到了限制,不灵活也使我们不容易或不可能编写我们所需的底层代码。
二、LangChain加载/调用模型
先来看看使用LangChain如何进行模型调用。写这篇文章的时候,LangChain最新的版本是v0.3。从v0.1、v0.2、v0.3不同版本之间的区别还是挺大的。为方便表述这里先不严格区分版本代码上的差异。
1. 加载第三方模型服务【调用第三方模型服务api】
加载第三方模型服务,比如openAI,阿里云通义千问,百度文心一言,chatGLM开源模型等。
- 包主要在langchain.llms中,代码如下所示:
- 调用远程百度千帆大模型API例子如下。
- langchain v0.3创建LLM与ChatModel两种调用的区别。
官方列出了创建LLM与ChatModel分别所能支持的模型:https://python.langchain.com/docs/integrations/chat/
2. 从huggingface上加载开源模型,这种方式会把大模型【加载到本地运行】,对本地的硬件配置有要求
直接调用本地已下载好的模型的例子:
3. 本地自定义大模型
在大部分情况下,我们直接使用第三方的模型服务或开源模型已经能够满足我们大部分需求;但在某些情况下,这些服务无法满足我们的需求,我们需要自定义模型。
但自定义模型又不能被LangChain直接调用,所以我们就需要按照LangChain的格式封装我们自己的大模型。也可以类似于第一种情况,把大模型打包成服务,然后让LangChain通过API调用(小马也觉得统一为接口规范比本地直接调用此种方式更优雅)。
LangChain自定义模型的官方教程:
参考文章:
《LangChain加载模型的几种方式》
不过最近使用Ollama来部署本地大模型似乎也很火。Ollama是一个能够在本地运行大语言模型的应用,可以直接在命令行中进行问答交互、或者使用相应的API(本文要用到的方式),以及使用第三方GUI工具,如Lobechat等。
而llama虽然与Ollama很像,但两者关系不大。llama是一个Meta公司开源的预训练大型语言模型,llama.cpp用于加载和运行 LLaMA 语言模型。ollama是大模型运行框架,它利用了llama.cpp 提供的底层功能。
Ollama是一个专注于本地部署大型语言模型的工具,旨在简化在Docker容器中部署和管理大型语言模型(LLM)的过程。它提供了便捷的模型管理、丰富的预建模型库、跨平台支持以及灵活的自定义选项,使得开发者和研究人员能够在本地环境中高效利用大型语言模型进行各种自然语言处理任务,而无需依赖云服务或复杂的基础设施设置。
Ollama的特点包括:
开源性:作为一个开源框架,用户可以免费使用和修改。 轻量级:Ollama设计为轻量级框架,便于在本地机器上构建和运行大型语言模型。
易用性:通过简单的安装指令和API,用户可以快速在本地运行开源大型语言模型,如Llama 2。
灵活性:提供丰富的预构建模型库和灵活的自定义选项,适用于各种应用程序。
Ollama的应用场景广泛,适用于需要本地运行大型语言模型的场景,特别是在资源有限的环境下,能够提供高效且便捷的模型运行服务。
似乎它能很快部署本地模型并提供给LangChain等应用调用。如下:
还有一种用法,就是直接.chat调用模型和模型对话,还是通过fastapi提供模型接口。
使用Ollama本地部署模型,也兼容Langchain-Chatchat-V0.3调用,如此文所述。
三、用LangChain实现Agent
我们在上一篇介绍了Agent的原理,Agent 根据用户输入及当前状态选择一个动作,执行该动作并观察结果,然后继续下一个动作。有了 Agent,就不需要手动编写 if/else 逻辑了(即不需要静态的业务流程编排了),只需将 Prompt 提示词提供给大语言模型,让其进行判断决策即可。
LangChain 本身提供一些实用的工具,比如:Google 搜索、GitHub 和 Python 等。如果需要自己实现工具,则需要继承 BaseTool 类,并实现 run 方法。模型根据工具的描述调用相应的方法,并观察其返回结果。参考文章。
Agent调用例子
agent主调用代码非常简洁明了,示例:
from langchain.llms import ChatGLM
from langchain.experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
from tools import LlmModelTool, VectorSearchTool
endpoint_url = "http://11.18.59.1:8888"
llm = ChatGLM(`
endpoint_url=endpoint_url,
max_token=80000,
history=[],
model_kwargs={"sample_model_args": False},
temperature=0.95
)
tools = [LlmModelTool(), VectorSearchTool()]
planner = load_chat_planner(llm)
executor = load_agent_executor(llm, tools, verbose=True)
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
agent.run(input="马上国庆节,请帮我制定一个国外的7天旅行计划")
LangChain Agent 代码实现原理解析,小马总结为一句话:思考是模型思考的,调用工具的动作是Agent做的。
例子参考案例:
《LangChain文档》
《LangChain Agent 原理解析》
《LangChain AgentExecutor究竟是怎样驱动模型和工具完成任务的》
关键理解ReAct
从此文可以理解所谓的agent就是帮助我们多次调用大模型,对每次返回的结果进行解析并再次调用大模型,正则判断得到答案关键字后即停止。Agent代码走读理解Agent实现原理:大模型利用每次返回的观察结果重复套用模版进行推理,直到得到最终结果结束循环。这里有点像模版的递归执行。(每次都是接收完整历史思考决策记录的提示词模版来调用模型思考决策下一步怎么做或是直接得到答案了,实质是多次调用模型,靠代码“链”来解决)
工具解析
提示词模板
四、LangChain MultiQueryRetriever通过自动生成多个查询视角来增强检索效果
哈哈,这个环节有点乱入了,小马正好在官方文档中看到这块内容觉得和之前小马搞过的RAG系统有点契合,正好解决了RAG的召回环节在问题相似度匹配上的局限性,有带点惊艳。我们知道中华文化博大精深,有的时候我们的库可能只有A->B这个知识库QA对,我们的问题C的问法现实中和A是相识的同一个问题,但是C恰好和A在相似度算法计算上不匹配,因此就无法得到C问题的答案。看起来LangChain MultiQueryRetriever就能解决这个问题。
在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。该方案可以解决RAG里前半部分中对问题相识度匹配的局限性,可以更加精准匹配知识库,取出更全面的参考资料给与大模型总结。
MultiQueryRetriever 的核心思想是利用语言模型(LLM)为单个用户查询生成多个不同视角的查询。这种方法有效地自动化了提示工程的过程,克服了传统向量检索中由于查询措辑微小变化或嵌入语义捕获不佳而导致的结果不稳定问题。
《LangChain官方 MultiQueryRetriever》
《MultiQueryRetriever 提升向量数据库检索效果的强大工具》
好书推荐(如欲购买注意LangChain版本匹配):
更多AI落地资料还可以参看这里AI应用落地。还有疑问可以来公众号【贝可林】私信我,我骑共享单车到你家探讨。
- 彩蛋不要停~