第6课

Function Calling 入门

AI 负责理解你想算什么,真正的计算交给函数完成。

本课项目:AI计算小助手

学习重点:工具定义、参数、函数结果回传。工具重点:Function Calling。

OpenAI AI编程第6课封面
AI 工具地图

OpenAI 项目工具栈

页面里加入 OpenAI、Node.js、Python 和 JSON 图标,帮助学生把 AI 能力、后端调用、脚本实验和结构化输出放在同一条学习路线里理解。

学习路线

阶段入口与周课入口

先用阶段卡片看清大方向,再用周课卡片进入具体项目。每节课都保留理论、例子、Node.js、Python、练习和自测,学生可以直接按卡片推进。

OpenAI 项目地图

阶段入口

第01阶段:AI应用基础与 OpenAI 入门

先看懂 AI 应用的工作流程,再完成第一次 API 调用,最后学会写清楚提示词。

进入学习

第02阶段:让 AI 输出程序能读懂的结果

AI 不只要会说话,还要按固定格式交答案,这样程序才能稳定处理。

进入学习

第03阶段:Function Calling:让 AI 调用函数

AI 负责理解语言,函数负责精确计算;两者配合,结果更可靠。

进入学习

第04阶段:多模态应用:文字 + 图片

把图片也交给 AI 看,再让它用清楚的文字或 JSON 结果回答。

进入学习

第05阶段:内置工具:Web Search 与 File Search

需要最新消息时查网页;需要班级资料时查文件。先找资料,再回答。

进入学习

第06阶段:前后端 AI 应用开发

把 AI 能力做成网页:前端收集输入,后端保护密钥,页面展示结果。

进入学习

第07阶段:AI Agent、安全与成本

Agent 会按步骤完成任务,但你要给它工具、边界、检查规则和预算意识。

进入学习

第08阶段:毕业项目发布会

把前面学过的提示词、JSON、函数、检索、网页和安全设计合在一个作品里。

进入学习

周课入口

第6课:Function Calling 入门

AI 负责理解你想算什么,真正的计算交给函数完成。

进入学习

第7课:AI学习管家:分析成绩并给建议

函数做统计,AI 做解释和建议,组合成一个学习助手。

进入学习

6.1 今天你要完成什么

模型很会理解语言,但精确计算应该交给代码函数。这样结果更稳定,也更容易检查。

本课闯关:完成“AI计算小助手”,并用 3 组输入测试它。

6.2 核心理论

理论不是背概念,而是帮你判断项目为什么这样设计。下面这些规则会在代码里反复出现。

6.3 课堂讲解

这一课的项目是“AI计算小助手”,重点是“工具定义、参数、函数结果回传”。你可以把它当成一个小实验:先给它一个清楚输入,再观察代码里哪些地方用到了 Function Calling。课堂里我们不会一上来就追求复杂功能,而是先把最小版本做出来。最小版本跑通以后,你再改输入、改提示词、改输出格式,变化就会看得很清楚。

这几课开始让 AI 和函数合作。模型听懂人的话,函数做确定的事。这样的分工很像课堂小组:一个同学负责读题,一个同学负责计算。

本课有一条很实用的学习线索:先问“用户到底给了什么”,再问“程序希望拿到什么”。比如你可以试这些输入:帮我算 23 乘以 17;48 除以 6 是多少?;长方形宽 8 高 5,面积多少?。这些输入故意有简单的,也有容易出问题的。正常输入能帮你确认功能;短输入、空输入、奇怪输入能帮你发现系统边界。

写代码时建议你分三轮。第一轮只跑通官方调用,不加自己的想法;第二轮把输入换成自己的例子,看看结果是否还合理;第三轮才开始改结构,比如增加字段、加错误提示、做网页交互。这个顺序有点慢,但很稳。真正浪费时间的不是慢,而是一下子改太多,最后不知道错在哪里。

不要让模型负责精确计算。它可以解释过程,但平均分、面积、乘法结果应该由函数给出。

理论部分要和代码一起看。比如“输入契约”不是一个漂亮词,它在代码里就是长度检查、必填字段、表单校验;“输出契约”也不是空话,它在代码里就是 JSON Schema、固定字段或页面渲染规则。你每写一行检查代码,都是在告诉系统:什么结果可以接受,什么结果需要退回去重新处理。

课堂里可以把同桌当成第一个用户。你把项目跑给同桌看,让对方换一个输入,观察系统会不会乱。很多问题都是别人随手一试才出现的,比如输入太短、问题太模糊、连续点击按钮、图片看不清。能处理这些小麻烦,作品就会从“我电脑上能跑”变成“别人也能用”。

最后做复盘时,不要只写“我学会了调用 API”。可以写得更具体:我学会了怎样限制输入,怎样让输出固定,怎样判断结果不可靠,怎样把报错变成用户看得懂的提示。这样的复盘有用,因为下一课你真的会再次用到它。

课堂讨论题

6.4 先看例子

先把例子看懂,再动手写代码。你不需要一次记住所有概念,先能说清楚“输入是什么、输出是什么、程序要检查什么”。

用户输入

帮我算一下 23 乘以 17,再告诉我过程。

函数调用想法

AI 选择 multiply(a=23, b=17),程序计算得到 391。

最终输出

23 乘以 17 等于 391。可以理解成 23 个 17 相加,或者 20×17 加 3×17。

你可以替换成这些输入

6.5 完整代码实现

下面同时给出 Node.js 和 Python 两套完整最小实现。先任选一种原样跑通,再改输入、改提示词、改输出格式。

Node.js 运行方式

  1. 新建文件 lesson-06.mjs,把下面完整代码放进去。
  2. 在终端运行:npm init -y
  3. 安装依赖:npm install openai
  4. 设置环境变量 OPENAI_API_KEY。Windows PowerShell 示例:$env:OPENAI_API_KEY="你的密钥"
  5. 运行:node lesson-06.mjs
  6. 把最后一行的示例输入换成你自己的测试内容。

Node.js 完整代码

import OpenAI from "openai";

const client = new OpenAI();
const MODEL = process.env.OPENAI_MODEL || "gpt-5.5";

const tools = [
  {
    type: "function",
    name: "calculate",
    description: "完成基础数学计算。",
    parameters: {
      type: "object",
      properties: {
        operation: {
          type: "string",
          enum: ["add", "subtract", "multiply", "divide"],
        },
        a: { type: "number" },
        b: { type: "number" },
      },
      required: ["operation", "a", "b"],
      additionalProperties: false,
    },
    strict: true,
  },
];

function calculate({ operation, a, b }) {
  if (operation === "add") return a + b;
  if (operation === "subtract") return a - b;
  if (operation === "multiply") return a * b;
  if (operation === "divide") {
    if (b === 0) return "错误:不能除以 0";
    return a / b;
  }
  return "错误:未知运算";
}

let input = [
  { role: "user", content: "帮我算一下 23 乘以 17,并用一句话解释过程。" },
];

let response = await client.responses.create({
  model: MODEL,
  input,
  tools,
});

input.push(...response.output);

for (const item of response.output) {
  if (item.type !== "function_call") continue;
  if (item.name === "calculate") {
    const args = JSON.parse(item.arguments);
    const result = calculate(args);
    input.push({
      type: "function_call_output",
      call_id: item.call_id,
      output: JSON.stringify({ result }),
    });
  }
}

response = await client.responses.create({
  model: MODEL,
  input,
  tools,
  instructions: "请用学生能懂的话解释计算结果,不要编造函数没有返回的数字。",
});

console.log(response.output_text);

Python 运行方式

  1. 新建文件 lesson-06.py,把下面完整代码放进去。
  2. 建议新建虚拟环境后再安装依赖。
  3. 安装依赖:pip install openai
  4. 设置环境变量 OPENAI_API_KEY。Windows PowerShell 示例:$env:OPENAI_API_KEY="你的密钥"
  5. 运行:python lesson-06.py
  6. 把 main 里的示例输入换成你自己的测试内容。

Python 完整代码

from openai import OpenAI
import json
import os

client = OpenAI()
MODEL = os.getenv("OPENAI_MODEL", "gpt-5.5")

tools = [
    {
        "type": "function",
        "name": "calculate",
        "description": "完成基础数学计算。",
        "parameters": {
            "type": "object",
            "properties": {
                "operation": {
                    "type": "string",
                    "enum": ["add", "subtract", "multiply", "divide"],
                },
                "a": {"type": "number"},
                "b": {"type": "number"},
            },
            "required": ["operation", "a", "b"],
            "additionalProperties": False,
        },
        "strict": True,
    }
]


def calculate(operation, a, b):
    if operation == "add":
        return a + b
    if operation == "subtract":
        return a - b
    if operation == "multiply":
        return a * b
    if operation == "divide":
        if b == 0:
            return "错误:不能除以 0"
        return a / b
    return "错误:未知运算"


input_items = [
    {"role": "user", "content": "帮我算一下 23 乘以 17,并用一句话解释过程。"}
]

response = client.responses.create(model=MODEL, input=input_items, tools=tools)
input_items += response.output

for item in response.output:
    if item.type != "function_call":
        continue
    if item.name == "calculate":
        args = json.loads(item.arguments)
        result = calculate(**args)
        input_items.append({
            "type": "function_call_output",
            "call_id": item.call_id,
            "output": json.dumps({"result": result}, ensure_ascii=False),
        })

response = client.responses.create(
    model=MODEL,
    input=input_items,
    tools=tools,
    instructions="请用学生能懂的话解释计算结果,不要编造函数没有返回的数字。",
)

print(response.output_text)

6.6 跟着做

  1. 先写一个普通函数,例如 multiply(a, b)。
  2. 给函数写清楚参数名和参数类型。
  3. 让 AI 判断用户需要哪个函数。
  4. 程序执行函数,拿到真实结果。
  5. 把结果展示给用户,并说明过程。

6.7 常见错误

排查顺序:先看输入,再看提示词,再看输出格式,最后看程序逻辑。

6.8 课后练习

  1. 新增 area_rectangle(width, height) 函数。
  2. 让用户用自然语言提问面积问题。
  3. 输出答案和一句适合学生理解的解释。

6.9 自测清单