大模型FunctionCall-知识整理

大模型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
}
<think>好的,用户想知道如何在大型语言模型(LLM)的推理过程中实现函数调用。首先,我需要回忆一下之前看过的相关引用内容。引用[1]提到需要定义可以被LLM调用的函数,包括函数名、描述和参数列表。引用[4]则详细说明了函数调用功能如何提升模型的推理能力,以及如何通过tools参数向模型提供函数定义,模型生成调用参数后由开发者执行。 接下来,我应该整理实现步骤。根据引用中的信息,首先需要定义函数,然后通过API将函数描述传递给模型,模型生成调用参数后,再执行外部函数。引用[3]还提到有两种交互方式:用户直接选择或模型推理判断,这可能需要在步骤中说明。 可能还需要考虑不同框架的特点,比如引用[2]提到的local-llm-function-calling专注于函数调用和输出约束,与其他框架的区别。但用户的问题主要关注实现方法,所以这部分可以作为补充。 需要确保回答结构清晰,分步骤说明,并引用正确的来源。同时,要检查是否符合系统级指令,比如使用正确的LaTeX格式和引用标识。例如,在提到参数列表时,可以用$...$包裹变量名,如$参数名$。 最后,生成相关问题时要围绕函数调用的定义、交互方式、参数验证、应用场景和本地部署等方面,确保问题有针对性,帮助用户深入理解。</think>### 如何在 LLM 中实现推理过程的函数调用 实现大型语言模型(LLM)的推理过程中函数调用,需通过以下步骤完成: --- #### **1. 定义函数规范** - **核心要求**:明确函数名称、功能描述、输入参数(含类型和约束)及返回值格式。例如: ```json { "name": "get_weather", "description": "查询指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} } } } ``` 此步骤需确保模型能理解函数语义和调用逻辑[^1][^4]。 --- #### **2. 通过 API 传递函数定义** - **技术实现**:将函数定义通过 API 参数(如 OpenAI 的 `tools`)传递给模型: ```python response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "北京今天气温多少?"}], tools=[{ "type": "function", "function": weather_function_definition # 步骤1定义的函数 }] ) ``` 模型会生成包含调用参数的响应(如 `{"city": "北京"}`)[^4]。 --- #### **3. 解析并执行函数调用** - **开发侧处理**:从模型响应中提取参数并执行实际函数: ```python def get_weather(city): # 调用天气API或查询数据库 return f"{city}天气:晴,25℃" if response.choices[0].message.tool_calls: args = json.loads(response.choices[0].message.tool_calls[0].function.arguments) result = get_weather(args["city"]) ``` 模型不直接执行函数,仅提供参数。 --- #### **4. 反馈结果并迭代** - **交互闭环**:将函数执行结果返回给模型,支持后续推理: ```python messages.append({ "role": "tool", "content": result, "tool_call_id": response.choices[0].message.tool_calls[0].id }) ``` 此过程可循环进行以实现复杂任务。 --- ### **关键技术点** 1. **语义对齐**:函数描述需与模型知识对齐,例如“查询天气”需明确参数为城市名称而非经纬度。 2. **参数验证**:需在调用前校验参数合法性(如城市是否存在),避免模型生成无效参数[^3]。 3. **本地部署优化**:如引用[^2]所述,本地化部署需关注输出约束,可通过微调或提示词工程提升调用准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值