不知不覺已經 10 天過去了,過去 10 天使用了很多 No code 的 AI 工具或平台,像是 ollama、Azure Speech Studio。也實作了如何根據專案建置虛擬環境,並且了解了目前最強大的 AI 平台 - Hugging Face,然後玩了各式各樣的模型,生成了文字、圖片、影像、語音。那麼接下來要來透過呼叫 API 的方式,來跟生成式 AI 做互動,但是需要 API 的大部分都要付錢。
第一個要分享的是 Google 的 Gemini AI,但我平常比較少以 API 呼叫這個模型,通常是在 Colab debug 的時候才會用到他。但我聽同事說這個是要付費,但我申請一個 Key 使用都沒有顯示需要收費。Google 的說明網頁常常讓人找不到想找的🤣
要安裝
google-generativeai
套件
# 匯入套件
import google.generativeai as genai
# 輸入 Key
api_key = 'Your Key'
genai.configure(api_key = api_key)
# 選擇模型 & 輸入內容 & 輸出結果
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content('NBA歷史總得分最多的人是誰,他目前累積多少分?')
print(response.text)
# 匯入套件
import google.generativeai as genai
# 輸入 Key
api_key = 'Your Key'
genai.configure(api_key = api_key)
# 選擇模型 & 設定對話 history
model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat(history=[])
# 第一個問題
response = chat.send_message('Aespa的成員有誰?')
print(response.text)
# 第二個問題
response = chat.send_message('可以推薦幾首他們的歌嗎?')
print(response.text)
# 顯示對話紀錄
print(chat.history)
程式碼結果探討 🧐:
現在這個時代應該沒人不知道 OpenAI 了吧,基本上要找答案第一時間想到的方式都還是 ChatGPT。而且他們模型也是持續有在更新和加強,我自己覺得 GPT-4o 是當前世界上最強的語言模型,也有可能是我用的模型不夠多。
# 匯入套件 & 載入 API
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
# 初始化 OpenAI
client = OpenAI()
# 生成聊天回應
conversation = [{"role": "user", "content": "台灣8+9是什麼?"}]
# conversation = [
# {"role": "user", "content": "你最喜歡哪種動物最有趣?"},
# {"role": "assistant", "content": "我最喜歡章魚,因為他們有三顆心臟、能夠變色,還能解決複雜的問題!"},
# {"role": "user", "content": "真的嗎?那他們的智商一定都很高!"}
# ]
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=conversation,
)
print(response)
程式碼結果探討 🧐:
dotenv
這個套件,可以在同個資料夾底下建立一個 .env
檔案,目的是讓程式可以安全地使用這些變數。role
的部分有分成三種,如果只是想要單純的請 AI 回覆,就是像範例這樣使用一個 user
的方式。那如果想要有對話的感覺的話,可以設置像註解掉的 conversation 那樣,就可以實現 conversation 的感覺。那還有一個 role
是 system
,就像是下 Prompt 的感覺,給 AI 設定角色和對話背景規則。我在 【Day 02】生成式 AI 入門指南 的文章有介紹過台智雲了,所以這邊就不在贅述做介紹,這邊就來介紹一下他的程式結構。
# 1.匯入套件 & 選擇模型 & 輸入 API KEY 和 URL
import json
import requests
MODEL_NAME = 'MODEL NAME'
API_KEY = 'API KEY'
API_URL = 'API URL'
# 2.設定參數
max_new_tokens = 500
temperature = 0.01
top_k = 10
top_p = 1
frequence_penalty = 1.03
def conversation(system, contents):
# 3.設定 post 需要傳入的參數
headers = {
"content-type": "application/json",
"X-API-KEY": API_KEY,
"X-API-HOST": "afs-inference"}
# 4.確認是否有 system prompt 和對話內容
roles = ["human", "assistant"]
messages = []
if system is not None:
messages.append({"role": "system", "content": system})
for index, content in enumerate(contents):
messages.append({"role": roles[index % 2], "content": content})
# 5.這個也是 post 需要傳入的參數
body = {
"model": MODEL_NAME,
"messages": messages,
"parameters": {
"max_new_tokens": max_new_tokens,
"temperature": temperature,
"top_k": top_k,
"top_p": top_p,
"frequence_penalty": frequence_penalty
}
}
result = ""
try:
# 6.對 API URL 發出請求
response = requests.post(API_URL + "/models/conversation", json=body, headers=headers)
# 7.請求成功的話取得並解析回傳的 json 資料
if response.status_code == 200:
result = json.loads(response.text, strict=False)['generated_text']
else:
print("error")
except:
print("error")
return result.strip("\n")
system_prompt = "你是一位 Kpop 的粉絲。"
contents = ["Aespa是誰?", "是由韓國娛樂公司 SM 娛樂創立的韓國女團。", "她們的成員有誰?"]
result = conversation(system_prompt, contents)
print(result)
程式碼結果探討 🧐:
requests
是像網頁發出請求的套件,被廣泛應用在爬蟲。而 json
套件是後續回傳內容為 json 格式的資料。conversation
還是單純的 text-generation
,所以 input 的個數要是基數個,偶數個也可以啦,但就是沒什麼意義。2
那邊的參數還有整理過後的使用者 input 還有選擇的模型都傳遞進去。剛剛在註解 2
的那邊有一些可以調整 AI 回傳內容的參數,那其實不只有台智雲,OpenAI 也有這些參數。
max_new_tokens
:一次最多可生成的 token 數量。temperature
:生成創造力,生成文本的隨機和多樣性。值越大,文本更具創意和多樣性;值越小,則較保守、接近模型所訓練的文本。top_p
:當候選 token 的累計機率達到或超過此值時,就會停止選擇更多的候選 token。值越大,生成的文本越多樣化;值越小,生成的文本越保守。top_k
:限制模型只從具有最高概率的 K 個 token 中進行選擇。值越大,生成文本越多樣化;值越小,生成的文本越保守。frequence_penalty
:重複懲罰,控制重複生成 token 的概率。值越大,重複 token 出現次數將降低。stop_sequences
:當文字生成內容遇到以下序列即停止,而輸出內容不會納入序列。seed
:亂數種子,具有相同種子與參數的重複請求會傳回相同結果。若設成 null,表示隨機。設定的功能都是一樣的,只是數值和名字上會有些不同,譬如說:temperature
在台智雲最低不能設成 0,但是 OpenAI 可以。但基本上很多都維持預設就可以了,我自己使用的時候基本上只會調整 temperature
。那我找不到 OpenAI 的參數說明連結,這邊附上台智雲的 參數說明~
從下圖結果可以看到,temperature
越大生成了越多不必要的內容,而且還有些內容是錯的。所以如果不滿意 AI 回答的內容,或許也可以考慮從參數著手調整。
今天分享了兩個主流的 LLM 以及一個台灣新興的 LLM 後,我們也探討了一些可以用來調整回覆內容的參數。不過,在串接不同的 AI 輔助工具時,會發現各種不同的寫法和繁多的工具,確實讓人感到頭痛。這樣的描述或許有些抽象。明天,我們就來看看 LangChain 這個套件是如何將工具與 LLMs 有效整合的吧!
今天的大地震希望大家都一切平安,我在 11 樓真的超級晃。