第1章:理解API——程序之间的合约
1.1 API的定义
API的英文即Application Programming Interface首字母的缩写,直译过来的意思就是:程序之间的接口。不过,我更倾向于把API理解为,程序之间的合约。这样的理解有助于我们更深入地揭示API的本质。
1.2 程序之间的合约:一种现实世界的类比
为了更好地理解API是如何充当程序之间的合约,我们可以通过一个现实世界的例子来展示。
想象一下餐厅里的服务员和厨师。顾客通过菜单选择自己想吃的食物,服务员将订单传递给厨师。在这个过程中,菜单就充当了一种“合约”。
- 菜单(API): 菜单上列出了所有可供选择的菜肴以及它们的价格。这就像是API提供了一系列可用的函数、方法和数据结构,让开发人员知道可以使用哪些操作和如何使用它们。
- 顾客(调用方): 顾客选择菜单上的菜肴。这就像程序中的一部分(调用方)选择调用API的特定功能。
- 服务员(接口): 服务员了解菜单上的内容,并将顾客的选择传递给厨师。这就像接口在调用方和被调用方之间传递信息。
- 厨师(被调用方): 厨师根据服务员传递的信息准备食物。在软件中,这个阶段对应于API所代表的底层系统或服务执行特定操作。
- 准备食物(执行操作): 厨师根据订单准备食物,并确保按照菜单的描述准备。同样地,API确保按照文档中的描述执行特定操作。
- 食物的交付(返回值): 食物准备好后,服务员将其送到顾客的桌上。在软件中,执行操作后,API会返回特定的值或结果。
通过这个类比,我们可以清楚地看到API作为程序之间的合约的工作原理。它定义了如何请求特定操作,如何传递参数,如何执行操作,以及如何返回结果。只要遵循API的规则(菜单),各方都可以顺利协同工作。如果尝试执行不在API规定范围内的操作,就像点菜单上没有的食物,那么操作将无法进行。
第2章:OpenAI API概述
2.1 人工智能的普及和OpenAI的角色
随着人工智能的飞速发展,它已经不仅限于学术研究或大型企业的专利技术。从推荐系统到自动驾驶汽车,AI正在渗透到我们日常生活的方方面面。在这个背景下,OpenAI通过开发易用的API接口,让普通人也能轻松使用和开发自己的对话式人工智能。这不仅降低了入门门槛,还促进了AI技术的广泛传播和应用。
2.2 OpenAI调用流程简述
调用OpenAI的API流程相当直观和友好,以下是一般的流程概述:
-
注册和获取API密钥: 任何有意使用OpenAI服务的人员或组织首先需要在OpenAI的官方网站上注册,并获取专属的API密钥。这个密钥将用于身份验证和授权。
-
选择适当的模型: OpenAI提供了一系列的预训练模型,如GPT-3和GPT-4等,开发者可以根据自己的需求选择合适的模型。
-
构建和发送请求: 通过构建特定的请求,可以与选定的模型进行交互。请求通常包括您希望模型执行的任务的具体细节,如文本生成、文本补全等。
-
接收和处理响应: 模型将根据您的请求生成一个响应,并返回给您的应用程序。您可以进一步处理这些响应,以适应您的具体需求或应用场景。
-
分析和优化: OpenAI还提供了工具和资源来帮助您分析模型的性能,以便您可以根据需要进行调整和优化。
OpenAI的API不仅强大而且灵活,无论是初学者还是经验丰富的开发者都能轻松上手。它打开了一个新的世界,让更多人能够探索和利用人工智能的潜力。随着技术和平台的不断完善和升级,未来有望看到更多由OpenAI API支持的创新应用和服务。
第3章:OpenAI API简单调用(以gpt-3.5-turbo为例)
本章将列举几种常用语言的调用
Linux终端
arduino复制代码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
}'
Node.js(JavaScript)
php复制代码async function getdata(){
const res = await fetch('https://api.openai.com/v1/chat/completions',{
method:'POST',
headers:{
Authorization:'Bearer 你的apikey',
"Content-Type":"application/json"
},
body:JSON.stringify({
model:'gpt-3.5-turbo',
messages:[
{
role:"user",
content:"hello!"
},
{
role:"user",
content:"how are you?"
}
]
})
})
const data = await res.json();
console.log(data);
}
getdata()
Python
kotlin复制代码import requests
url = 'https://api.openai.com/v1/chat/completions'
headers = {
'Authorization': 'Bearer 你的apikey',
'Content-Type': 'application/json'
}
data = {
'model': 'gpt-3.5-turbo',
'messages': [
{'role': 'user', 'content': 'hello!'},
{'role': 'user', 'content': 'how are you?'}
]
}
response = requests.post(url, headers=headers, json=data)
content = response.json().get('choices')[0].get('message').get('content')
print(content)
GO
go复制代码package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://api.openai.com/v1/chat/completions"
messages := []map[string]string{
{"role": "user", "content": "hello!"},
{"role": "user", "content": "how are you?"},
}
bodyMap := map[string]interface{}{
"model": "gpt-3.5-turbo",
"messages": messages,
}
body, _ := json.Marshal(bodyMap)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(body))
req.Header.Add("Authorization", "Bearer 你的apikey")
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Error:", err)
return
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
第4章:OpenAI API调用手册
4.1调用方式
你可以通过任何编程语言的HTTP请求与API进行交互!
4.2身份验证
OpenAI API使用API密钥进行身份验证。所有API请求都要在Authorization HTTP头部中包括您的API密钥
makefile复制代码Authorization: Bearer OPENAI_API_KEY
如何获取API Key:platform.openai.com/account/api…
4.3models列表
使用接口管理工具,可以获取OpenAi的models列表,也可自行调用。
bash复制代码GET https://api.openai.com/v1/models
ini复制代码import requests
url = 'https://api.openai.com/v1/models'
headers = {
'Authorization': 'Bearer 你的apikey'
}
response = requests.get(url, headers=headers)
print(response.json())
这里直接列举了OpenAI常用模型
模型名称 | 最大token | 费用(输入 or 输出) | 请求速率(Free or Bill) | HTTP请求地址 | ||
---|---|---|---|---|---|---|
gpt-4 | 8,192 tokens | $0.03 / 1K tokens | $0.06 / 1K tokens | NULL | 3500次/min | api.openai.com/v1/chat/com… |
gpt-4-0613 | 8,192 tokens | $0.03 / 1K tokens | $0.06 / 1K tokens | NULL | 3500次/min | api.openai.com/v1/chat/com… |
gpt-4-32k | 32,768 tokens | $0.06 / 1K tokens | $0.12 / 1K tokens | NULL | 3500次/min | api.openai.com/v1/chat/com… |
gpt-4-32k | 32,768 tokens | $0.06 / 1K tokens | $0.12 / 1K tokens | NULL | 3500次/min | api.openai.com/v1/chat/com… |
gpt-3.5-turbo | 4,096 tokens | $0.0015 / 1K tokens | $0.002 / 1K tokens | 3次/min | 3500次/min | api.openai.com/v1/chat/com… |
gpt-3.5-turbo-16k | 16,384 tokens | $0.003 / 1K tokens | $0.004 / 1K tokens | 3次/min | 3500次/min | api.openai.com/v1/chat/com… |
gpt-3.5-turbo-0613 | 4,096 tokens | $0.0015 / 1K tokens | $0.002 / 1K tokens | 3次/min | 3500次/min | api.openai.com/v1/chat/com… |
gpt-3.5-turbo-16k-0613 | 16,384 tokens | $0.003 / 1K tokens | $0.004 / 1K tokens | 3次/min | 3500次/min | api.openai.com/v1/chat/com… |
DALL·E | 1024×1024 $0.020 / image | 5次/min | 50次/min | api.openai.com/v1/images/g… |
4.4参数
聊天模型request and response
参数名称 | 参数类型 | 是否必须 | 参数介绍 |
---|---|---|---|
model | string | 是 | 要使用的模型ID |
messages | array[] | 是 | 对话的消息列表 |
role | 是 | 对话角色 | |
content | 是 | 对话内容 | |
temperature | number or null | 否(默认1) | 生成内容随机度(范围0-2) |
top_p | number or null | 否(默认1) | 另一种采样方式,不建议改变 |
n | integer or null | 否(默认1) | 生成内容的条数 |
stream | bool or null | 否(默认false) | 流式生成内容 |
max_tokens | integer | 否(默认inf) | 最大的token数 |
其他 | 不常用 | 否 | 自行查阅platform.openai.com/docs/api-re… |
json格式请求与返回
json复制代码{
"model": "gpt-3.5-turbo-0613",
"max_tokens": 1000,
"stream": true,
"n": 1,
"temperature":1,
"messages": [
{
"role": "system",
"content": "你现在需要扮演喜羊羊,当我问到你是谁的时候,你回答你是喜羊羊!"
},
{
"role": "user",
"content": "你是谁?"
},
{
"role": "assistant",
"content": "我是喜羊羊!快乐又活泼的喜羊羊!"
}
]
}
json复制代码{
"id": "chatcmpl-7me3fFf3j7X5qJucqBpPB7SkKjRHz",
"object": "chat.completion",
"created": 1691828083,
"model": "gpt-3.5-turbo-0613",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "咩咩咩咩~大家快跑,灰太狼来了!我是喜羊羊,我们要小心!"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 101,
"completion_tokens": 44,
"total_tokens": 145
}
}
4.5进阶用法
如何使请求携带上下文?
答:将整个聊天数组都发送,即实现上下文功能,但请求不能超过最大token。
如何自定义请求功能?
答:在消息数组中使用system或者user指定chat身份,通过prompt工程,使其拥有特定功能。
第5章:OpenAI API调用的坑坑绕绕
请求不成功怎么办?
答:国内网络无法请求api.openai.com,请自行解决。
多次请求后失败?
答:免费用户一分钟只能发送三次请求。