2023-12-17|閱讀時間 ‧ 約 13 分鐘

利用 IBM Watsonx.ai 與 Python SDK :應用 LLM 在客戶滿意度分析

前言

在上一篇文章中,分享了第一次使用 IBM Watsonx 的經歷,以及我對 Prompt lab 功能的初步探索。繼續這個話題,本文將探討 Watsonx 平台對 Python SDK 的支持,以及實作幾個 LLM 的應用,這一特性為開發者提供了極大的便利,使得在此平台上進行開發和應用大型語言模型(LLM)變得非常簡便。更值得一提的是,這個平台甚至支持 hugging face 上的模型,為開發者提供了更廣闊的創新空間和可能性,也對於介接 LLM 模型更加便利。

raw-image

IBM Watsonx.ai的基礎模型概覽

在IBM Watsonx.ai平台上,搭載一系列來自IBM和其他開源提供商(hugging face)的基礎模型。這些包括多種功能強大的模型,如flan-t5-xl-3b、flan-t5-xxl-11b、flan-ul2-20b、gpt-neox-20b、granite-13b-chat-v2等。這些模型涵蓋了從聊天生成到程式碼生成等多種用途,可在Prompt Lab中或透過Python庫進行編程調用。

IBM提供的基礎模型,如granite-13b系列,專注於對話應用和指令型任務,並且經過精細調整,以適應企業相關的數據集。這些模型的 Maximum Token Limit 達到8192,並被分類為不同的計費類別。

此外,通過Hugging Face提供的第三方模型,如由Google提供的flan-t5系列和Meta的llama-2-13b-chat等,涵蓋了從自然語言處理到長文本推理的各種任務。這些模型支持多種自然語言,並且在訓練過程中結合了鏈式思維數據和其他多步驟推理任務。

每個模型的詳細資料,包括使用案例、code 架構、支持的語言,以及訓練數據集的詳情,都已在各自的模型卡上公開。

詳細內容可以參閱:watsonx.ai 支援的基礎模型 - IBM 文件


使用 IBM Watsonx 基礎模型從文字分析租車用戶滿意度

利用 IBM Watsonx 平台和 ibm/granite-13b-instruct-v1 等基礎模型來分析租車使用者的滿意度,我們使用的主要數據來源是名為 car_rental_training_data.csv 的租車數據集,在這個數據集中,分析「顧客服務」的評論以及相應的「滿意度評分」。實作為通過設計合適的提示(prompt)來引導模型,當輸入用戶的評論後,模型會根據內容給出「是」或「否」的滿意度評價


數據集的導入

import wget
import pandas as pd

filename = 'car_rental_training_data.csv'
url = 'https://raw.githubusercontent.com/IBM/watson-machine-learning-samples/master/cloud/data/cars-4-you/car_rental_training_data.csv'

if not os.path.isfile(filename):
wget.download(url, out=filename)

df = pd.read_csv("car_rental_training_data.csv", sep=';')
data = df[['Customer_Service', 'Satisfaction']]

選擇基礎模型

model_id = ModelTypes.GRANITE_13B_INSTRUCT

我們選用 GRANITE_13B_INSTRUCT

定義模型參數

from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watson_machine_learning.foundation_models.utils.enums import DecodingMethods

parameters = {
GenParams.MIN_NEW_TOKENS: 0,
GenParams.MAX_NEW_TOKENS: 1,
GenParams.DECODING_METHOD: DecodingMethods.GREEDY,
GenParams.REPETITION_PENALTY: 1
}
  • GenParams.MIN_NEW_TOKENS: 0
    • 這個參數設定了模型在生成回應時最少新增的 token 數量。在這個案例中,它被設定為0,意味著沒有強制模型最少生成一定數量的新 token。
  • GenParams.MAX_NEW_TOKENS: 1
    • 這個參數設定了模型在生成回應時最多新增的 token數量。
  • GenParams.DECODING_METHOD: DecodingMethods.GREEDY
    • 這個參數指定了模型在生成文本時使用的解碼方法。DecodingMethods.GREEDY 是一種貪婪解碼方法,它在每一步都選擇最有可能的下一個 token。這種方法傾向於快速決策,但可能不總是生成最自然或最有創造性的文本。
    • 補充說明 Greedy Decoding : 在每一步生成文本時,Greedy 總是選擇具有最高概率的下一個 token(例如單詞或字符)。換句話說,它每次都選擇當前最可能的選項,而不考慮長期的最佳結果。特點:這種方法相對簡單快速,但可能不總是導致最佳或最自然的文本輸出,因為它不考慮整體句子或段落的上下文連貫性
    • 其他的 Decoding:
      • Beam Search :
        • 定義:這種方法在每一步考慮多個最可能的選項( Beam 的大小是一個參數),而不是只考慮單一最可能的選項。這允許模型在生成文本時考慮多種可能的路徑。特點:束搜索能夠產生更自然和連貫的文本,但比貪婪解碼更耗時和計算量更大。
      • 隨機抽樣(Random Sampling)
        • 定義:這種方法從可能的下一個令牌的概率分布中隨機選擇,而不是總是選擇最可能的一個。特點:隨機抽樣能夠產生更多樣化和創新的文本,但有時可能會產生不那麼連貫或不相關的結果。
      • Top-K Sampling
        • 定義:這種方法首先選擇一個「K」值,然後只從最可能的K個令牌中隨機選擇下一個令牌。特點:這種方法結合了隨機抽樣和貪婪解碼的特點,提供了一種平衡的選擇方式。
      • Top-p (或稱為核心抽樣,Nucleus Sampling)
        • 定義:在這種方法中,系統選擇一個概率閾值「p」,然後隨機選擇來自累計概率最高(並且總和小於或等於p)的一組令牌。特點:Top-p 抽樣能夠生成更多樣化且高質量的文本,減少無關或重複的內容。
  • GenParams.REPETITION_PENALTY: 1
    • 這個參數用於減少文本生成中的重複內容。當設定為1時,表示不對重複內容施加任何額外的處罰。如果這個值被設定得更高(例如1.2或2),模型在生成重複內容時會受到更多的限制,從而減少重複語句的出現。

初始化模型

from ibm_watson_machine_learning.foundation_models import Model

model = Model(
model_id=model_id,
params=parameters,
credentials=credentials,
project_id=project_id)

查看模型資訊

model.get_details()

準備 prompt

定義好輸入顧客經驗,回傳顧客是否滿意

instruction = """Determine if the customer was satisfied with the experience based on the comment. Return simple yes or no.
Comment:The car was broken. They couldn't find a replacement. I've waster over 2 hours.
Satisfied:no""

LLM 滿意度分析 Inference

prompt1 = "\n".join([instruction, "Comment:" + comments[2], "Satisfied:"])
print(prompt1)

Determine if the customer was satisfied with the experience based on the comment. Return simple yes or no.
Comment:The car was broken. They couldn't find a replacement. I've waster over 2 hours.
Satisfied:no
Comment:long lines waiting for the rental pick.
Satisfied:

輸出分析結果:

print(model.generate_text(prompt=prompt1))

no

中文的應用案例

model_id = ModelTypes.LLAMA_2_70B_CHAT
model = Model(
model_id=model_id,
params=parameters,
credentials=credentials,
project_id=project_id)

模型可以換成中文的 LLAMA_2


instruction = """基於給予的評論判斷使用者對這次體驗是否滿意。僅回答是或否。
輸入: 這輛車壞了。他們不能找到替代方案。我浪費了兩個小時。
輸出:
輸入: 客戶服務非常有幫助。他們知道我正在探望我 91 歲的母親,並免費升級了一輛對她來說更舒適的汽車。
輸出:"""


執行輸出結果

prompt1 = "\n".join([instruction, "輸入: " + comments[2], "輸出: "])
print(prompt1)

基于给出的评论判断用户对这次体验是否满意。仅回答是或否。
输入: 这辆车坏了。他们不能找到替代方案。我浪费了两个小时。
输出: 否
输入: 客户服务非常有帮助。他们知道我正在探望我 91 岁的母亲,并免费升级了一辆对她来说更舒适的汽车。
输出: 是
输入: 我主要担心的是互联网上的报价不是我开具发票的价格。我不得不打电话给提供商并解决问题,但这需要时间而且很麻烦。
输出:

print(model.generate_text(prompt=prompt1))

小心得 : 開拓新視野與實踐應用

這次實作 IBM Watsonx.ai 平台支援 Python SDK,以及可以很方便的去呼叫和應用各種 LLM model,並使用租車服務的顧客滿意度作為應用場景,展示 LLM 在現今充斥著 AI 的時代,有沒有什麼快速、隨插即用的可能,我想 LLM 很適合扮演這樣的角色,尤其是面對多元的語言,展現模型對於語言的理解能力與強大。

同時,面對的挑戰為如何快速理解已預訓練的模型的優點,並在對的場景選擇適合的編碼方式、選擇適合的模型,變得更為重要。無論是貪婪解碼、beam search 還是其他解碼技術,每種方法都有其獨特的適用場景和優勢。正如我們所見,適當的設置和參數調整能顯著影響模型的性能和輸出質量。

總結來說,IBM Watsonx.ai 和其豐富的模型庫為開發者提供了一個強大的工具集與平台,不僅可以促進創新和探索,還可以應對實際的業務挑戰。下一篇還有更多實作的應用場景,感謝閱讀到這裡的你,我們下次見!

參考資料

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.