単発応答から真の「会話記憶」へ
前回の朝食店チャットボット実装では、OpenAI(ChatGPT)をLINEのWebhookに接続することに成功しました。 当時は、客が一言話せばボットが一言返すという仕様でした。一見スマートに見えますが、よくテストすると致命的な欠点があることに気づきます:記憶を失うのです。
例: 客:「店主さん、卵焼き一つください。」 ボット:「かしこまりました!プレーン卵焼き一つ、合計30元です。他にご注文は?」 客:「それと大サイズのアイスミルクティーも追加で。」 ボット:「承知しました!大サイズアイスミルクティー20元です。他にご注文は?」 客:「以上で、合計いくら?」 ボット:「何を注文されましたか?」
これが所謂「単一ターン会話(Single-turn conversation)」です。Webhookがメッセージを受信してOpenAIを呼び出す度に、OpenAIはそれを全く新しい客として扱い、直前の会話など全く覚えていません!
人材を代替できる真のAIカスタマーサポートを構築するには、ボットに「短期記憶(Short-term memory)」を持たせる必要があります。
🧠 AIに海馬体を追加:会話配列(Messages Array)
OpenAIに記憶を持たせる原理は驚くほどシンプルです:APIを呼び出す際、最新の発言だけを送るのではなく、過去の全ての会話履歴をパッケージ化して送信するのです。
OpenAIのAPI仕様では、リクエストとしてmessagesという配列を送信します:
const messages = [
{ role: "system", content: "あなたは朝食店の女主人です..." }, // システム設定(神視点)
{ role: "user", content: "卵焼き一つください" }, // 客の発言(履歴1)
{ role: "assistant", content: "かしこまりました、他にご注文は?" }, // AIの直前返答(履歴2)
{ role: "user", content: "アイスミルクティーも追加で" } // 客の最新発言
];
この完全なmessages配列をOpenAIに送信すれば、AIは台本を読むように文脈を即座に理解し、完璧な返答を返してくれます!
🛠️ Vibe Coding実践:メモリによる会話一時保存
この記憶管理ロジックを手動で実装すると非常に複雑になります:各ユーザーのLine IDをKeyとして過去の会話を検索し、一定長さを超えたら古い記憶を削除する(Token制限超過防止のため)必要があります。
ここで最強の拡張機能を召喚します:Cursor + Vibe Prompt。
【AI記憶カスタマーサポート Vibe Prompt】 Line BotのNode.jsサーバーを開発中で、カスタマーサポートチャットを処理しています。 以前のバージョンではAIが文脈を記憶できませんでした。会話記憶機能を追加するためリファクタリングが必要です。
以下の実装詳細に従ってください:
- グローバル変数
const memoryStore = new Map()をメモリ一時保存領域として使用。ユーザーのlineUserIdをKeyとし、Valueはそのユーザーのmessages配列。- 新規メッセージ受信時、まず
memoryStoreから履歴を取得。存在しなければSystem Promptを含む新規配列を初期化。- ユーザ��の最新メッセージを配列に
.push()し、OpenAIgpt-4o-miniに送信。- OpenAIからの返答を受信後、AIの返答も同じ配列に
.push()して保存。- 【重要機制】配列が無限に成長してメモリ不足やToken超過を防ぐため、「自動トリミング」機能を実装:ユーザーの会話履歴が10発言を超えた場合(配列長>11、system含む)、最も古い一問一答を削除(
splice)。- 完全なNode.js Expressコードを提供し、明確な日本語コメントを追加。
この呪文を送信すれば、AIは瞬時にMapデータ構造とArray.spliceロジックを含む完璧なコードを生成します。
このシステムの威力:マルチタスクカスタマーサポート
LINE Botに記憶機能が追加されると、その商業的価値は倍増します:
- 連続データ収集: 「お名前を教えてください?」➡️「林様、では電話番号は?」➡️「承知しました、林様、電話0912、ご予約希望日時は?」(客を段階的にフォーム完成へ誘導)。
- 専門技術サポート: 「画面が起動しません。」➡️ AIが3ステップを指導 ➡️「2番目のステップで詰まり、ランプが点灯しません。」➡️ AIはステップ2に特化して深掘り解決。
- 高没入型コンパニオンボット: タロット占い師、心理カウンセリングAI、さらにはバーチャルガールフレンドまで、この強力な「メモリ管理機構」の上に構築されます。
🚨 記憶システムの高度な考慮点:サーバー再起動時
鋭い方は既にお気づきでしょうが、上記Promptでは会話履歴をnew Map()に保存しています。これは「インメモリ一時保存(In-memory storage)」と呼ばれます。
開発テスト時には非常に高速で便利です。しかし致命的な弱点があります:サーバーがクラッシュしたり、Vercel/Renderでプログラムを再デプロイすると、このmemoryStoreは瞬時に消去され、全てのボットが再び「集団記憶喪失」状態になります。
有料案件で月額3万円の高級カスタマーサポートシステムを構築する場合、このような事態は許容できません。
真の企業級アーキテクチャでは、このmessages配列をJSON形式に変換し、**Redis(メモリデータベース)やSupabase(PostgreSQL)**に永続保存します。
しかしビジネスモデルの迅速な検証(MVP)段階では、Node.jsのMap配列で実装するだけでも、クライアントを驚かせ、案件を獲得するには十分です!朝食店のおばさんを改造する準備はできましたか?次章では更に強力なLINEの隠し武器:LIFFウェブアプリを紹介します!
章のまとめ
- コアコンセプトと原理を理解
- 実装方法とテクニックを習得
- 一般的な問題と解決策に精通
- 実際のプロジェクトに適用可能
さらに読む
- 公式ドキュメントとAPIリファレンス
- GitHubのオープンソース例
- 技術書とオンラインコース
- コミュニティディスカッションと技術ブログ