前言
当你让AI看懂医疗报告、实时翻译会议录音、甚至自动查询航班------ 这不再是科幻电影,而是ChatGPT API的日常操作!作为开发者2025年必备利器,它能:
-
🌐 128K超长上下文:直接分析整本《三体》
-
🖼️ 多模态交互:图文理解+语音转写
-
🔌 函数调用:3行代码教会AI调用你的服务
-
.....
本文将手把手带你玩转这些「超能力」!
代码仓库: github.com/SuYxh/chatg...
如何使用 ChatGPT API
什么是 ChatGPT API 🌐
ChatGPT API 是 OpenAI 提供的一个接口,允许开发者将 ChatGPT 模型(如 GPT-3.5、GPT-4)集成到自己的应用中,比如网站、App、小程序、机器人等。它提供了强大的自然语言理解与生成能力,能够实现自然语言理解与生成、多轮对话、内容创作等多种功能。
简单理解:ChatGPT API = 让你的程序可以"直接调用 ChatGPT 智能大脑"!
ChatGPT API 的主要特点 📋
特点类别 | 描述 | 优势/用途 |
---|---|---|
🤖 对话式结构 | 使用 messages 实现多轮对话,支持 system 、user 、assistant 角色 |
上下文记忆强,模拟真实对话,非常适合聊天机器人、问答系统 |
🔧 模型选择 | 支持 gpt-3.5-turbo 、gpt-4 、gpt-4-turbo |
根据预算和性能灵活选择,GPT-4-Turbo 高性价比 |
🎛 参数可调节 | temperature 、top_p 、max_tokens 等 |
控制输出风格、创意度、回复长度,自定义对话风格 |
💬 流式响应 | 支持 stream: true 实时输出结果 |
类似打字机效果,提升用户体验,适合聊天界面或写作应用 |
🌍 多语言支持 | 能处理中文、英文、日语、韩语、德语等几十种语言 | 可用于国际化产品、多语言客服、全球化智能助手 |
🧠 上下文长度支持 | GPT-4-Turbo 最多支持 128K tokens | 可用于大文档问答、长文章摘要、代码分析等场景 |
🛠 函数调用 | 支持 Function Calling、工具插件调用功能 | AI 可调用你的 API,具备实际执行能力,适合复杂业务场景 |
Token ✨
什么是 Token
Token 是语言模型处理文本的基本单位。你可以理解为"比字小,比词粗"的单位。
- 对于英文,一个 token 通常是 4 个字符左右 ,例如:
ChatGPT
是一个 tokenis
,a
,great
,tool
是 4 个 token
- 对于中文,一个字一般就是 1 个 token(比如:"你好"是 2 个 token)
举个例子:
文本内容 | Token 数量估算 |
---|---|
"Hello, how are you?" | 5 个 token |
"今天天气真不错。" | 7 个 token(每个字或符号算一个) |
Markdown/HTML 文本 | 通常比字符数少 25~30% |
英文论文一页(500词) | 约 700~800 token |
中文一页(500字) | 约 500~600 token |
Token计费规则
OpenAI 采用 输入****Token + 输出Token 的总量计费(包括输入+输出),不同模型价格不同。
👉 截至 2024 年的 GPT 模型定价(单位:USD 美元/ 1M tokens):platform.openai.com/docs/pricin...

如何查看Token消耗
- 使用 API 返回的
usage
字段(最直接)
每次你调用 ChatCompletion
,返回结果里就会带有这个字段:
JavaScript
const { OpenAI } = require("openai");
const openai = new OpenAI({ apiKey: 'YOUR_KEY' });
async function getTokenUsage() {
const response = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [{ role: "user", content: "Hello" }]
});
console.log(`输入 token: ${response.usage.prompt_tokens}`);
console.log(`输出 token: ${response.usage.completion_tokens}`);
console.log(`总消耗: ${response.usage.total_tokens}`);
}
"usage": {
"prompt_tokens": 600,
"completion_tokens": 400,
"total_tokens": 1000
}
prompt_tokens
:输入消耗completion_tokens
:输出消耗total_tokens
:总 token,用来计费
- 使用官方工具手动估算
OpenAI 提供了一个可视化工具: 👉 Tokenizer 工具地址(OpenAI 官方)
你可以在这里粘贴任意文本,查看它将被分成多少个 token。
🔍 为什么不同模型下 token 数不同?
原因是:**不同模型使用的 Tokenizer(分词器)不同。**OpenAI 每个模型在训练时,都会选择一个特定的分词方式(Tokenizer)。虽然这些 Tokenizer 都是基于 Byte Pair Encoding(BPE)方法,但它们的细节是有差异的:
模型 | 使用的 Tokenizer 名称 | 特点描述 |
---|---|---|
GPT-3 | p50k_base | 原始 GPT-3 使用的 tokenizer,分词较细 |
Codex (代码模型) | p50k_edit | 专为代码编辑优化的 tokenizer |
GPT-3.5-Turbo | cl100k_base | 更高效、token 更少,适配新模型 |
GPT-4 | cl100k_base | 与 GPT-3.5-Turbo 一样,更统一,token 压缩更好 |
不同模型 = 不同的 tokenizer → 相同文本会分成不同数量的 token,这会影响成本、性能、估算结果
- 使用
tiktoken
工具
OpenAI 提供了一个 Python 库来计算 token:
python
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4")
text = "你好,世界"
tokens = encoding.encode(text)
print(f"Token 数量: {len(tokens)}") # 输出 5
上下文窗口(Context Window)🔍
理解"上下文窗口 "(context window)是核心关键之一。它直接影响你能发送多长的 prompt、多轮对话记忆、处理多大文档,以及......你要花多少钱 💸
什么是"上下文窗口"
上下文窗口(Context Window)就是:
模型一次"看得见"的 token 数量总上限(包括你的输入 + 它的输出)。
- 它不是字符数,也不是字节数,而是 token 数
- 超出这个窗口,模型就 "看不见"之前的内容了,相当于"忘掉"了
不同模型的上下文窗口大小
模型名称 | 上下文窗口****大小(tokens) | 估算最大可处理字符数 | 主要特点与说明 |
---|---|---|---|
GPT-4.1 | 1,000,000 | ~750,000 字符 | OpenAI 于 2025 年 4 月发布的最新旗舰模型,支持高达 100 万 tokens 的上下文窗口,适用于处理超长文本和复杂任务。 |
GPT-4 Turbo | 128,000 | ~96,000 字符 | GPT-4 的高效版本,具有更大的上下文窗口和更低的成本,适用于需要处理长文本的应用场景。 |
GPT-4 | 8,192 / 32,768 | ~6,000 / ~24,000 字符 | 标准版本的 GPT-4,提供两个上下文窗口选项,适用于一般的文本生成和理解任务。 |
GPT-4o | 128,000 | ~12,000 字符 | 成本效益高的模型,适用于对上下文窗口要求不高的应用,如实时聊天和简单的文本处理。 |
GPT-3.5 Turbo | 16,385 | ~96,000 字符 | 多模态模型,支持文本、图像和语音输入,适用于多语言和多模态任务。 |
💡 记住:上下文 = 你的提问 + 系统提示 + 模型回答,总 token 不可超过此限制!
📦 举个例子:
你使用 GPT-4-turbo:
JavaScript
System prompt:1000 tokens
用户对话历史(多轮):8000 tokens
你当前提问:500 tokens
模型生成的回复:只能用 128000 - 已用的 token
一旦你发送的内容 + 模型回复长度 > 128K,API 会报错或者自动截断前面的内容(可能丢失关键信息)。
成本也和上下文窗口密切相关
上下文越大 → token 越多 → 成本越高。
发送内容长度 | 回复长度 | 使用 GPT-4-Turbo | Token 总数 | 费用估算 |
---|---|---|---|---|
1000 tokens | 1000 tokens | ✅ | 2000 | $0.31 + $0.03 = $0.34 |
30,000 tokens | 1000 tokens | ✅ | 31,000 | $0.31 + $0.03 = $0.34 |
建议的最佳实践:
场景 | 做法建议 |
---|---|
多轮对话 | 控制历史轮数 / 精选上下文摘要 / 截断旧内容 |
长文处理(PDF、小说) | 切段处理,或使用 GPT-4-turbo 一次输入全文 |
自动摘要 / 归纳 | 用 summary 替换旧对话,压缩 token 数量 |
成本优化 | 用 GPT-3.5 处理简单内容,GPT-4 用在高价值场景 |
常用参数详解
在上述案例中只用了很基础的参数,比如 model
、messages
、temperature
。但实际上 ChatGPT API (尤其是 chat.completions
接口)支持更多参数,可以细致控制模型行为和生成效果 。下面我将系统、详细、以开发者视角地总结一下每个常用参数。
参数概览
参数名 | 类型 | 作用 | 建议与示例 |
---|---|---|---|
model | string | 指定使用哪个模型,比如 gpt-4 , gpt-4o , gpt-3.5-turbo |
必填。根据需求选模型,比如长文本用 gpt-4o 。 示例:model: 'gpt-4o' |
messages | array | 传递对话历史,控制上下文(每条消息包括 role 和 content ) |
必填。标准结构,系统、用户、助手角色示例:见下面细节 |
temperature | number | 控制生成内容的随机性。值越大,回答越随机越有创意 | 通常设 0.2-1 正式场景稳定输出建议 0.2,创意内容建议 0.8 示例:temperature: 0.7 |
top_p | number | 另一个随机性控制参数(Nucleus Sampling)。一般和 temperature 二选一 |
通常不同时用。一般保留 temperature |
n | integer | 一次生成多少个回答(选项) | 默认为 1。设为 2 或以上可以生成多版本回答供选择 示例:n: 3 |
stream | boolean | 是否开启流式输出(边生成边返回) | 建议聊天产品使用,体验更好 示例:stream: true |
stop | string[] 或 string |
设定遇到特定文本就停止生成 | 用于控制回答结构,比如遇到 "\\n\\n" 停止 |
max_tokens | integer | 限制单次输出最大 token 数量 | 防止回答太长耗费过多 token 示例:max_tokens: 300 |
presence_penalty | number | 惩罚模型重复提及新主题,提高内容多样性 | 设为正数让回答更爱提新点子;设为负数更守旧 示例:presence_penalty: 0.6 |
frequency_penalty | number | 惩罚模型在回答中重复同样的词句 | 设为正数减少啰嗦;适合对内容要求紧凑的场景 |
logit_bias | object | 调整某些 token 出现概率(token -> -100~100 权重) | 高级用法,比如强制避免说某些话 |
user | string | 填用户唯一标识 ID,有助于模型行为分析和滥用检测 | 可选。但建议加。示例:user: 'user-12345' |
tools | array | 定义可以让模型调用的外部函数(Function Calling) | 高级场景,如调用天气 API、数据库查询等 |
重点参数示范
messages
json
[
{ "role": "system", "content": "你是一个友善的写作助手。" },
{ "role": "user", "content": "帮我写一首关于春天的诗。" }
]
role | 说明 |
---|---|
system | 设定 AI 的身份、语气、风格(非常重要) |
user | 用户输入内容 |
assistant | AI 回复内容(可选,构建多轮历史) |
temperature vs top_p
- temperature 高:更疯狂、有创意,比如写小说
- temperature 低:更稳定、严肃,比如写法律文档
- top_p 也控制"随机性",但更温和,一般不与 temperature 同时调。
常规建议:只设 temperature
就够了,严肃文档设 0.2;创意文案设 0.7。
stream(流式返回)
适合做实时打字效果:
JavaScript
stream: true
- 服务器会一段一段发回来
- 你需要监听
data
事件不断渲染内容 - 用在聊天机器人体验非常自然
stop(停止词)
比如你想让回答到"END"就立刻停止:
JavaScript
stop: ["END"]
当生成到 END
时模型会停止继续输出。
stop 可以配置特定的词语就停止嘛?
max_tokens(控制输出长度)
假设你只想要一小段回答,怕模型废话太多:
JavaScript
max_tokens: 200
最大只生成 200 tokens 左右的文本(注意不是字符!)。
presence_penalty / frequency_penalty
- presence_penalty 正数:鼓励引入新话题
- frequency_penalty 正数:减少重复词
适合写作、聊天防止啰嗦时用。比如:
JavaScript
presence_penalty: 0.5,
frequency_penalty: 0.5
可以让回复更简洁、丰富。
tools(调用外部函数)
如果定义一个获取天气的函数:
yaml
tool: [
{
name: "get_weather",
description: "获取指定城市天气",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "城市名称"
}
},
required: ["location"]
}
}
]
这样模型就能在需要时主动提出调用这个函数!
不同应用场景推荐参数表
应用场景 | 推荐模型 | temperature | presence_penalty | frequency_penalty | max_tokens | 说明 |
---|---|---|---|---|---|---|
文案创作(短文、广告语、标题) | gpt-4o / gpt-4-turbo | 0.8~1.2 | 0.6~1.0 | 0.2~0.5 | 500~1000 | 高创意,强调新颖表达,不怕轻微偏离 |
技术文档撰写(标准化文档、说明书) | gpt-4 / gpt-4-turbo | 0.2~0.4 | 0.0~0.2 | 0.0~0.2 | 1000~2000 | 低温度,输出规范、严谨、连贯 |
智能客服对话 | gpt-3.5-turbo | 0.3~0.5 | 0.0~0.3 | 0.0~0.5 | 500~1000 | 要求稳定,且尽量避免废话、重复 |
长文档摘要 / 归纳总结 | gpt-4-turbo / gpt-4o | 0.2~0.4 | 0.0~0.2 | 0.0~0.2 | 1500~3000 | 尽量客观总结,结构清晰 |
创意写作(小说、剧本、故事大纲) | gpt-4o | 0.9~1.3 | 0.7~1.2 | 0.0~0.3 | 2000~5000 | 鼓励想象力暴走,允许自由发挥 |
法律、合同、政策文案 | gpt-4 | 0.1~0.3 | 0.0 | 0.0 | 1000~3000 | 要求准确、正式、逻辑清晰 |
代码生成 / 代码解释 | gpt-4o / gpt-4-turbo | 0.1~0.3 | 0.0~0.1 | 0.0~0.2 | 500~2000 | 低创意,强调正确、清晰、简洁 |
多轮聊天机器人 | gpt-3.5-turbo / gpt-4o | 0.6~0.8 | 0.5~0.7 | 0.2~0.4 | 500~1500 | 保持活泼又不过度偏题,适合对话系统 |
思维导图生成 / 头脑风暴 | gpt-4o | 1.0~1.5 | 0.8~1.5 | 0.0~0.2 | 1000~3000 | 高自由度,输出尽可能多的想法 |
实操技巧与开发示例
代码仓库: github.com/SuYxh/chatg...
公共代码
utils/openai-client.js
:
javascriptimport OpenAI from 'openai'; import dotenv from 'dotenv'; dotenv.config(); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); export { openai };
ChatGPT 核心能力实操 ⚙️
自然语言理解(NLU)
ChatGPT 能够准确理解人类自然语言表达的内容,包括:
- 语义理解:能读懂各种句式、短语和隐含含义
- 意图识别:理解用户真正想要做什么,比如提问、命令、建议
- 上下文理解:根据对话历史推断出当前语境和逻辑关联
- 歧义处理:遇到模棱两可的表达时,能给出合理推测或主动澄清
✅ 应用场景:
- 聊天机器人
- 智能客服
- 对话式搜索
📄 Demo 案例
javascript
import { openai } from '../utils/openai-client.js';
// 预定义意图列表,供模型参考
const INTENT_CATEGORIES = [
"订票",
"取消订单",
"查询航班",
"酒店预订",
"天气查询",
"投诉反馈",
"闲聊",
"其他"
];
export async function understandIntent(userInput) {
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: `你是一个意图识别引擎,需要根据用户的输入,从以下意图中选择最匹配的一项返回:
${INTENT_CATEGORIES.map((c, i) => `${i + 1}. ${c}`).join('\n')}
只返回最匹配的意图名称,其他任何内容都不要输出。` },
{ role: 'user', content: userInput },
],
});
console.log('识别结果:', response.choices[0].message.content.trim());
}
// 调用
understandIntent('我想预定五一飞往杭州的航班')

自然语言生成(NLG)
ChatGPT 擅长流畅地生成符合人类习惯的自然语言文本,包括:
- 回答问题:准确、逻辑清晰地给出回答
- 内容创作:撰写故事、诗歌、广告文案、社交媒体帖子
- 多样风格切换:可以根据指令改变语气(正式、幽默、感性)
- 多语言输出:支持中、英、日、韩、德等多种语言写作
✅ 应用场景:
- 内容营销
- 自动写作
- 知识问答平台
📄 Demo 案例
javascript
import { openai } from '../utils/openai-client.js';
export async function generateShortStory(prompt) {
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你是一个优秀的短篇故事作者,写的内容不超过 100 字' },
{ role: 'user', content: prompt },
],
});
console.log('生成的故事:', response.choices[0].message.content.trim());
}
// 调用
generateShortStory('写一个关于勇敢小狗的温暖故事')

多轮对话管理(Contextual Dialogue)
ChatGPT 可以在多轮对话中保持上下文一致性和逻辑连贯性:
- 记住历史对话:在当前对话窗口内,追溯上下文,记得前几轮对话
- 动态调整回答:根据最新输入和历史内容,自适应调整回复
- 情绪跟踪(部分场景):模拟理解用户的情绪变化,调整回应
✅ 应用场景:
- 智能助理
- 聊天 App
- 游戏 NPC 互动
📄 Demo 案例
javascript
import { openai } from '../utils/openai-client.js';
export async function continueConversation(history, userInput) {
const messages = [
...history,
{ role: 'user', content: userInput },
];
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: messages,
});
console.log('AI 回答:', response.choices[0].message.content.trim());
return messages.concat({ role: 'assistant', content: response.choices[0].message.content.trim() });
}
// 调用
let history = [];
await withLoading(async () => {
history = await continueConversation(history, '你好');
history = await continueConversation(history, '你喜欢什么食物?');
history = await continueConversation(history, '我之前的问题是什么?');
});

信息检索与总结(Summarization & Extraction)
虽然 ChatGPT 不实时联网(除非用专门插件或接 API 调用搜索引擎),但它可以基于训练数据:
- 总结长文档:提取重点,写摘要
- 列出要点:将复杂内容组织成清单或结构化信息
- 比较分析:对比不同事物、观点、产品特点
✅ 应用场景:
- 报告生成
- 新闻摘要
- 法律、学术辅助
📄 Demo 案例
javascript
import { openai } from '../utils/openai-client.js';
export async function summarizeText(text) {
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你是一个专业的文档摘要助手' },
{ role: 'user', content: `请帮我总结以下内容:\n${text}` },
],
});
console.log('摘要内容:', response.choices[0].message.content.trim());
}
// 调用
summarizeText('ChatGPT 是由美国人工智能研究公司OpenAI开发的一款基于大规模语言模型的对话生成系统,属于 GPT系列的重要应用之一。自 2022 年 11 月正式发布以来,它凭借强大的自然语言处理能力和交互性,迅速成为全球关注的焦点。ChatGPT基于 Transformer 架构构建,一种擅长处理序列数据(如文本)的深度学习模型,通过 "自注意力机制" 捕捉文本中的长距离依赖关系,能高效处理上下文语义。其训练数据涵盖互联网级别的海量文本(书籍、网页、对话等),早期版本(如 GPT-3)参数量达数百亿级,后续版本(如 GPT-4)进一步提升至万亿级,显著增强了逻辑推理、多模态理解等能力。')

代码理解与生成(Code Understanding & Generation)
ChatGPT 在编程辅助方面也非常强大(特别是 GPT-4.0 之后):
- 写代码:支持 Python、JavaScript、C++、HTML、SQL 等主流语言
- 代码解释:帮你理解已有代码的功能和逻辑
- 代码调试建议:发现常见错误并提出修正方案
- 算法设计辅助:根据需求快速草拟解决方案
✅ 应用场景:
- AI 编程助手(如 Copilot 类工具)
- 技术支持
- 教学和学习辅导
📄 Demo 案例
javascript
import { openai } from '../utils/openai-client.js';
export async function generateCode(taskDescription) {
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你是一个资深前端工程师' },
{ role: 'user', content: `请帮我用 JavaScript 实现以下功能:\n${taskDescription}` },
],
});
console.log('生成的代码:\n', response.choices[0].message.content.trim());
}
// 调用
generateCode('使用 js 写一个快排函数')

多模态能力示例 🌟
GPT-4o 支持多模态输入与输出:
- 文本 、图片 和 语音 输入
- 文本 、语音 输出
- 视觉理解:可以识别图片中的物体、读图表、分析截图
- 语音对话:超自然、低延迟的语音交流
✅ 应用场景:
- 视觉问答(VQA)
- 智能语音助手
- 图文搜索
图像理解
javascript
// services/vision-image-understanding.js
import { openai } from '../utils/openai-client.js';
import fs from 'fs';
export async function analyzeImage(imagePath, question) {
const imageBase64 = fs.readFileSync(imagePath, { encoding: 'base64' });
const dataUrl = `data:image/jpeg;base64,${imageBase64}`;
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你是一个专业图像分析助手' },
{
role: 'user',
content: [
{ type: 'text', text: question },
{ type: 'image_url', image_url: { url: dataUrl } }
],
},
],
});
console.log('图片分析结果:', response.choices[0].message.content.trim());
}
// 调用
analyzeImage('./pic.jpg', '图片中有什么?')
需要理解的图片

图片理解结果

音频转文字
暂时无法在飞书文档外展示此内容
javascript
import { openai } from '../utils/openai-client.js';
import fs from 'fs';
export async function transcribeAudio(audioPath) {
const response = await openai.audio.transcriptions.create({
file: fs.createReadStream(audioPath),
model: 'whisper-1'
});
console.log('音频转文字结果:', response.text);
}
// 调用
transcribeAudio('./54321.mp3')

Function Calling 🔌
从 GPT-4 开始,ChatGPT 可以调用外部定义的函数:
- 结构化数据生成:输出符合特定 schema 的 JSON
- 插件调用:调用搜索引擎、数据库、天气预报、购物网站等服务
- 动作执行:如发起支付、查询库存、自动化操作
✅ 应用场景:
- 智能客服(自动查询订单)
- 企业内部知识库搜索
- 多任务自动化工作流
📄 Demo 案例
javascript
import fetch from 'node-fetch';
import dotenv from 'dotenv';
import { openai } from '../utils/openai-client.js';
dotenv.config();
const QWEATHER_API_KEY = process.env.QWEATHER_API_KEY; // 和风天气 API Key
async function get_weather({ location }) {
try {
// 使用 GeoAPI 获取城市的 Location ID
// 对应开发文档 https://dev.qweather.com/docs/api/geoapi/
const geoUrl = `https://n336x6y9yf.re.qweatherapi.com/geo/v2/city/lookup?location=${encodeURIComponent(location)}&key=${QWEATHER_API_KEY}`;
const geoRes = await fetch(geoUrl, { timeout: 5000 });
if (!geoRes.ok) {
throw new Error(`GeoAPI请求失败: ${geoRes.status} ${geoRes.statusText}`);
}
const geoData = await geoRes.json();
if (geoData.code !== '200' || !geoData.location || geoData.location.length === 0) {
return `抱歉,找不到 ${location} 的天气信息`;
}
const locationId = geoData.location[0].id;
console.log('locationId ->', locationId);
// 使用 Location ID 获取实时天气数据
// 对应开发文档: https://dev.qweather.com/docs/api/weather/weather-daily-forecast/
const weatherUrl = `https://n336x6y9yf.re.qweatherapi.com/v7/weather/3d?location=${locationId}&key=${QWEATHER_API_KEY}`;
const weatherRes = await fetch(weatherUrl, { timeout: 5000 });
if (!weatherRes.ok) {
throw new Error(`天气API请求失败: ${weatherRes.status} ${weatherRes.statusText}`);
}
const weatherData = await weatherRes.json();
console.log('weatherData ->', weatherData); // 打印 weatherData 以进行调试,确保正确获取了天气数据
if (weatherData.code !== '200') {
return `获取 ${location} 的天气信息失败,错误码:${weatherData.code}`;
}
return weatherData.daily[1];
} catch (error) {
console.error('天气查询出错:', error);
return `获取 ${location} 的天气信息时发生错误:${error.message}`;
}
}
export async function functionCallingExample() {
const response = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你可以调用用户定义的函数。' },
{ role: 'user', content: '明天北京天气怎么样?' },
],
tools: [
{
type: "function",
function: {
name: "get_weather",
description: "获取城市天气",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "城市名称,比如:北京"
}
},
required: ["location"]
}
}
}
],
tool_choice: "auto" // 让模型自动决定是否调用函数
});
const message = response.choices[0].message;
if (message.tool_calls && message.tool_calls.length > 0) {
const toolCall = message.tool_calls[0];
console.log('检测到需要函数调用:', JSON.stringify(toolCall, null, 2));
if (toolCall.function && toolCall.function.name === 'get_weather') {
const args = JSON.parse(toolCall.function.arguments);
const result = await get_weather(args);
// console.log(`\n函数 get_weather 执行结果:`, result);
// 这里增加一段新的逻辑:把 result 交给模型总结
const finalResponse = await openai.chat.completions.create({
model: 'gpt-4.1-mini',
messages: [
{ role: 'system', content: '你是一个天气播报员,负责把天气信息转成自然流畅的人类语言。' },
{ role: 'user', content: `帮我根据以下天气数据,总结成一段话:${JSON.stringify(result)}` }
],
});
const finalMessage = finalResponse.choices[0].message.content;
console.log('\n最终模型回复:', finalMessage);
} else {
console.log(`未识别的函数调用:${toolCall.function?.name}`);
}
} else {
console.log('没有触发函数调用。模型回复内容:', message.content);
}
}

小结
🔮 未来已来:当API能「看」能「听」能「行动」,我们开发的早已不是工具,而是智能伙伴!