Function Calling使用示例
Function Calling 是一种允许大语言模型(LLM)通过调用外部函数或API来扩展能力的机制。其核心流程是:开发者预先定义函数及其参数格式,LLM根据用户输入的自然语言请求,自动判断是否需要调用函数,并生成包含函数名和参数的JSON格式指令,最终由外部程序执行具体函数。它主要解决以下问题:
- 突破知识库限制:使LLM能够处理实时数据(如天气查询)、执行计算等超出内置知识范围的任务;
- 连接外部系统:通过对接数据库、API等工具,将LLM从文本生成器升级为可操作业务系统的智能代理;
- 增强任务处理能力:结合外部工具的精确性,完成复杂动态任务(如股票查询、邮件发送等),实现"语言理解+工具执行"的协同工作模式;
- 标准化交互接口:通过JSON格式规范输入输出,降低LLM与程序间的对接复杂度,提升系统可靠性。
本文介绍一个function calling调用的示例,目前DeepSeek-R1版本原生并不支持function calling,DeepSeek-V3对function calling的支持也不稳定,会出现循环调用、空回复的情况,, 示例中使用是Qwen2.5-72B-Instruct
模型。
补充:DeepSeek-V3-0324版本已经修复了function calling的问题,可以正常使用。
初始化OpenAI
from openai import OpenAI
OPEN_AI_BASE_URL = "https://api.siliconflow.cn"
CHAT_MODEL = "Qwen/Qwen2.5-72B-Instruct"
client = OpenAI(
api_key=OPEN_AI_KEY,
base_url=OPEN_AI_BASE_URL,
)
定义查询天气方法
定义方法,同时也定义方法说明,用于传入到LLM调用中,告诉LLM有哪些方法可用,以及如何调用。
import json
import requests
# 查询天气的实现方法
def search_weather(location):
params = {
"q": location,
"appid": OPEN_WEATHER_KEY,
"units": "metric",
"lang": "zh_cn",
}
response = requests.get("https://api.openweathermap.org/data/2.5/weather", params=params)
data = response.json()
return json.dumps(data)
# 工具function字典集合
tool_functions = {
"search_weather": search_weather,
}
# 工具定义声明
tools = [{"type": "function", "function": {
"name": "search_weather",
"description": "根据城市名称查询当日天气情况",
"parameters": {
"type": "object",
"properties": {
"location": {
"description": "城市名称,中文城市需要使用对应的拼音,例如查询北京的天气,则输入 'Beijing'",
"type": "string",
}
},
"required": ["location"],
},
}}]
带tools定义调用LLM
调用LLM时如果带了tools,支持function_calling的大模型会识别是否需要用户使用tools补充信息,如果需要会返回要调用的方法以及参数信息。 这里演示只做了一次function_calling调用,实际使用时可能会多次调用
def send_message(messages):
chat_response = client.chat.completions.create(
model=CHAT_MODEL,
messages=messages,
tools=tools,
)
return chat_response.choices[0]
messages = [{"role": "user", "content": "请帮我查询无锡地区今日天气情况"}]
# 第一次调用模型
chat_response_choice = send_message(messages)
# 判断是否需要进行function calling
while chat_response_choice.finish_reason == "tool_calls":
tool_call = chat_response_choice.message.tool_calls[0]
function_to_call = tool_functions[tool_call.function.name]
function_args = json.loads(tool_call.function.arguments)
function_response = function_to_call(**function_args)
print("tool_call:", tool_call.function.name, "(", function_args, ")")
# 追加第一次模型返回结果消息
messages.append(chat_response_choice.message.model_dump())
# 追加function执行结果消息
messages.append(
{
"role": "tool",
"content": function_response,
"tool_call_id": chat_response_choice.message.tool_calls[0].id,
}
)
# 再次调用模型
chat_response_choice = send_message(messages)
print("\n===================================\n")
print(chat_response_choice.message.content)
tool_call: search_weather ( {'location': 'Wuxi'} )
===================================
无锡地区今日天气晴朗,气温为19.89°C,体感温度19.19°C。湿度为48%,风速为3.81米/秒,风向为186度。气压为1005 hPa,能见度为10000米。日出时间为早上5:56,日落时间为晚上6:13。