WFU

2024/3/19

向專家學習:ihower 「LLM 應用開發工作坊」課後心得

【初次】


第一次的課程開在11月,深深覺得講師 ihower 對於 LLM 真是是有「愛」。對於 LLM 各種不同的技巧,從初級入門的串接 API,到 prompt 技巧、CoT,然後 RAG 等,通通都有涉獵。非資訊本科生的我,如同劉姥姥進大觀園般,看著 ihower 快速講解每個 colab 程式。

說起來慚愧,11月後我自己在 LLM 的接觸面向減少許多,追了大半年的 AI 潮流,東碰一點、西碰一小塊,到最後真的累了,只想要躺平。

離上次的課程才隔四個月,謝謝主辦單位主動在課程群組歡迎大家「回訓」。

回訓,或許是重新讓自己再檢視看看,對於 LLM 這塊領域,哪些層面是自己有興趣的。


【回訓】


跟第一次上課的感想一樣,短短三堂加起來8小時的課,知識量真的很大。

三堂課,知識架構是一層層推上去的,也代表難度也是推疊上去的。

第一堂的重點放在 API的串接、prompt 基本知識(zero-shot, few-shot, CoT)。
第二堂的重點有 Chaining prompt , Embedding 和 RAG(檢索增強生成)
第三堂的重點是 Agent 及 functional calling。

非本科生的我,其實在第二堂的 RAG 開始,腦袋運轉就開始打結了,哈。

【特色】


這次的回訓,我對我自己的目標沒那麼高,我的目標是針對我有興趣的主題,利用 ihower 自己整理過的講義,也實際操作過的程式碼來學習。

ihower 說這堂課含金量最高的是 colab 程式碼,講義反而是其次。(colab程式碼有 34 個!!!)

真的把一個個的 colab 程式碼去執行、去了解,真的會收獲很多。類似的案例(書籍分類),在第一堂時用基本的 prompt 可以做到,到第二堂課換不同的概念也可以做到,沒想到第三堂課,還可利用functional calling 的 json schema 來完成分類,真的頗神奇。

人其實是無法理解沒見過的東西,人的想像力也會因為自我的見識而受限。以我自己的背影,同樣的觀點放在「程式碼」也是。雖然我可以把我要達成的功能與需求告訴 LLM ,請他產出 code,但自己在看 ihower 整理的程式碼時,會讓我對一些設計很巧妙的 code 感到佩服,也讓自己多出對 code 的想像力空間。

多數課程或書籍,甚至官方的 demo 文件,呼叫 LLM API 的方式,最常用的方式是直接安裝該 LLM 對應的 python 套件。不過 ihower 的程式碼中,呼叫 API 幾乎都是用 HTTP library 的方式,我真心覺得這才是基本功。這樣的方式才不會讓開發受限於 python 語言,也減少套件層層包裝後的黑盒子。

【和初次的差異】


說到黑盒子,langchain 也算是在排行榜內(笑)。

和初次課程相比,這次的課程中 langchain 佔比降低了,甚至 ihower 直接就說 langchain 不用學。課程中雖然有用 langchain 來執行部份程式,但也都有對應不用到 langchain 的程式法解法。

在初次課程時,functional calling 才剛冒出來。這次的回訓,在這一塊的講解更為全面,應用層面也更多了,這也是讓我最有興趣的地方。

Assistant API  也是新東西,但 ihower 有將目前還不建議商用的理由寫出。聽專家一句話,真的會少走很多冤枉路。


【感想】


這堂課很適合想要全面了解如何與 LLM 串接與應用的人來學習。

要有心理準備,你會被講師準備超豐富的資料量驚訝到,你也會被講師對 LLM 的熱情驚豔到。這真是對 LLM 有熱情才能主動去吸收這麼多的資訊。如果你不怕看程式碼,也想要從最基本的程式碼去了解 LLM 的應用,這堂「LLM 應用開發工作坊」真心推!

2023/9/16

使用 iOS 的 捷徑,透過呼叫 OpenAI API 轉換格式後,增加 Google 日曆行程

📝 OpenAI 和 Google 日曆整合指南

此指南將教你如何使用 iOS 的「捷徑」與 Google Apps Script,使你能夠方便地將資訊增加到 Google 日曆中。


📌 需求:

① 口說增加 google 日曆行程
② 複製文件或信件上的開會資訊,轉存為 google 日曆行程
③ 跳出文字輸入區,輸入後增加 google 日曆行程


🛠 所需操作 app 或介面:

① iOS 的捷徑
② Google apps script


📋 前置作業

① OpenAI API Key
② 你想要預設輸入的 google 日曆群組 (google 日曆 ID) (怎麼找日曆ID 可參照 https://support.google.com/a/answer/1626902?hl=zh-Hant )


🔧 Google Apps Script 步驟

① 網址: https://script.google.com/ 。開「新專案」,在預設的「檔案:程式碼.gs」內,複製以下程式碼貼上。也可連至 GitHub 複製程式碼 
const CALENDAR_ID = '你的calendar ID';  // 替換成你的calendar ID
const OPENAI_API_TOKEN = 'Bearer sk-你的openAI API';  // 替換成你的openAI API

function doGet(e) {
  handleRequest(e.parameter.action);
}

function doPost(e) {
  handleRequest(e.postData.contents);
}

function handleRequest(data) {
  var eventData = JSON.parse(openAIGPT35Turbo(data));
  Calendar.Events.insert(eventData, CALENDAR_ID);
}

function openAIGPT35Turbo(userPrompt) {
  var url = 'https://api.openai.com/v1/chat/completions';
  var headers = {
    'Authorization': OPENAI_API_TOKEN,
    'Content-Type': 'application/json'
  };
 
  var inputPrompt = '今天的日期是 ' + getFormattedDate() + '。請將使用者輸入的句子轉為 google calendar json 格式,目的是添加新的行程於 google calendar中。輸出只需要寫出 json 內容,其餘都不需要寫。';
  var data = {
    'model': 'gpt-3.5-turbo',
    'messages': [
      { 'role': 'system', 'content': inputPrompt },
      { 'role': 'user', 'content': userPrompt }
    ],
    'temperature': 0.1,
  };

  try {
    var response = UrlFetchApp.fetch(url, { 'method': 'post', 'headers': headers, 'payload': JSON.stringify(data) });
    return JSON.parse(response.getContentText())['choices'][0]['message']['content'];
  } catch (error) {
    Logger.log(error);
    return "Error: " + error;
  }
}

function getFormattedDate() {
  var today = new Date();
  var year = today.getFullYear();
  var month = String(today.getMonth() + 1).padStart(2, '0');
  var day = String(today.getDate()).padStart(2, '0');
  var daysInChinese = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  return year + '-' + month + '-' + day + '(' + daysInChinese[today.getDay()] + ')';
}

② 在左側欄位的「服務」按「+」,增加「Google Calendar API」服務
③ 試著「執行」一次,會發生錯誤,目的是要開通 google 帳號的權限
④ 右上角「部署」-「新增部署作業」-「選取類型」-「網頁應用程式」,誰可以存取這一欄位選取「所有人」,右下角「部署」。部署後會產出一長串的「網址」,在下一個步驟會用到。


📱iOS 的捷徑步驟:

📸 請參照附加的截圖進行操作,或根據個人需求進行調整。 

需求 口說增加 google 日曆行程

第四步驟的「上一步驟的網址」就是 google apps script 部署後的網址,記得要貼上。網址貼上後,後面要加上"?action="的字串。

🚀啟動步驟: 「嘿,Siri,增加行程(這是我內定的捷徑名稱)



▶️ 示範①


需求 複製文字或信件上的開會資訊,轉存為 google 日曆行程

第四步驟的「前述網址」就是 google apps script 部署後的網址,記得要貼上。
🚀啟動步驟: 先把行程的文字內容圈選 -> 複製 -> 「嘿,Siri,貼上行程(這是我內定的捷徑名稱)



▶️ 示範②


需求 跳出文字輸入區,輸入後增加 google 日曆行程 (for mac only)

跳出文字輸入區的功能,只有在 mac 上才會啟動,在 iPhone 上只會出現 Siri 聽取的圖示。
第四步驟的「前述步驟網址」就是 google apps script 部署後的網址,記得要貼上。
🚀啟動步驟: 「嘿,Siri,輸入行程(這是我內定的捷徑名稱)




🎉 現在,你應該可以順利地使用這些功能了! 享受你的高效生產力吧!
🚀 希望這個指南能夠幫助你更容易地整合 OpenAI 和 Google 日曆!


2023/6/3

[學習筆記] 用 Whisper 來轉出 DeapLerning.AI 影片字幕檔

緣起

吳恩達 (Andrew Ng) 陸續在 DeepLearning.AI 上推出和 生成式AI 有關的免費課程。之前推出的 「ChatGPT Prompt Engineering for Developers」,每一小段的課程時間不長,又搭配成 Jupyter 程式視窗同步展示,同時又有字幕,這讓學習過程的體驗很不錯呀! 

日前吳恩達一次推出三個課程: (1) Building Systems with the ChatGPT API; (2) How Diffusion Models Work; (3) LangChain for LLM Application Development。這一下子突然冒出的資訊量實在是太大了,但重點是這次三段課程居然還沒有上「英文字幕」,在有口音且又沒有字幕下,這會讓我的學習的動力減少許多(殘念)。 

DeepLearning.AI 的影片檔按滑鼠右鍵是可以下載的,所以興起了今日突然興起的學習目標:「把影片檔用Whisper 轉出 SRT字幕檔,再用沉浸式翻譯轉為雙語字幕。」 對於程式小白的我,面對程式碼或是寫程式軟體的操作上還是會碰壁且一直卡關,一個早上的亂玩後還是有得到成果。

正在執行轉檔時的截圖



以下是自己學習/試誤的過程,記錄下來以免自己日後忘了: 

一、學習怎麼在 Visual Studio Code 開 python 虛擬環境 


OpenAI Whisper 要求的 python 版本是 3.9。Python很煩的是版本一大堆,每個程式要求的 python 版本或是另外安裝的 package 的版本都可能不一致。所以這次學習著如何在 Visual Studio Code 開 python 虛擬環境,讓彼此不同程式的執行環境是獨立出來的。



指令其實很簡單:python -m venv {虛擬環境的目錄名} 

後面比較麻煩的是一些小設定或安裝 package 時會出現錯誤,反正有出現錯誤訊息時,把整個訊息丟給 ChatGPT,通常都能得到還不錯的解決方式的回答。 

二、學習怎麼在本地端使用 Whisper 將語音轉字幕檔 


這部份網路上有不少人寫 step by step 的步驟,我主要參考的是: 

這邊我比較卡關的是 "choco install ffmpeg" 這一段的安裝,在虛擬環境下的設定有卡住,後來 google + chatGPT 解決。

三、一次只能轉一個檔的程式碼,改寫為一次轉整個目錄所有影音檔的程式碼 


因為一次只能轉一個檔很麻煩,不能放在背景讓它自己跑,因為前景正在打玩起來其實有點無聊的 Diablo4。這部份就是請 ChatGPT4 直接改寫,也測試 ChatGPT 最近的新功能 Share。 測過後發現分享原始對話串的人不能刪除原始對話,不然對方會無法載入繼續展開對話。 


四、用 沉浸式翻譯 外掛將 SRT 字幕翻擇成雙語字幕


沉浸式翻譯真的是好物,能解決大多數和文字類翻譯有關的需求。沉浸式翻譯內建「翻譯字幕檔案」,讚!

雖然它可以用 OpenAI API 來接 ChatGPT 3.5/4 來翻譯,但我最常選擇的是「Google翻譯」,因為其實是太快了。若對翻譯品質不太要求,只求讀得下去就好,選「Google翻譯」是最佳解。

成果

輸出設定如下:
  • 英文字幕:Whisper Model_Type = "medium" 
  • 雙語字幕:沉浸式翻譯的翻譯器「Google翻譯」
檔案下載:


2023/4/23

eGFR計算機

CKD Calculator







計算結果

2023/2/28

運用 ChatGPT 執行 EBM 的第1與第2步驟

 

簡介

Evidence-Based Medicine (EBM) 是一個從臨床經驗和最新的科學證據中獲得的醫學決策方法,它試圖解決傳統醫學中的局限性,這種方法可以幫助人們更好地了解不同治療方法的優缺點,以便做出更明智的決策。然而,初學者在實證五階段步驟(提出問題、搜集證據、評估證據、應用證據、評估結果)中常常遇到困難,初學者往往需要更多的指導與方向指引,此時使用自然語言處理技術的 ChatGPT 模型是可以用來幫助執行 EBM 的前面步驟。本文將介紹如何運用 ChatGPT 加速 EBM 的第1與第2步驟。


第1步驟:提出問題

在 EBM 的第1步驟中需要明確提出一個可回答的臨床問題。這個問題應該是明確的、具體的、可測量的、有關聯性的、可行的和有意義的。只需要輸入一個簡要的問題描述,使用 ChatGPT 可以判別是否為「前景問題」、並將問題轉換為 PICO 架構、也可以判斷問題的類型(治療/預後/診斷/傷害)。

運用 ChatGPT 下指令需要注意以下三點:明確的問題、適當的關鍵詞、適時的導正方向。

至於要用「英文」或是「中文」發問呢?雖然 ChatGPT 的訓練資料庫是英文為大宗,但兩種語言我個人試過後,感覺答案的精準度還是「英文」會好一些。若英文不夠好,或是懶的再用中翻英後再問它(可另開另一個 ChatGPT 對話串翻譯、或用 DeepL 來翻),直接問「中文」也是 OK 的。以下範例為求平易近人(?),和 ChatGPT 的溝通仍使用中文來問。

在開始新一串 ChatGPT EBM 對話的第一個指令,可以先指示你想要 ChatGPT 扮演的角色、遵守的原則或規則。

指令:我希望你能扮演一位專門在教「實證醫學(evidence based medicine)」教授的角色,你的目標聽眾是醫學生。資料來源以英文資料為主。除非我另有指定,以下的回答請盡可能翻譯成繁體中文來回答。如果你理解上述規則,請回答“是”。

下一步驟,我們可以測試 ChatGPT 是否熟悉實證醫學的基本常識。EBM第1步驟包含有前景問題、背景問題以及PICO架構。我們可以用這些問題來測試並指引 AI 教授的指導方向,好讓之後的對話能確保在正確的道路上。

指令一:請用少於100字的內容解釋 "background question" 和 "foreground question"。指令二:請用少於100字的內容解釋 "PICO framework"

進入正題,我在此網頁挑選了一個臨床問題: "對於患有SLE的成年患者,飲用薑黃茶是否比使用Plaquenil更有效地減輕關節疼痛?"(原文為: "In adult patients with SLE, is consuming turmeric tea more effective than Plaquenil at reducing joint pain?")。接下來,請 ChatGPT 判斷是「前景問題」或「背景問題」及拆解成 PICO 四要素。

指令:臨床問題是:「在患有SLE的成年患者中,飲用薑黃茶是否比使用Plaquenil更有效地減輕關節疼痛?(In adult patients with SLE, is consuming turmeric tea more effective than Plaquenil at reducing joint pain?)」,請問此問題是「前景問題」還是「背景問題」,並請用PICO架構拆解此臨床問題。

在進入第二步驟之前,我們需要仔細檢查PICO,確保所有的英文單詞都被轉換並查找其同義詞。此外,我們需要定義問題類型,包括治療、預後、診斷和傷害。透過這些步驟,我們可以判斷哪一種醫學文獻最適合用來解答此臨床問題。這些問題,ChatGPT 是做的到的…

指令:請將上述 PICO 轉換成英文關鍵字與同義字,並請分析此 PICO 是屬於哪一種問題類型(治療/預後/診斷/傷害)? 且適合用哪一種醫學文獻來解答此臨床問題?

第2步驟:搜尋證據

在EBM中,第二步驟的前半段在於把搜尋詞轉換為搜尋字串。轉換搜尋詞時,需要使用「同義詞」來進行搜索。以前教實證都會教 Mesh Terms 的使用,使用Mesh Terms進行轉換可以進一步提高搜索效率和準確性,不過越來越聰明的 Pubmed 已經具有自動轉換為MeSH terms的功能後,就比較少教了,但我們仍可試試 ChatGPT 在此方面的能力。決定好搜尋詞及 Mesh Terms後,就是選取 PICO 各部份的組合來進行搜尋,我們就請 Chat GPT 試看看最常使用 P+I 的組合。

指令:我想用上述的 PICO 中的 P+I 來進行 PubMed 的文獻搜尋,請建議適合的搜尋字串。且若有適合的 MeSH Terms也包含在內。

我把 ChatGPT 建議的「搜尋字串」直接貼到 PubMed 中搜尋,PubMed有顯示出搜尋詞有小錯誤,沒關係,我就接受這一點小失誤繼續看下去,目前有搜尋到 25 篇文獻。


接著試著把前 10 篇文獻的標題用 PubMed 的 Save 功能 (Summary) 匯出,請 ChatGPT 幫我挑選有符合原始 PICO 的文獻,他幫我挑出了兩篇。



這次用 ChatGPT 來執行 EBM 的第一及第二步驟就告一段落。ChatGPT 輸出結果仍然不完美,但能有這樣輸出我給予 80 分的評分!


總結

運用 ChatGPT 是可以做到 EBM 的第1與第2步驟。 然而,對於初學者來說,在使用 ChatGPT 進行問題求解時可能會遇到一些困難,由自然語言處理技術而生的 ChatGPT,他的回答是基於大量的訓練數據生成的,但這並不意味著它的回答是正確的,這時就會需要「人腦」去確保 ChatGPT 給出的答案是可靠的。

有人會問,AI 是否讓學習實證醫學變得無意義?實際上,AI 可能使得學習實證醫學變得更重要,因為你需要具備相關專業能力,才能判斷 AI 給出的答案是否正確。對於已經具備基本能力的人來說,善用 AI 可以縮短執行 EBM 或是寫 EBM 報告的時間。

使用 ChatGPT 時,需要注意問題的明確性、關鍵詞的適當性和答案的可靠性。在我與 ChatGPT 玩的過程中,有時他回答的方向會飄向奇怪的遠方,這時可以按「Regenerate reponse」請他重新回答,或是下一題請他導回正確方向。來來回回和 ChatGPT 對話是一件很好玩也很舒壓(?)的事,AI這幾個月的進步實在太快了,我們都應該抱著一頭熱的看熱鬧心情,一起來玩來趕上這個熱潮才是!


利益揭露

本文章的撰寫是極多次使用 Notion AI 功能,合併使用人腦修改而成。不負責任的目視計算,約保留 40% Notion AI 產出的文字。




2019/8/29

[生活雜感] 我所經歷的白內障


「這是外星人的白眼睛」,我和小孩這樣開玩笑著。

2019/8/16

從暑假小孩學游泳體驗《教學的技術》



2019年3月14日,福哥佛心地在花蓮門諾醫院舉辦公益演講簽書會,讓花蓮的鄉親能一窺《教學的技術》的實際操作,在當中我也(很抖的)上台分享「快速了解實證精神」,如何讓一般民眾能了解「實證精神」並去實際去操作。在福哥的場子能上台分享是難得的體驗,結束後想說應該寫點文字來分享「教學」,不過一直遲遲沒有下筆,直到今年的暑假…