長文摘要的兩種策略:分段彙整與滑動精煉
文件超過上下文長度時,怎麼摘才不會漏掉關鍵段落。兩種策略各有適用情境。
即使上下文視窗越來越長,超長文件仍需要拆。而且就算塞得下,中段資訊的召回率通常也不理想。
策略一:分段彙整(map-reduce)
把文件切成段,每段各自摘要,最後把所有摘要合併再摘一次。優點是可平行、速度快;缺點是跨段落的因果關係容易斷掉。
chunks = split(doc, size=3000, overlap=200)
parts = [summarize(c) for c in chunks] # 可平行
final = summarize('\n\n'.join(parts))策略二:滑動精煉(refine)
先摘第一段,然後帶著目前的摘要讀第二段並更新,如此逐段推進。優點是能保留敘事脈絡;缺點是必須序列執行,而且前段的錯誤會一路傳遞。
summary = summarize(chunks[0])
for c in chunks[1:]:
summary = refine(summary, c) # 只能序列怎麼選
- 技術文件、條列型內容 → 分段彙整,快又夠用。
- 會議逐字稿、敘事型長文 → 滑動精煉,脈絡比速度重要。
- 兩者都要 → 先分段彙整取得骨架,再用滑動精煉補時序。
切段一定要留重疊(overlap)。沒有重疊時,剛好被切開的那個句子會兩邊都摘不到。