乐于分享
好东西不私藏

OpenAI API 完全入门手册:调用、Token、参数,一篇掌握

OpenAI API 完全入门手册:调用、Token、参数,一篇掌握

OpenAI 模型 API 基础

1. 发送你对GPT模型的第一个请求

首先,确保已安装 OpenAI Python 库:

pip install openai

1.1 最简单的调用方式

from openai import OpenAI# 初始化客户端(会自动读取环境变量 OPENAI_API_KEY)client = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {"role""user""content""四大文明古国分别有哪些"}    ])print(response.choices[0].message.content)

运行结果示例

四大文明古国指的是古代埃及、巴比伦、印度和中国。这四个古国拥有悠久的历史和独特的文明。以下是这些古国的一些特点:1. 埃及:埃及文明起源于公元前3100年的法老王朝时期。埃及是世界上最早的文明之一,拥有众多的古代建筑和文化遗产,如金字塔、狮身人面像等。2. 巴比伦:巴比伦是古代美索不达米亚地区的一座重要城市。巴比伦文明的最大贡献之一是制定了世界上最早的法典——汉谟拉比法典。3. 印度:印度文明起源于公元前2500年左右的哈拉帕文明,印度教、佛教、耆那教等宗教都在这里兴起。4. 中国:中国文明起源于公元前21世纪的夏代,是世界上最古老的连续文明之一,拥有造纸术、指南针、火药等伟大发明。

1.2 多轮对话(带上下文)

如果需要维持对话历史,可以将之前的对话内容传入 messages 数组:

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[    {"role""system""content""你是一个乐于助人、语气友善的AI聊天助手"},  # 设定AI的性格    {"role""user""content""你是谁"},                                  # 用户之前问过的问题    {"role""assistant""content""我是ChatGPT,由OpenAI开发..."},        # AI之前回答的内容    {"role""user""content""四大文明古国分别有哪些"}                     # 用户现在问的问题    ])print(response.choices[0].message.content)

1.2.1 参数说明

1.2.2 返回对象结构

response 返回的是一个 ChatCompletion 对象,主要包含:

ChatCompletion(    id='chatcmpl-xxx',           # 唯一请求ID    choices=[                      # 回复选项列表        Choice(            finish_reason='stop',  # 结束原因:stop/length/content_filter等            index=0,            message=ChatCompletionMessage(                content='回复内容...',                role='assistant'            )        )    ])

1.2.3 提取回复内容

# 标准方式reply = response.choices[0].message.contentprint(reply)

1.3 常见问题

1.3.1 API Key 设置

推荐使用环境变量:

import osfrom openai import OpenAIclient = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

在代码中直接设置(不推荐):你的api可以被别人使用

client = OpenAI(api_key="xxxxxxxxxxxxxxxxxxxxxxxx")

2. 大模型API GPT模型咋收费?

必了解的token计数

2.1 什么是 Token?

在使用 OpenAI API 时,你需要了解一个核心概念:Token。

简单来说,Token 是 AI 处理文本的基本单位。它不完全是“字”,也不完全是“词”,而是一种介于两者之间的切分方式。

2.1.1 Token 的规则

  • 英文:通常一个单词约等于 1-2 个 Token

  • 中文:一个汉字通常等于 1-2 个 Token

  • 空格和标点:也会占用 Token

2.2 为什么需要计算 Token?

使用 OpenAI API 时,费用是按照 Token 数量 来计算的:

  • 输入 Token:你发送给 AI 的消息

  • 输出 Token:AI 返回给你的回答

了解 Token 数量可以帮助你:

  1. 控制 API 使用成本

  2. 避免超出模型的最大 Token 限制

  3. 优化提示词长度

2.3 如何计算 Token?

OpenAI 提供了一个名为 tiktoken 的工具库,可以精确计算 Token 数量。

2.3.1 安装 tiktoken

pip install tiktoken

2.4 基础用法

import tiktoken# 获取指定模型的编码器encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")# 查看编码器名称print(encoding)# 输出:<Encoding 'c1100k_base'>

2.5 将文本转换为 Token

# 将文本编码为 Token 数组text = "黄河之水天上来"tokens = encoding.encode(text)print(tokens)# 输出:[30868, 226, 31106, 111, 55030, 53610, 36827, 17905, 37507]
  • 这些数字代表Token ID,包含 9 个 Token

2.6 计算 Token 数量

# 方法一:获取编码后的长度token_count = len(encoding.encode(text))print(token_count)  # 输出:9# 方法二:直接使用 encode 方法后取长度tokens = encoding.encode(text)token_count = len(tokens)print(f"'{text}' 包含 {token_count} 个 Token")# 输出:'黄河之水天上来' 包含 9 个 Token

2.7 费用计算

OpenAI 按 总Token 收费:

  • 费用 = (输入Token数 × 输入价格) + (输出Token数 × 输出价格)

每个模型有总Token上限:

  • 注意:所有消息的Token总和不能超过这个上限

调用总tokens示例:

3. 大模型API定制和调整GPT回复的常用参数

在使用 OpenAI API 时,除了 model 和 messages 这两个必填参数外,还有四个重要的可选参数可以控制 AI 的回复行为,分别是max_tokens、temperature、top_p 和 frequency_penalty。

3.1 max_tokens:控制回复长度

3.1.1 作用

max_tokens 用于限制 AI 回复的最大 Token 数量。就像给 AI 规定了一个“字数上限”,超过这个长度就会被截断。

3.1.2 代码示例

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {            "role""user",            "content""四大文明古国分别有哪些"        }    ],    max_tokens=100  # 限制回复最多100个Token)print(response.choices[0].message.content)

运行结果:超过长度被截断

四大文明古国指的是古代埃及、美索不达米亚、印度河流域和黄河流域四个地区。它们分别是:1. 埃及文明:位于尼罗河流域,是人类历史上最早的文明之一。埃及文明以母系社

3.1.3 参数详解

3.1.4 注意事项

  • max_tokens 限制的是 AI 回复的 Token 数,不包括你的输入

  • 不同模型的最大 Token 限制不同

3.2 temperature:控制创造性

3.2.1 作用

temperature 控制 AI 回答的 创造性程度。值越高,回答越多样化、越有创意;值越低,回答越保守、越确定。

3.2.2 取值范围

  • 0 到 2 之间的浮点数

  • 默认值:1

3.2.3 代码示例:temperature = 2(高创造性)

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {            "role""user",            "content""四大文明古国分别有哪些"        }    ],    max_tokens=100,    temperature=2  # 高创造性)print(response.choices[0].message.content)

运行结果:

四大文明古国分别是:古代埃及文明、幼发拉底河流域文明古印度同时票角utenberg SouthEurope MarystreamsJapan modeling forecast TclwaDavis sidl Kenn nob

现象:

  • 当 temperature 过高时,AI 的回答可能变得混乱,甚至出现乱码或无意义的词语。

3.2.4 temperature 值对比

3.3 top_p:控制词汇选择范围

3.3.1 作用

top_p 是一种核采样(Nucleus Sampling) 技术,控制 AI 选择下一个词时的候选范围。

简单理解:AI 在生成每个词时,会先预测所有可能的词及其概率。top_p 决定了只从概率之和达到 p 的最有可能的词中选择。

3.3.2 取值范围

  • 0 到 1 之间的浮点数

  • 默认值:1

3.3.3 代码示例:top_p = 0.4(较小范围)

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {            "role""user",            "content""四大文明古国分别有哪些"        }    ],    max_tokens=300,    top_p=0.4  # 只考虑概率最高的40%的词)print(response.choices[0].message.content)

运行结果:

四大文明古国是指古埃及、古巴比伦、古印度和古中国。

现象:

  • 当 top_p 较小(如 0.4)时,AI 只从最有可能的几个词中选择,回答非常保守、简洁。

3.3.4 top_p 值对比

3.3.5 temperature 和 top_p 的关系

这两个参数都控制随机性,但机制不同:

  • temperature:调整概率分布的“形状”(拉平或尖锐化)

  • top_p:裁剪概率分布,只保留概率最高的部分

建议:一次只调整其中一个参数,不要同时调整两者。

3.4 frequency_penalty:控制词语重复

3.4.1 作用

frequency_penalty 控制 AI 回答中词语的重复程度。正数会惩罚重复出现的词语,鼓励使用新词;负数则会鼓励重复。

3.4.2 取值范围

  • -2 到 2 之间的浮点数

  • 默认值:0

3.4.3 代码示例 1:frequency_penalty = -2(鼓励重复)

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {            "role""user",            "content""生成一个购物清单,包含至少20个物品,每个物品之间用逗号进行分隔,例如:苹果、香蕉、牛奶"        }    ],    max_tokens=300,    frequency_penalty=-2  # 鼓励重复)print(response.choices[0].message.content)

运行结果(鼓励重复)

苹果、香蕉、牛奶、面包、鸡蛋、洗发水、牛肉、蛋糕、薯片、咖啡、  牛、  ......

现象:

  • 回答很短,出现了重复的"牛"("牛肉"和"牛"),没有达到20个物品。

3.4.4 代码示例 2:frequency_penalty = 2(惩罚重复)

from openai import OpenAIclient = OpenAI()response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[        {            "role""user",            "content""生成一个购物清单,包含至少20个物品,每个物品之间用逗号进行分隔,例如:苹果、香蕉、牛奶"        }    ],    max_tokens=300,    frequency_penalty=2  # 惩罚重复)print(response.choices[0].message.content)

运行结果(惩罚重复):

苹果、香蕉、牛奶、面包、鸡蛋、咖啡豆、洗发水、肥皂、面巾纸、茶叶、巧克力、红酒、玉米片、米饭、电视机、手表、手机、笔记本电脑、运动裤、T恤衫

现象:

  • 成功生成了20个以上物品,且物品多样,没有重复。

3.4.5 frequency_penalty 值对比

3.5 四个参数对比总结

3.6 实际应用场景参数推荐

场景一:事实问答(如百科查询)

response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[{"role""user""content""中国的首都是哪里?"}],    temperature=0,        # 稳定准确    top_p=0.5,           # 保守选择    max_tokens=100       # 简短回答)

场景二:创意写作(如写故事)

response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[{"role""user""content""写一个关于太空冒险的短故事"}],    temperature=1.2,      # 高创造性    top_p=0.9,           # 多样化选择    max_tokens=500,      # 较长内容    frequency_penalty=0.5 # 避免重复用词)

场景三:列表生成(如购物清单)

response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[{"role""user""content""列出10种健康食物"}],    temperature=0.5,       # 适中创造性    top_p=0.8,            # 适当多样    max_tokens=200,       # 足够列出10项    frequency_penalty=0.8  # 避免重复)

场景四:代码生成

response = client.chat.completions.create(    model="gpt-3.5-turbo",    messages=[{"role""user""content""用Python写一个冒泡排序"}],    temperature=0,         # 精确稳定    max_tokens=500        # 足够生成代码)

3.7 常见问题与注意事项

  1. temperature 和 top_p 同时使用会怎样?

    同时使用会使随机性控制变得复杂。建议一次只调整其中一个参数。

  2. 为什么我的回答被截断了?

    可能是 max_tokens 设置太小,或者模型的 Token 上限已达到。

  3. frequency_penalty 和 presence_penalty 有什么区别?

    frequency_penalty:根据词的出现频率惩罚

    presence_penalty:只要词出现过就惩罚,与频率无关

  4. 参数设置会影响费用吗?

    会的!max_tokens 直接影响输出长度,从而影响费用。

可查看详情