地域のお店を紹介する記事を1本作るのに、何時間かかるか。
取材のアポを取り、現地に行き、話を聞き、写真を撮り、帰って書く。早くても2〜3時間だ。それを毎週積み上げていくとなると、専任のライターが必要になる。小さな地域メディアにはその余裕がない。
だから「AIがLINEでインタビューして記事を作る」仕組みを作った。
なぜLINEで取材するのか
地域の事業者にWebフォームへのアクセスを求めても、反応は薄い。しかしLINEならほぼ全員が使っている。
「LINEで質問に答えるだけで記事になる」という仕組みなら、取材のハードルが大幅に下がる。事業者はLINEの公式アカウントを友だち追加して、「取材を受ける」ボタンを押す。それだけだ。
AIが5回質問して、回答をもとに記事を生成する。
システムの流れ
事業者がLINEリッチメニュー「取材を受ける」をタップ
→ LIFFフォームで基本情報(店名・業種)を登録
→ GASがLINEでインタビュー開始
→ 5回のQ&A(Geminiが次の質問を生成)
→ 記事生成(Gemini)
→ 写真送信依頼(最大2枚)
→ 管理画面で確認・編集・公開
技術スタックはGAS・LINE Messaging API・Gemini APIだ。データはGoogleスプレッドシートで管理する。Sessions・Messages・Articles・Submissions(投げ込みフォーム)・Issues(号管理)という複数のシートが状態を持つ。
セッション管理
インタビューは「セッション」という単位で管理する。1人の事業者が取材を受けると1つのセッションが作られ、完了するまで維持される。
WAITING_START → INTERVIEWING → GENERATING → WAITING_PHOTO → COMPLETE
LINEからメッセージが届くたびに、GASはそのLINE User IDに対応するセッションを探して、現在のステータスに応じた処理をする。「この人は今インタビューの3問目にいる」という状態をスプレッドシートが持ち続ける。
5ターンのQ&A
最初の質問は固定だ。「お店の特徴を教えてください」という入口から始まる。
2問目以降はGeminiが生成する。前の回答を読んで「次に何を聞くべきか」を判断する。前の回答で興味深かった点を深掘りする。まだ聞いていないことを埋める。読者が知りたいと思う情報を引き出す。
function generateNextQuestion(sessionId, turnCount) {
const messages = getSessionMessages(sessionId);
const conversationLog = messages.map(m =>
`${m.speaker}: ${m.message}`
).join('\n');
const prompt = `以下は事業者へのインタビューの会話です。${turnCount}回目の質問に対して回答を受け取りました。
次の(${turnCount + 1}回目の)質問を生成してください。
${conversationLog}
次の質問(1文で、自然な会話として):`;
return callGemini(prompt);
}
5問目だけは「締めくくりのメッセージを引き出す」という文脈をプロンプトに追加する。インタビューとしてきれいに終わるようにする。
写真の受け取り
インタビューが終わって記事が生成されると、GASは「写真を送ってください(最大2枚)」というLINEメッセージを送る。
事業者がLINEで画像を送ると、GASがLINE APIで取得してS3に保存する。1枚目を受け取った後もWAITING_PHOTOのまま待ち続ける。2枚目を受け取るか「スキップ」「不要」というキーワードが来るとCOMPLETEになる。
写真URLを記事データに紐づける。管理画面では記事と写真を合わせて確認できる。
投げ込みフォーム
取材を受けるほどではないが告知したい情報もある。イベントのお知らせや、新メニューの情報。これらのために「投げ込みフォーム」も用意した。
投げ込みフォームから送信された内容もGeminiが記事化する。事業者が書いた箇条書きを、読み物として整形する。
取材記事と投げ込み記事が混在して号を構成する。
*次回は「Geminiがインタビューと記事生成を担う——5ターン会話と記事生成プロンプトの設計」*
*シンプルシステム株式会社 代表 伊藤勝彦*