聯絡 EN 中文

六十影響報告書

把 InDesign 印刷報告變成上線網站與本地多模態 RAG

上線中 獨力完成

一眼看懂

問題
慈濟基金會 60 週年出版了《六十影響報告書》,是一份用 InDesign 排版的長篇繁體中文印刷品:約 64 個跨頁、682 個文字 story。
我做了什麼
同一份原始檔,兩個用途。
成果
已上線於 60impact.tzuchi.org.tw(18 頁),另有本機問答工具,每個答案都附原報告頁碼。
我的角色
獨力完成
期間
2026-05 → 2026-10

展現的能力

每一項都連到能力頁上對應的能力與等級。

問題

慈濟基金會 60 週年出版了《六十影響報告書》,是一份用 InDesign 排版的長篇繁體中文印刷品:約 64 個跨頁、682 個文字 story。它需要一個能在手機上閱讀的網站版。報告書的內容也值得拿來提問:問一個問題,答案要能指回它出自哪一頁。

我做了什麼

同一份原始檔,兩個用途。第一個是公開網站:18 頁,用 Astro 建置,部署在 Cloudflare Pages。第二個是 Python 寫的 RAG 管線,把 InDesign 檔(文字、頁面重建圖、圖片)寫進我自己做的 BaaS drust 的向量庫,再由一個小型 Flask 介面回答問題,每個說法都標上(頁N)出處。問答工具只在本機執行,沒有對外開放。

運作方式

  1. 解析器直接讀解壓後的 IDML:頁面、帶字級與座標的精準文字塊、置入的圖片。
  2. 重建器畫出每一頁的近似版面圖,把真正的連結圖片放到正確位置,並替每個文字塊標上編號。
  3. 本地視覺模型看這張圖,只回傳 JSON:每個編號的閱讀順序、角色與標題層級。
  4. Python 依這個順序,用 IDML 原文組出 Markdown 與 chunks,以 2,560 維模型向量化,寫入 drust 的 pages、chunks、images。
  5. 查詢時:先對 chunks 做向量搜尋再 rerank,命中夠強的段落會擴展成整頁內容當上下文;概括性的問題則改用入庫時預先產生的頁摘要來回答。

關鍵決策

  • 視覺模型不重打字。 它只決定順序與結構,正文一律取自 IDML。面對複雜的印刷版面,也不會有 OCR 誤差。
  • 只用本地模型。 對話、視覺、嵌入、rerank 全部跑在自架的 Qwen3 模型上,透過 OpenAI 相容的 proxy 呼叫,不依賴任何外部 AI API。
  • 網站逐頁遷移。 第一版是零依賴的 HTML。我用 Astro 包住它,讓新舊頁面可以並存上線;另外寫了驗證腳本,因為同名時 Astro 會默默採用舊檔。
  • 內容只有一個來源。 repo 裡的 JSON 是唯一真實來源,drust 只是用腳本推送的鏡像;drust 讀取失敗時,網站退回本地 JSON。

成果

網站已上線於 60impact.tzuchi.org.tw,18 頁全部遷移為 Astro,每次 push 到 main 由 CI 自動部署。問答工具維持本機使用,答案附頁碼出處。全程由我一人完成,以 Claude Code 按 spec → plan → implement → review 的流程開發。