大模型FunctionCall-知识整理

发布于:2025-03-11 ⋅ 阅读:(12) ⋅ 点赞:(0)

大模型FunctionCall-知识整理

介绍FunctionCall的核心知识要点+智谱AI+DeepSeek的FunctionCall示例

1-参考网址

智谱AI+DeepSeek的FunctionCall示例和博文如下


2-思路整理

1)知识前提

网络请求是什么数据格式进行->JSON(很对版本的演进后目前JSON最火)-所以大模型最好也是使用JSON交互

2)学习思路

  • 1)先定义API或者Function函数(输入->[内容处理]->输出)
  • 2)再定义工具描述->[API/函数]需要什么参数,什么参数必填(但是貌似没有定义输出)
  • 3)然后定义JsonSchema->建立大模型的调用工具参数(为大模型添加外部API工具)
  • 4)大模型调用

3)有什么问题

  • 1)参数提取不准确,会导致函数调用失败或返回错误的结果->毕竟不是手动填写
  • 2)需要手动编写JsonSchema(即使大模型可以帮我们编写)

3-知识点

一、Function calling功能诞生背景

在人工智能快速发展的今天,大型语言模型(LLM)已经成为处理自然语言任务的强大工具。然而,随着应用场景的不断拓展,仅仅依靠模型生成文本已经无法满足复杂多样的实际需求。Function calling功能应运而生,它使LLM能够根据用户的输入与外部工具、API和功能进行互动。这一功能的出现,极大地拓展了模型的应用范围,使其可以 ’ 从“仅仅说”转变为“实际操作” ’ ,例如查询实时天气、获取股票信息等,从而为用户提供更精准、更有价值的服务。

二、Function calling外部函数库创建方法

创建外部函数库是实现Function calling的关键步骤。首先,开发者需要明确模型需要调用的外部功能,例如查询天气、获取股票数据等。然后,针对每个功能编写相应的函数,并定义好函数的参数和返回值。例如,定义一个查询天气的函数,需要指定地点和日期作为参数,并返回天气信息。接着,将这些函数封装成一个函数库,以便模型在需要时能够调用。在实际操作中,可能还需要设置API接口和认证信息,以确保函数能够正确访问外部数据源。

三、Function calling通信数据格式

Function calling的通信数据格式通常采用JSON(JavaScript Object Notation),这是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。在Function calling中,模型通过生成一个结构化的JSON对象来请求调用特定的函数,并传递相应的参数。例如,当用户询问天气时,模型会生成一个包含函数名(如get_weather)和参数(如地点和日期)的JSON对象。外部函数执行后,也会将结果以JSON格式返回给模型,模型再将这些结果整合到最终的自然语言回复中。

四、Functions参数解释与定义过程

在Function calling中,参数是连接模型和外部函数的关键。参数的解释和定义需要非常精确,以确保模型能够正确理解用户的意图,并生成符合函数要求的参数值。首先,开发者需要为每个函数定义好参数的类型、描述和是否必填等信息。例如,在查询天气的函数中,地点是一个必填的字符串参数,而日期可能是一个可选的字符串参数。然后,模型在解析用户的自然语言输入时,会根据这些定义来提取和生成相应的参数值。如果参数提取不准确,可能会导致函数调用失败或返回错误的结果。

五、JSON Schema对象解释

在Function calling中,JSON Schema是一个非常重要的概念,它用于描述函数参数的结构和约束。JSON Schema是一个基于JSON的格式,用于定义JSON数据的结构和验证规则。通过使用JSON Schema,开发者可以确保模型生成的参数符合函数的要求,从而减少错误调用的可能性。例如,在定义查询天气的函数时,可以使用JSON Schema来指定地点和日期的格式,以及哪些参数是必填的。模型在生成参数时,会根据这些Schema定义来验证参数的合法性,如果参数不符合要求,模型会尝试重新生成或提示用户修正输入。

六、Function calling first response

Function calling的第一次响应是指模型在接收到用户的自然语言输入后,生成的包含函数调用请求的响应。在这个阶段,模型会首先解析用户的意图,判断是否需要调用外部函数来完成任务。如果需要调用函数,模型会生成一个结构化的函数调用请求,包括函数名和参数,并将其作为响应的一部分返回。例如,当用户询问“今天北京的天气怎么样?”时,模型会生成一个调用get_weather函数的请求,并传递地点“北京”和日期“今天”作为参数。这个请求随后会被发送给外部函数执行。


1-第一次请求参数
[
    {
        "role": "system",
        "content": "不要假设或猜测传入函数的参数值。如果用户的描述不明确,请要求用户提供必要信息"
    },
    {
        "role": "user",
        "content": "帮我查询1月23日,北京到广州的航班"
    }
]

2-第一次请求响应
{
    "content": null,
    "role": "assistant",
    "tool_calls": [
        {
            "id": "call_-8929800266402085722",
            "function": {
                "arguments": "{\"date\": \"2024-01-23\", \"departure\": \"北京\", \"destination\": \"广州\"}",
                "name": "get_flight_number"
            },
            "type": "function",
            "index": 0
        }
    ]
}


七、Function calling second response

Function calling的第二次响应是指在外部函数执行完成后,模型根据函数的执行结果生成的最终回复。在这个阶段,模型会将外部函数返回的结果整合到自然语言回复中,以向用户提供完整的信息。例如,当外部函数返回北京今天的天气信息后,模型会生成一个如“北京今天晴天,25℃”的回复。如果函数调用失败或返回错误信息,模型也可能会生成相应的提示信息,告知用户出现问题,并可能建议用户修正输入或稍后重试。

Function calling作为大模型的一项重要功能,极大地拓展了模型的应用能力。通过与外部函数的交互,模型可以从生成文本转变为执行实际任务,为用户提供更丰富、更实用的服务。在实际应用中,开发者需要精心设计外部函数库、通信数据格式、参数定义以及错误处理机制,以确保Function calling的顺利进行。随着技术的不断发展,Function calling将在更多领域发挥重要作用,为人工智能的应用开辟新的可能性。


1-第二次请求参数
[
    {
        "role": "system",
        "content": "不要假设或猜测传入函数的参数值。如果用户的描述不明确,请要求用户提供必要信息"
    },
    {
        "role": "user",
        "content": "帮我查询1月23日,北京到广州的航班"
    },
    {
        "content": null,
        "role": "assistant",
        "tool_calls": [
            {
                "id": "call_-8929800266402085722",
                "function": {
                    "arguments": "{\"date\": \"2024-01-23\", \"departure\": \"北京\", \"destination\": \"广州\"}",
                    "name": "get_flight_number"
                },
                "type": "function",
                "index": 0
            }
        ]
    },
    {
        "role": "tool",
        "content": "{\"flight_number\": \"8321\"}",
        "tool_call_id": "call_-8929800266402085722"
    }
]

2-第二次请求响应
{
    "content": "1月23日从北京飞往广州的航班号为8321。如果需要查询该航班的票价,请告诉我。",
    "role": "assistant",
    "tool_calls": null
}