iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
生成式 AI

Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用系列 第 3

【Day3】第一次使用 LLM API:用 OpenAI API 和 LLM 說聲嗨 (還有免費的 Groq API)

  • 分享至 

  • xImage
  •  

程式碼同步更新在 Github

簡化開發

在開始之前我們先來看一張梗圖

截圖 2024-09-02 晚上10.48.48.png

(圖片來源: https://www.threads.net/@ihower/post/C_LRVnqSppb)

這張梗圖流傳在 LinkedIn 上,但我找不到來源了只找到 ihower 大大在串上分享的貼文。背後的梗其實就是我們在做應用,實際上不會碰到太底層的東西。原本你可能要手刻演算法,到後來使用套件來做分詞與推論,到現在用 API 來使用模型。

(還記得昨天我們有使用 transformers 套件,並用了 GPT2 模型和 tokenizer 來做簡單的文字接龍嗎?)

比較可能令人疑惑的是 2024 的部分,這個在講的就是像 Github copilot, Cursor 等程式碼自動補全的工具出現,我們只要用手點 tab 鍵就可以產生程式碼,我覺得身為工程師一定要使用這樣的工具來提升效率,但也要注意資安的問題,不要把公司的程式碼泄露了XD

螢幕錄影 2024-09-03 凌晨1.18.31.gif

接下來就讓我們用 OpenAI API 來操作模型吧!

什麼是 API

所以什麼是 API 呢?你可以看這個影片來理解 https://youtu.be/zvKadd9Cflc?si=ziFBJx39ffkQO6JY

想像一下,你在一家餐廳裡,店員是這個餐廳的 API,而菜單就是可用的 API。當你想要吃東西時,你完全不需要知道廚房裡的廚師是怎麼做菜的。你只需要告訴店員你想吃什麼 (這就是你發送的請求),然後店員會把你的點餐帶到廚房,廚師會做出食物,然後店員把食物端給你 (這就是回應)。

API 就是一個橋樑,讓開發者可以在不需要知道底層技術的情況下,輕鬆使用其他應用程式的服務及功能,提升開發效率。這些提供 API 服務的人都會制定一些規格,並且在官網或者規格書中,你需要用什麼方式去請求 (request),他的回傳 (response) 格式是什麼。每一個程式、供應商的規格都不同,甚至會隨著時間而更動。依賴網路上的範例程式碼包含我寫的程式碼是有一定風險的,因此學習如何閱讀讀規格書將是很重要的,越早習慣越好。inspiration1 , inspiration2

OpenAI API

在使用 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

image.png

這邊可以看到一些權限設定,因為有些場景是一個帳號的 API key 需要給其他人使用,你可能會希望他們只使用特定的模型 (比較便宜的),不過這邊的 permissions 就選擇 All,名字可以隨意取

image.png

記得一定要複製起來,把這個 key 存好

截圖 2024-09-03 凌晨1.33.40.png

如果你現在就用官網的範例來使用這個 API,可能會遇到以下情況,就是說你沒錢ㄌㄚ,所以要去設定信用卡扣款才行

image.png

Pricing 與 token 計算

收費的部分可以參考 https://openai.com/api/pricing/

image.png

注意到這邊的計費方式都是以 1M input tokens 為單位來算,那我要怎麼知道我用了多少 token 呢?這邊的計算方式為:輸入的 token 數量 (prompt) 加上模型輸出的 toke 數量 (completion)。你可以用用 OpenAI tokenizer 來計算字串的 token 數量。以下是「我喜歡吃蘋果」 “I like to eat an apple” 的例子

image.png

image.png

可以發現,如果我們用字元 (Character) 來計算中文轉換成 token 時有點吃虧,在這個例子中,同樣一句話中文要使用 11 個 token 來表示;英文只要 11 個。延伸閱讀: https://roykwokcode.medium.com/unicode-與-utf-8-的關係-1c9b7a0b7c29

image.png

image.png

可以發現不同的 tokenizer 轉換中文的方法也有些許不同,上面這個例子,對 GPT-3.5 和 GPT-4 用的分詞器來說「中」、「文」、「文字」各是一個 token;GPT-3 中,某些中文字符可能會被拆分為多個 token 來表示。較新且較大的模型之所以能更好地理解文句,是因為它們在設計上能夠處理的 token 數量更多,同時也受益於更大規模的訓練數據。

用 Python 串接 API

當你設定好信用卡付款 (可以參考:https://geo1995.com/openai-apikeys/),我們就可以開始來用 Python 串接 API 了

先下載套件

pip install openai        # openai 套件
pip install python-dotenv # 用來處理環境變數

在你的專案資料夾中建立 .env 檔,這個檔案是我們用來管理環境變數的地方

image.png

把你的 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)

這段程式碼做了一些事情

  1. 載入環境變數,並且將 OPENAI_API_KEY 這個變數 assign 給 open.api_key
  2. 建立 OpenAI() 物件,並取名為 client (用戶端) 之後的操作都會用到它
  3. 利用 OpenAI 物件定義的 chat 屬性的 completions 方法回傳一個 Completions 物件,使用這個物件的 create 方法來對 API 送出請求。細節可以參考 https://github.com/openai/openai-python
  4. 除了傳入 model 參數指定模型以外,還傳入了一個 messages 參數表示輸入給模型的內容。這邊的 role 為 user,表示人類使用者;content 就是對應的 role 要對模型說的話。所以我們輸入給模型的完整內容為:我是 user,我要說「你好ㄚ可愛的模型」。
  5. 最後就是將回傳資料的 content 印出來

比較複雜的是第三點,這應該也是很多初學者會感到疑惑的地方,為什麼要這樣一層一層呼叫,我就只是要跟模型說聲 hello 而已ㄚ?

其實當一個專案越做越大,功能越來越多,就不可能只有一個兩個函式可以解決,這會涉及到物件導向 (OOP) 設計、功能劃分、降低耦合度等等等很深的軟體工程學問,我們要知道的是怎麼根據我的需求去找到我應該要呼叫的函式。看文件是一個方法,但看原始碼也不錯,畢竟好的程式碼本身就是文件。稍後會介紹怎麼看原始碼,我們先來執行看看吧!

python 你的檔案名稱.py

image.png

太棒了!終於和 GPT-4o-mini 打聲招呼了,只不過回傳的是簡體中文,這個部分之後會再告訴大家怎麼解決,你已經走到這一部已經很棒了喔!

觀察 openai 的原始程式碼

(這一段可以跳過不看沒關係~只是如果知道怎麼讀會對之後使用其他 Python 套件都很有幫助歐)

請到 https://github.com/openai/openai-python 看看人家怎麼寫程式的,首先,我們創建了一個 client.OpenAI() 物件,所以可以到 src/openai 來觀察看看這個物件在哪裡?

截圖 2024-09-03 下午4.37.32.png

天啊,太多檔案了怎麼辦QQ,沒關係,如果你過去寫程式習慣用 VSCode 或者 Cursor 等編輯器,只要按住 Command (Windows 使用者請按著 Ctrl),並且將鼠標放到你想要查看原始程式碼的地方,點下去就可以看到了喔

螢幕錄影 2024-09-03 下午4.39.31.gif

所以我們知道了 OpenAI 這個類別定義在 _client.py 這個檔案,一樣的道理,我們也可以去看 Chat 物件定義在哪兒

螢幕錄影 2024-09-03 下午4.41.13.gif

原來是 resource 資料夾底下的 chat.py 。這樣一層一層找到最後,我們找到了 create 這個方法,也發現不只有 gpt-4o-mini 可以使用,還有非常多模型可以使用,有機會再跟大家分享吧!
先知道怎麼找類別、函式,這樣之後就算 Python 套件更新了、文章過時了,你還是可以自己找到一些線索!真的有看不懂的程式碼,直接複製到 ChatGPT 找關鍵字,更方便你深入學習。

image.png

Groq API (使用 Python request)

怎麼說呢,我不太想要付錢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

截圖 2024-09-03 晚上9.01.53.png

一樣要記得複製起來歐

image.png

把 API Key 放到 .env 檔中

image.png

實作程式碼

觀察官方網站的 Groq Libraries,這邊可以看到 Groq 也有提供 Python 的套件使用。程式碼的部分就跟 OpenAI 的方法大同小異,可以參考這一頁

pip install groq

模型的選擇有很多,甚至還有語音轉文字 (Speech to text) 模型,來觀察一下 llama3-8b-8192 這個模型

image.png

  • 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! 感覺就超像老外的🤣

image.png

小結

今天分享了 API 的基本概念、以及 OpenAI, Groq 這兩個模型供應商的 API 使用方法,如果你大概都聽懂了,也順利地向它們打招呼了,為自己鼓掌吧!👏👏👏 ,你已經從原本只是 ChatGPT 的使用者,變成模型操控師了!

其實不只有 Groq, OpenAI 還有很多模型供應商可以用,在這邊推薦一個工具:perplexity,你可以把它想成是 AI 版本的 Google Search,有不懂的東西上去查會快很多,包含我寫的文章參考的資料很多都是用 perplexity 搜尋的。

螢幕錄影 2024-09-03 晚上10.04.43.gif

不過你可能也注意到一個問題,那就是為什麼他們好像都不太會說台灣正體呢?還有為什麼在和大型語言模型溝通時還要指定 role 呢?我不就是 user 了嗎?明天會分享提示詞工程 (Prompt Engineering) 這個酷東東,一次解答所有困惑,這個技巧還能讓模型的輸出更符合我們的期待喔。


上一篇
【Day2】什麼是 AI 和大型語言模型 (LLM)?
下一篇
【Day4】提示詞工程 (Prompt Engineering) 這什麼鬼:初探 LLM 操控術與 OpenAI 的六大策略
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言