JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

接地與可靠性:檢索增強微調與結構化輸出

一個樂於助人的模型仍有兩道可靠性缺口:它會編造事實,也會無視你的輸出格式。RAFT 教它閱讀檢索到的證據;受約束解碼則強迫它吐出合法的 JSON。兩者合起來,才造就一個你能拿來蓋產品的模型。

兩道可靠性缺口

做完 SFT 與對齊後,你有了一個有用又有禮貌的模型——但它仍在兩個具體面向上不可靠,而這兩點會卡住真實產品。第一,它會幻覺(hallucination):問它訓練範圍之外的事實,它會自信地答錯。第二,它無結構:你要它給 JSON,它可能把 JSON 包在散文裡、漏掉一個欄位,或吐出一個會讓你的解析器當掉的尾隨逗號。本指南把這兩道缺口都補上——一道用資料,一道用解碼。

檢索增強微調(RAFT)

樸素的檢索增強生成(retrieval-augmented generation, RAG)只是在推論時把一個檢索器外掛到凍結模型上:抓取相關段落、貼進提示,然後期望模型去用它們。它常常不用——一個從未被訓練去閱讀證據的模型,可能無視那些段落、退回它(可能錯誤的)參數記憶,或被檢索器誤抓回來的不相關段落帶偏。

普通 RAG 只是给冻结模型外挂一个检索器;RAFT 则是微调模型,让它学会用好这些检索到的段落。

检索增强生成流程:查询从文档库中检索相关段落,拼接进提示词后再生成答案。

檢索增強微調(retrieval-augmented fine-tuning, RAFT)藉由訓練模型把 RAG 做好來補上這道缺口。核心想法是:在同時包含一份*黃金(golden)*文件(藏有答案)刻意插入的*干擾(distractor)*文件(不含答案)的範例上微調。模型學會引用相關段落、援引它,並無視不相關的——這正是推論時的檢索器所要求的技能。

  1. 對每個訓練問題,建立一個由一份黃金文件加上數份干擾文件組成的脈絡,順序隨機。
  2. 撰寫目標答案,讓它以思維鏈引用並援引黃金段落,示範你希望在推論時看到的推理。
  3. 關鍵是要納入一些沒有黃金文件的範例——訓練模型說「脈絡中不含答案」,而非胡謅。
  4. 推論時把 RAFT 與一個好的嵌入檢索器(embedding retriever)搭配;此時模型會閱讀檢索器返回的內容,而不是與之對抗。

結構化輸出:約束解碼器

第二道缺口是格式。你可以在提示裡好聲好氣地請求 JSON,並為此微調,但提示只是建議,不是保證——在分佈偏移下,模型遲早會吐出某種無法解析的東西。結構化輸出解碼(structured output decoding)藉由改變詞元的取樣方式,而非仰賴模型乖乖配合,讓不合法的輸出變得不可能

其機制建立在自迴歸解碼(autoregressive decoding)之上。每一步模型對整個詞彙表提出一個機率分佈;受約束解碼會把它與一套*文法(grammar)*取交集,那套文法編碼了「在已吐出的內容之下,此刻哪些詞元合法」。不合法的詞元在取樣前就被遮罩成機率零,於是輸出保證合規——每個大括號都會閉合,每個必填欄位都會出現。

p_{\text{mask}}(t \mid x) = \frac{p_\theta(t \mid x)\,\mathbb{1}\!\left[t \in \mathcal{A}(x)\right]}{\displaystyle\sum_{t' \in \mathcal{A}(x)} p_\theta(t' \mid x)}

受限解码把语法不允许的每个 token 的概率置零,再在合法集合 A(x) 上重新归一化——这是保证,而非建议。

# Constrained decoding: mask illegal next-tokens to -inf
logits = model(prefix)                 # raw scores over vocab
allowed = grammar.allowed_tokens(prefix)   # set legal given JSON state
logits[~allowed] = -float('inf')       # forbid everything else
next_tok = sample(softmax(logits))     # guaranteed to keep JSON valid
一套文法(正規表達式、JSON schema 或上下文無關文法)決定合法的下一個詞元;其餘的都被遮罩掉。

現代引擎會把 JSON schema 或一套文法(grammar)編譯成快速的詞元遮罩,因此成本可忽略。值得知道的提醒是:一套過緊的文法,可能逼模型走上它不喜歡的路徑,傷害答案品質——一個本想說「我不知道」、卻被文法逼進某個 JSON 列舉值的模型,可能會挑一個「錯誤但合法」的值。約束結構,但只要可能,就在內容上留給模型自由。

合起來:一個會用工具的助手

這兩種技術會相乘。一個經 RAFT 訓練、能可靠閱讀檢索證據的模型,再加上能保證機器可讀輸出的結構化解碼,正好是函式呼叫代理(function-calling agents)代理式 RAG(agentic RAG)的基礎:模型吐出一個合法的工具呼叫(結構有保證),工具返回證據,模型再就那份證據推理而不捏造(接地已習得)。可靠性不是單一招式——它是「資料端接地」與「解碼端約束」有紀律地疊加。

RAFT 带来的可靠阅读,加上结构化输出,正是一个能可靠调用工具的「推理—行动—观察」智能体的基础。

大语言模型智能体循环:模型先推理,再执行动作(如调用工具或函数),观察结果,然后重复。