前言:
针对新人场景的学习文章,介绍一些简单的使用、基础定义等。
从一个简单的消息编辑开始:
诉求:我想发送如下信息
'prompt' : 'tell me a joke'
那发送的最终格式为:
'messages': [{
'role': 'user',
'content': 'tell me a joke'
}]
那连续对话的消息格式为:
'messages': [{
'role': 'user',
'content': 'tell me a joke'
},
{
'role': 'assistant',
'content': 'why did the chicken cross the road'
},
{
'role': 'user',
'content': "'I don't know, why did the chicken cross the road "
}
]
1.1 消息体特点:
通过发送消息,进行交互。
-
不是发送单个字符串作为提示,而是发送一组消息作为输入。
-
列表中的每个消息都有两个属性: role and content。
属性 role:
role:可以取三个值之一: system、user 或 assistant
-
system 指令:可以为会话提供高层次的指令。
-
assistant 指令:消息将按照它们在列表中出现的顺序进行处理,assistant将相应地作出响应。
system 指令详解:
可以使用系统级指令在整个对话过程中指导模型的行为。
例如:
'messages': [{
'role': 'system',
'content': 'You are an assistant that speaks like Shakespeare.'
},
{
'role': 'user',
'content': 'tell me a joke'
}
]
这里添加了一个模型的人设,是一名说话方式像莎士比亚一样的助手,则后续 模型会返回 贴合 莎士比亚语境的 对话。
属性 content:
包含来自 role 的消息文本。
如何发送消息进行交互?
发送消息进行交互,目前一定有4种方法:
-
任何语言的HTTP请求与API交互,
-
可以通过官方Python绑定、
pip install openai
- 官方Node.js库
//在Node.js项目目录下运行以下命令:
npm install openai
但是不管哪一种,于 Open Api 交互,都需要 密钥key。
密钥介绍
密钥用于跟 Open Api 通信的身份校验。
如何获取密钥?
OpenAI API使用API密钥进行认证。密钥key获取地址:platform.openai.com/account/api…
提示:
- 密钥生成后,只提供一次复制的机会,如果密钥忘记,只能删除重新创建密钥。
如何使用密钥?
所有的API 请求,Authorization HTTP header 中应该包含对应生成的 密钥key。
Authorization: Bearer OPENAI_API_KEY
当有多个组织时,需要考虑到Open Api 请求计费,就需要进行 多组织配置。
如何多组织配置,避免错误计费?
当用户属于多个组织时,可以通过header配置 来指定 API 请求属于哪一个组织,这些API请求的使用量将计入指定组织的订阅配额。
Curl 示例:
// 示例代码:
curl https://api.openai.com/v1/models
-H "Authorization: Bearer $OPENAI_API_KEY"
-H "OpenAI-Organization: org-QDZ0nHgzgPVhuYVa21sOEkpR"
官方Python openai 示例:
import os
import openai
openai.organization = "org-QDZ0nHgzgPVhuYVa21sOEkpR"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Model.list()
Node.js openai 示例:
import { Configuration, OpenAIApi } from "openai";
const configuration = new Configuration({
organization: "org-QDZ0nHgzgPVhuYVa21sOEkpR",
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.listEngines();
其中 Organization IDs 查询见:platform.openai.com
从一个简单的消息发送开始:
当如上前置的条件完备后,这里开始进行发起 Chat 聊天。
Curl 执行示例:
curl https://api.openai.com/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer $OPENAI_API_KEY"
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Say this is a test!"}],
"temperature": 0.7
}'
说明:
-
需要将 $OPENAI_API_KEY 替换为 上面自己查找到的 密钥。
-
这里涉及到了特有的模型选择,这里使用模型:gpt-3.5-turbo 进行。
上面的示例请求后,得到的结果:
{
"id":"chatcmpl-abc123",
"object":"chat.completion",
"created":1677858242,
"model":"gpt-3.5-turbo-0301",
"usage":{
"prompt_tokens":13,
"completion_tokens":7,
"total_tokens":20
},
"choices":[
{
"message":{
"role":"assistant",
"content":"nnThis is a test!"
},
"finish_reason":"stop",
"index":0
}
]
}
说明:
- “finish_reason”:”stop”,表示由API 返回的数据全部完成。
有哪些模型?
模型有很多,可以通过接口请求,查询模型列表信息。
6.1 如何查询模型列表?
查询接口:
Curl 执行示例:
curl https://api.openai.com/v1/models
-H "Authorization: Bearer $OPENAI_API_KEY"
结果(截止2023-4-18模型数据):
共计64个数据模型,具体见如下文档:
模型太多,也可以检索指定的模型,查看功能。
6.2 如何检索指定的模型信息?
Curl 执行示例:
curl https://api.openai.com/v1/models/text-davinci-003
-H "Authorization: Bearer $OPENAI_API_KEY"
返回结果:
{
"id": "text-davinci-003",
"object": "model",
"created": 1669599635,
"owned_by": "openai-internal",
"permission": [
{
"id": "modelperm-XKctlRE4Wz1fIXFVcybPlWQE",
"object": "model_permission",
"created": 1681415378,
"allow_create_engine": false,
"allow_sampling": true,
"allow_logprobs": true,
"allow_search_indices": false,
"allow_view": true,
"allow_fine_tuning": false,
"organization": "*",
"group": null,
"is_blocking": false
}
],
"root": "text-davinci-003",
"parent": null
}
6.3 gpt-3.5-turbo 特点:
-
更多地用于传统的文本补全任务。
-
对chat 应用进行了优化。
所以 chat 应用,多是使用 gpt-3.5-turbo 模型。
扩展参考:
Open APi 提供了不同的接口调用能力,不同的接口使用了不同的数据模型。
不同接口使用了哪些数据模型?
ENDPOINT | MODEL NAME |
---|---|
/v1/chat/completions | gpt-4, gpt-4-0314, gpt-4-32k, gpt-4-32k-0314, gpt-3.5-turbo, gpt-3.5-turbo-0301 |
/v1/completions | text-davinci-003, text-davinci-002, text-curie-001, text-babbage-001, text-ada-001 |
/v1/edits | text-davinci-edit-001, code-davinci-edit-001 |
/v1/audio/transcriptions | whisper-1 |
/v1/audio/translations | whisper-1 |
/v1/fine-tunes | davinci, curie, babbage, ada |
/v1/embeddings | text-embedding-ada-002, text-search-ada-doc-001 |
/v1/moderations | text-moderation-stable, text-moderation-latest |
更多模型类别,参考 Models 。
接口请求的数据存在有效期吗?
从2023年3月1日起,openApi 只保存 30天的数据,但不再使用通过API发送的客户数据来改进 OpenApi 的模型。
如何保持聊天会话集中在一个主题上?
主要方法是 system 信息。
ChatGPT API的速率限制如何?
Free trial users: 20 RPM 40000 TPM
Pay-as-you-go users (first 48 hours): 60 RPM 60,000 TPM
Pay-as-you-go users (after 48 hours): 3500 RPM 90,000 TPM
RPM = requests per minute,每分钟请求数
用于监控服务的指标之一,更常用的是QPS(Queries Per Second)。对于一些AI服务,其处理速度可能比通常的服务要长,几秒到十几秒都正常,因此QPS对于此类服务并不精确,更常用QPM来限制。
TPM = tokens per minute,每分钟Token数。
Tokens Per Minute 是长文本NLP服务经常使用的负载衡量单位。NLP服务尤其是大模型,计算资源的处理负载主要取决于单位时间所处理的token数量,因此传统的QPS等负载衡量指标并不适用。NLP中的Token分割和语言相关,在中文、日文等语言一般是字,在英文等拉丁语言中一般是词根等等。