Blog

Retrieval-augmented generation for source-backed article writing

Naly 工程筆記:以來源為先的 RAG 文章草稿系統,打造可持久化、可稽核的發布流程

本筆記定義了一個生產架構,其中檢索是一級控制面,而非提示時的提示性訊息。Naly 的文章任務會收集網頁與 arXiv 證據,持久化標準化的來源事實,並在轉換為 HTML 之前,透過結構化、可稽核的合約強制模型輸出,讓文章維持在可驗證事實基礎上

June 27, 202610 sources

TL;DR檢索增強生成(RAG)將 Naly 的文章流程轉為以來源為根據的發布系統,而不是模型記憶組合式寫作。每筆草稿請求先蒐集網頁與 arXiv 證據,標準化並持久化來源 URL,接著要求模型先輸出 answer-first 草稿,再輸出最終 HTML 文章。這將風險從「模型是否會出現幻覺?」轉移為「檢索層是否完整且可追蹤」,為編輯提供穩定成果、可重播任務,與可辯護的公開主張。

摘要

Naly 的 RAG 應圍繞著 來源持久化與可確定性合約。截至 2026 年 6 月 27 日,實務上的可靠性更多來自檢索物件是否可查詢、可版本化,並在發布前被驗證,而不是來自更大模型。本文提出雙平面設計:一個證據平面負責檢索/儲存,另一個生成平面負責草稿撰寫,並論證此架構如何直接提升編輯信任與事件處理能力。

Naly 的定位

Naly 將其作為 Next.js 16.0.7 App Router 架構(next + react)中的生產內容子系統,文章發布是運行時程式路徑的一部分,而非獨立的離線撰寫步驟。文章任務路徑是所有約束必須生效之處:未有來源紀錄就不會被「寫入」,摘要結構未通過驗證前不會轉成 HTML。

棧級對齊是刻意設計的:

  • next@16.0.7 + React Server Components 在伺服器端承載任務觸發渲染,對應文章的伺服器端輸出合約。
  • drizzle-orm@0.44.7 + @neondatabase/serverless@1.0.2 定義具型別的、可持久化的任務與來源資料表,讓每個主張都可追溯。
  • ai@6.0.0-beta.105 提供支援 schema 的生成輸出控管。
  • marked@17.0.1 將生成的 Markdown 摘要轉為可發布的 HTML。
  • @vercel/blob@2.0.0 以耐用 URL 儲存生成資產以供重用。
  • 可將 Anthropic 工具納入同一合約邊界作為替代模型提供者,但不能成為逃脫結構化約束的後門。

這將「先生成再校對」模型替換為 可追根據的寫作迴圈:只有檢索、驗證、生成、渲染與發布都通過,文章才可見。

技術機制

穩健的 Naly 設計包含五個受控階段:

  1. 證據計畫與查詢編排
  • 以主題、日期區間與證據政策定義任務規格。
  • 同時執行網頁搜尋與 arXiv 搜尋以取得第一來源。
  • 依 canonical URL 去重複,並標準化通訊協定、主機與查詢字串。
  1. 來源持久化層
  • 儲存每個 URL 的中繼資料(url、正規化 URL、抓取狀態、抓取時間戳、標題、摘要、來源類型)。
  • 將模型可見片段與原始載荷分開儲存,使重跑在上游頁面變動時仍保持可重現。
  • 新增每個來源的校驗碼以偵測漂移。
  1. 上下文塑形與約束
  • 建立依關聯度與新近性排序的檢索上下文。
  • 在提示合約中要求明確的來源 ID。
  • 強制採用 answer-first 輸出形態(intro claim, evidence bullets, risk caveats, uncertainty),並加上有順序的來源參照。
  1. 以嚴格 schema 進行結構化生成
  • 使用結構化輸出,讓格式異常或違反 schema 的回應快速失敗,並以更精準的上下文重試。
  • 將生成保留在伺服器上下文中,並拒絕未提供對應來源 ID 的不支援事實主張。
  1. 渲染、發布與驗證
  • 將已驗證的 Markdown 轉為 HTML,並持久化 Markdown 與 HTML。
  • 僅在驗證成功後快取最終輸出。
  • 輸出稽核欄位與營運指標:來源數、被拒主張數、重試次數、生成延遲。

最重要的設計步驟是 關注點分離:檢索品質與生成品質是兩類不同故障域,對應不同指標。Next.js Server Components 非常契合這種拆分,因為渲染可保持可重現,而檢索與生成可在受控的非同步任務中進行。

文獻觀點

最新的 RAG 文獻支持這種架構模式。2024 年的 RAG 架構調查說明,檢索增強系統透過將生成建立在外部證據之上可降低事實漂移,但也指出了管線複雜性與模組協調上的權衡 [Gupta et al., 2024]。2025 年的追蹤調查補充指出,穩健性現在取決於自適應檢索、解碼控制與端到端評估,而不只取決於生成品質 [Sharma, 2025]。

就生產品質控管而言,2025 年以評估為核心的調查明確將評估拆解為內部檢索器/生成器指標與外部系統指標;這種拆解特別適用於文章管線,因為即使語言品質高,「壞文章」仍可能是錯誤的來源選擇 [Gan et al., 2025]。專注於 groundedness 的工作也轉向了偵測層,該層使用檢索上下文與 NLI 式檢查來分類主張是否被支持,進一步鞏固生成後驗證的實務價值 [Gerner et al., 2025]。

總的來說,這些論文收斂到一個主張:RAG 不只是注入上下文的方法,而是一種 工程合約 ,用於串接檢索與生成,因此 Naly 應優化合約本身,而非僅優化提示詞。

設計權衡

  • 新鮮度與可重現性:更嚴格的 TTL 可降低資料過期,但會提高重新抓取成本。持久化快照可在仍進行新鮮度窗口重驗證的同時,維持可重現的渲染。
  • 檢索中的召回率 vs 精確率:更廣的檢索可提高覆蓋率,但也會帶入雜訊;第二階段相關性過濾能保護主張品質。
  • schema 嚴格度 vs 文案流暢度:嚴格輸出 schema 提升機器可靠性,但可能降低文體自由度。answer-first schema 模式在保留護欄的同時,仍維持可讀性。
  • 靜態渲染速度 vs 稽核性:預先渲染 HTML 可提升傳遞效能並降低重複計算,但前提是所用來源構件必須是不可變參考。
  • 複雜度 vs 運維成本:每新增一個驗證步驟(來源檢查、schema 檢查、構件持久化)都會提高延遲。Next 生產指引中的快取、路由邊界與建置時驗證對維持可運行性至關重要。

失效模式

  • 來源漂移:任務建立後 URL 變為 404 或軟變動。緩解:canonical key + 快照雜湊 + 回退來源鏈。
  • 檢索過度擴散:高召回低精準會導致似是而非但未受支持的綜合結果。緩解:要求 evidence-first 約束,並阻擋沒有來源對應的主張。
  • 模型格式失敗:schema 不符或生成 JSON 被截斷。緩解:嚴格 schema 驗證,並在縮減上下文後重試。
  • 雙重發布競爭:並發 worker 可能發布部分構件。緩解:使用 job 冪等鍵、列層級狀態轉移(pending -> drafting -> validated -> published)。
  • 渲染回歸:Markdown 格式不當或不安全的 HTML 轉換。緩解:採用可重現的 marked 轉換路徑,並以樣本清單(manifest)建立 HTML 輸出測試。
  • 快取錯覺:伺服器輸出中的過時動態資料可能使已發布文字與來源索引不同步。緩解:將路由渲染策略與明確的執行時新鮮度政策對齊,並避免在需要證據新鮮度時使用隱含快取。

實作註記

在實務落地中,將其視為一個發布合約:

  • 在 Drizzle 中定義來源資料表,採用明確約束:按 canonical host/path 的 URL 唯一性、抓取狀態枚舉與 checksum 欄位。
  • 一致使用與 Neon 相容的驅動路徑,以配合 serverless 的執行行為;Drizzle 文件同時描述 runtime-specific 和 neon-* driver 選項。
  • 在生成環節,強制結構化輸出合約,並在渲染前對無效物件直接失敗。
  • 對文章路由使用 Next.js 的生產指引,涵蓋伺服器邊界、錯誤頁面、快取與 SEO metadata,讓發布可被觀測且保持快速。
  • 透過 Vercel Blob 持久化生成的二進位物件(例如封面圖、附件、匯出檔),設定明確存取策略並使用可預測命名以避免碰撞。
  • 在發布前輸出營運檢查:最小來源數、最小來源多樣性、證據新鮮度,以及已映射主張的最低完成率。

這是關鍵轉變:文章不再以模型聰明度來評判,而是以在重試與重新部署下,證據與生成是否始終同步來評估。

參考資料

Sources