OpenAI Chat API 详解:打造智能对话应用的基石

目录

    • OpenAI Chat API 详解:打造智能对话应用的基石
      • 参数概览
      • 核心参数详解与实战
        • 1. `model`: 选择你的 AI 大脑
        • 2. `prompt`: 指引 AI 的灵魂
        • 3. `max_tokens`: 控制输出的长度
        • 4. `temperature` 和 `top_p`: 调控创造力
        • 5. `stop`: 控制生成的结束
        • 6. `presence_penalty` 和 `frequency_penalty`: 避免重复
      • 实战演练:使用 REST API 调用
      • 总结与展望

OpenAI Chat API 详解:打造智能对话应用的基石

OpenAI API 提供了强大的自然语言处理能力, 通过简单的 API 调用, 开发者可以将先进的语言模型集成到各种应用中。然而, 要充分发挥这些模型的潜力, 理解并灵活运用其丰富的调用参数至关重要。本文将带你深入探索 OpenAI API 的各项参数, 并结合实际案例, 助你成为驾驭语言力量的行家。

参数概览

在深入每个参数之前, 我们先通过一个表格对 OpenAI API 的常用调用参数进行概览, 其中包含了参数及其默认值, 让你对整体有一个清晰的认识。

参数名 类型 是否必需 描述 常用取值示例 默认值
model String 指定要使用的模型。 "gpt-3.5-turbo", "text-davinci-003", "code-davinci-002"
message Array messages 参数是一个包含消息对象的数组,用于表示到目前为止的对话历史 。每个消息对象必须包含 role 和 content 字段。role 可以是 system、user 或 assistant,分别代表系统指令、用户的输入和助手的回复。通过在 messages 数组中按时间顺序包含所有相关的先前消息,可以为模型提供必要的上下文,从而实现连贯的多轮对话。 "请写一首关于春天的诗歌", [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "你好!有什么我可以帮您?"}]
prompt String/Array 在一些较旧的或基于补全的模型中,仍然会使用 prompt 参数。prompt 接受一个字符串或字符串数组,作为生成文本补全的输入 。对于构建类似 ChatGPT 的应用程序,推荐使用带有聊天补全端点的 messages 参数 。 "你好"
max_tokens Integer 生成文本的最大 token 数。限制生成文本的长度, 防止模型输出过长。 50, 200, 1000 模型默认最大值
temperature Float 控制生成文本的随机性。值越高, 输出越随机和有创造性;值越低, 输出越确定和集中。通常在 0 到 2 之间。 0.2, 0.7, 1.5 1.0
top_p Float 控制生成文本的核采样。模型会考虑概率最高的 top-p 的 token 集合。与 temperature 类似, 但以不同的方式控制随机性。建议不要同时调整 temperaturetop_p 0.5, 0.9 1.0
n Integer 为每个输入提示生成多少个独立的补全。 1, 3, 5 1
stream Boolean 是否启用流式传输。如果设置为 True, 模型将以数据流的形式逐个返回 token。 True, False False
stop String/Array 模型在生成文本时遇到这些序列时会停止生成。可以是一个字符串或一个字符串数组。 "\n", `[“###”, "< file_separator
presence_penalty Float 对模型生成新 token 的惩罚, 鼓励模型生成之前文本中没有出现过的新概念。范围通常在 -2.0 到 2.0 之间。 -1.0, 0.5, 2.0 0.0
frequency_penalty Float 对模型生成已经频繁出现的 token 的惩罚, 降低模型重复输出相同内容的倾向。范围通常在 -2.0 到 2.0 之间。 -1.0, 0.5, 2.0 0.0
logit_bias Map 修改特定 token 出现在完成结果中的可能性。接受一个 JSON 对象, 该对象将 token (由 tokenizer 计算) 映射到介于 -100 和 100 之间的偏差值。正偏差会增加 token 的可能性, 而负偏差会降低其可能性。 {"50256": -100} (降低 `< endoftext
user String 代表最终用户的唯一标识符, 有助于 OpenAI 监控和检测滥用行为。 "user-1234", "internal-app-user" null

注意: max_tokens 的默认值取决于所选模型的最大上下文长度。stopuser 默认值为 null,表示没有设置。logit_bias 默认值为空字典 {},表示没有对任何 token 的概率进行调整。

核心参数详解与实战

接下来, 我们将对一些最核心和常用的参数进行更深入的探讨, 并通过实际案例展示它们的应用。

1. model: 选择你的 AI 大脑

model 参数决定了你将使用哪个 OpenAI 模型来处理你的请求。不同的模型在能力、速度和成本上都有所不同。

  • gpt-3.5-turbo: 目前最流行的模型之一, 性价比高, 适用于各种文本生成和对话任务。
  • text-davinci-003: 功能强大的文本生成模型, 擅长创意性写作、长文本生成和复杂指令理解。
  • code-davinci-002: 专门为代码生成和理解而优化的模型。

实战案例 (Python SDK):

假设你想生成一篇关于未来旅行的短文, 你可以选择 text-davinci-003 以获得更具创意和深度的内容:

import openai

client = openai.OpenAI(api_key="YOUR_API_KEY")

response = client.completions.create(
    model="text-davinci-003",
    prompt="展望未来,人们会以怎样的方式旅行?",
    max_tokens=200,
    temperature=0.8 # 覆盖默认值 1.0
)

print(response.choices[0].text.strip())

如果你想构建一个简单的聊天机器人, gpt-3.5-turbo 会是更经济实惠的选择:

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "你好!"},
    ]
)

print(response.choices[0].message.content)
2. prompt: 指引 AI 的灵魂

prompt 是你提供给模型的指令或输入文本, 它直接影响着模型生成的内容。对于不同的模型, prompt 的格式有所不同:

  • Completion 模型 (如 text-davinci-003): prompt 是一个字符串, 包含你希望模型补全或基于其生成文本的指令。
  • Chat 模型 (如 gpt-3.5-turbo): prompt 是一个包含消息对象的数组, 每个消息对象都有 role (可以是 "user", "assistant", 或 "system") 和 content 字段, 用于构建对话历史。

实战案例 (Python SDK):

Chat 模型:

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "你是一个乐于助人的翻译助手。"},
        {"role": "user", "content": "请翻译这句话成法语:谢谢你的帮助。"},
    ]
)

print(response.choices[0].message.content)

清晰、明确且富有上下文的 prompt 是获得高质量输出的关键。掌握 prompt engineering 的技巧将极大地提升你使用 OpenAI API 的效果。
主要区别总结。

3. max_tokens: 控制输出的长度

max_tokens 参数限制了模型在单个请求中生成的最大 token 数。一个 token 大致相当于英语文本中的一个单词或几个字符。合理设置 max_tokens 可以帮助你控制 API 的使用成本, 并防止模型生成过长的、不相关的文本。

实战案例 (Python SDK):

假设你需要生成一篇关于某个主题的摘要, 你可能希望限制输出的长度:

response = client.completions.create(
    model="text-davinci-003",
    prompt="请总结一下人工智能在医疗领域的应用。",
    max_tokens=150
)

print(response.choices[0].text.strip())
4. temperaturetop_p: 调控创造力

temperaturetop_p 是控制模型输出随机性的两个重要参数。它们的默认值都是 1.0

  • temperature: 值越高 (例如 0.8, 1.0), 模型在选择下一个 token 时会更加随机, 生成更具创意和多样性的文本。值越低 (例如 0.2, 0.5), 模型会更加保守和确定, 输出更符合逻辑和事实的文本。
  • top_p: 又称核采样。模型会考虑概率最高的 top-p 的 token 集合, 并从中进行采样。例如, top_p=0.9 意味着模型会考虑概率最高的 90% 的 token。

建议: 通常建议只调整其中一个参数。如果你追求更可预测和正式的输出, 降低 temperature 是一个好的选择。如果你希望模型更具创造性, 可以尝试提高 temperature

实战案例 (Python SDK):

temperature (更确定):

response = client.completions.create(
    model="text-davinci-003",
    prompt="中国的首都是哪里?",
    temperature=0.1, # 覆盖默认值 1.0
    max_tokens=10
)

print(response.choices[0].text.strip())

temperature (更具创造性):

response = client.completions.create(
    model="text-davinci-003",
    prompt="用奇幻的风格描述一片森林。",
    temperature=0.9, # 覆盖默认值 1.0
    max_tokens=100
)

print(response.choices[0].text.strip())
5. stop: 控制生成的结束

stop 参数允许你指定一个或多个停止序列。当模型生成文本时遇到这些序列中的任何一个, 它将停止生成。其默认值为 null, 表示模型会一直生成直到达到 max_tokens 或自然结束。设置 stop 可以帮助你控制模型输出的范围和格式。

实战案例 (Python SDK):

假设你希望模型生成一段代码, 并希望它在生成完函数定义后停止:

response = client.completions.create(
    model="code-davinci-002",
    prompt="请用 Python 编写一个计算两个数字之和的函数。",
    stop=["\n\n"] # 覆盖默认值 null
)

print(response.choices[0].text.strip())
6. presence_penaltyfrequency_penalty: 避免重复

这两个惩罚参数用于控制模型生成重复文本的倾向。它们的默认值都是 0.0

  • presence_penalty: 对模型生成新 token 的惩罚。值越大, 模型越不容易生成之前文本中已经出现过的 token, 从而鼓励生成新的概念和想法。
  • frequency_penalty: 对模型生成已经频繁出现的 token 的惩罚。值越大, 模型越不容易重复使用高频词汇, 从而降低生成重复文本的可能性。

实战案例 (Python SDK):

假设你希望模型生成一篇关于某个主题的文章, 并避免过度重复关键词:

response = client.completions.create(
    model="text-davinci-003",
    prompt="谈谈人工智能的未来发展。",
    max_tokens=300,
    presence_penalty=0.5, # 覆盖默认值 0.0
    frequency_penalty=0.3 # 覆盖默认值 0.0
)

print(response.choices[0].text.strip())

实战演练:使用 REST API 调用

为了更直观地展示 OpenAI API 的调用方式, 这里提供一个使用 Python requests 库进行 REST API 调用的全面示例。这个示例将调用 gpt-3.5-turbo 模型生成一段文本, 并包含常用的参数, 显式地设置了一些非必填参数。

import requests
import json

# 替换为你的 OpenAI API 密钥
API_KEY = "YOUR_OPENAI_API_KEY"
BASE_URL = "https://api.openai.com/v1"
# 指定要使用的 OpenAI 模型, 这里选择的是对话模型 gpt-3.5-turbo
MODEL = "gpt-3.5-turbo"

# 设置 HTTP 请求头, 包含授权信息和内容类型
headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# 构建发送给 OpenAI API 的 JSON 数据
data = {
    # 指定使用的模型
    "model": MODEL,
    # 包含用户输入的消息列表。对于 chat 模型, 需要指定 role (user, assistant, system) 和 content
    "messages": [
        {"role": "user", "content": "请用一句话概括人工智能的未来。"}
    ],
    # 设置生成文本的最大 token 数量, 防止输出过长
    "max_tokens": 50,
    # 控制生成文本的随机性, 值越高越随机 (0 到 2), 默认 1.0
    "temperature": 0.7,
    # 控制核采样, 与 temperature 类似但以不同的方式控制随机性 (0 到 1), 默认 1.0
    "top_p": 0.9,
    # 请求生成多少个不同的回复, 默认 1
    "n": 1,
    # 是否以流式传输响应, 设置为 False 表示等待完整响应, 默认 False
    "stream": False,
    # 定义模型在生成文本时遇到这些字符串时停止生成, 默认 null
    "stop": ["\n", "."],
    # 对生成新 token 的惩罚, 鼓励生成新的概念 (-2.0 到 2.0), 默认 0.0
    "presence_penalty": 0.0,
    # 对生成已频繁出现的 token 的惩罚, 降低重复性 (-2.0 到 2.0), 默认 0.0
    "frequency_penalty": 0.0,
    # 修改特定 token 出现在完成结果中的可能性 (字典), 默认 {}
    "logit_bias": {},
    # "user": "user-specific-id" # 可选参数, 代表最终用户的唯一标识符, 默认 null
}

try:
    # 向 OpenAI API 的 /chat/completions 端点发送 POST 请求
    response = requests.post(f"{BASE_URL}/chat/completions", headers=headers, json=data)
    # 如果请求失败 (状态码不是 2xx), 则抛出 HTTPError 异常
    response.raise_for_status()
    # 将 API 的 JSON 响应解析为 Python 字典
    response_json = response.json()
    # 格式化打印 JSON 响应, 方便查看
    print(json.dumps(response_json, indent=4, ensure_ascii=False))

    # 检查响应中是否存在 'choices' 字段且不为空
    if "choices" in response_json and len(response_json["choices"]) > 0:
        # 提取生成的文本内容
        message = response_json["choices"][0]["message"]["content"]
        print(f"\n生成的文本:{message}")
    else:
        print("未能在响应中找到生成的内容。")

except requests.exceptions.RequestException as e:
    print(f"API 请求失败: {e}")
except json.JSONDecodeError as e:
    print(f"JSON 解析失败: {e}")

总结与展望

掌握 OpenAI API 的调用参数是解锁其强大功能的关键。通过灵活调整这些参数, 并理解它们的默认行为, 你可以更精确地控制模型的行为, 使其生成符合你需求的文本。

你可能感兴趣的:(AIGC,AI编程)