讓 AI 做摘要是現在很常見的 AI 應用,但現在就算都使用 OpenAI,各家摘要的品質參差不齊。主要原因有兩個:
AI 摘要結果不如預期的兩個原因
1. Prompt
這可能是最關鍵的問題。「摘要」這件事不如大家想得這麼單純,它要考慮的東西不少。
舉例來說,同樣一則台積電新聞,一般大眾和投資人關注的重點就不同。如果站在一般大眾的角度摘要重點,對投資人來說無用資訊太多,該講的重點沒講;如果站在投資人角度摘要,對一般大眾來說又省略太多前提,看不懂,也不了解為什麼這是重點。
「重點」是什麼,這很因人而異。一個人認為的重點,可能是另一個人眼中的廢話。所以你不能單純用「幫我摘要重點」作為 prompt。而要針對不同情境、不同使用者,特製該情境下的 prompt。
這也是為什麼大家會讓 ChatGPT 在做廣泛閱讀時做摘要,但回到自己專業領域,通常不會信任 ChatGPT 的摘要。因為前者就算是泛泛之論仍會有點收獲,但後者對摘要的品質要求變得很高。
2. 技術選擇
這邊要先了解一下目前技術的限制。現在最強的語言模型還是 OpenAI 的 GPT-4 和 GPT-3.5。
GPT-3.5 目前在摘要上最大的問題是一次能塞的內容少。他的限制是 4096 token,如果是寫滿字的 pdf,大概就是一頁半,而且理解能力較差。
GPT-4 的優點是理解能力強,但它的速度慢,如果閱讀長一點的文章,甚至會花到 2 分鐘以上。試想,你叫 AI 幫你摘要一篇文章,結果在那邊乾等 2 分鐘,顯然並不是很愉快的閱讀體驗。更別說 GPT-4 目前價格是 GPT-3.5 的 15 倍。就算你有錢有閒,基本的 GPT-4 token 上限是 8k (三頁 pdf),更貴的可以到 32k (12 頁 pdf),針對真的需要摘要的大量內容,這都是杯水車薪。
所以,針對超過字數限制的文件,有哪些摘要方法呢?
如何摘要大量內容
為了解決字數上限的問題,網路上有各式各樣的應對方法,這邊是我目前看到的幾種:
只拿開頭
有一款很紅的瀏覽器擴充功能——「YouTube & Article Summary powered by ChatGPT」,之前叫做「YouTube Summary with ChatGPT」,就是用這個方法。
簡單來說,我只拿開頭能拿的字數。舉例來說,一篇文章 10,000 字,但我 GPT-3.5 只能拿 4,000 字,那我就只拿前面 4,000 字丟給 GPT 摘要。
這感覺很簡單粗暴,但後面 6,000 字不就完全沒讓 GPT 看到了嗎?這樣摘要出來的東西不就沒有結尾的結論嗎?
對,所以他還有另一種變形,也是這個擴充功能預設的方法:
先平均切分段落,然後拿每一段的開頭合起來做摘要。舉例來說,一個 YouTube 影片逐字稿 10,000 字,那我就先平分成 10 段,每段 1,000 字。接著拿每一段的開頭 400 字,加起來一樣是 4,000 字丟給 GPT 摘要。
跟上一個這個方法相比,好處是他可以比較均衡地看到整篇文章,比較有可能更全面的知道講了哪些東西。但缺點一樣就是會很有多東西沒看到,畢竟他一樣少看了 6,000 字。
總結來說,只拿開頭這個方法,不管是拿整篇文章的開頭,或是切段後拿每一段的開頭,他都忽略了很多內容。在越長的文本,這個問題會越嚴重。這是最大的缺點。
那他的優點是什麼?便宜、快。因為他只丟一次 GPT,所以要花的錢很少,速度也相對快很多。
切段後每一段都全部看,摘要後再摘要
剛剛提到切段的概念,但在上面的作法中,如果切 10 段,為了滿足一次摘要最多 4,000 字的上限,只拿每一段的開頭 400 字 (4000/10=400)。
但如果我們多摘要幾次呢?這個方法叫做 map reduce。作法是將每一段都個別摘要一次,然後最後把每一段的摘要再放在一起摘要。
聽起來蠻單純,主要要注意的是:
-
如何切段?如果單純用空行切段,萬一有一段字還是超過怎麼辦?(用遞迴切段)
-
如果每一段的摘要加起來超過字數怎麼辦?(摘兩輪不夠,不會摘三輪嗎?)
這個做法可以有很不錯的效果,但也不是沒有缺點。主要缺點是單純把每一段拿出來摘要,它會缺乏上下文。例如,當其中一段的開頭是「她接著說」,這時候 AI 因為缺乏上下文,它很可能會沒辦法給出正確的摘要,甚至是誤解文意。
給他前情提要
為了解決上面缺乏上下文的問題,又產生了另一種方法,就是給他前情提要。在 LangChain 裡,這方法叫 refine。
簡單來說,我先摘要第一段。然後把第一段的摘要 (摘要 1),以及第二段的原文放在一起給 GPT,請他再摘要一次。接著,把這個新產生的摘要 (摘要 2) 再跟第三段放在一起給 GPT,再產生一個新的摘要 (摘要 3)。
透過這個方法,GPT 比較有機會在理解原本文章脈絡的情況下,盡可能幫你找出摘要出這篇文章的重點。
缺點呢?第一個是慢。非常慢。前面 map reduce 的方法你可以每一段摘要平行處理,但這個方法你一定要等上一段摘要完,才可以接下一段的摘要。結果就是非常慢。
第二個缺點是這種方法會讓第一段的重要性被大幅重視,如果開頭是開場或是題外話,這個方法也不ㄕㄨ適用。
分群摘要
不管是 map reduce 還是 refine,都會讓 GPT 閱讀每一個字。以我的經驗來看,一本書大概會花費 60-100 塊台幣。如果再更大量,可能對一些人來說就有點貴了,怎麼辦呢?
最近看到一個另闢蹊徑的方法,那就是帶入分群 (cluster) 的概念。
-
首先,一樣將長文本切成很多段落。
-
接著,將這些文本進行分群 (cluster),它會將類似的段落放在一起。舉例來說,如果一本 10 萬字,共 300 頁的書,然後把每一頁切成一個段落,總共 300 個段落。接著請他分成十群,他會整理這 300 個段落,段落內容相近的擺一起,最後給你十群結果,每一群都會有很多段落。
-
接著,找出每一群最具代表性的段落。(與分群中心最近的向量)
-
最後,將這十群各自最具代表性的段落擺在一起,請 AI 摘要。
簡單說,有點像是把一本 300 頁的書先給 AI 大致看過一次,了解有哪些內容。接著,選出最具代表性的 10 頁,將這 10 頁的內容丟給 GPT 請他摘要。
比起前面 map reduce 和 refine 兩個方法,這種分群方法的好處就是便宜很多。同樣使用 OpenAI 的 API,分群用到的 embedding API,價格是 gpt-3.5-turbo 的 1/5。而且速度也快很多。
小結
重點摘要是現在最常見的 ChatGPT 應用之一。但這不只要考慮到讀者的知識背景,不同技術選擇也會有很大的不同。
如果大家還有看到其他我沒看的的方法,或是自己有一些應用的經驗,歡迎跟我分享。