function call
简介
为什么需要function call
大语言模型 (LLM) 擅长解决许多类型的问题。但是,它们受到以下限制:
- 知识固化:模型在训练后参数就被冻结,无法获取新知识
- 能力边界:无法直接查询或修改外部数据,缺乏实时交互能力
- 计算限制:复杂数学运算或专业领域计算能力有限
函数调用(function call)本质上是为LLM提供了"使用工具"的能力,让模型可以:
- 动态获取最新信息(如查询天气、股票)
- 执行具体操作(如发送邮件、预订机票)
- 处理复杂计算(如调用专业API)
- 连接企业系统(如CRM、ERP等业务系统)
技术实现上,这需要开发者向模型提供一组定义良好的函数接口,模型会根据用户需求智能选择调用
Function Call技术原理
- 通过结构化输出(json格式)描述需要调用的函数及参数
- 模型自身不直接执行函数,而是输出调用指令
- 开发者负责实际函数调用并将结果返回给模型
应用
使用场景
- 实时数据获取:天气查询、股票行情、新闻检索
- 业务系统集成:CRM、ERP系统查询与操作
- 复杂任务分解:将复杂问题拆解为多个API调用
- 专业领域增强:法律、医疗等专业领域工具调用
- 典型案例:
- 智能旅行助手:整合航班查询、酒店预订、天气查询等多个API
- 电商客服机器人:查询订单状态、退货处理等后端系统对接
最佳实践
函数名称
- 函数名称应以字母或下划线开头,且只能包含字符 a-z、A-Z、0-9、下划线、英文句点或英文短划线,长度上限为 64 个字符。
函数说明规范
- 清晰而详细地撰写函数说明。例如,对于 book_flight_ticket 函数:
- 下面是一个良好的函数说明示例:book flight tickets after confirming users' specific requirements, such as time, departure, destination, party size and preferred airline
- 下面是一个不良的函数说明示例:book flight ticket
函数参数规范
- 命名规则:函数参数和嵌套属性名称应以字母或下划线开头,并且只能包含字母 a-z、A-Z、数字 0-9 或下划线,最大长度为 64 个字符。请勿在函数参数名称和嵌套属性中使用英文句点 (.)、短划线 (-) 或空格字符。
说明
- 编写清晰而详细的参数说明,包括首选格式或值等详细信息。例如,对于 book_flight_ticket 函数:
- 以下是 departure 参数说明的一个良好示例:Use the 3 char airport code to represent the airport. For example, SJC or SFO. Don't use the city name.
- 以下是 departure 参数说明的一个不良示例:the departure airport
类型
尽可能使用强类型参数来减少模型幻觉。例如,如果参数值来自有限集,请添加 enum 字段,而不是将值集放入说明中。如果参数值始终是整数,请将类型设置为 integer,而不是 number。
参数类型定义示例:
json
"parameters": {
"location": {
"type": "string",
"description": "城市名称,如'北京'或'New York'"
},
"temperature_unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"default": "celsius"
}
}
系统指令优化
- 使用包含日期、时间或位置参数的函数时,请在系统说明中添加当前日期、时间或相关位置信息(例如城市和国家/地区)。这样可以确保模型具有必要的上下文来准确处理请求,即使用户提示缺少详细信息也是如此。
用户提示
- 为获得最佳结果,请在用户提示前面加上以下详细信息:
- 模型的其他上下文,例如 You are a flight API assistant to help with searching flights based on user preferences.
- 有关如何及何时使用函数的详细信息或说明,例如 Don't make assumptions on the departure or destination airports. Always use a future date for the departure or destination time.
- 在用户查询不明确时询问澄清性问题的说明,例如 Ask clarifying questions if not enough information is available.
生成配置
- 对于温度参数,请使用 0 或其他较低值。这会指示模型生成置信度更高的结果并减少幻觉。
API 调用
- 如果模型建议调用一个会发送订单、更新数据库或以其他方式产生重大后果的函数,请在执行之前先向用户验证该函数调用。
实例说明
例如,您可以提供一个函数 get_weather,该函数接受一个位置参数,并返回该位置的天气状况信息
处理提示时,该模型可以选择将某些数据处理任务委托给您确定的函数。模型不会直接调用函数。相反,模型会提供结构化数据输出,其中包含要调用的函数和要使用的参数值。例如,对于提示
What is the weather like in Boston?
,模型可以将处理委托给get_weather
函数,并提供位置参数值Boston, MA
.您可以使用模型的结构化输出来调用外部 API。例如,您可以连接到天气服务 API,提供位置 Boston, MA,并接收有关温度、云量和风况的信息
然后,您可以将 API 输出返回给模型,使模型能够完成对提示的回答。对于天气示例,模型可能会提供以下回答:It is currently 38 degrees Fahrenheit in Boston, MA with partly cloudy skies.
完整交互流程
参考
- https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling?hl=zh-cn
- 最佳实践 - https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling?hl=zh-cn#best-practices