目錄
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加載環境變量:
先創建一個文件“.env”,所在位置與代碼文件同級。
在文件“.env”中,寫入環境變量OPENAI_BASE_URL、OPEN_API_KEY和對應的值。
代碼如下:?
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