iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
生成式 AI

T 大使 AI 之旅系列 第 11

【Day 11】API 呼叫 LLMs

  • 分享至 

  • xImage
  •  

前情提要

不知不覺已經 10 天過去了,過去 10 天使用了很多 No code 的 AI 工具或平台,像是 ollama、Azure Speech Studio。也實作了如何根據專案建置虛擬環境,並且了解了目前最強大的 AI 平台 - Hugging Face,然後玩了各式各樣的模型,生成了文字、圖片、影像、語音。那麼接下來要來透過呼叫 API 的方式,來跟生成式 AI 做互動,但是需要 API 的大部分都要付錢。

Google - Gemini

第一個要分享的是 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)

2024-08-15 20.25.59

  • 使用 Gemini 套件內建 Memory 功能
# 匯入套件
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)

2024-08-15 22.02.55
程式碼結果探討 🧐:

  • 透過簡單的呼叫方式就可以實現與 AI 的多輪互動,這是蠻方便的,後面要介紹的模型都沒有這種內建功能。因為如果回答的內容不是我們想要的一般都會繼續往下問,如果是 ipynb 檔就可以實現 AI 回覆一次再輸入下一次的問題。

OpenAI - GPT 家族

現在這個時代應該沒人不知道 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)

2024-08-15 22.28.22
程式碼結果探討 🧐:

  • 除了 OpenAI 套件之外,我還有使用 dotenv 這個套件,可以在同個資料夾底下建立一個 .env 檔案,目的是讓程式可以安全地使用這些變數。
  • 接著創建一個對話的 client,並且指定模型名稱。
  • role 的部分有分成三種,如果只是想要單純的請 AI 回覆,就是像範例這樣使用一個 user 的方式。那如果想要有對話的感覺的話,可以設置像註解掉的 conversation 那樣,就可以實現 conversation 的感覺。那還有一個 rolesystem,就像是下 Prompt 的感覺,給 AI 設定角色和對話背景規則。

台智雲 - FFM 家族 🇹🇼

我在 【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)

CleanShot 2024-08-06 at 23.48.28@2x
程式碼結果探討 🧐:

  1. requests 是像網頁發出請求的套件,被廣泛應用在爬蟲。而 json 套件是後續回傳內容為 json 格式的資料。
  2. 這些參數我最後面統一簡單介紹一下和分享我的想法。
  3. 有爬蟲抓過 post 網頁,或者做過 Web API 的人就知道 header 在幹嘛。基本上他就是傳入需要驗證資訊的地方,譬如說這邊是傳入 API KEY。很多後端的 Web API 都是在 header 這邊向網頁傳遞 Authorization 或 KEY 這種參數。
  4. 這邊跟前面 gpt 的部分一樣,可以選擇要不要輸入 Prompt,不要的話輸入空值,或者將預設設為空值。也可以選擇要 conversation 還是單純的 text-generation,所以 input 的個數要是基數個,偶數個也可以啦,但就是沒什麼意義。
  5. 這邊就是將註解 2 那邊的參數還有整理過後的使用者 input 還有選擇的模型都傳遞進去。
  6. 上面設定的 header 和 body 都是向 API URL 發出請求需要的參數,這就是 POST 網頁的特性,需要傳遞必要的參數,並且通過驗證才可以取得對應的資料。
  7. 向網頁發出請求,而網頁成功回應的話,會回傳 200 的狀態碼。200 以外的數字都分別代表特定的 error。

參數說明

剛剛在註解 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 回答的內容,或許也可以考慮從參數著手調整。
https://ithelp.ithome.com.tw/upload/images/20240815/201683360TGW5QFtAq.png

結論

今天分享了兩個主流的 LLM 以及一個台灣新興的 LLM 後,我們也探討了一些可以用來調整回覆內容的參數。不過,在串接不同的 AI 輔助工具時,會發現各種不同的寫法和繁多的工具,確實讓人感到頭痛。這樣的描述或許有些抽象。明天,我們就來看看 LangChain 這個套件是如何將工具與 LLMs 有效整合的吧!

題外話🤣

今天的大地震希望大家都一切平安,我在 11 樓真的超級晃。

下一篇文章:LLMs 最佳拍檔 - LangChain 🦜️🔗


上一篇
【Day 10】Azure Speech Studio 語音生成實戰
下一篇
【Day 12】LLMs 最佳拍檔 - LangChain 🦜️🔗
系列文
T 大使 AI 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言