【大模型入門】訪問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加載環境變量:

先創建一個文件“.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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87773.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jenkins 部署腳本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止舊進程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固態閃存NV196NV201

美光固態閃存技術深度解析:NV183、NV185、NV196與NV201系列 一、技術架構與核心參數對比 1. 制程工藝與容量布局 美光NV183/NV185/NV196/NV201系列采用176層3D NAND技術,通過垂直堆疊提升存儲密度。其中: NV183:主打256GB容量段…

基于單片機PWM控制逆變電源設計資料集:全面掌握逆變電源設計精髓

基于單片機PWM控制逆變電源設計資料集:全面掌握逆變電源設計精髓 去發現同類優質開源項目:https://gitcode.com/ 項目介紹 在現代電子技術中,逆變電源的設計與應用占據了至關重要的位置。今天,我將為您介紹一個優秀的開源項目——基于單片…

Docker Buildx 構建多架構鏡像(Redis、Mysql、Java8、Nginx)

目標 ARM64 麒麟電腦無法直接拉取 Redis 鏡像,需在 Windows x86 電腦上通過 多架構構建工具(如 Docker Buildx) 生成適配 ARM64 的 Redis 鏡像,再打包傳輸到目標設備。 一、核心問題:跨架構鏡像兼容性 直接保存的 redi…

代理IP的安全陷阱:如何避免中間人攻擊與IP池污染?

在跨境業務、數據采集等場景中,代理IP已成為剛需工具。然而,其隱藏的安全風險卻常被忽視——輕則泄露隱私,重則導致賬號封禁、數據劫持甚至金融損失。本文將深入剖析兩大核心風險(中間人攻擊與IP池污染),并…

深入理解大語言模型中的超參數:Temperature、Top-p 與更多

隨著大語言模型(LLM)如 GPT、Claude、Gemini 的廣泛應用,調優生成文本的質量與風格成為開發者和研究人員的重要課題。其中,超參數(Hyperparameters)如 temperature 和 top_p 扮演了核心角色,影響…

譯碼器Multisim電路仿真匯總——硬件工程師筆記

目錄 74LS實現二線三線譯碼器 1 74LS139D和74LS138D基礎知識 1.1 74LS139D 二線四線譯碼器 1.1.1 功能特點 1.1.2 引腳功能 1.1.3 工作原理 1.1.4 應用場景 1.1.5 使用方法 1.1.6 注意事項 1.6.7 邏輯真值表 1.2 74LS138D 3線8線譯碼器 1.2.1 功能特點 1.2.2 引腳…

國產 OFD 標準公文軟件數科 OFD 閱讀器:OFD/PDF 雙格式支持,公務辦公必備

各位辦公軟件小達人們,今天咱來聊聊數科OFD閱讀器! 軟件下載地址安裝包 這軟件啊,是基于咱國家自主OFD標準的版式閱讀軟件,主要用來閱讀和處理OFD/PDF電子文件,還能用于公務應用擴展。它支持打開和瀏覽OFD/PDF格式的文…

vue中的toRef

在 Vue 中, toRef 函數用于將響應式對象的屬性轉換為一個獨立的 ref 對象,同時保持與原始屬性的關聯。其參數格式及用法如下: toRef 的參數說明 1. 參數 1:源對象(必須) - 類型: Object &…

暖通鍋爐的智能管控:物聯網實現節能又舒適?

暖通鍋爐系統在建筑供暖、工業供熱等領域扮演著重要角色,其運行效率和能源消耗直接關系到用戶的使用體驗和成本支出。傳統的暖通鍋爐管理方式往往依賴人工操作和經驗判斷,存在能耗高、調節不靈活、舒適性差等問題。隨著物聯網技術的發展,暖通…

PHP:從入門到進階的全面指南

PHP(Hypertext Preprocessor)作為一種廣泛使用的開源腳本語言,尤其適用于 Web 開發并可嵌入 HTML 中。自誕生以來,PHP 憑借其簡單易學、功能強大以及豐富的生態系統,成為了眾多網站和 Web 應用程序開發的首選語言之一。…

EXCEL 基礎函數

1、絕對引用、相對引用 1.1相對引用 相對引用,這是最常見的引用方式。復制單元格公式時,公式隨著引用單元格的位置變化而變化 例如在單元格內輸入sum(B2:C2),然后下拉填充柄復制公式。 可以看到每個單元格的公式不會保持sum(B2:C2)&#…

升級到MySQL 8.4,MySQL啟動報錯:io_setup() failed with EAGAIN

在升級到MySQL 8.4后,許多用戶在啟動數據庫時遇到了一種常見錯誤:“io_setup() failed with EAGAIN”。本文將深入探討該錯誤的原因,并提供詳細的解決方案。錯誤分析錯誤描述當你啟動MySQL時,可能會在日志文件中看到以下錯誤信息&…

【ECharts Y 軸標簽優化實戰:從密集到稀疏的美觀之路】

ECharts Y 軸標簽優化實戰:從密集到稀疏的美觀之路 📋 文章背景 在開發數據可視化模塊時,我們遇到了一個常見但棘手的圖表顯示問題:ECharts 圖表的 Y 軸標簽過于密集,影響了用戶體驗和數據的可讀性。本文將詳細記錄整個…

【鋰電池剩余壽命預測】GRU門控循環單元鋰電池剩余壽命預測(Pytorch完整源碼和數據)

目錄 效果一覽程序獲取程序內容代碼分享效果一覽 程序獲取 獲取方式一:文章頂部資源處直接下載:【鋰電池剩余壽命預測】GRU門控循環單元鋰電池剩余壽命預測(Pytorch完整源碼和數據) 獲取方式二:訂閱電池建模專欄獲取電池系列更多文件。 程序內容 1.【鋰電池剩余壽命預測…

Minstrel:多智能體協作生成結構化 LangGPT 提示詞

一、項目概述 Minstrel 是一個基于 LangGPT 框架的多智能體系統,自動生成結構化、人格化的提示詞。它通過多個協作代理,提升提示詞的準確性、多樣性和靈活性,適合非 AI 專家使用 (github.com)。 二、問題動機 當前 LLM 提示設計經驗依賴強…

Golang發送定時郵件

前面嘗試過用Python來發送郵件,下面測試一下Golang如何發送郵件 需要使用三方庫如下 1.安裝github.com/jordan-wright/email go get github.com/jordan-wright/email安裝完成之后代碼如下 package mainimport ("github.com/jordan-wright/email""log""…

CodeSys的軟PLC忘記了用戶名和密碼怎么辦

Codesys的win v3 x64軟PLC忘記用戶名和密碼怎么辦 概述檢查文件成功 概述 我曾經多次在運行了軟PLC后忘記了自己的用戶名和密碼。有些是回憶起來了,但有些真的想不起來了。沒有辦法后來是重新裝的CodeSys。這次從網上看到大佬寫的文章,試了一下&#xf…

【論文】微服務架構下分布式事務一致性解決方案設計與實踐

摘要 2022年3月至2023年6月,我作為首席架構師主導完成了某大型電商平臺訂單系統的微服務化改造項目。該項目日均處理訂單量達300萬筆,旨在解決原有單體架構在業務高峰期出現的性能瓶頸和事務一致性問題。本文重點論述在微服務架構下,如何通過Saga事務模式、事件溯源和最終一…

Matplotlib 安裝部署與版本兼容問題解決方案(pyCharm)

引言 Matplotlib 是 Python 中最常用的可視化庫之一,它是一個綜合性的繪圖庫,能夠創建靜態的、動畫的和可交互的可視化圖形圖像,能夠創建折線圖、散點圖,還是復雜的熱力圖、3D 繪圖等 matplotlib官網地址:https://ma…