掌握了的基本使用方法后,我们需要进一步扩展的进阶应用:Funcation Calling。
我们都知道,能调用外部工具,是大模型进化为智能体的关键,如果不能使用外部工具,大模型就只能是个简单的聊天机器人,甚至连查询天气都做不到。由于底层技术限制啊,大模型本身是无法和外部工具直接通信的,因此的思路,就是创建一个外部函数()作为中介,一边传递大模型的请求,另一边调用外部工具,最终让大模型能够间接的调用外部工具。

例如,当我们要查询当前天气时,让大模型调用外部工具的function calling的过程就如图所示:

而完整的一次执行流程如下:

需要注意的是,对于大模型来说,Function calling的本质,是当模型在特殊情况下的一种特殊响应形式:

OpenWeather是一家提供全球范围内的气象数据服务的公司,该公司的服务包括实时天气信息、天气预报、历史天气数据以及各种气象相关的报告等,并且OpenWeather开放了一定使用限度内完全免费的API,即我们可以在代码环境中通过调用OpenWeather API来进行实时天气查询、天气预报等功能,这意味着开发者可以将OpenWeather的天气预报功能加入到他们自己的应用或网站中。
为了能够调用OpenWeather服务,和OpenAI的API使用过程类似,我们首先需要先注册OpenWeather账号,并获取OpenWeather API Key。这里需要注意的是,对于大多数在线服务的API来说,都需要通过API key来进行身份验证,尽管OpenWeather相对更加Open,有非常多的免费使用的次数,但身份验证仍然是必要的防止API被滥用的有效手段。OpenWeather API key获取流程如下:
- Step 1.登录OpenWeather官网并点击Sign—>create account完成注册。该网站无需魔法即可直接登录,可以使用国内邮箱或者邮箱均可进行注册,官网地址为:openweathermap.org/


- Step 2.获取API-key:注册完成后,即可在API keys页面查看当前账户的API key:


一般来说完成注册后,就会有一个已经激活的API-key。和OpenAI一样,OpenWeather的API key也创建多个。
- Step 3.将其设置为环境变量:和OpenAI API key类似,为了方便后续调用,我们也可以直接将OpenWeather API key设置为环境变量,变量名为OPENWEATHER_API_KEY。具体设置环境变量的方法参考Ch.1中OpenAI APkey设置环境变量流程,此处不再赘述。

设置完了环境变量之后,接下来即可按照如下方式创建OpenWeather API key变量:
接下来我们通过一个简单的示例,来介绍如何通过OpenWeather API获取实时天气信息:
这里需要注意的是,城市名必须输入英文名,否则无法正确识别。接下来查看返回结果。首先我们先查看response结果:
在未解析之前,我们只能查看到基本请求结果状态,这里的200代表成功相应,即本次发送请求获得了对应的响应,且响应内容包含在response中。考虑到默认情况下返回结果是JSON格式,因此后续代码使用了response.json()对其进行解析。解析内容如下:
大家可以理解到,如果我们手动实现一个,其实是非常复杂的。但在中则不需要那么麻烦,只需要几行代码就可以快速接入自定义的外部工具并实现准确的调用。其实现的过程在就是一个组件链,由提示模版、大模型、外部工具和输出解析器组成,并利用大模型在循环中反复调用自身以实现复杂的流程。
这里我们以实时获取天气数据为例。在中,如果想要把一个普通的函数,变成一个可以被大模型调用的工具,只需要将函数包装成一个对象即可。代码如下:
依然使用模型,如下代码所示:
接下来,如果想让大模型调用某一个外部工具,需要使用方法,将工具绑定到模型上。代码如下:
接下来,便可以通过新的模型通过方法来调用模型。代码如下:
这会产生一个包含 的模型响应,打印如下:
我们需要调用输出解析器来处理模型响应。
从结果上我们看到它返回一个 ,这些操作由执行(LangChain构建Agent的底层逻辑就是),并且列表中的每个操作都会返回一个字符串输出。
我们可以从中获取工具调用,并手动执行工具调用以获取工具调用的结果。代码如下:
最后,使用中的函数,将工具调用转换为工具消息。代码如下:
这个过程会返回一个以添加到提示中并用于调用模型生成最终的回复。其完整流程其实是这样的:
代理是链(Runnable 序列),它循环运行并调用自身,直到达到最终的目标,或者出现异常才会终止。
- llm_with_tools:当接收到用户的输入时,大模型可以决定使用工具并返回;
- ToolsAgentOutputParser:将这些返回解析为要执行的;
- 该工具执行后,输出(), 使用进行处理,以产生一条可再次用于提示的消息;
- 当大模型不再执行任何工具调用并返回最终输出时,循环结束。
代理是链(Runnable 序列),它循环运行并调用自身,直到达到最终的目标,或者出现异常才会终止。
当然,上述流程是为了帮助大家理解中代理的实现方式,在实际使用中,我们其实可以直接使用来快速构建工具调用代理。代码如下:
使用来执行代理。代码如下:
中模块的整体架构设计。如下所示:

在的内部结构。每个组件一般会由语言模型 + 提示 + 输出解析器构成,它会作为的大脑去处理用户的输入。能够处理的输入主要来源于三个方面:代表用户的原始输入,指的是模型对某一个子任务的响应输出,而则能携带上下文的信息。其输出部分,则链接到实际的工具库,需要调用哪些工具,将由经过模块后拆分的子任务来决定。
而我们知道,大模型调用外部函数会分为两个过程:识别工具和实际执行。在Message -> Agent -> Toolkits 这个流程中,负责的是将子任务拆解,然后根据这些子任务在工具库中找到相应的工具,提取工具名称及所需参数,这个过程可以视作一种“静态”的执行流程。而将这些决策转化为实际行动的工作,则会交给。
所以综上需要理解的是:在LangChain的实际架构中,的角色是接收输入并决定采取的操作,但它本身并不直接执行这些操作。这一任务是由来完成的。将(决策大脑)与(执行操作的Runtime)结合使用,才构成了完整的(智能体),其中负责调用代理并执行指定的工具,以此来实现整个智能体的功能。
这也就是为什么需要通过才能够实际运行的原因。当然,在这种模式下,的内部已经自动处理好了关于我们工具调用的所有逻辑,其中包含串行和并行工具调用的两种常用模式。

3.1 多工具并联调用
在大模型中,并行工具调用指的是在大模型调用外部工具时,可以在单次交互过程中可以同时调用多个工具,并行执行以解决用户的问题。如下图所示:

而在中,已经自动处理了并行工具调用的处理逻辑,并不需要我们在手动处理,比如接下来测试一些复杂的问题:
这里我们在提出的问题中,尝试让大模型同时查询北京和上海两个城市的天气并汇总结果。
从这个过程中可以明显的看出,一次性发起了同一个外部函数的两次调用请求,并依次获得了北京和杭州两个城市的天气。这就是一次标准的。

3.2 多工具串联调用
接下来继续尝试进行多工具串联调用测试:

此时我们再定义一个write_file函数,用于将“文本写入本地”:
然后在列表中直接添加工具,并修改提示模版,添加工具的使用场景。代码如下所示:
接下来尝试运行:
通过中间过程信息的打印,我们能够看到在一次交互过程中依次调用的查询到北京和杭州的天气,然后又将结果写入到本地的文件中。这就是一个非常典型的串行工具调用的流程,如下图所示:
Agent 智能体
正如上述我们使用的方法,它其实在中是一个通用的用来构建工具代理的方法,除此以外,还封装了非常多种不同的实现形式,大家可以在这个链接中查看到所有中已经集成的实现形式:

每一个的实现都对应着不同的应用场景,而的实现方式也多种多样,比较常用的类型如下表所示:
推荐的Agent创建函数
其中比较通用场景的就是我们刚刚使用的,而对于一些符合的模型,则同样可以使用,另外像可以用于一些推理任务,则可以用于一些对话系统,具体还是需要根据实际需求来选择。
目前来说,在大模型应用开发领域有非常多的需求场景,其中一个比较热门的就是浏览器自动化,通过自动化提取网页内容,然后进行分析,最后生成报告。这样的流程提升效率和收集信息的有效途径。因此接下来,我们就尝试使用尝试使用来实际开发一个浏览器自动化代理。
首先,执行浏览器自动化代理需要安装一系列的第三方依赖包,如下所示:
此外,还需要安装 浏览器,需要在当前虚拟环境中执行如下命令:
这个安装过程它会下载并安装 Playwright 支持的浏览器内核(注意:这里不是用我们本机已有的浏览器),包括(类似 Chrome)、、(类似 Safari),并将这些浏览器下载到本地的 目录或项目的 目录中,以便 Playwright 使用稳定一致的运行环境。
这个案例的核心代码首先是需要用代理工具初始化同步 浏览器:
然后再通过接收初始化的大模型和工具构建共同构建代理,最后通过执行代理。
完整的代码因为的模块化封装非常简洁,如下所示:
但需要注意的是: 工具的初始化过程需要同步执行,在中无法直接使用,需要将代码保存为文件运行。这里完整的代码脚本为,已经上传到了百度网盘中,大家可以扫码进行领取。


运行效果如下所示:
Your browser does not support the element.
更进一步地,我们还可以将封装成工具函数,并结合的串行链,实现一个更加复杂的浏览器自动化代理。这里定义的工具如下所示:
然后我们可以自定义不同的链路,比如简单的串行链由和 组成,即先爬取网页的内容,然后将网页中的内容写入到本地的文件中。
除此以外,我们还可以再定一个摘要工具,在使用工具访问网页后,根据爬取到的网页内容先使用大模型进行摘要总结,再调用工具将总结内容写入到本地的文件中。代码如下所示:
完整的代码如下所示:
上述完整的代码我们已经上传到百度网盘中文件中,大家可以扫描下方的二维码免费领取。


运行效果如下所示:
Your browser does not support the element.
发布者:Ai探索者,转载请注明出处:https://javaforall.net/243748.html原文链接:https://javaforall.net
