【大模型入门】访问GPT的API
目录
0 前言
免费访问GPT的API
Windows下环境变量的设置
1 非流式输出
1.1 使用requests库
1.2 使用OpenAI库
2 流式输出
2.1 使用requests库
2.2 使用OpenAI库
3 使用OpenAI库与GPT聊天(存储对话历史版)
4 嵌入向量embeddings
4.1 创建嵌入向量
4.2 嵌入对象结构
0 前言
免费访问GPT的API
GPT_API_free:https://github.com/chatanywhere/GPT_API_free?tab=readme-ov-file
获取OPENAI_BASE_URL(API请求的代理地址)和OPENAI_API_KEY(API密钥)的值
Windows下环境变量的设置
“高级系统设置”-“环境变量”,设置环境变量OPENAI_BASE_URL、OPENAI_API_KEY和对应的值
1 非流式输出
1.1 使用requests库
先看一下OpenAI API支持的大模型列表
import requests
import os# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')
# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}
# 发送get请求,得到响应
response = requests.get(url=f'{BASE_URL}/v1/models',headers=headers)
# OpenAI API支持的大模型列表
print(response.json())
这里截取模型列表的部分输出:
接着使用requests库与GPT聊天(非流式输出的形式)
import requests
import os# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')
# 请求地址
url = f'{BASE_URL}/v1/chat/completions'
# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}
# 请求体
body = {"model": "gpt-3.5-turbo","messages": [{"role": "user","content": "say hello"}]
}
# 发送post请求,返回响应
response = requests.post(url=url,headers=headers,json=body)
# 打印输出的内容
print(response.json()['choices'][0]['message']['content'])
输出:
response.json()方法的理解:
1.2 使用OpenAI库
import os
from openai import OpenAIclient = OpenAI(# 老版本(v1以下的版本)OPENAI_API_BASE# 新版本(v1及以上的版本)OPENAI_BASE_URL# 我目前用的openai版本是1.93.0,所以环境变量的名称设置为OPENAI_BASE_URLbase_url = os.environ.get("OPENAI_BASE_URL"),api_key = os.environ.get("OPENAI_API_KEY"),
)chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "user","content": "Say this is a test",}],
)print(chat_completion.choices[0].message.content)
输出:
chat_completion对象的理解:
将请求过程封装成函数,方便直接调用
def chat(prompt,model_name="gpt-3.5-turbo"):chat_completion = client.chat.completions.create(model = model_name,messages = [{"role": "user","content": prompt,}],)answer = chat_completion.choices[0].message.contentreturn answer
访问大模型的API,API请求地址和API密钥属于敏感信息,很重要。之前是使用os库加载环境变量,下面使用dotenv加载环境变量:
import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "user","content": "Say this is a test",}],
)print(chat_completion.choices[0].message.content)
输出:
2 流式输出
2.1 使用requests库
import requests
import os
import json# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')# 请求地址
url = f'{BASE_URL}/v1/chat/completions'# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}# 请求体
body = {"model": "gpt-3.5-turbo","messages": [{"role": "user","content": "1000字介绍大模型"}],"stream": True
}# 当stream=True时,requests不会立即下载响应内容,而是在访问content属性时才开始下载
response = requests.post(url=url,headers=headers,json=body,stream=True)for line in response.iter_lines():# 每个data数据最后面有两个换行符,也就是换行后,会产生一行空,这行空应该跳过打印if not line:continue# 解码成字符串,然后分割得到data后面的值,并转换为字典形式data = json.loads(line.decode('utf-8').lstrip('data: '))# finish_reason为停止原因,包含:None(未停止)或者stop(输出结束)finish_reason = data['choices'][0]['finish_reason']if finish_reason == "stop":break# 打印每个data中content,不换行print(data['choices'][0]['delta']['content'],end='')
流式输出:
每个data数据的理解:
for line in response.iter_lines():# 每个data数据最后面有两个换行符,也就是换行后,会产生一行空,这行空应该跳过打印if not line:continueprint(line)
这里截取了一部分data输出:
2.2 使用OpenAI库
from openai import OpenAI
import dotenv# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()stream = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "user","content": "1000字介绍大模型"}],stream=True
)for chunk in stream:# 内容不为None就输出if chunk.choices[0].delta.content is not None:print(chunk.choices[0].delta.content,end='')# 内容为None(也就是输出结束时退出循环)else:break
流式输出:
每个chunk的理解:
for chunk in stream:print(chunk)
这里截取了一部分chunk输出:
3 使用OpenAI库与GPT聊天(存储对话历史版)
在1.2和2.2中,我们使用OpenAI库与GPT聊天,但是GPT并没有记住我们每次聊天的内容,也就是对话历史。先来看下面的示例:
import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [# system(系统):指令/角色扮演{"role": "system","content": "You are a helpful assistant."},# user(用户):用户消息是助手需要响应的请求或评论{"role": "user","content": "您好,我叫ahead"}]
)print(chat_completion.choices[0].message.content)
输出:
我们再次访问GPT的API,看看GPT能否记住我的名字?
chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "您好,我叫什么名字"}]
)print(chat_completion.choices[0].message.content)
输出:
第二次对话,GPT大模型并不知道我的名字,可见大模型并没有存储第一次对话的历史。
为了解决这个问题,我们可以在messages参数中指定assistant参数,它是用来存储以前的大模型回应。下面是在messages参数中添加了assistant参数的示例:
chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "您好,我叫ahead"},# assistant(助手):助手消息存储以前的助手回应{"role": "assistant","content": "您好,ahead!有什么问题我能帮您解决的吗?"},{"role": "user","content": "您好,我叫什么名字"}]
)# 大模型根据assistant提供的回应,记住我的名字了
print(chat_completion.choices[0].message.content)
输出:
第二次对话,GPT大模型记住我的名字了,可见大模型存储了第一次对话的历史。
最后,附上messages参数的详细介绍:
4 嵌入向量embeddings
4.1 创建嵌入向量
import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()# 创建嵌入向量,并返回一个包含嵌入对象的列表
embeddings_response = client.embeddings.create(model = "text-embedding-ada-002",input = "你好"
)
4.2 嵌入对象结构
例如,data=[Embedding(embedding=[0.0002107498439727351, -0.0062210820615291595,...],
index=0, object='embedding')]
其中,Embedding就是一个嵌入对象,里面含有嵌入向量embedding
获取嵌入向量:
# 嵌入向量,是一个浮点数列表
embeddings_response.data[0].embedding
这里截取部分embedding输出:
获取嵌入向量的长度:
# 嵌入向量的长度,也就是浮点数的个数
len(embeddings_response.data[0].embedding)
输出:1536