AIチャットボットや対話アプリケーションを構築する際、最大の問題の一つが「会話の文脈を維持する」ことです。ユーザーが2回目、3回目の質問をしたとき、AIは過去の会話を覚えているでしょうか?答案是「イエス」です。ただし、正しい実装が必要です。本記事では、HolySheep AIを使用して、多輪 대화システムを実装する方法をゼロから解説します。

多輪コンテキスト管理とは?

多輪コンテキスト管理とは、AIがユーザーとの会話において、過去の質問や回答を意識しながら応答することを可能にする技術です。例えば:

これを実装するには、会話履歴を適切に管理し、各リクエストに過去の内容を組み込む必要があります。

なぜAPIで状態管理が重要か

AI APIは本身状態を持ちません。各リクエストは独立して処理されます。つまり、あなたが何か特別なことをしなければ、AIは「前の質問は何だったか」を知りません。状態に「がない」という点は、 Stateless(ステートレス) と呼ばれます。

これを解决するために、2つの主要アプローチがあります:

アプローチ1:メッセージ履歴の自己管理

会話履歴をあなたのアプリケーション側で保存し、各リクエストで全ての発言を含めます。

アプローチ2:会話IDによる管理

APIが提供する会話IDを使用して、サーバー側で履歴を管理する方法です。

HolySheep AIのAPIは柔軟性が高く ambasのアプローチをサポートしています。

ステップバイステップ実装

前提準備

始める前に、以下のものが必要です:

💡 スクリーンショットヒント: HolySheep AIダッシュボードにログイン后、左側のメニューから「API Keys」を選択します。「Create New Key」ボタンをクリックして、任意の名前を付けてキーを生成してください。キーは「sk-...」で始まる文字列です。

ステップ1:基本的な単発リクエスト(比較用)

まず、状態管理なしの基本リクエストを理解しましょう。

import requests

HolySheep AI設定

API_KEY = "YOUR_HOLYSHEEP_API_KEY" BASE_URL = "https://api.holysheep.ai/v1" MODEL = "gpt-4.1" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }

単発の質問(履歴なし)

payload = { "model": MODEL, "messages": [ {"role": "user", "content": "你好,今天天气怎么样?"} ], "max_tokens": 500 } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload ) print(response.json()["choices"][0]["message"]["content"])

💡 ポイント: このコードでは、過去の会話がありません。もし次に「明天呢?(明天怎么样?)」と聞いても、AIはあなたの場所を分かりません。

ステップ2:メッセージ履歴を管理する基本形

会話履歴をリストで管理し、各リクエストに含めます。

import requests

API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"

def chat_with_context(messages_history):
    """
    会話履歴を渡して、AIの応答を取得
    messages_history: [{"role": "user/assistant", "content": "..."}]
    """
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "model": "gpt-4.1",
        "messages": messages_history,
        "max_tokens": 500
    }
    
    response = requests.post(
        f"{BASE_URL}/chat/completions",
        headers=headers,
        json=payload
    )
    
    return response.json()["choices"][0]["message"]

会話履歴の初期化

conversation = []

第1輪:東京の天気を聞く

conversation.append({"role": "user", "content": "東京の天気を教えて"}) response1 = chat_with_context(conversation) print(f"AI: {response1['content']}") conversation.append(response1)

第2輪:明日の天気を聞く

conversation.append({"role": "user", "content": "じゃあ、明日は?"}) response2 = chat_with_context(conversation) print(f"AI: {response2['content']}") conversation.append(response2)

第3輪:傘が必要か聞く

conversation.append({"role": "user", "content": "傘は必要?"}) response3 = chat_with_context(conversation) print(f"AI: {response3['content']}") conversation.append(response3)

結果:AIは過去の会話を踏まえて応答する

この方法的优点:実装が简单で、理解しやすいです。欠点:会話が長い場合、過去のすべてを送信するためコストと延迟が増加します。

ステップ3:履歴の要約でコスト最適化

長い会話では、全てを送信する和陈腐化します。定期的に履歴を「要約」して、過去の详细信息压缩する方法があります。

import requests

API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"

def summarize_and_truncate(conversation, max_messages=10):
    """
    会話履歴を指定长度に切り詰める
    実装案:古いメッセージを削除、または要約を生成
    """
    if len(conversation) <= max_messages:
        return conversation
    
    # 古いメッセージを切り詰める
    # 本番では「要約生成」を実装更具費用効果
    truncated = conversation[-max_messages:]
    return truncated

def chat_optimized(conversation, summarize_threshold=15):
    """
    最適化されたチャット関数
    """
    # 履歴过长時に切り詰め
    if len(conversation) > summarize_threshold:
        conversation = summarize_and_truncate(conversation, 10)
    
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "model": "gpt-4.1",
        "messages": conversation,
        "max_tokens": 500
    }
    
    response = requests.post(
        f"{BASE_URL}/chat/completions",
        headers=headers,
        json=payload
    )
    
    return response.json()["choices"][0]["message"]

使用例

conversation = [] for i in range(20): conversation.append({"role": "user", "content": f"質問{i}"}) response = chat_optimized(conversation) conversation.append(response) print(f"質問{i}への回答: {response['content'][:50]}...")

ステップ4:複数ユーザー・複数会話を管理

実際のアプリケーションでは、複数のユーザーの会話を同時に管理する必要があります。辞書を使って、各ユーザー独立的会话を維持します。

import requests
from datetime import datetime

API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"

class ConversationManager:
    """複数ユーザー・複数会話を管理するクラス"""