首页 › LLM大语言模型 › 大模型技术工程 › 提示词工程精通指南 › 第十二章:如何让AI连接真实世界工具(Function Calling)

第十二章:如何让AI连接真实世界工具(Function Calling)

​

💪

函数调用(Function Calling)是大语言模型与外部世界交互的核心能力。通过函数调用,AI不再局限于文本生成,而是能够查询数据库、调用API、执行代码,真正成为连接数字世界的智能助手。本文将深入解析函数调用的原理、实现方式和最佳实践。​

​

核心要点​

•

函数调用:让LLM能够识别用户意图并生成结构化的函数调用请求,而非直接执行函数​

•

JSON Schema:使用标准化的JSON Schema描述函数参数,确保类型安全和参数验证​

•

工具选择:LLM根据用户输入智能选择合适的工具,支持单次或并行调用多个函数​

•

执行分离:LLM只负责决策"调用什么",实际执行由应用程序完成,保证安全性​

•

MCP协议:函数调用的标准化演进,实现跨平台工具复用​

​

​

什么是函数调用​

函数调用(Function Calling),也称为工具调用(Tool Calling),是一种让大语言模型能够与外部系统交互的技术。它允许LLM在对话过程中识别用户意图,并生成结构化的函数调用请求。​

函数调用解决的问题​

​

#KPMTHJZPPzSU text { white-space: pre; }#KPMTHJZPPzSU .fb0 { stroke: var(--N900-FG, 0.15); }#KPMTHJZPPzSU .fb0 {stroke: rgba(31,35,41, 0.15)}#KPMTHJZPPzSU .fx0 { stroke-miterlimit: 10; }#KPMTHJZPPzSU .fx0 {stroke-miterlimit: 10}#KPMTHJZPPzSU .fa1 { fill: rgb(187, 191, 196); }#KPMTHJZPPzSU .fa1 {fill: rgb(187, 191, 196)}#KPMTHJZPPzSU .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#KPMTHJZPPzSU .fx1 {font-style: normal}#KPMTHJZPPzSU .fx2 { text-anchor: middle; }#KPMTHJZPPzSU .fx2 {text-anchor: middle}#KPMTHJZPPzSU .fx3 { dominant-baseline: central; }#KPMTHJZPPzSU .fx3 {dominant-baseline: central}#KPMTHJZPPzSU .fx4 { stroke: none; }#KPMTHJZPPzSU .fx4 {stroke: none}#KPMTHJZPPzSU .fc0 { fill: var(--text-caption); }#KPMTHJZPPzSU .fc0 {fill: #646a73}#KPMTHJZPPzSU .fa2 { fill: var(--text-link-disabled); }#KPMTHJZPPzSU .fa2 {fill: rgb(187, 191, 196)}#KPMTHJZPPzSU .fa3 { fill: rgb(31, 35, 41); }#KPMTHJZPPzSU .fa3 {fill: rgb(31, 35, 41)}#KPMTHJZPPzSU .fx5 { font: 400 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#KPMTHJZPPzSU .fx5 {font-style: normal}#KPMTHJZPPzSU .fx6 { text-anchor: start; }#KPMTHJZPPzSU .fx6 {text-anchor: start}#KPMTHJZPPzSU .fx7 { dominant-baseline: alphabetic; }#KPMTHJZPPzSU .fx7 {dominant-baseline: alphabetic}#KPMTHJZPPzSU .fc1 { fill: rgb(248, 249, 250); }#KPMTHJZPPzSU .fc1 {fill: rgb(248, 249, 250)}#KPMTHJZPPzSU .fc2 { fill: rgb(51, 51, 51); }#KPMTHJZPPzSU .fc2 {fill: rgb(51, 51, 51)}#KPMTHJZPPzSU .fb1 { fill: var(--N900-FG, 0.15); }#KPMTHJZPPzSU .fb1 {fill: rgba(31,35,41, 0.15)}#KPMTHJZPPzSU .fb2 { fill: rgb(225, 228, 232); }#KPMTHJZPPzSU .fb2 {fill: rgb(225, 228, 232)}#KPMTHJZPPzSU .fa4 { fill: var(--bg-body); }#KPMTHJZPPzSU .fa4 {fill: #fff}ABC12345问题传统方式函数调用方式获取实时信息执行计算操作外部系统结构化输出LLM无法获取训练数据之后的信息LLM数学计算不可靠无法实现需要复杂提示工程调用搜索API获取最新数据调用计算器函数精确计算调用API执行数据库操作、发送邮件等函数参数天然结构化

​

函数调用 vs 普通对话​

​

飞书文档 - 图片

​

​

​

​

函数调用工作原理​

函数调用的核心流程包含四个关键步骤:定义、选择、执行、整合。​

完整工作流程​

​

飞书文档 - 图片

​

关键概念解析​

函数定义(Function Definition)​

开发者预先定义LLM可以调用的函数,包括函数名、描述和参数Schema:​

​

代码块​

Python

functions = [​

{​

"name": "get_weather",​

"description": "获取指定城市的当前天气信息",​

"parameters": {​

​

函数选择(Function Selection)​

LLM根据用户输入和函数描述,智能判断是否需要调用函数,以及调用哪个函数。​

参数提取(Parameter Extraction)​

LLM从用户输入中提取函数所需的参数,并按照Schema格式化输出。​

结果整合(Result Integration)​

应用程序执行函数后,将结果返回给LLM,LLM将结果整合到最终回答中。​

​

​

JSON Schema定义函数​

JSON Schema是定义函数参数的标准方式,它确保了参数的类型安全和结构化验证。​

基础Schema结构​

​

代码块​

JSON

{"name": "search_products","description": "在商品数据库中搜索产品","parameters": {"type": "object","properties": {"query": {"type": "string","description": "搜索关键词"},"category": {"type": "string","enum": ["electronics", "clothing", "books", "home"],"description": "商品类别"},"price_range": {"type": "object","properties": {"min": {"type": "number", "minimum": 0},"max": {"type": "number", "minimum": 0}},"description": "价格范围"},"in_stock": {"type": "boolean","description": "是否只显示有库存商品"}},"required": ["query"]}}​

​

Schema关键字段说明​

​

表格加载中...

#XglrItqSTgNS text{white-space:pre}.fb0{stroke:var(--N900-FG, 0.15)}.fx0{stroke-miterlimit:10}.fa1{fill:#bbbfc4}.fx1{font:normal 400 12px MonospacedNumber,LarkHackSafariFont,LarkEmojiFont,LarkChineseQuote,-apple-system,BlinkMacSystemFont,Helvetica Neue,Tahoma,PingFang SC,Microsoft Yahei,Arial,Hiragino Sans GB,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.fx2{text-anchor:middle}.fx3{dominant-baseline:central}.fx4{stroke:none}.fc0{fill:var(--text-caption)}.fa2{fill:var(--text-link-disabled)}.fa3{fill:rgb(246, 248, 250)}.fx5{font:400 normal 16px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}.fx6{text-anchor:start}.fx7{dominant-baseline:alphabetic}.fc1{fill:rgb(51, 51, 51)}.fx8{font:400 normal 14px LarkHackSafariFont, LarkEmojiFont, "Fira Code", -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, "Noto Sans", Tahoma, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", STHeiti, SimHei, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", system-ui}.fc2{fill:rgb(139, 92, 246)}.fb1{fill:var(--N900-FG, 0.15)}.fb2{fill:rgb(225, 228, 232)}.fa4{fill:var(--bg-body)}ABC1234567字段作用定义参数类型参数描述,帮助LLM理解用途限定可选值必填参数列表数值范围限制字符串长度限制示例, , , , "用户的邮箱地址"typedescriptionenumrequiredminimum/maximumminLength/maxLengthstringnumberbooleanobjectarray["low", "medium", "high"]["query", "user_id"]"minimum": 0, "maximum": 100"minLength": 1, "maxLength": 100

​

复杂参数示例​

​

💡 快速生成Schema:手动编写JSON Schema容易出错,使用 JSON Schema生成器 可以从示例JSON自动生成规范的Schema。​

​

​

代码块​

JSON

​

​

​

OpenAI函数调用实战​

以下是使用OpenAI API实现函数调用的完整示例。​

基础实现​

​

代码块​

Python

import openai​

import json​

​

client = openai.OpenAI()​

​

tools = [​

{​

"type": "function",​

"function": {​

"name": "get_weather",​

"description": "获取指定城市的当前天气",​

"parameters": {​

​

tool_choice参数详解​

​

​

​

​

并行函数调用​

当用户请求涉及多个独立操作时,LLM可以同时生成多个函数调用请求,提高效率。​

并行调用示例​

​

代码块​

Python

def handle_parallel_calls(user_message: str) -> str:​

messages = [{"role": "user", "content": user_message}]​

​

response = client.chat.completions.create(​

model="gpt-4-turbo",​

messages=messages,​

tools=tools,​

​

并行调用流程图​

​

​

​

​

与MCP协议的关系​

MCP(Model Context Protocol)是函数调用的标准化演进,由Anthropic推出,旨在解决工具复用和跨平台兼容问题。​

函数调用 vs MCP​

​

​

从函数调用到MCP​

​

​

何时选择MCP​

•

需要在多个AI客户端(Claude、Cursor等)复用工具​

•

构建复杂的AI Agent系统​

•

需要标准化的工具发现和调用机制​

•

希望利用现有MCP Server生态​

​

💡 探索MCP生态:访问 MCP Server导航 发现数百个可直接使用的MCP工具。​

​

​

​

实战案例:构建AI助手​

下面我们构建一个完整的AI助手,集成多种工具能力。​

完整代码实现​

​

代码块​

Python

​

​

​

错误处理与最佳实践​

错误处理策略​

​

代码块​

Python

def safe_function_call(function_name: str, function_args: dict) -> dict:​

if function_name not in available_functions:​

return {"error": f"未知函数: {function_name}"}​

​

try:​

func = available_functions[function_name]​

result = func(**function_args)​

return {"success": True, "data": result}​

​

最佳实践清单​

​

​

安全注意事项​

​

代码块​

Python

DANGEROUS_FUNCTIONS = ["exec", "eval", "system", "delete"]​

​

def validate_function_call(function_name: str, function_args: dict) -> bool:​

if function_name in DANGEROUS_FUNCTIONS:​

return Falseif "path" in function_args:​

path = function_args["path"]​

if ".." in path or path.startswith("/"):​

return Falsereturn True​

​

​

​

常见问题​

函数调用和Prompt Engineering有什么区别?​

Prompt Engineering通过精心设计提示词来引导LLM输出特定格式的文本,但输出仍是非结构化的。函数调用则让LLM直接生成结构化的JSON格式调用请求,更可靠、更易于程序处理。​

如何提高函数选择的准确性?​

编写清晰、具体的函数描述​

使用有意义的函数名​

在description中包含使用场景示例​

避免功能重叠的函数定义​

使用enum限定参数可选值​

函数调用会增加API成本吗?​

是的,函数定义会计入Token消耗。优化建议:​

•

只传递当前场景需要的函数​

•

精简函数描述,去除冗余信息​

•

使用简洁的参数名​

如何处理函数执行失败?​

返回结构化的错误信息给LLM​

让LLM根据错误信息调整策略或向用户解释​

实现重试机制处理临时性错误​

设置最大重试次数避免无限循环​

函数调用支持流式输出吗?​

支持。在流式模式下,函数调用信息会在delta中逐步返回,需要累积完整的function_call后再执行。​

​

​

总结​

函数调用是让大语言模型从"能说会道"进化到"能说会做"的关键技术。通过标准化的JSON Schema定义和结构化的调用流程,AI能够安全、可靠地与外部系统交互。​

关键要点回顾​

✅ 函数调用让LLM能够执行实际操作,而非仅生成文本​

✅ JSON Schema是定义函数参数的标准方式​

✅ 并行调用可以同时处理多个独立请求​

✅ MCP协议是函数调用的标准化演进方向​

✅ 安全性和错误处理是生产环境的关键考虑​