LangChain调用外部函数

1. 简介

聊天类大模型如OpenAI、Qwen等均已经具备了外部函数调用的能力,可以通过定义清晰的函数说明和所需参数,将其输入到大模型中,让大模型根据输入的提示(Prompts)自动选择合适的函数执行。最终,大模型会返回一个JSON对象,包含了要调用的函数及其输入参数。
LangChain框架抽象了允许使用各种“工具”构建自然语言接口的Tools模块,这些工具可以是API、函数、数据库等。提供了大量的内置工具和良好的模型输出解析,可以轻松从模型输出中提取 JSON、XML、OpenAI 函数调用等。其在运行过程中调用工具的流程图如下所示:

大模型与工具使用的核心在于:正确地向大模型提出请求并解析其响应,从而准确选择合适的工具并为之提供恰当的输入。

LangChain的工具抽象模块源码文件位置为:langchain_core/tools.py
在这个核心文件中,定义了一个工具(Tool)系统,提供外部工具与大模型的交互能力。其类的层次结果是:
ToolMetaclass --> BaseTool --> <name>Tool # Examples: AIPluginTool, BaseGraphQLTool
BaseTool提供了工具的基础属性和方法:

  • args_schema: 确保工具接收到正确格式和类型的输入。
  • run / arun 方法: 工具的主要执行方法。run是同步方法,arun是其异步版本。它们负责处理工具的输入、执行工具的主要逻辑,并返回结果。
  • 回调(Callbacks): 工具执行期间可以触发的回调,允许在工具的生命周期的不同阶段注入自定义逻辑
    同时,构造了一个@tool 装饰器,用于将普通函数或可运行对象转换成工具。同时还可以指定工具的名称、描述和是否直接返回结果等属性。所以,为了使自定义的外部函数能够接入LangChain定义的规范,需要在定义函数添加@tool装饰器。

下面以调用实时天气为例:
前提:

  • https://openweathermap.org/注册账号,并获取API_KEY,并添加到环境变量中,变量名:OPENWEATHER_API_KEY
  • 注册OpenAI账号,并获取API_KEY,并添加到环境变量中,变量名:OPENAI_API_KEY

2. 定义获取天气的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import json  
import os

import requests
from langchain_core.tools import tool


@tool
def get_weather(loc):
"""
查询即时天气函数
:param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\
注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入'Beijing';
:return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather\
返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息
""" # Step 1.构建请求
url = "https://api.openweathermap.org/data/2.5/weather"

# Step 2.设置查询参数
params = {
"q": loc,
"appid": os.getenv("OPENWEATHER_API_KEY"), # 输入API key
"units": "metric", # 使用摄氏度而不是华氏度
"lang": "zh_cn" # 输出语言为简体中文
}

# Step 3.发送GET请求
response = requests.get(url, params=params)

# Step 4.解析响应
data = response.json()
return json.dumps(data)


print(get_weather)

[!Success] Print
name=’get_weather’ description=”get_weather(loc) - 查询即时天气函数\n :param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称, 注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则loc参数需要输入’Beijing’;\n :return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather 返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息” args_schema=<class ‘pydantic.v1.main.get_weatherSchema’> func=<function get_weather at 0x00000252941C9C60>

print(get_weather.invoke({"loc": "Hefei"}))

[!Success] Print
{“coord”: {“lon”: 117.2808, “lat”: 31.8639}, “weather”: [{“id”: 800, “main”: “Clear”, “description”: “\u6674”, “icon”: “01d”}], “base”: “stations”, “main”: {“temp”: 22.01, “feels_like”: 21.83, “temp_min”: 22.01, “temp_max”: 22.01, “pressure”: 1012, “humidity”: 60}, “visibility”: 10000, “wind”: {“speed”: 1, “deg”: 0}, “clouds”: {“all”: 0}, “dt”: 1713670371, “sys”: {“type”: 1, “id”: 9661, “country”: “CN”, “sunrise”: 1713648915, “sunset”: 1713696211}, “timezone”: 28800, “id”: 1808722, “name”: “Hefei”, “cod”: 200}

LangChain 附带了许多已经封装好的模块来简化函数调用,可以直接使用bind_tools将外部函数传递给 ChatOpenAI 调用的 tools 参数。
注意:并不是所有模型都有bind_tools抽象,使用前需要根据实际使用的大模型的说明文档或者源码进行灵活调整。
目前支持tool calling的大模型,详见官方文档:https://python.langchain.com/docs/integrations/chat/

pip install -U langchain-openai