「写真を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_phaseがwaitingの状態でテキストが来たとき、「スキップ」ならフェーズを進める、それ以外は「写真か『スキップ』を送ってください」と案内する。
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設計について書く。
シンプルシステム株式会社 代表 伊藤勝彦