大语言模型中的 Function Calling


前言

         想象一下,当你向一个大语言模型(LLM)询问“今天北京的天气如何?”时,模型却只能根据其预训练的知识库给出一个模糊的回答,比如“北京的天气通常很宜人”,而无法提供具体的实时数据。
在这里插入图片描述

         然而,当你点击了“联网搜索”后,模型却能自动去网页搜索天气内容,并且总结后返回“今天北京天气晴朗,最高温度8℃,最低温度-1℃”,这背后的关键技术就是 Function Calling。

在这里插入图片描述
         Function Calling 让大模型能够突破预训练知识的局限,动态调用外部工具或函数,获取实时信息,从而提供更准确、更有用的回答。这种能力的出现,不仅让大模型的应用场景更加广泛,也为开发者提供了更强大的工具来构建智能应用。


一、Function Calling 与大模型的融合

         Function Calling 是大语言模型(LLM)生态系统中的一项关键功能,它允许模型动态调用外部函数或工具,从而扩展其能力范围。这种能力打破了传统模型仅依赖预训练知识的局限,使其能够处理实时数据和执行复杂任务。

(一)Function Calling 的定义

         Function Calling 是一种机制,使大语言模型能够根据用户的自然语言请求,动态生成并调用外部函数。这些函数可以是自定义的工具函数,也可以是调用第三方 API 的函数。例如,当用户询问“明天北京的天气如何”时,模型可以识别出这是一个获取天气信息的任务,并调用相应的天气查询函数。

(二) 与传统对话模型的区别

         与传统对话模型不同,Function Calling 赋予了模型调用外部工具的能力。传统模型主要依赖预训练知识生成回复,而 Function Calling 则允许模型动态获取最新信息,从而提供更准确、更实用的回答。这种能力的结合,让大模型在处理复杂任务和实时数据时更加得心应手。


二、Function Calling 的工作原理

         Function Calling 的工作流程可以分为以下几个关键步骤(图源:AI取经路):
在这里插入图片描述

(一)定义函数

         开发者需要定义可供模型调用的函数,包括函数名、参数列表和功能描述。例如,定义一个获取城市天气的函数,其参数可能包括城市名称。

(二)用户请求

         用户通过自然语言向模型提出问题或请求。这些问题可能需要调用外部函数来获取答案或执行某些操作。

(三)模型解析与生成函数调用

         模型接收到用户输入后,会解析并理解输入内容。如果模型判断需要调用函数,它会生成一个包含函数调用所需参数的结构化输出,通常是一个 JSON 对象。这个 JSON 对象包含函数名和参数列表等信息。

(四)函数调用执行

         在代码环境中,开发者需要解析这个 JSON 对象,并使用其中的参数调用相应的函数。这个过程是在模型外部完成的。

(五)处理函数结果

         函数调用完成后,开发者需要将函数的结果返回给模型。模型会接收并处理这些结果,然后生成一个自然语言回复给用户,总结或解释函数调用的结果。


三、实战案例:Weather_EQ_Function_Calling.py 分析

         为了更好地理解 Function Calling 在实际项目中的应用,我们以一个智能问答系统为例,该系统能够动态调用天气查询和地震数据查询功能,同时利用大模型生成自然语言回答。这个系统展示了如何将 Function Calling 与大模型相结合,实现动态功能调用和实时数据处理。

(一)项目背景

         假设我们正在开发一个智能问答系统,用户可以通过自然语言向系统提问,系统需要根据问题的类型动态调用相应的函数来获取数据,并生成回答。具体来说,系统需要支持以下功能:

  1. 查询指定地点的未来15天天气。
  2. 查询最新的地震数据,并生成地震播报内容。

(二)系统架构

         系统的整体架构如下:

用户输入:用户通过自然语言向系统提问。
大模型解析:大模型解析用户输入,判断需要调用的函数及其参数。
动态函数调用:根据模型的解析结果,动态调用相应的函数。
外部数据获取:调用的函数通过 API 获取外部数据。
数据处理与回答生成:将获取的数据传递给大模型,生成自然语言回答。
返回结果:将生成的回答返回给用户。


(三)具体实现步骤

1.定义外部函数

         首先,我们需要定义两个外部函数:get_weather_dataget_earthquake_data。这些函数将通过 API 获取天气和地震数据。

get_weather_data:查询指定地点未来15天的天气。
get_earthquake_data:查询最新的地震数据。

2. 大模型解析用户输入

         用户通过自然语言向系统提问,例如:

“查询北京未来15天的天气。”
“查询最新的地震数据。”

         大模型解析这些输入,识别出需要调用的函数及其参数。例如,对于“查询北京未来15天的天气”,模型会解析出需要调用 get_weather_data 函数,并提取参数 province=“北京” 和 place=“北京”。

3. 动态函数调用

根据模型的解析结果,系统动态调用相应的函数。例如:

  • 如果模型解析出需要调用 get_weather_data,系统会调用该函数,并传递解析出的参数。
  • 如果模型解析出需要调用 get_earthquake_data,系统会调用该函数,无需传递参数。

4. 外部数据获取

调用的函数通过 API 获取外部数据。例如:

  • get_weather_data 函数通过天气 API 获取指定地点的天气数据。
  • get_earthquake_data 函数通过地震数据 API 获取最新的地震数据。

5. 数据处理与回答生成

将获取的数据传递给大模型,生成自然语言回答。例如:

  • 对于天气数据,模型会生成未来15天的天气总结。
  • 对于地震数据,模型会生成地震播报内容。

6. 返回结果

将生成的回答返回给用户。例如:

  • “未来15天北京的天气总结:周一晴朗,最高温度25℃,最低温度15℃;周二多云……”
  • “最新的地震播报:地震等级5.0,地震时间2025年3月16日14:00,位置:四川省某地,深度10千米。”
  • “无需调用函数,正常回答用户问题”

(四)代码实现

import requests
import json
from zhipuai import ZhipuAI

# 配置接口参数
EARTHQUAKE_API_URL = "https://example.com/api/earthquake"  # 替换为实际的地震数据API
WEATHER_API_URL = "https://example.com/api/weather"       # 替换为实际的天气数据API
USER_ID = "YOUR_USER_ID"                                  # 替换为你的用户ID
USER_KEY = "YOUR_USER_KEY"                                # 替换为你的用户KEY
GLM_API_KEY = "YOUR_GLM_API_KEY"                          # 替换为你的智谱GLM-4-Flash API密钥

# 初始化大模型客户端
client = ZhipuAI(api_key=GLM_API_KEY)
model_name = "glm-4-flash"

# 获取地震数据
def get_earthquake_data():
    params = {
   
   
        "id": USER_ID,
        "key": USER_KEY
    }
    response = requests.get(EARTHQUAKE_API_URL, params=
<think>好的,用户现在想了解如何通过函数调用的方式与大型语言模型进行交互,也就是Function Calling的方法和示例。首先,我需要回忆一下相关的知识,确保信息准确。Function Calling允许大模型执行外部函数,比如获取实时数据或与数据库交互,这扩展了模型的能力。 首先,应该解释Function Calling的基本概念,可能引用已有的参考资料,比如用户提供的引用[1]和[2]。然后,分步骤说明如何实现,比如定义函数、构建提示、解析响应和执行函数。用户可能需要具体的示例,所以需要准备一个代码示例,比如获取天气的函数。要注意代码的正确性,使用Python,并且语法正确。 另外,用户的问题可能还涉及到应用场景和注意事项,比如错误处理、权限控制等。需要确保回答结构清晰,分点说明,每个步骤都有例子或说明。同时,生成的相关问题要围绕Function Calling的扩展,比如优化方法、安全措施等。 检查是否遵循了系统级指令,比如数学公式的格式是否正确,使用中文回答,引用标识是否正确添加。最后,确保回答真实可靠,没有编造的信息,引用来源正确。</think>### 通过函数调用与大模型交互的方法 #### 1. **核心原理** 函数调用(Function Calling)通过将外部工具能力与大模型结合,扩展其功能边界。大模型根据用户输入**自动判断何时调用函数**,并将自然语言参数转换为结构化请求,例如: - 用户输入:“北京今天气温多少?” - 模型响应:触发`get_weather(location: str)`函数调用,参数为`{"location": "北京"}`[^2] #### 2. **实现步骤** ##### 步骤1:定义函数清单 ```python functions = [ { "name": "get_stock_price", "description": "获取指定股票实时价格", "parameters": { "type": "object", "properties": { "symbol": {"type": "string", "description": "股票代码,如 AAPL"} }, "required": ["symbol"] } } ] ``` ##### 步骤2:构建提示词 系统提示需包含函数描述: ``` 你是一个财经助手,可以调用以下功能: - get_stock_price:输入股票代码,返回实时价格 ``` ##### 步骤3:解析模型响应 当模型返回函数调用请求时,提取结构化参数: ```json { "function_call": { "name": "get_stock_price", "arguments": "{\"symbol\": \"AAPL\"}" } } ``` ##### 步骤4:执行函数并反馈 ```python def execute_function(function_name, arguments): if function_name == "get_stock_price": return fetch_api(f"https://api.stocks.com/{arguments['symbol']}") ``` #### 3. **完整交互示例** ```python import openai response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "苹果公司当前股价是多少?"}], functions=functions, function_call="auto" ) if response.choices[0].message.get("function_call"): func_args = json.loads(response.choices[0].message.function_call.arguments) result = execute_function(response.function_call.name, func_args) # 将结果返回给模型生成最终回复 ``` #### 4. **关键应用场景** - **实时数据查询**:股票/天气/交通信息 - **业务系统集成**:CRM系统客户数据查询 - **复杂计算委托**:将微积分计算交给SymPy等数学库 - **多模态扩展**:调用图像生成API实现文生图 #### 5. **注意事项** - **错误处理**:需捕获API调用超时/参数错误 - **权限控制**:敏感函数需进行身份验证 - **成本优化**:通过函数描述压缩减少token消耗 - **参数校验**:对模型输出的参数进行类型检查 $$ \text{交互流程} = \text{用户输入} \rightarrow \text{模型解析} \rightarrow \text{函数调用} \rightarrow \text{结果反馈} \rightarrow \text{最终输出} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢热型网友.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值