教一個 AI 小劇組寫出「值得截圖」的對話
LINE 對話製造機加了 AI。難的不是叫模型寫對話,是叫它寫出一段別人會想單獨截下來傳給朋友的對話。這中間我跟五個角色的模型吵了一整天。

這篇講的東西
- 工具(免費、免註冊、離線可用):https://yazelin.github.io/line-chat-maker/
- 原始碼(MIT):https://github.com/yazelin/line-chat-maker
- 前傳(工具怎麼一個晚上做出來的):許願池的誕生現場,和一個晚上做出來的 LINE 對話製造機
工具本身一個晚上就做完了。難的是後面那天。
前一篇講的是這個 LINE 對話截圖產生器怎麼誕生的:所見即所得的泡泡、頭像、已讀數,點了直接改。那時候它就是一支好用的手工具,一格一格自己填字。填字很快,但我很快撞到一件事:我想不出「值得截圖」的劇情。空框在那裡,我坐著發呆。
所以第二天我幫它加了 AI。這一天的 git 上有 74 個 commit,全部圍著同一件事:怎麼讓模型不只是「寫出一段對話」,而是寫出一段別人看完會想 tag 朋友、想單獨截下來傳出去的對話。那是完全不同的兩件事。
這是給誰用的
給要做內容的人。梗圖、教學示意、產品對話展示,社群貼文裡那種「你看這段對話」的配圖。以前這種圖要嘛去翻真的聊天記錄(有隱私問題),要嘛自己一句一句擺。現在給一句主題,AI 把整段劇本寫好、填進畫面、連貼圖跟頭像都幫你生。你負責挑跟改。
沒有帳號、沒有伺服器存你的東西。圖片跟對話都只在你自己的瀏覽器裡。這條線我後面會再講一次,因為它是我刻意守住的。
為什麼要拆成三個角色
最直覺的做法是丟一個 prompt 給模型:「寫一段媽媽提醒兒子帶傘的 LINE 對話,輸出 JSON。」我試了,結果就是那種你我都看過的、平淡到不行的問答。「記得帶傘」「好」「今天會下雨」「知道了」。技術上完全正確,情感上一文不值。
問題出在我把「創作」跟「填表」壓成同一步。一個模型同時要想劇情、又要顧 JSON 格式,兩邊都做不好。所以我把它拆開,變成一個小劇組:
- 編劇:只寫劇本,純文字。善用 LINE 才有的形式,已讀不回、時間跳躍、草稿打到一半、貼圖。不管格式。
- 評審:只打分,決定編劇的稿能不能過。
- 執行:拿過關的劇本,忠實填成畫面的 JSON。不准自己改劇情。
拆開之後每個角色的 prompt 都短、都專心。而真正讓成品變好的,是中間那個評審。
評審是靈魂
編劇寫完,稿子不會直接上。它先送給一個「嚴格的評審」,六個維度各打 0 到 10 分:
| 維度 | 看什麼 |
|---|---|
| arc 劇情弧 | 起因、升溫、高潮、收尾完整嗎 |
| voice 角色聲音 | 每個人口氣一致,而且彼此區分得出來嗎 |
| form 形式運用 | 已讀不回、時間差、貼圖、引用、react、draft,至少巧用三種而且服務劇情 |
| pacing 節奏 | 有留白也有密集,高潮前有鋪陳嗎 |
| real 真實感 | 像真人打字的口語跟短句嗎 |
| share 傳播力 | 看完會想 tag 誰?有沒有一格明確的「截圖點」 |
總分 60,要 48 分以上而且每一項都不低於 6 才過。不過就退稿,帶著具體意見打回去重寫,最多三輪,三輪都沒過就取這幾稿裡分數最高的那份。
其中 share 那一項是我加得最晚、也最關鍵的。前面五項都是在確保「這是一段合格的對話」,只有 share 在逼它回答「這段對話憑什麼被傳出去」。評審的指令裡我寫死一句話:沒有明確截圖點、或共鳴對象模糊的,share 不准超過 6。它低分的時候還得指出「截圖點應該設在哪一格」。
我也給評審裝了幾道「平庸硬閥」,防止它手軟。整段只有寒暄問答、沒有任何意外或情緒轉折的,arc 跟 pacing 直接封頂 6 分。純文字、沒穿插任何貼圖圖片語音的,form 封頂 6 分。這幾條硬閥是逼出來的:一開始評審太仁慈,什麼稿都給 50 幾分,過太鬆,於是我把它最容易放水的地方一個一個焊死。
執行為什麼要獨立
過關的劇本交給執行 AI,它跑的是一個 tool-calling 迴圈:先 get_script 讀現況,再 apply_script 把劇本填進去。第一輪強制它一定要動工具(不然模型很愛只用嘴巴回你「好的我已經完成了」,其實什麼都沒做),填完還要自審一遍才回報。
把它跟編劇分開,是因為我要一條乾淨的界線:劇情歸編劇,格式歸執行,執行不准順手改劇情。這聽起來很基本,但當同一個模型又要創作又要填表的時候,它就是會忍不住在填的時候「潤飾一下」,然後把好不容易評審過的劇本改壞。分開之後,這個誘惑就沒了。
一整天都在跟它們吵架
小劇組的骨架半天就搭好了。剩下半天全花在一件事上:模型會用各種你想不到的方式把事情搞砸,而每一種都得寫一條規矩擋回去。挑幾個最有代表性的:
舞台指示滲進台詞。 編劇是寫劇本的思維,很自然會寫「(轉折)」「(高潮)媽媽突然說」這種舞台提示。結果執行照單全收,把「(高潮)」四個字也打進對話泡泡裡。我先在兩邊的 prompt 都講清楚這是給 AI 看的演出說明、不是台詞,再在程式碼裡加一道保險,把這類前綴自動剝掉。雙重保險,因為光靠 prompt 它總有漏的時候。
react 的語意它搞不懂。 LINE 的表情回應是「對某一則訊息貼一個 emoji」,不是自己發一則訊息。編劇一開始把它當成一句話來寫,執行就生出一則空白訊息掛著表情。這個我修了三層:編劇 prompt 教它正確用法、執行 prompt 再講一次、程式碼最後自動把落單的 react 併回它該貼的那則。
「最強武器」四個字讓它上癮。 草稿(打字打到一半沒送出)是很戲劇性的收尾手法,我原本在 prompt 裡誇它是「最強的結尾武器」。壞了,編劇每一篇都硬要用草稿收尾,不管適不適合。措辭一改成「這是選配,結尾手法要輪換」,再讓評審對「為用而用」的形式扣分,它才鬆手。prompt 裡的形容詞是有後座力的,你越誇一個工具,它越濫用。
靈感籤寫太細它就照抄。 內建的「隨機給個主題」,我一開始把情境寫得很具體,結果編劇直接把我的範例當劇本抄,產出千篇一律。後來改成委託簡報式的寫法:只給主題跟情緒目標,「情侶吵架和好,過程虐結局暖,吵架的原因跟破冰的方式由你發明」,把具體轉折留給它自己想。給的越少,它反而越有創意。
還有一個很蠢但很真實的:群組名稱帶了人數會變成「家族群(3)」,某段程式重複加了兩次,變成「家族群(3)(3)」。這種 bug 不性感,但一天裡有一半時間是在抓這種東西。
連圖都幫你生
對話搞定之後還缺圖,貼圖、照片、頭像。這裡我沒有一張一張叫 API,那樣又慢又貴又難對齊。改成美術指導 AI 先依整份劇本產出每一格的繪圖 prompt(同一個人物跨格要長一樣、貼圖要綠底),然後把所有格子拼成一張格盤,單次一次生圖,程式再自動把格盤切回一格一格、把綠幕去背。單張不滿意可以重生,prompt 也能手改。
圖像來源有四條路可選:刷我的信用卡免費體驗(每天限量,經一個只轉發不存內容的 Cloudflare Worker 代理),或自帶 Gemini、OpenAI、自架服務的 key。右上角有個徽章顯示「今日免費額度剩多少」,這樣不用等按下去才發現用完了。
我刻意不做的
工具沒有帳號系統。你的對話存在瀏覽器的 IndexedDB,你的頭像圖片不上傳任何伺服器,免費模式的 AI 請求經過代理但代理不留對話內容。這不是還沒做,是我決定不做。一個做梗圖示意的小工具去收集使用者的對話內容,沒道理,也沒必要。fork 出去的人可以自己接自己的 key、自己架代理,完全不經過我。
也沒有做「一鍵生成一百張」這種量產功能。這工具的價值在你跟 AI 來回改到滿意的那幾張,不在洗一堆平庸的圖出來。評審那套退稿機制,本來就是為了少而好、不是多而濫。
這一天是怎麼分工的
老樣子講清楚:主題我出、規矩我定。三個角色怎麼拆、評審打幾分才過、share 那條硬閥、「最強武器」要收斂、圖片內容不落地這條線,這些決定都是我的。把它們變成能跑的 ai.js(771 行)跟 Cloudflare Worker、連同一路上抓的那些 bug,是 AI 寫的。我整天在做的事,比較像在帶一個劇組排戲:不是我在演,是我在旁邊喊「這段太平、重來」「這個表情放錯位置」「別每次都用同一招收尾」。
先去丟一句主題給它試試,看它寫出什麼、你又想怎麼退它的稿。玩過一輪,再回頭看這套小劇組是怎麼被逼出來的,會更有感覺。