当前位置:   article > 正文

万字长文|关于 OpenAI 接口开发你应该知道的一切_openai api

openai api

这篇文章中个人结合自己的实践经验把 OpenAI 官方文档解读一遍。但是原文档涉及内容众多,包括微调,嵌入(Embeddings)等众多主题,我这里重点挑选自己开发高频使用到的,需要详细了解的可以自行前往官网阅读。

API 介绍

  1. 所有 API 演示均使用 Python 代码作为示例,所以确保已经安装官方 Python 包:pip install openai,同时配置 API 密钥的环境变量 OPENAI_API_KEY

  2. 认证:OpenAI API 使用 API 密钥进行身份验证, API 密钥页面可以获取使用的 API 密钥。除了密钥,对于属于多个组织的用户,可以传递一个 Requesting organization 字段(可以在组织设置页面上找到组织 ID)来指定用于 API 请求的组织,这些 API 请求的使用将计入指定组织的订阅配额。

    arduino复制代码import os
    import openai
    # openai.organization = "org-gth0C8mT2wnKealyDkrSrpQk"
    openai.api_key = os.getenv("OPENAI_API_KEY")
    openai.Model.list()
    
    • 1
    • 2
    • 3
    • 4
    • 5

Chat Completions 会话补全

这个是使用频次最高的接口,几乎当前所有的套壳 ChatGPT 应用都是基于这个接口封装的,所以将其放在第一个。给定一组描述对话的消息列表,模型将返回一个回复。

ini复制代码import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")

# https://api.openai.com/v1/chat/completions
completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "Hello!"}
  ]
)

print(completion.choices[0].message)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

响应

swift复制代码{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?",
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Request body(常用入参详解)

  • model (string,必填)

    要使用的模型 ID。有关哪些模型适用于 Chat API 的详细信息,请查看 模型端点兼容性表

  • messages (array,必填)

    迄今为止描述对话的消息列表

    • role (string,必填)

      发送此消息的角色。systemuserassistant 之一(一般用 user 发送用户问题,system 发送给模型提示信息)

    • content (string,必填)

      消息的内容

    • name (string,选填)

      此消息的发送者姓名。可以包含 a-z、A-Z、0-9 和下划线,最大长度为 64 个字符

  • stream (boolean,选填,是否按流的方式发送内容)

    当它设置为 true 时,API 会以 SSE( Server Side Event )方式返回内容。SSE 本质上是一个长链接,会持续不断地输出内容直到完成响应。如果不是做实时聊天,默认 false 即可。请参考 OpenAI Cookbook 以获取 示例代码

  • max_tokens (integer,选填)

    在聊天补全中生成的最大 tokens 数。

    输入 token 和生成的 token 的总长度受模型上下文长度的限制。

  • temperature (number,选填,默认是 1)

    采样温度,在 0 和 2 之间。

    较高的值,如 0.8 会使输出更随机,而较低的值,如 0.2 会使其更加集中和确定性。

    通常建议修改这个(temperature )或者 top_p ,但两者不能同时存在,二选一。

Completions (文本和代码)补全

给定一个提示,模型将返回一个或多个预测的补全,并且还可以在每个位置返回替代 token 的概率。

ini复制代码import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# https://api.openai.com/v1/completions
openai.Completion.create(
  model="text-davinci-003",
  prompt="Say this is a test",
  max_tokens=7,
  temperature=0
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

响应

swift复制代码  "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
  "object": "text_completion",
  "created": 1589478378,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\nThis is indeed a test",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 7,
    "total_tokens": 12
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Request body(入参详解)

  • model (string,必填)

    要使用的模型的 ID。可以参考 模型端点兼容性表

  • prompt (string or array,选填,Defaults to <|endoftext|>)

    生成补全的提示,编码为字符串、字符串数组、token 数组或 token 数组数组。

    注意 <|endoftext|> 是模型在训练过程中看到的文档分隔符,所以如果没有指定提示符,模型将像从新文档的开头一样生成。

  • stream (boolean,选填,默认 false)

    当它设置为 true 时,API 会以 SSE( Server Side Event )方式返回内容,即会不断地输出内容直到完成响应,流通过 data: [DONE] 消息终止。

  • max_tokens (integer,选填,默认是 16)

    补全时要生成的最大 token 数。

    提示 max_tokens 的 token 计数不能超过模型的上下文长度。大多数模型的上下文长度为 2048 个 token(最新模型除外,它支持 4096)

  • temperature (number,选填,默认是 1)

    使用哪个采样温度,在 0 和 2 之间

    较高的值,如 0.8 会使输出更随机,而较低的值,如 0.2 会使其更加集中和确定性。

    通常建议修改这个(temperature )或 top_p 但两者不能同时存在,二选一。

  • n (integer,选填,默认为 1)

    每个 prompt 生成的补全次数。

    注意:由于此参数会生成许多补全,因此它会快速消耗 token 配额。小心使用,并确保对 max_tokensstop 进行合理的设置。

Embeddings 嵌入

将一个给定输入转换为向量表示,提供给机器学习模型算法使用。

ini复制代码import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# https://api.openai.com/v1/embeddings
openai.Embedding.create(
  model="text-embedding-ada-002",
  input="The food was delicious and the waiter..."
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

响应

css复制代码{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "embedding": [
        0.0023064255,
        -0.009327292,
        .... (1536 floats total for ada-002)
        -0.0028842222,
      ],
      "index": 0
    }
  ],
  "model": "text-embedding-ada-002",
  "usage": {
    "prompt_tokens": 8,
    "total_tokens": 8
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Request body(入参详解)

  • model (string,必填)

    要使用的 模型 ID,可以参考 模型端点兼容性表

  • input (string or array,必填)

    输入文本以获取嵌入,编码为字符串或 token 数组。要在单个请求中获取多个输入的嵌入,请传递字符串数组或 token 数组的数组。每个输入长度不得超过 8192 个 token

  • user (string,选填)

    一个唯一的标识符,代表终端用户,可以帮助 OpenAI 检测滥用。

Fine-tuning 微调

使用自定义的特定训练数据,定制自己的模型。

Create fine-tune

创建一个微调作业,从给定的数据集中微调指定模型。

ini复制代码import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
# POST https://api.openai.com/v1/fine-tunes
openai.FineTune.create(training_file="file-XGinujblHPwGLSztz8cPS8XY")
  • 1
  • 2
  • 3
  • 4
  • 5

响应(响应包括已入队的作业的详细信息,包括微调作业状态和完成后微调模型的名称):

json复制代码{
  "id": "ft-AF1WoRqd3aJAHsqc9NY7iL8F",
  "object": "fine-tune",
  "model": "curie",
  "created_at": 1614807352,
  "events": [
    {
      "object": "fine-tune-event",
      "created_at": 1614807352,
      "level": "info",
      "message": "Job enqueued. Waiting for jobs ahead to complete. Queue number: 0."
    }
  ],
  "fine_tuned_model": null,
  "hyperparams": {
    "batch_size": 4,
    "learning_rate_multiplier": 0.1,
    "n_epochs": 4,
    "prompt_loss_weight": 0.1,
  },
  "organization_id": "org-...",
  "result_files": [],
  "status": "pending",
  "validation_files": [],
  "training_files": [
    {
      "id": "file-XGinujblHPwGLSztz8cPS8XY",
      "object": "file",
      "bytes": 1547276,
      "created_at": 1610062281,
      "filename": "my-data-train.jsonl",
      "purpose": "fine-tune-train"
    }
  ],
  "updated_at": 1614807352,
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

Request body(入参详解)

  • training_file (string,必填)

    包含 训练数据 的已上传文件的 ID。

    请参阅 upload file 以了解如何上传文件。

    数据集必须格式化为 JSONL 文件,其中每个训练示例都是一个带有 “prompt” 和 “completion” keys 的 JSON 对象。

  • validation_file (string,选填)

    包含 验证数据 的已上传文件的 ID。

    如果提供此文件,则数据将在微调期间定期用于生成验证指标。这些指标可以在 微调结果文件 中查看,训练和验证数据应该是互斥的。

  • model (string,选填,默认是 curie)

    要微调的基础模型名称。

    可以选择其中之一:“ada”、“babbage”、“curie”、“davinci”,或 2022 年 4 月 21 日 后创建的经过微调的模型。要了解这些模型的更多信息,请参阅 Models 文档。

  • n_epochs (integer,选填,默认是 4)

    训练模型的批次数。一个 epoch 指的是完整地遍历一次训练数据集

  • batch_size (integer,选填)

    用于训练的批次大小,指的是每次迭代中同时处理的样本数量。

    默认情况下,批次大小将动态配置为训练集示例数量的约 0.2%,上限为 256。

    通常,发现较大的批次大小对于更大的数据集效果更好。

  • learning_rate_multiplier (number,选填)

    用于训练的学习率倍增器。微调学习率是预训练时使用的原始学习率乘以此值得到的( 本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/1007647

推荐阅读
相关标签