程式碼同步更新在 Github
在開始之前我們先來看一張梗圖
(圖片來源: https://www.threads.net/@ihower/post/C_LRVnqSppb)
這張梗圖流傳在 LinkedIn 上,但我找不到來源了只找到 ihower 大大在串上分享的貼文。背後的梗其實就是我們在做應用,實際上不會碰到太底層的東西。原本你可能要手刻演算法,到後來使用套件來做分詞與推論,到現在用 API 來使用模型。
(還記得昨天我們有使用 transformers
套件,並用了 GPT2 模型和 tokenizer 來做簡單的文字接龍嗎?)
比較可能令人疑惑的是 2024 的部分,這個在講的就是像 Github copilot, Cursor 等程式碼自動補全的工具出現,我們只要用手點 tab 鍵就可以產生程式碼,我覺得身為工程師一定要使用這樣的工具來提升效率,但也要注意資安的問題,不要把公司的程式碼泄露了XD
接下來就讓我們用 OpenAI API 來操作模型吧!
所以什麼是 API 呢?你可以看這個影片來理解 https://youtu.be/zvKadd9Cflc?si=ziFBJx39ffkQO6JY
想像一下,你在一家餐廳裡,店員是這個餐廳的 API,而菜單就是可用的 API。當你想要吃東西時,你完全不需要知道廚房裡的廚師是怎麼做菜的。你只需要告訴店員你想吃什麼 (這就是你發送的請求),然後店員會把你的點餐帶到廚房,廚師會做出食物,然後店員把食物端給你 (這就是回應)。
API 就是一個橋樑,讓開發者可以在不需要知道底層技術的情況下,輕鬆使用其他應用程式的服務及功能,提升開發效率。這些提供 API 服務的人都會制定一些規格,並且在官網或者規格書中,你需要用什麼方式去請求 (request),他的回傳 (response) 格式是什麼。每一個程式、供應商的規格都不同,甚至會隨著時間而更動。依賴網路上的範例程式碼包含我寫的程式碼是有一定風險的,因此學習如何閱讀讀規格書將是很重要的,越早習慣越好。inspiration1 , inspiration2
在使用 OpenAI 的模型如 GPT-4, GPT-4o-mini 之前,我們需要先到官網上註冊帳號,並取得 API Key。為什麼會需要 API Key 呢?用剛剛的例子,如果你是餐廳 (OpenAI),你總不會希望大家都可以免費使用你的模型,畢竟機器也是需要錢的,有了 API Key 餐廳就可以知道你是誰、有沒有付錢。
先到官網上註冊帳號
https://openai.com/index/openai-api/
在左側的選單可以看到 API keys,你可以用右上角的 Create new secret key 來生成一個 API Key
這邊可以看到一些權限設定,因為有些場景是一個帳號的 API key 需要給其他人使用,你可能會希望他們只使用特定的模型 (比較便宜的),不過這邊的 permissions 就選擇 All,名字可以隨意取
記得一定要複製起來,把這個 key 存好
如果你現在就用官網的範例來使用這個 API,可能會遇到以下情況,就是說你沒錢ㄌㄚ,所以要去設定信用卡扣款才行
收費的部分可以參考 https://openai.com/api/pricing/
注意到這邊的計費方式都是以 1M input tokens 為單位來算,那我要怎麼知道我用了多少 token 呢?這邊的計算方式為:輸入的 token 數量 (prompt) 加上模型輸出的 toke 數量 (completion)。你可以用用 OpenAI tokenizer 來計算字串的 token 數量。以下是「我喜歡吃蘋果」 “I like to eat an apple” 的例子
可以發現,如果我們用字元 (Character) 來計算中文轉換成 token 時有點吃虧,在這個例子中,同樣一句話中文要使用 11 個 token 來表示;英文只要 11 個。延伸閱讀: https://roykwokcode.medium.com/unicode-與-utf-8-的關係-1c9b7a0b7c29
可以發現不同的 tokenizer 轉換中文的方法也有些許不同,上面這個例子,對 GPT-3.5 和 GPT-4 用的分詞器來說「中」、「文」、「文字」各是一個 token;GPT-3 中,某些中文字符可能會被拆分為多個 token 來表示。較新且較大的模型之所以能更好地理解文句,是因為它們在設計上能夠處理的 token 數量更多,同時也受益於更大規模的訓練數據。
當你設定好信用卡付款 (可以參考:https://geo1995.com/openai-apikeys/),我們就可以開始來用 Python 串接 API 了
先下載套件
pip install openai # openai 套件
pip install python-dotenv # 用來處理環境變數
在你的專案資料夾中建立 .env
檔,這個檔案是我們用來管理環境變數的地方
把你的 key 放進去,變數名為 OPENAI_API_KEY
,後面 sk 開頭的就是你的 api key
OPENAI_API_KEY=sk-xxxx
建立一個檔案並撰寫程式碼,記得檔案要和 .env
檔放在同一個資料夾喔
##
# 使用 openai 的 API 來生成文本
import openai
from dotenv import load_dotenv # 載入 dotenv 套件
import os
load_dotenv() # 載入環境變數
input_string = "你好ㄚ可愛的模型"
model_name = "gpt-4o-mini"
# 從環境變數中取得 API 金鑰,並且設定給 openai
openai.api_key = os.getenv("OPENAI_API_KEY")
client = openai.OpenAI() # 建立 OpenAI 客戶端
completion = client.chat.completions.create(
model=model_name,
messages=[
{
"role": "user",
"content": input_string
}
]
)
# 印出回傳的結果
print(completion.choices[0].message.content)
這段程式碼做了一些事情
OPENAI_API_KEY
這個變數 assign 給 open.api_key
OpenAI()
物件,並取名為 client (用戶端) 之後的操作都會用到它比較複雜的是第三點,這應該也是很多初學者會感到疑惑的地方,為什麼要這樣一層一層呼叫,我就只是要跟模型說聲 hello 而已ㄚ?
其實當一個專案越做越大,功能越來越多,就不可能只有一個兩個函式可以解決,這會涉及到物件導向 (OOP) 設計、功能劃分、降低耦合度等等等很深的軟體工程學問,我們要知道的是怎麼根據我的需求去找到我應該要呼叫的函式。看文件是一個方法,但看原始碼也不錯,畢竟好的程式碼本身就是文件。稍後會介紹怎麼看原始碼,我們先來執行看看吧!
python 你的檔案名稱.py
太棒了!終於和 GPT-4o-mini 打聲招呼了,只不過回傳的是簡體中文,這個部分之後會再告訴大家怎麼解決,你已經走到這一部已經很棒了喔!
(這一段可以跳過不看沒關係~只是如果知道怎麼讀會對之後使用其他 Python 套件都很有幫助歐)
請到 https://github.com/openai/openai-python 看看人家怎麼寫程式的,首先,我們創建了一個 client.OpenAI()
物件,所以可以到 src/openai 來觀察看看這個物件在哪裡?
天啊,太多檔案了怎麼辦QQ,沒關係,如果你過去寫程式習慣用 VSCode 或者 Cursor 等編輯器,只要按住 Command (Windows 使用者請按著 Ctrl),並且將鼠標放到你想要查看原始程式碼的地方,點下去就可以看到了喔
所以我們知道了 OpenAI 這個類別定義在 _client.py
這個檔案,一樣的道理,我們也可以去看 Chat 物件定義在哪兒
原來是 resource 資料夾底下的 chat.py
。這樣一層一層找到最後,我們找到了 create
這個方法,也發現不只有 gpt-4o-mini 可以使用,還有非常多模型可以使用,有機會再跟大家分享吧!
先知道怎麼找類別、函式,這樣之後就算 Python 套件更新了、文章過時了,你還是可以自己找到一些線索!真的有看不懂的程式碼,直接複製到 ChatGPT 找關鍵字,更方便你深入學習。
怎麼說呢,我不太想要付錢XD,如果你想要用 GPT-4o, GPT-4o-mini 等 GPT 家族的模型,那就只能用 OpenAI (close ai) 的服務,但我們也可以用別家 API 提供商來玩喔!這邊介紹一家人工智慧公司 Groq,他們的目標是利用 LPU (Language Processing Unit),一種類似 GPU, CPU 專門加速 AI 運算的計算單元,可想而知它的 API 模型推理速度會更快,甚至是免費的!
到 https://console.groq.com/playground 註冊帳號並且登入,取得 API Key
一樣要記得複製起來歐
把 API Key 放到 .env
檔中
觀察官方網站的 Groq Libraries,這邊可以看到 Groq 也有提供 Python 的套件使用。程式碼的部分就跟 OpenAI 的方法大同小異,可以參考這一頁。
pip install groq
模型的選擇有很多,甚至還有語音轉文字 (Speech to text) 模型,來觀察一下 llama3-8b-8192
這個模型
Model ID: 模型的代號,也就是在使用它的時候要輸入的名稱
Developer: 是誰開發的 (這很重要,因為有些模型使用的 License 會有一些限制,像是無法商用、無法拿輸出結果來微調其他模型等等)
Context Window: 模型一次處理文字的最大上限,包含輸入給模型的 token 以及模型推論出的 token,你可能會想多 8192 這麼大怎麼可能用得完?嘿嘿嘿,之後的章節提到 RAG 的時候就會覺得其實這樣沒有特別大了XD
Model Card: 這個術語的來源是為了提供模型的詳細資訊和背景,就像一張名片 (card) 一樣,如果說存程式碼的雲端是 Github,那存模型的雲端代表就是 huggingface 了。點擊這個連結會帶你到 Groq 他們使用的模型存在 huggingface 上的位置,有的甚至可以在上面直接試用。
順帶一提,昨天我們用到 transformers 套件也是出自於 huggingface 喔。
我們來看看一樣的「你好ㄚ可愛的模型」讓 llama3-8b-8192
去推論會得到什麼結果吧!(messages 的部分和 OpenAI 的例子一樣)
# 記得先安裝套件
pip install groq
# 檔名為 groq-test.py
import os
from dotenv import load_dotenv
from groq import Groq
load_dotenv()
input_string = "你好ㄚ可愛的模型"
model_name = "gpt-4o-mini"
client = Groq(
api_key=os.environ.get("GROQ_API_KEY"),
)
chat_completion = client.chat.completions.create(
messages=[
{
"role": "user",
"content": "你好ㄚ可愛的模型",
}
],
model="llama3-8b-8192",
)
print(chat_completion.choices[0].message.content)
然後你就會發現,天啊 llama 根本就是外國人!ni hao! 感覺就超像老外的🤣
今天分享了 API 的基本概念、以及 OpenAI, Groq 這兩個模型供應商的 API 使用方法,如果你大概都聽懂了,也順利地向它們打招呼了,為自己鼓掌吧!👏👏👏 ,你已經從原本只是 ChatGPT 的使用者,變成模型操控師了!
其實不只有 Groq, OpenAI 還有很多模型供應商可以用,在這邊推薦一個工具:perplexity,你可以把它想成是 AI 版本的 Google Search,有不懂的東西上去查會快很多,包含我寫的文章參考的資料很多都是用 perplexity 搜尋的。
不過你可能也注意到一個問題,那就是為什麼他們好像都不太會說台灣正體呢?還有為什麼在和大型語言模型溝通時還要指定 role 呢?我不就是 user 了嗎?明天會分享提示詞工程 (Prompt Engineering) 這個酷東東,一次解答所有困惑,這個技巧還能讓模型的輸出更符合我們的期待喔。