用 AI 實際解決工作問題!這種讓人痛苦的工作,還是讓AI來吧

更新 發佈閱讀 11 分鐘
raw-image

這篇來寫,嘗試用GPT4解決工作中,一個讓我渾身難受的問題。

任務說明

我要做的事情是,把word檔中表格的部分資訊擷取出來。下圖的示範表格即是一例。

raw-image

我需要存取表格中特定元素資訊,例如 Net Calorific Value,我得存下Min. 4,750這個訊息,同理可知,Total Sulfur的話,我需要記下他是 Max. 0.6。


背景 (涉及一點技術上的名詞)

先前的作法是,我用python的docx讀取word檔案,並且識別文件中可能存在的「表格」。第二步用正則表達式──如果不知道這是啥,就把它當作是一個找尋規則的方法──根據表格型態不同,擷取出目標元素的對應數值。

然而,這個方法令人痛苦......。因為這些word表格是人手去填的,規則不一。例如,可能有人會把Net Calorific Value寫在第三個列,有些人把他寫去第四列;有人的4,750有加逗號,有的沒有加(4750)。

這就導致了我所寫的規則,永遠都有例外,以至於這個工作長期停滯不前。執行上竟然花了兩周,才完成了20%的資料整理。


來點 AI !

仔細想想,應該讓AI來幫忙才對,因為AI適合在不規則中歸納訊息。怎麼做?

展示一下測試用的程式碼。

'''
1 接續前面步驟,讀取word檔並偵測出表格
2 回傳結果tables
'''
print(tables[3]) # 查看眾多tables中的第4個table,即本文的表1

這是一個二維的列表如下。

[['Item', 'Unit ', 'Limit of Range'],  
['Total Moisture (TM) \n(As received basis)', '% WT', 'Max. 28'],
['Volatile Matter (Air dried basis)\nFixed Carbon (Air dried basis)\nAsh (Air dried basis)', '% WT\n% WT\n% WT', 'Min. 22∼Max. 45\nMax. 60\nMax. 17'],
['Total Sulfur (As received basis)', '% WT', 'Max. 0.6'],
['Grindability (HGI)', '', 'Min. 45~Max. 65'],
['(As Received Basis)\nGross Calorific Value\nNet Calorific Value *', '\nkcal/kg\nkcal/kg', '\n\nMin. 4,750'],
['Nitrogen (Dry ash free basis)', '% WT', 'Max. 2.2'],
['Ash Fusion Temperature (IDT) \n(Reducing Atmosphere) ', 'oC', 'Min. 1,150'],
['CSN(Crucible Swelling Number)', '', 'Less than 2\n(0≤CSN<2)'],
['Mercury(HG)', '㎍/g', ''],
['Ash Analysis\nSiO₂\nFe₂O₃\nNa₂O\nK₂O', '\n% WT\n% WT\n% WT\n% WT', '\nMax. 70\nMax. 16\nMax. 2\nMax. 3'],
['Size Distribution\nAbove 50mm\nUnder 2mm \nUnder 0.25mm', '\n%\n%\n%', '\nMax. 5\nMax. 40\nMax. 17']
]

這個表格,就是本文表例1的完整長相,現在變成python列表。

我要讓AI理解這個列表,並且摘要出我需要的元素數值。

下面做的事情很簡單,就是把前面python 列表所有元素,全部都融合為一段文字,很長的文字。

import openai
openai.api_key = TOKEN # 輸入你的API KEY

tb_specs = tables[3] # 本文的表1
output_txt = ""

for sub_lst in tb_specs:
  for ele in sub_lst:
    output_txt += " " + ele.strip("\n")

print(output_txt)

產出如下,所有的列/欄位名稱與數值,通通都混在一起,變成一串很長的文字。

' Item Unit  Limit of Range Total Moisture (TM) \n(As received basis) % WT Max. 28 Volatile Matter (Air dried basis)\nFixed Carbon (Air dried basis)\nAsh (Air dried basis) % WT\n% WT\n% WT Min. 22∼Max. 45\nMax. 60\nMax. 17 Total Sulfur (As received basis) % WT Max. 0.6 Grindability (HGI)  Min. 45~Max. 65 (As Received Basis)\nGross Calorific Value\nNet Calorific Value * kcal/kg\nkcal/kg Min. 4,750 Nitrogen (Dry ash free basis) % WT Max. 2.2 Ash Fusion Temperature (IDT) \n(Reducing Atmosphere)   oC Min. 1,150 CSN(Crucible Swelling Number)  Less than 2\n(0≤CSN<2) Mercury(HG) ㎍/g  Ash Analysis\nSiO₂\nFe₂O₃\nNa₂O\nK₂O % WT\n% WT\n% WT\n% WT Max. 70\nMax. 16\nMax. 2\nMax. 3 Size Distribution\nAbove  50mm\nUnder  2mm \nUnder  0.25mm %\n%\n% Max. 5\nMax. 40\nMax. 17'

再來如下,把那串長字丟到ChatGPT裡面,讓他閱讀與回答。

選用模型 (model) 為GPT4。在message參數中,輸入你要他做的事情 (input),餵給他剛才那個很長很長的文字串(output_txt)。

input = "請將內容整理成表格, 並告訴我 Net Calorific Value的數值, 回傳數字(要包含Min, Max)但不要回傳出表格"
completion = openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": input},
    {"role": "user", "content": output_txt},
  ]
)

然後察看結果

print(completion.choices[0].message.content)

'Net Calorific Value 的數值範圍是:最小值 4,750 kcal/kg,最大值未提供。'

回應內容非常正確,Net Calorific Value的數值範圍,就是Min. 4,750,你可以回去看一下表1。

如果我想看Total Sulfur,不知道能否做到?如法炮製前面的步驟,只是換一個問題。

input = "請將內容整理成表格, 並告訴我 Total Sulfur (As received basis) 的數值, 回傳數字(要包含Min, Max, 如果有的話)但不要回傳出表格"
completion = openai.ChatCompletion.create(
model="gpt-4",
messages=[
  {"role": "system", "content": input},
  {"role": "user", "content": output_txt},
 ]
)

print(completion.choices[0].message.content)
'Total Sulfur (As received basis) 的數值為 % WT Max. 0.6。'

結果還是對的!


兩種後續嘗試

1. 我會繼續用上述方式,找尋其他更多我要的資訊,如果都能成功,我就可以減輕寫複雜程式的痛苦。

2. 嘗試下出更好的input,也就是讓GPT4直接吐給出我想要的數值。目前他的回答都是一串完整的句子,其實我不用,我比較需要這樣形式:

Net Calorific Value: Min. 4,750

這樣資料整理起來就更輕鬆。


三個心得

1. 我覺得GPT4非常強大,我們給他讀的是一串混亂的文字,他竟然能理解出哪個數字對應哪個名稱。他的理解力確實不一般,我還有其他領域的嘗試,也發現了這點──之後有機會繼續分享!

2. 問問題的能力很重要。

我是經過反覆試驗,了解到怎麼樣的問法才是合適的問法,並讓GPT明白如何回答。請看我上面程式碼,我是先叫 GPT 把輸入那串複雜文字,整理成「表格」,再讓他回傳 Net Calorific Value 的數字。如果沒有整表格這一步,他回傳任何數字都是錯的。

3. 也因此,我們注意到ChatGPT的極限:他對理解表格訊息的理解,是一個大罩門。原因我大概想了幾點,之後有機會再繼續!


關於這個讓人渾身難受的任務,現在已經看見希望的曙光了。




留言
avatar-img
留言分享你的想法!
avatar-img
Darren的沙龍
15會員
14內容數
大數據意味著什麼?數據科學背後有怎樣的mind set和技術?數據科學家又做些什麼?這些科技/技術,帶給我們什麼生活上和人文上的省思?這個專題會橫跨這些彼此相關的面向,避開生澀的專業詞彙,探索這些事情背後的樣貌。應該會是有趣的知識和想法分享﹝笑﹞
Darren的沙龍的其他內容
2024/08/31
文章主攻四大領域:機率與統計、計量經濟和量化金融分析。以機率統計為核心主幹,詳加說明其精神與應用。也會輔以其餘三個領域的介紹作為統計實例。統計學是AI / 機器學習背後的英雄,假設檢定與統計分布是其兩大特色,前者找出彼此相互關聯的變數;後者則幫助我們進行模擬和抽樣,幫助我們找尋最優解或近似真實值。
Thumbnail
2024/08/31
文章主攻四大領域:機率與統計、計量經濟和量化金融分析。以機率統計為核心主幹,詳加說明其精神與應用。也會輔以其餘三個領域的介紹作為統計實例。統計學是AI / 機器學習背後的英雄,假設檢定與統計分布是其兩大特色,前者找出彼此相互關聯的變數;後者則幫助我們進行模擬和抽樣,幫助我們找尋最優解或近似真實值。
Thumbnail
2024/07/19
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
Thumbnail
2024/07/19
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
Thumbnail
2024/07/05
本文談及資料科學的領域與分工。首先是建造一個AI的研發流程,資料收集到 AI 模型訓練的過程,AI經歷這一切流程被創造出來並產生價值;再來本文也提及在這個領域中的各種腳色、資料工程師、數據庫工程師、資料科學家和資料分析師的各種介紹。並且強調跨領域合作的重要性。
Thumbnail
2024/07/05
本文談及資料科學的領域與分工。首先是建造一個AI的研發流程,資料收集到 AI 模型訓練的過程,AI經歷這一切流程被創造出來並產生價值;再來本文也提及在這個領域中的各種腳色、資料工程師、數據庫工程師、資料科學家和資料分析師的各種介紹。並且強調跨領域合作的重要性。
Thumbnail
看更多
你可能也想看
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
雙11於許多人而言,不只是單純的折扣狂歡,更是行事曆裡預定的,對美好生活的憧憬。 錢錢沒有不見,它變成了快樂,跟讓臥房、辦公桌、每天早晨的咖啡香升級的樣子! 這次格編突擊辦公室,也邀請 vocus「野格團」創作者分享掀開蝦皮購物車的簾幕,「加入購物車」的瞬間,藏著哪些靈感,或是對美好生活的想像?
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目會給定一個輸入陣列temperatures ,分別代表每一天的溫度。 請計算每一天還要再過幾天才會遇到更溫暖的日子,如果遇不到,則回填0。 請以陣列的形式返回答案。 題目的原文敘述 約束條件 Constraints: 1 <= temperatures.length <= 10^
Thumbnail
題目會給定一個輸入陣列temperatures ,分別代表每一天的溫度。 請計算每一天還要再過幾天才會遇到更溫暖的日子,如果遇不到,則回填0。 請以陣列的形式返回答案。 題目的原文敘述 約束條件 Constraints: 1 <= temperatures.length <= 10^
Thumbnail
粉絲提問需求 儲存格中這一段字串:baseccy=usd,baseccyamoun=1300,type=short} 要如何把字串中1300的數字給抓出來,其實方式蠻多的,今天來介紹3種方式 第一種剖析法: 先將資料選取出來之後利用資料剖析,因為資料的規則數字是在=之後與逗號之前,所以可以先將逗號剖
Thumbnail
粉絲提問需求 儲存格中這一段字串:baseccy=usd,baseccyamoun=1300,type=short} 要如何把字串中1300的數字給抓出來,其實方式蠻多的,今天來介紹3種方式 第一種剖析法: 先將資料選取出來之後利用資料剖析,因為資料的規則數字是在=之後與逗號之前,所以可以先將逗號剖
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
Thumbnail
我們介紹了字串和列表的索引和切片操作。索引使用方括號[]來選擇字串或列表中的特定元素,並可以使用正向索引(從0開始)或反向索引(從最後一個元素為-1)來訪問元素。切片使用方括號[]和冒號:來選擇字串或列表中的一段子序列,指定起始位置和結束位置(不包含),並可以使用步長來控制間隔。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News