AI开发者必学:一分钟掌握Function Calling的用法与实操,看这一篇就够了

Function Calling 简介

Function Call 是大模型在对话过程中调用外部函数的能力,它允许模型在无法直接回答问题时,返回一个函数调用请求,而不是生成文本。开发者需要手动解析这个请求,执行对应的函数,并将结果传回给模型,以生成最终答案。

通俗地讲,Function Calling允许模型返回一个结构化的“函数调用请求”,告诉你的程序:“我建议调用哪个函数,以及具体用什么参数”。但需要注意的是,模型本身并不会真的执行函数,执行的任务必须由你自己定义和实现。

相比之下,我们在上一节课学习到的 Tool(工具)是具体的可执行函数,Agent 可以直接调用它,省去手动解析的步骤,使得模型能够自主决策并执行任务。

在 OpenAI 的 API 设计中,Function Call 允许模型以 JSON 格式返回参数,供外部程序解析并执行。例如:


{
  "name": "get_weather",
  "arguments": {
    "location": "Shanghai",
    "unit": "Celsius"
  }
}

这意味着模型“决定”调用 get_weather 这个函数,并传递参数 { "location": "Shanghai", "unit": "Celsius" }。然后,外部程序可以执行该函数,并将返回的结果反馈给 LLM。

乍一看,相较于 Function Call,工具(Tool)的使用方式确实更加便捷。开发者只需定义一个函数,并在注释中描述其用途,模型便可直接调用它。然而,这种简便性往往伴随着潜在问题,最明显的就是 大模型可能会因幻觉(Hallucination)传入错误的参数或格式,从而导致输出结果异常。而由于 Tool 直接执行调用,开发者难以在调用前对输入数据进行验证和修正,增加了出错的风险。

相比之下,Function Call 采用 JSON 格式进行交互,使得开发者可以在获取模型返回的调用请求后,先对参数进行检查,确保数据的完整性和准确性。此外,Function Call 允许开发者在函数逻辑中增加 数据补充、格式转换、异常处理 等机制,避免因模型提供无效参数而导致调用失败或程序崩溃。这种更精细的控制方式极大地提升了模型应用的稳定性和可靠性。因此,在许多实际开发场景中,开发者更倾向于 使用 Function Call,而不仅仅依赖 Tool 的自动调用,以确保系统的稳健性和安全性。

那下面,我们将基于openai官方定义的function_call方法来解释一下我们如何具体的使用吧!

实操演示

1. 环境准备

首先我们要获取一个阿里云百炼大模型的api_key,这个具体的获取方式在我之前的课程中讲过,这里我就不作进一步的赘述了。那除此之外呢我们还需要安装一下以下的库,我们可以在终端输入下面的代码进行安装:

pip install openai==1.47.0

2. 函数设置及方法创建

前面我们提到了,对于Function Call这个调用方法来说,大模型只知道告诉你去调用哪个函数以及对应需要传入的参数是什么,因此我们其实要做的第一步就是创建好这些函数。 我们以最经典的天气查询函数为例,来看看具体操作步骤。

首先定义一个简单的函数,用于模拟天气API,并最后返回json格式内容:

def get_current_weather(location, unit="fahrenheit"):
    # 根据用户提供的地点和温度单位,构建模拟的天气信息
    weather_info = {
        "location": location,            # 用户输入的城市名称,例如"北京"或"New York"
        "temperature": "72",            # 示例固定温度,仅用于模拟演示
        "unit": unit,                    # 温度单位,可选华氏(fahrenheit)或摄氏(celsius)
        "forecast": ["sunny", "windy"] # 示例天气情况,用于演示
    }
    # 返回JSON格式的天气信息,便于后续处理
    return json.dumps(weather_info)

接下来,我们需要告诉大模型有哪些函数可供调用,具体结构包括函数名、功能描述、参数说明和类型等,如下所示:

functions = [
    {
        "name": "get_current_weather",                # 函数的唯一标识名称
        "description": "获取指定位置的当前天气",       # 函数的简要说明,用于模型理解用途
        "parameters": {                                # 函数需要的参数定义
            "type": "object",                         # 参数整体类型为对象
            "properties": {                            # 对象包含的具体参数说明
                "location": {
                    "type": "string",
                    "description": "城市名称,例如北京、上海或纽约"# 参数"location"的具体含义
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],          # 限定温度单位只能是摄氏或华氏
                    "description": "温度单位,可选摄氏或华氏"      # 参数"unit"的具体含义
                }
            },
            "required": ["location"]                   # 指定必须提供的参数
        }
    }
]

我们可以看到,functions其实是一个列表,所以我们假如有多个工具的情况可以在这个列表里再写入其他的函数

3. 构建大模型并进行调用

在这节课里,我们不再使用ChatTongyi来进行模型的调用,由于国内大部分的大模型服务商都适配openai的格式,所以我们可以尝试一下通过openai官方库来进行调用。

那由于我们不是直接使用openai的模型,所以我们先要配置一下具体的api_key以及模型服务商的地址base_url。这里max_retries=3其实就是希望假如调用三次都失败就不调用了。

import openai

client = openai.OpenAI(
    api_key='api_key',  # 指定 OpenAI API Key(默认会从环境变量 `OPENAI_API_KEY` 读取)
    base_url="<https://dashscope.aliyuncs.com/compatible-mode/v1>",  # API 服务器的地址(可用于私有部署或代理)
    max_retries=3,  # 最大重试次数
)

然后我们就可以通过其调用方法进行调用,这里我们指定了其function_call需要用到的工具,假如我们不希望其使用function_call,那我们要把这个参数设置为”none”,假如是让系统自动决定是否使用,那就需要使用”auto”这个参数。另外,这里的messages我们可以自己来进行定义,system就代表系统提示词,user就代表用户提示词。最后我们打印一下response就可以看到返回的内容。

messages = [
    {
        "role": "system",
        "content": "你是一个乐于助人、知识渊博的中文助手,请始终用中文回复用户的问题。"
    },
    {
        "role": "user",
        "content": "明天纽约的天气怎么样"
    }
]

response = client.chat.completions.create(  # ✅ 新的写法
    model="qwen-turbo",
    messages=messages,
    functions=functions,
    function_call={"name": "get_current_weather"}
)

print(response)

最后输出的内容为如下。我们会发现其不再是直接回答我们的具体问题,而是说返回一个调用的方法。其实里面最关键的内容就是function_call=FunctionCall(arguments='{"location": "New York, NY"}', name='get_current_weather') 这部分的内容,其明确定义了要输入的内容是什么,以及要调用的方法是哪一个。后续我们其实就可以基于这个输出的结果去进行手动的解析并调用。

ChatCompletion(
  id='chatcmpl-4829de50-8335-9a62-a70d-6f8011aa3a1f', 
  choices=[
    Choice(
      finish_reason='stop', 
      index=0, 
      logprobs=None, 
      message=ChatCompletionMessage(
        content='', 
        refusal=None, 
        role='assistant', 
        function_call=FunctionCall(
          arguments='{"location": "New York, NY"}', 
          name='get_current_weather'
        ), 
        tool_calls=None
      )
    )], 
  created=1743032477, 
  model='qwen-turbo', 
  object='chat.completion', 
  service_tier=None, 
  system_fingerprint=None, 
  usage=CompletionUsage(
    completion_tokens=14, 
    prompt_tokens=209, 
    total_tokens=223, 
    completion_tokens_details=None, 
    prompt_tokens_details={'cached_tokens': 0}
  ))

4. 解析并执行函数

当我们获取到了这部分信息后,我们就可以对其进行解析了,具体解析代码如下。我们首先要确保模型返回的是function_call的内容,然后提取其中的参数并找到对应的函数进行执行。

import json

# 获取模型返回的message
message = response.choices[0].message

# 如果模型返回了函数调用请求
if message.function_call:
    # 提取函数名
    function_name = message.function_call.name
    
    # 提取并解析函数参数(注意:是字符串,要先 json.loads)
    arguments_str = message.function_call.arguments
    arguments = json.loads(arguments_str)

    # 根据函数名选择执行你定义的函数(这里只定义了一个函数做示例)
    if function_name == "get_current_weather":
        result = get_current_weather(**arguments)  # 执行函数
        print("✅ 实际函数执行结果:")
        print(result)

执行后的结果就是函数返回的内容。

{
"location": "\u5317\u4eac", 
"temperature": "72", 
"unit": "celsius", 
"forecast": ["sunny", "windy"]
}

5. 将结果传输给模型进行回复

最后,我们可以通过messages.append的方式将function返回的结果传输给大模型进行回复。这样就能够实现大模型选择方法,执行函数,然后返回结果传给大模型进行回复的流程啦!

messages.append(
        {
            "role": "function",
            "name": "get_current_weather",
            "content": result,
        }
)

response = client.chat.completions.create( 
    model="qwen-turbo",
    messages=messages,
)

print(response.choices[0].message.content)

当然因为这个示例里没有真正的调用天气的函数所以输出的结果不太让人满意,但是大家也可以尝试自己来进行构建,来让大模型能够真实且稳定的让大模型能够调用外部的工具,从而实现更好的工作流!

完整的代码如下所示:

import json
import openai

def get_current_weather(location, unit="fahrenheit"):
    # 根据用户提供的地点和温度单位,构建模拟的天气信息
    weather_info = {
        "location": location,            # 用户输入的城市名称,例如"北京"或"New York"
        "temperature": "72",            # 示例固定温度,仅用于模拟演示
        "unit": unit,                    # 温度单位,可选华氏(fahrenheit)或摄氏(celsius)
        "forecast": ["sunny", "windy"] # 示例天气情况,用于演示
    }
    # 返回JSON格式的天气信息,便于后续处理
    return json.dumps(weather_info)

functions = [
    {
        "name": "get_current_weather",                # 函数的唯一标识名称
        "description": "获取指定位置的当前天气",       # 函数的简要说明,用于模型理解用途
        "parameters": {                                # 函数需要的参数定义
            "type": "object",                         # 参数整体类型为对象
            "properties": {                            # 对象包含的具体参数说明
                "location": {
                    "type": "string",
                    "description": "城市名称,例如北京、上海或纽约"# 参数"location"的具体含义
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],          # 限定温度单位只能是摄氏或华氏
                    "description": "温度单位,可选摄氏或华氏"      # 参数"unit"的具体含义
                }
            },
            "required": ["location"]                   # 指定必须提供的参数
        }
    }
]

messages = [
    {
        "role": "system",
        "content": "你是一个乐于助人、知识渊博的中文助手,请始终用中文回复用户的问题。"
    },
    {
        "role": "user",
        "content": "明天天气怎么样"
    }
]

client = openai.OpenAI(
    api_key='api_key',  # 指定 OpenAI API Key(默认会从环境变量 `OPENAI_API_KEY` 读取)
    base_url="<https://dashscope.aliyuncs.com/compatible-mode/v1>",  # API 服务器的地址(可用于私有部署或代理)
    max_retries=3,  # 最大重试次数
)
# OpenAI 1.0.0+ 需要先创建 client 实例

response = client.chat.completions.create(  # ✅ 新的写法
    model="qwen-turbo",
    messages=messages,
    functions=functions,
    function_call={"name": "get_current_weather"}
)

# 获取模型返回的message
message = response.choices[0].message

# 如果模型返回了函数调用请求
if message.function_call:
    # 提取函数名
    function_name = message.function_call.name
    
    # 提取并解析函数参数(注意:是字符串,要先 json.loads)
    arguments_str = message.function_call.arguments
    arguments = json.loads(arguments_str)

    # 根据函数名选择执行你定义的函数(这里只定义了一个函数做示例)
    if function_name == "get_current_weather":
        result = get_current_weather(**arguments)  # 执行函数
        print("✅ 实际函数执行结果:")
        print(result)

messages.append(
        {
            "role": "function",
            "name": "get_current_weather",
            "content": result,
        }
)

response = client.chat.completions.create(  
    model="qwen-turbo",
    messages=messages,
)

print(response.choices[0].message.content)

总结

通过本节内容,我们完整了解了 OpenAI Function Calling 的基本概念、使用方式以及与 Tool 的区别。我们不仅学会了如何定义一个标准的函数结构,并注册给模型使用,还掌握了如何解析模型返回的函数调用请求,执行函数并将结果重新传回模型以获取最终回复。这种方式为开发者提供了更高的灵活性与安全性,使得我们在构建模型应用时能够更稳定、更可控地完成复杂任务。

Function Calling 是构建智能体系统中非常重要的一环,它不仅是 LangChain Agent 系统底层的关键机制之一,更是未来大模型与外部世界交互的核心桥梁。在学完openai对于function call的操作方式,下节课我们一起来学学看这个如何和langchain进行联系吧!

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

### 如何在Spring框架中调用AI函数 为了在Spring框架内集成并调用AI功能,开发者可以利用`spring-ai`模块来简化这一过程。通过设置特定属性如API密钥以及模型选项,应用程序能轻松访问外部的人工智能服务。 配置文件中的相关设定如下所示: ```properties spring.ai.openai.api-key=YOUR_API_KEY spring.ai.openai.embedding.options.model=text-embedding-ada-002[^1] ``` 上述配置允许应用连接到OpenAI的服务,并指定使用名为`text-embedding-ada-002`的预训练模型来进行文本嵌入操作。这使得开发人员可以在项目里实现自然语言处理的任务,比如语义相似度计算或是基于内容的推荐系统构建等高级特性。 对于希望进一步增强解释性的AI交互体验的应用程序而言,研究也提供了有价值的见解。例如,在计算机视觉领域的工作展示了如何让机器学习模型不仅给出预测结果还能提供背后的原因说明,从而提高了系统的透明性和可信度[^2]。 当涉及到具体编码实践时,假设已经完成了必要的依赖引入和环境搭建工作,则可以通过注入相应的客户端组件实例化对象并之互动的方式完成对AI能力的调用。下面是一个简单的Java代码片段展示怎样创建一个REST控制器方法用于触发AI任务执行: ```java @RestController @RequestMapping("/api/ai") public class AiController { private final OpenAIClient openAiClient; @Autowired public AiController(OpenAIClient openAiClient) { this.openAiClient = openAiClient; } @PostMapping("/embeddings") ResponseEntity<String> getEmbedding(@RequestBody String text){ EmbeddingRequest request = new EmbeddingRequest(text); EmbeddingResponse response = openAiClient.createEmbedding(request); return ResponseEntity.ok(response.toString()); } } ``` 这段代码定义了一个接受POST请求的端点 `/api/ai/embeddings` ,它接收一段文字作为输入参数并通过`openAiClient`发送给远程服务器获取对应的向量表示形式作为响应返回给前端使用者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值