5.2 コンテキストを保持したマルチターン会話の実装|LLM活用ガイド

前のセクション「5.1 チャットボットの基本アーキテクチャ」では、LLMを活用したチャットボットの構成要素と、そのバックエンド実装について学びました。ユーザーインターフェースから自然言語処理、API連携まで、全体像をつかむことができました。
今回は、より実践的なステップとして、ユーザーとの連続した会話を実現する「コンテキスト保持」に焦点を当てます。マルチターン会話が可能になることで、チャットボットは一層人間らしく、信頼性の高いインターフェースとなります。
5.2 コンテキストを保持したマルチターン会話の実装
シンプルなチャットボットは、各ユーザー入力に対して独立した応答を生成しますが、より自然な会話を実現するには、コンテキストを保持したマルチターン会話が必要です。コンテキストを保持することで、ユーザーの意図をより深く理解し、連続した質問にも対応できるチャットボットを構築できます。
コンテキストの管理方法
マルチターン会話を実装するには、以下の方法でコンテキストを管理することが一般的です:
- セッションごとの履歴保持: ユーザーの入力履歴をセッション内で保存し、過去のやり取りを参照して応答を生成します。
- ユーザーIDによるコンテキスト管理: ユーザーIDを使用して、ユーザーごとの会話履歴をデータベースに保存します。
- メモリ内キャッシュ: Redisなどのメモリ内キャッシュを使用して、会話の一時的な履歴を高速に参照します。
Pythonによるコンテキスト保持の例(Flask)
ここでは、Flaskを使用して、シンプルなコンテキスト保持機能を実装した例を紹介します。
from flask import Flask, request, jsonify, session
import openai
app = Flask(__name__)
app.secret_key = "your-secret-key"
openai.api_key = "your-api-key"
# コンテキスト保持用のAPIエンドポイント
@app.route("/chat", methods=["POST"])
def chat():
user_input = request.json.get("message")
# 会話履歴をセッションから取得
if "chat_history" not in session:
session["chat_history"] = []
# 最新のユーザー入力を履歴に追加
session["chat_history"].append({"role": "user", "content": user_input})
# OpenAI APIへのリクエスト
response = openai.ChatCompletion.create(
model="gpt-4",
messages=session["chat_history"]
)
bot_reply = response.choices[0].message["content"]
# ボットの応答を履歴に追加
session["chat_history"].append({"role": "assistant", "content": bot_reply})
return jsonify({"response": bot_reply})
この例では、Flaskのセッションを使用して会話履歴を管理しています。ユーザーの入力とボットの応答を履歴に保存し、コンテキストを保持しながら会話が進行します。
スケーラブルなコンテキスト管理の方法
セッションに会話履歴を保存する方法は簡単ですが、大規模なユーザーベースにはスケーラブルではありません。以下の技術を使用することで、スケーラビリティを向上させることができます:
- データベース: MongoDBやPostgreSQLなどのデータベースを使用して、ユーザーごとの会話履歴を永続的に保存します。
- Redis: 高速なデータアクセスが必要な場合、Redisをキャッシュとして使用します。
- 分散トレーシング: JaegerやZipkinなどのツールを使用して、複数のサーバー間でコンテキストをトラッキングします。
Redisを使用したコンテキスト管理の例
import redis
from flask import Flask, request, jsonify
import openai
app = Flask(__name__)
openai.api_key = "your-api-key"
redis_client = redis.StrictRedis(host="localhost", port=6379, db=0, decode_responses=True)
@app.route("/chat", methods=["POST"])
def chat():
user_id = request.json.get("user_id")
user_input = request.json.get("message")
# ユーザーの会話履歴をRedisから取得
chat_history = redis_client.get(user_id) or "[]"
chat_history = eval(chat_history)
# 最新のユーザー入力を履歴に追加
chat_history.append({"role": "user", "content": user_input})
# OpenAI APIへのリクエスト
response = openai.ChatCompletion.create(
model="gpt-4",
messages=chat_history
)
bot_reply = response.choices[0].message["content"]
# ボットの応答を履歴に追加し、Redisに保存
chat_history.append({"role": "assistant", "content": bot_reply})
redis_client.set(user_id, str(chat_history))
return jsonify({"response": bot_reply})
この例では、Redisを使用してユーザーごとの会話履歴を管理しています。スケーラビリティが高く、複数のサーバー間での一貫性も確保できます。
まとめ
コンテキストを保持したマルチターン会話は、ユーザー体験を向上させる重要な要素です。FlaskやRedisを使用した実装例を紹介しましたが、スケーラブルなソリューションを構築するには、ユーザーごとの履歴管理やキャッシュ戦略の工夫が求められます。
次のセクションに進む
次は、「5.3 NLUとNLGの活用」です。自然言語理解と自然言語生成の技術を使った高度なチャットボット設計について学びましょう。

下田 昌平
開発と設計を担当。1994年からプログラミングを始め、今もなお最新技術への探究心を持ち続けています。カテゴリー
タグ
検索履歴
チーム

任 弘毅
株式会社レシートローラーにて開発とサポートを担当。POSレジやShopifyアプリ開発の経験を活かし、業務のデジタル化を促進。

下田 昌平
開発と設計を担当。1994年からプログラミングを始め、今もなお最新技術への探究心を持ち続けています。