NLP 網路爬蟲 資料科學

經典 NLP 任務標籤生成:串接非官方 ChatGPT API

turned on computer monitor displaying text

這篇文章紀錄我串接非官方 ChatGPT API 「試圖」取得 NLP 資訊抽取任務標籤的過程。結論是

  • ChatGPT 一段時間內的回應次數有限制,需要等待一段時間再繼續
  • 需要在 prompt 中制定回應格式,他才不會到後面開始自由發揮,以至於很難收束標籤資料進模型 re-train

以下開始過程介紹:


既然 ChatGPT 在 NLP 資訊抽取任務那麼強大,大家一定會想直接使用他;但是被別人掌握 API 這個維護上面總是會怕怕的

  • API 速度疑慮:因為他要即時生成回答,API 速度不是很快
  • 連續用量限制:一小時內間隔數秒發送的 Requests 有次數上限

所以自家產品的 NLP 服務,還是會自己訓練提供;原本一般公司 算力、標註數據量都比不過巨頭,難以自己訓練 Pre-trained Models ,頂多用用人家開源的 PLM 做下游任務 fine-tuning。這時候可能會外包數據標註工作,此時我覺得 ChatGPT 就可派上用場了!

為 NLP 任務撰寫 prompt 模板

不管是 GPT-3 還是 ChatGPT(GPT-3.5) 都是利用 text generation 技術,因此我們可以嘗試將原本的資訊抽取任務 input 轉換成 prompt 格式,來運用到語言生成模型的優勢。

以情緒分類的 few-shot learning prompt 為例:

請從 正面、負面、中立 三種情緒中,選擇最能描述文本情緒的選項:
文本: 據知情人士透露, AIG已委托摩根士丹利和德國銀行AG作為友邦保險進行公開上市的全球協調人
情緒: 中立
文本: 國泰台大產學合作團隊分析,明年全球景氣將放緩,除大陸以外,各國明年經濟景氣都會比今年差,出口恐受全球經濟不佳及需求不振影響,成長動力不足
情緒: 負面
文本: 國發會透過12項關鍵戰略技術,2030發電占比也調整為燃氣50%、再生能源27至30%、燃煤20%,逐步降低能源依賴度,預期綠電、儲能電網族群將可受惠
情緒:

給模型幾筆 sample data 後,留下一個讓他接續的斷點,用這個方式產生新的 label

用 Python 串接 ChatGPT

簡單來說,ChatGPT 頁面在你跟他對話同時,是透過一隻 conversation API 來傳送你們之間的訊息;而這個 repo 在做的事情就是把從驗證身分到傳送訊息接收回應的過程用 Python 完成。

https://github.com/terry3041/pyChatGPT/blob/main/src/pyChatGPT/pyChatGPT.py

我去細看他的程式碼,光驗證的 uri 就有 3 個,還沒算 login 時又需要 email 和 password

如果有 session_token,可以直接 GET auth_uri 來取得 accessToken

如果只有 email, passsword 就要先 GET csrf_uri 取得 crsfToken 、再 POST login_uri 取得 session_token

csrf_uri = "https://chat.openai.com/api/auth/csrf"
login_uri = "https://chat.openai.com/api/auth/signin/auth0?prompt=login"
auth_uri = "https://chat.openai.com/api/auth/session"

拿到 session_tokenaccessToken 才可以 POST send_msg_uri 把對話傳給 ChatGPT 的後端 API;ChatGPT 會以 dict 格式回傳他回覆的內容。

send_msg_uri = "https://chat.openai.com/backend-api/conversation"
cookie 內的 session_token

原本這樣用起來好好的,雖然 API 每 40 秒才能回應,而且 1hr 內有 Requests 次數限制,直到…

2022/12/15:ChatGPT 新增了 Cloudflare !!

Cloudflare?

Cloudflare 是一家提供網路安全、性能優化、CDN服務的公司。它的產品和服務可以幫助企業和網站擁有者改善網站的安全性、加速網站載入速度、減少網站訪問延遲,並提供許多其他功能,如DDoS攻擊防禦、內容分发網路 (CDN)、自動化網站備份、訪問控制、威脅情報收集和分析等。

總而言之,Cloudflare 只允許帶指定 Cookie 的 JavaScript 瀏覽器通過驗證,其餘的會被判定是機器人阻擋在外。想當然耳,這一個 repo 使用純 Requests 也失效了

用 Selenium 繞過 ChatGPT Cloudflare 人機驗證

踩坑紀錄

以下嘗試過的方法:

Python
  • 用第三方服務 ScrapingAnt 轉址 + Requests 來繞過 cloudflare
    • Error : Our browser was detected by target site. Try again later or contact us support@scrapingant.com…
  • 用可以帶入 Headers 的 SeleniumWire 繞過 cloudflare
    • Error: selenium.common.exceptions.TimeoutException 反而會一直跳出 cloudflare 的驗證畫面
  • 用躲避驗證的 undetected_chromedriver 防止觸發 cloudflare
    • Error: ‘Chrome’ object has no attribute ‘_client’
      無法像 SeleniumWire 透過 driver._client.set_header_overrides(headers=headers) 帶入 headers
  • cloudflare-scrapecloudscraper(專門應對 cloudflare 驗證的 scrapy)
    • Error: 403 Client Error: Forbidden for url
    • 官方 issue 說他們無法解 CAPTCHA ,我在想因為後來我用模擬瀏覽器開啟來的 ChatGPT 頁面都是要點擊才會驗證過,有可能是因為這樣所以也不 work

2022/12/25: 發現多個開源 repo 都更新了繞過 cloudflare 的部分

其中有個 python 開發的 repo 也是用到 undetected_chromedriver

https://github.com/terry3041/pyChatGPT
https://github.com/transitive-bullshit/chatgpt-api

測試

實際用改好的 prompt 透過 pyChatGPT 提供的串接方法連續取得 label
(為了避免 session_token 過期,我用 email, password 方式登入,所以每次開始抓取前還是會要從手機按登入驗證)

前幾次 Query 都可以完美的給我回覆

但多次 query 後發現幾個問題:

  • 他會開始自由發揮XD(如下圖) 不在我原本想要讓他回答的範圍裡
    我猜是因為 ChatGPT 預設的 temperature 可能被設定的比較大(*temperature 是 OpenAI GPT-3 的參數之一,會影響模型生成文字的隨機程度,0 是最不隨機~ 1 最隨機)
  • 大概只能撐 10 次的 Query (間歇 3 秒) 就會開始出現 Hmm…something seems to have gone wrong. Maybe try me again in a little bit. 的紅字回覆
    • 設定條件讓他 clear conversation, reload,甚至關掉瀏覽器全部重來,還是會出現紅字或不 output 的情況…

總之測完發現要用在 production 還是很不 friendly …

OpenAI API

以替代方案來說,OpenAI 有提供 GPT-3 的付費 API 接口…

任務類型有 text completion, code completion, image generation, get embeddings, fine-tuning 等,真的是從應用串接到研發訓練都一條龍收費了啊

如下圖試打回 API 傳我想要的 labeled data

但是以他的 token 收費算下來,如果要大量取得標籤不是一個長久之計

GPT-3 的潛在開源替代方案

這幾個模型的 prompt engineering 測試結果我在這幾篇文章有整理:

  • GPT-J: 來自 EleutherAI 開源語言模型,參數量高達 6B!
  • BLOOM: 全世界參數量最高的語言模型(176B!) 來自 Huggingface – bigscience project
  • OPT: Open Pretrained Language Model

最終比較:同樣用關係抽取任務 人工檢測 100 筆資料,每個模型生成標籤的正確率我寫在這篇文章:

  • 經典 NLP 任務標籤生成:最終章—— Huggingface models 大混戰

%d 位部落客按了讚: