介绍 Function Calling
什么是 Function Calling
Function Calling(函数调用)是AI模型与外部系统交互的一种重要方式,它允许AI模型在对话过程中识别用户意图并触发特定的功能调用。本质上,Function Calling是AI模型与API之间的桥梁,使AI能够执行超越纯文本交互的操作。
工作原理
- 意图识别:AI模型分析用户输入,判断是否需要执行外部功能
- 参数提取:从用户话语中提取执行功能所需的参数
- 函数调用生成:生成结构化的函数调用请求
- 执行与响应:系统执行函数并返回结果,AI模型将结果整合到回复中
主要应用场景
- 信息查询:天气、股票、航班等实时数据获取
- 系统操作:控制智能家居、发送邮件、创建日历事件
- 业务处理:订单查询、支付处理、预订服务
- 数据分析:生成报表、数据可视化、趋势预测
实现方式
- 声明式函数定义:开发者预先定义可用的函数及其参数
- 动态决策:AI模型根据上下文决定是否调用函数
- 结构化响应:使用JSON等格式传递函数调用请求
- 安全验证:确保只有授权的函数可以被调用
优势与挑战
- 优势:扩展AI能力边界、提供更精准服务、实现任务自动化、提高用户体验
- 挑战:需要精确的意图识别、参数提取可能出错、需要处理API调用失败、存在安全风险
未来发展
- 多步骤函数调用链
- 动态函数发现与注册
- 自适应参数提取
- 更安全的执行环境
背景介绍
Function Calling是一种强大的API扩展机制,允许用户在使用大型语言模型(如GPT-3.5、GPT-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定义。