自我修正迴圈:讓模型檢查並修正自己的輸出
產生—檢查—修正的迴圈能顯著提升品質,但設計不當會變成無限打轉。
讓模型檢查自己的輸出再修正,是提升品質最直接的手段之一。但它有兩個典型失敗:檢查者總說「沒問題」,以及修正後產生新問題導致無限循環。
關鍵在於:檢查必須盡可能程式化,模型只負責程式判斷不了的部分;而且迴圈必須有嚴格的收斂條件。
三層檢查
- 程式檢查:格式、必填欄位、數值範圍、引用是否存在。最快最可靠,先做。
- 規則檢查:業務規則的自動驗證,例如金額加總、日期先後。
- 模型檢查:只處理前兩層無法判斷的,例如語氣是否恰當、有沒有遺漏重點。
def generate_with_repair(task, max_rounds=2):
out = generate(task)
for i in range(max_rounds):
issues = check_program(out) + check_rules(out)
if not issues:
issues = check_model(out, task) # 最貴的一層放最後
if not issues:
return out, {'rounds': i, 'status': 'clean'}
out = repair(out, issues, task)
# 仍有問題:回報而不是硬給
return out, {'rounds': max_rounds, 'status': 'unresolved',
'issues': check_program(out) + check_rules(out)}修正提示要具體
「請修正上面的問題」效果很差。要把問題清單、原始輸出與原始要求一起給,並明確要求只改有問題的部分。
REPAIR = '''以下輸出有具體問題需要修正。
原始要求:{task}
目前輸出:{output}
發現的問題:
{issues}
請只修正列出的問題,其餘部分保持不變,並輸出完整的修正版本。'''避免無限迴圈
- 硬性上限:兩輪通常就夠,第三輪的邊際效益很低。
- 問題數必須遞減:修正後問題沒有變少就中止,這代表模型在原地打轉。
- 偵測震盪:記錄每輪輸出的雜湊,出現重複就中止。
讓檢查者更嚴格
模型檢查層要明確要求「找出問題」而非「評估品質」,並且給出具體的檢查項目清單。開放式的「這個回答好嗎」幾乎一定會得到「很好」。
CHECK = '''逐項檢查下列輸出,只回報**確實存在**的問題。
檢查項目:
1. 是否有未經 context 支持的主張
2. 是否遺漏了問題中明確要求的部分
3. 是否出現與 context 矛盾的內容
沒有問題時輸出 {"issues": []}。不要為了找問題而挑剔。'''自我修正會讓延遲與成本翻倍以上。互動式場景建議只做程式檢查層,模型檢查留給離線或高價值的批次任務。
訂閱後繼續閱讀全文
本篇為訂閱者專屬內容。訂閱後可取得下列權限:
- 解鎖全部內容權限
- 閱讀不限篇數
- 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6
一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。
立即訂閱
金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策