大模型Function Calling实战:让Agent拥有工具调用能力

大模型Function Calling实战:让Agentæ‹¥æœ‰å·¥å ·è°ƒç”¨èƒ½åŠ›

引言

AI Agent çš„æ ¸å¿ƒä»·å€¼åœ¨äºŽèƒ½å¤Ÿè‡ªä¸»å®Œæˆå¤æ‚ä»»åŠ¡ã€‚ç„¶è€Œï¼Œå¤§è¯­è¨€æ¨¡åž‹ï¼ˆLLMï¼‰æœ¬è´¨ä¸Šåªèƒ½ç”Ÿæˆæ–‡æœ¬ï¼Œæ— æ³•ç›´æŽ¥èŽ·å–å®žæ—¶æ•°æ®ã€æ‰§è¡Œä»£ç æˆ–æ“ä½œå¤–éƒ¨ç³»ç»Ÿã€‚Function Calling(函数调用)机制的出现,恰好弥补了这一短板——它让模型能够"理解"ä½•æ—¶éœ€è¦è°ƒç”¨å¤–éƒ¨å·¥å ·ã€è°ƒç”¨å“ªä¸ªå·¥å ·ã€ä¼ å ¥ä»€ä¹ˆå‚æ•°ï¼Œå¹¶å°†æ‰§è¡Œç»“æžœå›žä¼ ç»™æ¨¡åž‹ç»§ç»­æŽ¨ç†ã€‚æœ¬æ–‡å°†æ·±å ¥è®²è§£ OpenAI Function Calling çš„å®Œæ•´å®žæˆ˜æµç¨‹ï¼Œå¸®åŠ©ä½ æž„å»ºå ·å¤‡å·¥å ·è°ƒç”¨èƒ½åŠ›çš„æ™ºèƒ½ Agent。

一、什么是 Function Calling

Function Calling 是 OpenAI 在 GPT-3.5-turbo 和 GPT-4 ä¸­å¼•å ¥çš„ä¸€é¡¹èƒ½åŠ›ã€‚å®ƒå è®¸å¼€å‘è€ åœ¨ API è¯·æ±‚ä¸­é¢„å ˆå®šä¹‰ä¸€ç»„å¯è°ƒç”¨å‡½æ•°ï¼Œæ¨¡åž‹æ ¹æ®ç”¨æˆ·è¾“å ¥è‡ªä¸»åˆ¤æ–­æ˜¯å¦éœ€è¦è°ƒç”¨å ¶ä¸­æŸä¸ªå‡½æ•°ï¼Œå¹¶ç”Ÿæˆç¬¦åˆå‡½æ•°ç­¾åçš„ JSON 参数。

ä¸Žä¼ ç»Ÿçš„æç¤ºè¯å·¥ç¨‹ï¼ˆPrompt Engineering)相比,Function Calling å ·æœ‰ä¸‰ä¸ªæ˜¾è‘—ä¼˜åŠ¿ï¼š

  1. ç»“æž„åŒ–è¾“å‡ºï¼šæ¨¡åž‹ç”Ÿæˆä¸¥æ ¼çš„ JSON æ ¼å¼å‚æ•°ï¼Œæ— éœ€ä»Žè‡ªç”±æ–‡æœ¬ä¸­è§£æž
  2. ç±»åž‹å®‰å ¨ï¼šé€šè¿‡ JSON Schema 定义参数类型,降低解析错误率
  3. 决策透明:模型显式地选择"直接回答"或"è°ƒç”¨å·¥å ·",决策过程可追溯

二、Function Calling 的工作流程

一个完整的 Function Calling äº¤äº’æµç¨‹åŒ å«ä»¥ä¸‹å››ä¸ªæ­¥éª¤ï¼š

用户提问 → 模型分析 → 输出函数调用请求 → å¼€å‘è€ æ‰§è¡Œå‡½æ•° → ç»“æžœå›žä¼ â†’ 模型生成最终回答

å ·ä½“æµç¨‹å¦‚ä¸‹ï¼š

  1. æ³¨å†Œå·¥å ·ï¼šå°†å¯ç”¨å·¥å ·ä»¥ JSON Schema 形式注册到 API 请求中
  2. æ¨¡åž‹å†³ç­–ï¼šæ¨¡åž‹åˆ†æžç”¨æˆ·è¾“å ¥ï¼Œå†³å®šæ˜¯å¦è°ƒç”¨å·¥å ·ã€è°ƒç”¨å“ªä¸ªå·¥å ·
  3. 参数解析:模型输出结构化的函数名称和参数(JSON æ ¼å¼ï¼‰
  4. æœ¬åœ°æ‰§è¡Œï¼šå¼€å‘è€ åœ¨æœ¬åœ°æ‰§è¡Œå¯¹åº”çš„å‡½æ•°é€»è¾‘
  5. 结果回ä¼ï¼šå°†å‡½æ•°æ‰§è¡Œç»“果以functionè§’è‰²çš„æ¶ˆæ¯å›žä¼ ç»™æ¨¡åž‹
  6. æœ€ç»ˆè¾“å‡ºï¼šæ¨¡åž‹åŸºäºŽå·¥å ·è¿”å›žç»“æžœç”Ÿæˆå®Œæ•´å›žç­”

ä¸‰ã€å®žæˆ˜ï¼šå®šä¹‰å·¥å ·å‡½æ•°

假设我们要构建一个能够查询天气和获取当前时间的 Agentã€‚é¦–å ˆï¼Œéœ€è¦å®šä¹‰å·¥å ·å‡½æ•°çš„ JSON Schema:

tools = [ { "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的当前天气信息", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称,例如:北京、上海" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"], "description": "温度单位" } }, "required": ["city"] } } }, { "type": "function", "function": { "name": "get_current_time", "description": "获取当前时间", "parameters": { "type": "object", "properties": { "timezone": { "type": "string", "description": "时区,例如:Asia/Shanghai" } }, "required": [] } } } ]