全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / AiInterview制作記 / Vol.27 AiInterview制作記 Vol.2

記事 01

写真を2枚受け取るLINEインタビューエンジンの改修

AiInterviewは、LINEの会話を通じてAIがインタビューし、その内容を記事にするシステムだ。地域のお店や事業者をインタビューして、地域メディアに掲載する記事を自動生成する。

2026-06-07 公開

「写真を1枚しか送れないのが不便で」

AiInterviewは、LINEの会話を通じてAIがインタビューし、その内容を記事にするシステムだ。地域のお店や事業者をインタビューして、地域メディアに掲載する記事を自動生成する。

最初の設計では、写真は1枚だった。お店の外観か、商品か、どちらか一枚を選んでもらう。しかし実際に使ってみると「外観と商品、両方使いたい」という要望が来た。


LINEのメッセージ処理を見直した。

LINEのWebhookは、ユーザーがメッセージを送るたびにPOSTリクエストを送ってくる。テキストも画像も、それぞれ1つのイベントとして届く。

1枚対応のときは「画像メッセージが来たらS3に保存してセッションに記録する」というシンプルな実装だった。2枚対応にするには、何枚目かを追跡する必要がある。

セッションデータにphotosという配列を持たせることにした。画像が届くたびに配列に追加する。最大2枚に達したら「ありがとうございます、では質問を続けます」という返答を送って次のフェーズに進む。

def handle_image(user_id, message_id, session):
    # LINE APIから画像を取得してS3にアップロード
    photo_url = upload_to_s3(message_id)
    session['photos'].append(photo_url)
    
    if len(session['photos']) >= 2:
        send_line_reply('写真を2枚受け取りました。続けてご質問させてください。')
        session['photo_phase'] = 'done'
    else:
        send_line_reply('もう1枚お送りください。(1枚だけの場合は「スキップ」と送ってください)')

スキップの対応が重要だった。

2枚を必須にすると、写真が1枚しかない事業者がインタビューを完了できなくなる。「スキップ」と送ったら1枚のまま次のフェーズに進む。

テキストメッセージの処理と画像メッセージの処理は別の分岐になっている。photo_phasewaitingの状態でテキストが来たとき、「スキップ」ならフェーズを進める、それ以外は「写真か『スキップ』を送ってください」と案内する。


S3へのアップロードも2枚分に対応した。

ファイル名は{user_id}/photo_1.jpg{user_id}/photo_2.jpgの形式にした。配列のインデックスをそのままファイル名に使う。S3の同一prefixに入れることで、後の記事生成ステップで2枚をセットで取得できる。

記事生成のプロンプトには両方のURLを渡す。「外観:{url1}、商品:{url2}」という形で追記する。Geminiは画像URLを理解して、記事の中でどう言及するかを自分で判断する。


実際に2枚送って試した。

1枚目を送ると「もう1枚お送りください」が返ってくる。2枚目を送ると「写真を2枚受け取りました」が返ってきて、インタビューが再開する。

スキップを試した。「スキップ」と送るとインタビューが再開した。

インタビューを完了させて記事を生成した。写真が2枚ある場合、記事の中で2箇所に写真への言及が入った。「店舗外観の写真では」「商品の写真に映る」という表現が自然に入っていた。


写真の枚数は小さな変更のように見えて、ユーザー体験の質が変わる。

1枚のときは「どちらか一つを選ぶ」という判断がユーザーに生まれる。2枚になると「全部伝えられる」という安心感に変わる。

インタビューシステムは、使いやすさと記事の質が直結する。インタビューで集まる情報が多いほど記事が豊かになる。写真を2枚受け取れるようにしたことは、記事の質にも効いた。

次回は、AIが確認を求めるときのUX設計について書く。

シンプルシステム株式会社 代表 伊藤勝彦