介绍 Function Calling

什么是 Function Calling

Function Calling(函数调用)是AI模型与外部系统交互的一种重要方式,它允许AI模型在对话过程中识别用户意图并触发特定的功能调用。本质上,Function Calling是AI模型与API之间的桥梁,使AI能够执行超越纯文本交互的操作。

工作原理

  1. 意图识别:AI模型分析用户输入,判断是否需要执行外部功能
  2. 参数提取:从用户话语中提取执行功能所需的参数
  3. 函数调用生成:生成结构化的函数调用请求
  4. 执行与响应:系统执行函数并返回结果,AI模型将结果整合到回复中

主要应用场景

  • 信息查询:天气、股票、航班等实时数据获取
  • 系统操作:控制智能家居、发送邮件、创建日历事件
  • 业务处理:订单查询、支付处理、预订服务
  • 数据分析:生成报表、数据可视化、趋势预测

实现方式

  1. 声明式函数定义:开发者预先定义可用的函数及其参数
  2. 动态决策:AI模型根据上下文决定是否调用函数
  3. 结构化响应:使用JSON等格式传递函数调用请求
  4. 安全验证:确保只有授权的函数可以被调用

优势与挑战

  • 优势:扩展AI能力边界、提供更精准服务、实现任务自动化、提高用户体验
  • 挑战:需要精确的意图识别、参数提取可能出错、需要处理API调用失败、存在安全风险

未来发展

  • 多步骤函数调用链
  • 动态函数发现与注册
  • 自适应参数提取
  • 更安全的执行环境

背景介绍

Function Calling是一种强大的API扩展机制,允许用户在使用大型语言模型(如GPT-3.5、GPT-4等)时,灵活地集成并调用外部函数。

具体工作流程:

  1. 用户向语言模型提交包含特定需求的查询
  2. 模型识别需要调用的外部函数
  3. 系统执行函数并返回结构化数据
  4. 模型整合函数结果生成自然语言响应

安装依赖

pip install -qU langchain-core langchain-openai

编写代码

定义了四个基础数学运算类(Add, Subtract, Multiply, Divide),使用Pydantic的BaseModel进行参数定义和验证。通过llm.bind_tools()将工具绑定到LLM。

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

class Multiply(BaseModel):
    """Multiply two integers together."""
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")

class Add(BaseModel):
    """Add two integers together."""
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")

class Subtract(BaseModel):
    """Subtract two integers."""
    a: int = Field(..., description="First integer")
    b: int = Field(..., description="Second integer")

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
llm_with_tools = llm.bind_tools([Add, Multiply, Subtract])

message1 = llm_with_tools.invoke("what's 3 * 12")
message2 = llm_with_tools.invoke("what's 3 + 12")
message3 = llm_with_tools.invoke("what's 3 - 12")

运行结果

  • “3 * 12” → 直接返回结果 “3 * 12 is equal to 36.”
  • “3 + 12” → 直接返回结果 “The result of 3 + 12 is 15.”
  • “3 - 12” → 触发工具调用,返回tool_calls

转换函数

使用convert_to_openai_tool将函数转换为JSON格式:

import json
from langchain_core.utils.function_calling import convert_to_openai_tool

def multiply(a: int, b: int) -> int:
    """Multiply two integers together."""
    return a * b

print(json.dumps(convert_to_openai_tool(multiply), indent=2))

输出为标准的OpenAI function calling格式JSON,包含name、description和parameters定义。