C#调用 AI学习从0开始-第2阶段(Function Calling+工具调用智能体)-第8天Function Calling原理

1. 什么是Function Calling(函数调用)?

当用户提出一个问题时,让AI能识别和理解这个问题并且输出一个指令,告诉程序该调用哪个函数、传入什么参数。

2. 为什么需要Function Calling?

因为AI的能力边界。

AI能做 AI不能做
回答问题、写代码、翻译 获取实时时间
解释概念、推理分析 查询天气
生成文本、总结归纳 访问数据库
理解意图、规划步骤 发送邮件/短信

表格中,AI不能做的部分,就需要开发人员自己写函数,供AI调用实现。

3. tools的JSON Schema格式

3.1 基础结构

csharp 复制代码
json
{
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "函数名",
        "description": "函数描述(AI据此判断何时调用)",
        "parameters": {
          "type": "object",
          "properties": {
            "参数名1": {
              "type": "参数类型",
              "description": "参数描述"
            }
          },
          "required": ["必填参数列表"]
        }
      }
    }
  ]
}

3.2 最简单的工具:get_current_time(无参数)

csharp 复制代码
json
{
  "type": "function",
  "function": {
    "name": "get_current_time",
    "description": "获取当前的日期和时间",
    "parameters": {}   // 没有参数,空对象
  }
}

3.3 带参数的工具:get_weather(有参数)

csharp 复制代码
json
{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "查询指定城市的天气",
    "parameters": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string",
          "description": "城市名称,如:北京、上海"
        }
      },
      "required": ["city"]
    }
  }
}

3.4 复杂参数的工具:calculator

csharp 复制代码
json
{
  "type": "function",
  "function": {
    "name": "calculator",
    "description": "计算数学表达式的结果",
    "parameters": {
      "type": "object",
      "properties": {
        "expression": {
          "type": "string",
          "description": "数学表达式,如:1024*256、100+200"
        }
      },
      "required": ["expression"]
    }
  }
}

4. 响应中的tool_calls字段

4.1 响应结构

当AI决定调用工具时,返回的JSON结构如下:

csharp 复制代码
json
{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": null,  // 工具调用时content通常为空
        "tool_calls": [
          {
            "id": "call_abc123",        // 工具调用的唯一ID
            "type": "function",          // 固定为function
            "function": {
              "name": "get_weather",     // 要调用的函数名
              "arguments": "{\"city\": \"北京\"}"  // 参数(JSON字符串)
            }
          }
        ]
      },
      "finish_reason": "tool_calls"      // 表示需要调用工具
    }
  ]
}

4.2 字段说明

字段 说明 用途
tool_calls\[\].id 本次调用的唯一ID 第2次请求时需要原样返回
function.name AI想要调用的函数名 你的代码根据名称执行对应方法
function.arguments 参数的JSON字符串 解析后传给C#方法
finish_reason "tool_calls" 判断是否需要调用工具

5.Function Calling需要几次API请求?

2次,第一次让ai理解问题 ,然后返回需要调用哪个方法;调用方法后,第二次调用AI把方法返回的结果传给AI ,AI组织语言输出答案。即:

第一次:AI理解问题 → 决定调用哪个方法

第二次:把方法结果传给AI → AI组织语言输出答案

Function Calling 的本质就是:你需要提前把所有可能被调用的函数都实现好。

6. 怎么判断是否需要Function Calling?

简单判断标准:

AI大脑里有的知识 → 不需要实现函数

需要获取外部信息或执行操作 → 需要实现函数

7. 实际项目中怎么规划函数?

按需添加,不是一次性写完。80/20法则,先实现高频功能,按需添加。

8. Function Calling vs 直接写代码的区别

方式 怎么做 适用场景
直接写代码 if (用户说"时间") { GetTime(); } 命令明确、固定
Function Calling AI判断意图 →判断调用哪个函数 意图多样、自然语言
csharp 复制代码
// 直接写代码(要穷举所有说法)
if (用户说.Contains("时间") || 用户说.Contains("几点") || 用户说.Contains("现在"))
{
    GetTime();
}

// Function Calling(AI帮你理解意图)
用户可以说:
- "现在几点了?"
- "能告诉我当前时间吗?"
- "What time is it?"
- "几时了?"
AI都能识别 → 调用 get_current_time
相关推荐
AI02261 小时前
探秘AI Agent软件公司:开启智能时代的创新引擎
人工智能
fīɡЙtīиɡ ℡3 小时前
AI 应用系统设计
java·开发语言·人工智能
小淮AI3 小时前
国际教育课程的本土化探索:以枫叶教育三十年为观察样本
大数据·人工智能
又折桃枝换酒钱3 小时前
VisCoder2:构建多语言可视化编码智能体(翻译与解读)
人工智能·信息可视化
AI绘画哇哒哒3 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
Chengbei113 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
QN1幻化引擎4 小时前
DalinX Phi 性能突破:跨层秩保持对齐与意识涌现度量的实证研究
人工智能·ai·架构·agi·asi
NeilCarmack4 小时前
Deepseek-harness增加桌面版端序列:第 1 讲 · 命令解析:`pnpm dsh desktop` 的第一步
人工智能·agent·ai agent
龙兵AI增长破局圈.赵老师讲成交4 小时前
只有把过程管好,结果才会出来。
大数据·人工智能·ai·创业创新