这里需要先介绍一下Function calling,什么是Function calling? 它提供了可以让我们把大模型和外部数据或系统进行连接的能力
举个具体的例子:我们现在有一些如查询订单等信息的接口,我们可以把这些接口工具及参数等详情信息提供给大模型,这样如果在上下文对话中,它判断出需要需要使用这个接口时,就会返回对应的接口及参数值(注意:大模型只是会判断后返回工具名称和参数,并不会实际进行调用)
我们可以据此在本地进行实际的调用,获取最终结果进行返回;如果大模型函数不需要这个能力,那么就可以以正常自然语言的方式进行对话内容返回
当然,我们也可以通过设置一些参数,强制大模型使用/不使用工具
这个Function calling能力,各个大模型提供的api可能有所差异,需要看各自对应的API,但是langchain帮我们整合了相关的功能,所以本次我们主要看一下通过它来实现
工具创建
提供给大模型的工具至少要有如下几个部分来说明它自己,以及让大模型判断如何使用,包含:名称、描述、参数(json schema)、以及是否在调用结束后直接返回给用户
langchain中支持如下三种方式创建工具:函数、Runnable (langchain_core.runnables) 以及 BaseTools(langchain_core.tools)子类
使用函数创建工具基本可以满足我们大部分的场景了,下面看一个具体的例子
1 | from langchain_core.tools import tool |
将工具绑定到模型
1 | # 定义llm与工具集合 |
模型判断调用工具
大模型会根据问题来判断是否使用工具,以及使用何种工具
1 | llm_with_tools.invoke("你好") |
工具执行
有了如上信息后,我们就可以调用对应的工具进行最终的执行了
1 | # 定义好工具的名称和对应的函数映射 |
以上我们就完成了一个最简单的工具定义以及使用的流程,可以基于此完成更多更复杂,更有趣的功能~