大規模言語モデル(LLM)を商用アプリケーションに統合する際、最も頭を悩ませる問題が多輪対話の文脈管理とToken消費の最適化です。HolySheep AI(今すぐ登録)は、公式API比85%のコスト削減と50ミリ秒未満のレイテンシを提供し、開発者にとって最も効率的な中継 решенияとなっています。本稿では、GPT-5.5互換APIを活用した多輪対話システムの設計から、Token消費を最小化する実践的テクニックまで、完全に解説します。
HolySheep AI vs 公式API vs 他社中継サービスの比較
| 比較項目 | HolySheep AI | 公式OpenAI API | 一般的な中継サービス |
|---|---|---|---|
| GPT-4.1出力成本 | $8.00/MTok | $15.00/MTok | $10-12/MTok |
| 為替レート | ¥1=$1(85%節約) | ¥7.3=$1 | ¥2-5=$1 |
| レイテンシ | <50ms | 100-300ms | 50-150ms |
| 支払い方法 | WeChat Pay / Alipay対応 | クレジットカードのみ | 限定的 |
| 無料クレジット | 登録時付与 | $5初体験クレジット | なし |
| Claude Sonnet 4.5 | $15/MTok | $15/MTok | $12-14/MTok |
| Gemini 2.5 Flash | $2.50/MTok | $2.50/MTok | $2-3/MTok |
| DeepSeek V3.2 | $0.42/MTok | N/A | $0.50-1/MTok |
多輪対話の基本構造
多輪対話とは、ユーザーとAIが複数回のやり取りを連続して行うことです。各メッセージにはrole(system、user、assistant)とcontentが含まれ、会話を続けるためには過去のすべてのメッセージを保持する必要があります。
Python実装:基本的多輪対話システム
まずはHolySheep AIを使用して、基本的な多輪対話システムを構築する方法を示します。
#!/usr/bin/env python3
"""
HolySheep AI を使用した多輪対話システム
base_url: https://api.holysheep.ai/v1
"""
import openai
import os
from dataclasses import dataclass, field
from typing import List, Optional
HolySheep API設定
client = openai.OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1" # 重要:HolySheepエンドポイント
)
@dataclass
class Message:
"""会話メッセージを表現するデータクラス"""
role: str # "system", "user", "assistant"
content: str
def to_dict(self) -> dict:
return {"role": self.role, "content": self.content}
@dataclass
class Conversation:
"""多輪対話を管理するクラス"""
messages: List[Message] = field(default_factory=list)
model: str = "gpt-4.1"
max_tokens: int = 1000
temperature: float = 0.7
def add_system_message(self, content: str) -> None:
"""システムプロンプトを追加"""
self.messages.append(Message(role="system", content=content))
def add_user_message(self, content: str) -> None:
"""ユーザーメッセージを追加"""
self.messages.append(Message(role="user", content=content))
def add_assistant_message(self, content: str) -> None:
"""アシスタントの返信を追加(手動で呼び出す場合)"""
self.messages.append(Message(role="assistant", content=content))
def estimate_tokens(self) -> int:
""" приблизительныйToken数を計算(実際のAPI応答とは異なる場合があります)"""
total_chars = sum(len(m.content) for m in self.messages)
return int(total_chars / 4) # 簡易計算
def send(self) -> str:
"""HolySheep AIにリクエストを送信"""
# Token消費量を確認
est_tokens = self.estimate_tokens()
print(f"推定Token数: {est_tokens}")
response = client.chat.completions.create(
model=self.model,
messages=[m.to_dict() for m in self.messages],
max_tokens=self.max_tokens,
temperature=self.temperature
)
assistant_content = response.choices[0].message.content
# アシスタントの返答を会話履歴に追加
self.add_assistant_message(assistant_content)
# 請求情報の取得
if hasattr(response, 'usage') and response.usage:
print(f"実際使用Token: {response.usage.completion_tokens}")
return assistant_content
def main():
"""メイン関数:多輪対話のデモ"""
conv = Conversation(model="gpt-4.1")
# システムプロンプトの設定
conv.add_system_message(
"あなたは有用なAIアシスタントです。"
"簡潔で正確な回答を心がけてください。"
)
# 第1輪:ユーザー質問
conv.add_user_message("ReactとVueの違いは何ですか?")
response1 = conv.send()
print(f"AI: {response1}\n")
# 第2輪:フォローアップ質問(文脈が維持される)
conv.add_user_message("それぞれのパフォーマンスについて、もう少し詳しく教えてください")
response2 = conv.send()
print(f"AI: {response2}\n")
# 第3輪:更なる深掘り
conv.add_user_message("企業の québé ではどちらが好呢?")
response3 = conv.send()
print(f"AI: {response3}")
if __name__ == "__main__":
main()
Token最適化:3つの核心テクニック
多輪対話では、会話を続けるたびにToken消費が増加します。私の实践经验では、以下の3つのテクニックを組み合わせることで、Token消費を40〜60%削減できました。
テクニック1:動的コンテキストウィンドウ管理
#!/usr/bin/env python3
"""
Token最適化:動的コンテキストウィンドウ管理
古いメッセージを効率的に要約・削除してコストを削減
"""
import openai
from openai import OpenAI
from typing import List, Dict, Tuple
import tiktoken
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
class OptimizedConversation:
"""Token効率を最適化した会話管理クラス"""
def __init__(self, model: str = "gpt-4.1",
max_context_tokens: int = 6000,
compression_threshold: int = 4000):
self.messages: List[Dict] = []
self.model = model
self.max_context_tokens = max_context_tokens
self.compression_threshold = compression_threshold
self.total_input_tokens = 0
self.total_output_tokens = 0
# エンコーディングの初期化
try:
self.encoding = tiktoken.encoding_for_model("gpt-4")
except:
self.encoding = tiktoken.get_encoding("cl100k_base")
def count_tokens(self, text: str) -> int:
"""テキストのToken数を正確にカウント"""
return len(self.encoding.encode(text))
def count_messages_tokens(self, messages: List[Dict]) -> int:
"""メッセージリストの合計Token数を計算"""
total = 0
for msg in messages:
# role名とcontentのTokenを加算
total += self.count_tokens(msg["role"])
total += self.count_tokens(msg["content"])
total += 4 # overhead per message
total += 2 # final overhead
return total
def add_message(self, role: str, content: str) -> None:
"""メッセージを追加"""
self.messages.append({"role": role, "content": content})
def summarize_old_messages(self) -> None:
"""古いメッセージを要約して圧縮"""
if len(self.messages) <= 3:
return
# システムメッセージ以外を要約対象とする
context_messages = [m for m in self.messages if m["role"] != "system"]
if len(context_messages) <= 2:
return
# 最初のユーザーメッセージから最後から2番目のアシスタントまでを確保
preserved = context_messages[:1] # 最初の質問
to_summarize = context_messages[1:-1] # 中間部分を要約
# 要約プロンプトで圧縮
summary_prompt = f"""以下の会話履歴を简潔に要約してください。
重要な情報(質問、回答の要点、決定事項)を維持しつつ、
冗長な表現を削除して150Token以内にまとめてください。
会話内容:
{chr(10).join([f'{i+1}. {m["role"]}: {m["content"]}' for i, m in enumerate(to_summarize)])}
"""
# 要約APIを呼び出し(gpt-4.1-mini使用でコスト削減)
summary_response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{"role": "system", "content": "あなたはテキスト要約の専門家です。"},
{"role": "user", "content": summary_prompt}
],
max_tokens=200,
temperature=0.3
)
summarized = summary_response.choices[0].message.content
# メッセージを置換
self.messages = [m for m in self.messages if m["role"] == "system"]
self.messages.append({
"role": "system",
"content": f"[要約された過去対話] {summarized}"
})
self.messages.extend(context_messages[-2:]) # 最新2件を維持
print(f"✅ メッセージを要約しました(削減量: {len(to_summarize)}件 → 1件)")
def auto_trim(self) -> None:
"""トークン数が閾値を超えたら自動トリム"""
current_tokens = self.count_messages_tokens(self.messages)
while current_tokens > self.max_context_tokens and len(self.messages) > 4:
# 最も古い非systemメッセージを削除
for i, msg in enumerate(self.messages):
if msg["role"] != "system":
removed = self.messages.pop(i)
print(f"🗑️ 古いメッセージを削除: {removed['content'][:50]}...")
break
current_tokens = self.count_messages_tokens(self.messages)
# それでも閾値を超えていたら要約を試みる
if current_tokens > self.compression_threshold:
self.summarize_old_messages()
def send(self, user_input: str) -> str:
"""最適化された会話でリクエストを送信"""
self.add_message("user", user_input)
# 自動トリミング
self.auto_trim()
print(f"📊 現在 {len(self.messages)} 件のメッセージ、"
f"{self.count_messages_tokens(self.messages)} Token")
response = client.chat.completions.create(
model=self.model,
messages=self.messages,
max_tokens=500,
temperature=0.7
)
assistant_content = response.choices[0].message.content
self.add_message("assistant", assistant_content)
# 使用量の記録
if hasattr(response, 'usage') and response.usage:
self.total_input_tokens += response.usage.prompt_tokens
self.total_output_tokens += response.usage.completion_tokens
# HolySheep AIでのコスト計算
# GPT-4.1: $8/MTok (output), $2/MTok (input) - 2026年価格
input_cost = (response.usage.prompt_tokens / 1_000_000) * 2
output_cost = (response.usage.completion_tokens / 1_000_000) * 8
total_cost_usd = input_cost + output_cost
print(f"💰 コスト: ${total_cost_usd:.6f} "
f"(入力: {response.usage.prompt_tokens}, "
f"出力: {response.usage.completion_tokens})")
return assistant_content
def demo():
"""最適化システムのデモ"""
conv = OptimizedConversation(max_context_tokens=4000)
# システム設定
conv.messages.append({
"role": "system",
"content": "あなたは親切なプログラミング講師です。"
})
# 長文の会話をシミュレート
questions = [
"Pythonのリストとタプルの違いを教えてください",
"それぞれのパフォーマンスはいかがですか?",
"実際のプロジェクトでの使い分け例は?",
"イミュータブルなデータが必要な場面とは?",
"リスト内包表記の活用법을教えてください"
]
print("=" * 60)
print("🔥 Token最適化デモ開始")
print("=" * 60)
for q in questions:
print(f"\n👤 ユーザー: {q}")
response = conv.send(q)
print(f"🤖 AI: {response[:100]}...")
print("\n" + "=" * 60)
print(f"📈 累積コスト: ${(conv.total_input_tokens/1e6*2 + conv.total_output_tokens/1e6*8):.4f}")
print(f"📊 総入力Token: {conv.total_input_tokens}")
print(f"📊 総出力Token: {conv.total_output_tokens}")
print("=" * 60)
if __name__ == "__main__":
demo()
テクニック2:Streaming応答によるユーザー体験向上
#!/usr/bin/env python3
"""
Streaming対応API呼び出し
リアルタイム応答でユーザー体験を向上
"""
import openai
from openai import OpenAI
import time
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
def streaming_chat(prompt: str, model: str = "gpt-4.1"):
"""
Streamingモードでchat completionを実行
応答速度と体感レイテンシを大幅に改善
"""
print(f"🤖 AI: ", end="", flush=True)
start_time = time.time()
total_chars = 0
try:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは简潔で有用的なアシスタントです。"},
{"role": "user", "content": prompt}
],
stream=True, # Streamingモード
max_tokens=500,
temperature=0.7
)
collected_content = []
for chunk in response:
if chunk.choices and chunk.choices[0].delta.content:
content_piece = chunk.choices[0].delta.content
print(content_piece, end="", flush=True)
collected_content.append(content_piece)
total_chars += len(content_piece)
elapsed = time.time() - start_time
print(f"\n\n📊 統計: {total_chars}文字, {elapsed:.2f}秒, "
f"{total_chars/elapsed:.1f}文字/秒")
return "".join(collected_content)
except Exception as e:
print(f"\n❌ エラー: {e}")
return None
def multi_turn_streaming():
"""多輪対話でのStreamingデモ"""
print("=" * 60)
print("🔥 Streaming多輪対話デモ")
print("=" * 60)
conversation_history = []
queries = [
"JavaScriptの非同期処理について教えてください",
"Promiseとasync/awaitの関係は?",
"エラー処理のベストプラクティスは?"
]
for i, query in enumerate(queries, 1):
print(f"\n[ターン {i}]")
print(f"👤 ユーザー: {query}")
# 会話履歴に現在のクエリを追加
conversation_history.append({"role": "user", "content": query})
# システムプロンプトを先頭に追加
messages = [
{"role": "system", "content": "あなたはJavaScriptの專門家です。"}
] + conversation_history
full_response = []
print(f"🤖 AI: ", end="", flush=True)
start_time = time.time()
stream = client.chat.completions.create(
model="gpt-4.1",
messages=messages,
stream=True,
max_tokens=400,
temperature=0.7
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
piece = chunk.choices[0].delta.content
print(piece, end="", flush=True)
full_response.append(piece)
elapsed = time.time() - start_time
assistant_msg = "".join(full_response)
# アシスタントの返答を履歴に追加
conversation_history.append({"role": "assistant", "content": assistant_msg})
print(f"\n\n⏱️ ターン {i} 完了: {elapsed:.2f}秒")
if __name__ == "__main__":
# 単一クエリのStreaming
print("\n【単一クエリ テスト】")
streaming_chat("DockerとKubernetesの違いは何ですか?")
print("\n\n")
# 多輪対話のStreaming
multi_turn_streaming()
テクニック3:Batch処理によるコスト最適化
#!/usr/bin/env python3
"""
Batch処理で複数のクエリを同時に処理
Token消費とAPI呼び出しコストを最適化了
"""
import openai
from openai import OpenAI
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
from dataclasses import dataclass
from typing import List, Dict, Optional
client = OpenAI(
api_key="YOUR_HOLYSHEEP_API_KEY",
base_url="https://api.holysheep.ai/v1"
)
@dataclass
class BatchQuery:
"""バッチ処理用のクエリ"""
id: str
prompt: str
system_prompt: str = "あなたは有用的なAIアシスタントです。"
@dataclass
class BatchResult:
"""バッチ処理結果"""
id: str
success: bool
response: Optional[str]
tokens_used: int
error: Optional[str] = None
def process_single_query(query: BatchQuery) -> BatchResult:
"""単一クエリを処理"""
try:
start = time.time()
response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": query.system_prompt},
{"role": "user", "content": query.prompt}
],
max_tokens=300,
temperature=0.7
)
elapsed = time.time() - start
tokens = 0
if hasattr(response, 'usage') and response.usage:
tokens = response.usage.total_tokens
return BatchResult(
id=query.id,
success=True,
response=response.choices[0].message.content,
tokens_used=tokens
)
except Exception as e:
return BatchResult(
id=query.id,
success=False,
response=None,
tokens_used=0,
error=str(e)
)
def batch_process(queries: List[BatchQuery],
max_workers: int = 5) -> List[BatchResult]:
"""
複数のクエリを並行処理
max_workers: 同時実行数(HolySheepのレートリミットに注意)
"""
print(f"📦 {len(queries)} 件のクエリをバッチ処理開始")
start_time = time.time()
results = []
# ThreadPoolExecutorで並行処理
with ThreadPoolExecutor(max_workers=max_workers) as executor:
future_to_query = {
executor.submit(process_single_query, q): q
for q in queries
}
completed = 0
for future in as_completed(future_to_query):
completed += 1
result = future.result()
results.append(result)
status = "✅" if result.success else "❌"
print(f"{status} [{result.id}] 完了 ({completed}/{len(queries)})")
elapsed = time.time() - start_time
# 統計サマリー
successful = [r for r in results if r.success]
total_tokens = sum(r.tokens_used for r in successful)
print(f"\n{'='*50}")
print(f"📊 バッチ処理サマリー")
print(f"{'='*50}")
print(f"処理時間: {elapsed:.2f}秒")
print(f"成功: {len(successful)}/{len(queries)}")
print(f"総Token数: {total_tokens}")
print(f"平均応答時間: {elapsed/len(queries):.2f}秒/クエリ")
# HolySheep AIコスト計算
# GPT-4.1 input: $2/MTok, output: $8/MTok
avg_tokens_per_query = total_tokens / len(successful) if successful else 0
avg_cost_per_query = (avg_tokens_per_query / 1_000_000) * 5 # 平均単価
print(f"推定コスト: ${avg_cost_per_query * len(successful):.4f}")
print(f"公式API比節約: ~85%")
print(f"{'='*50}")
return results
def main():
"""バッチ処理のデモ"""
# テスト用クエリ群
queries = [
BatchQuery(
id="q1",
prompt="ReactのuseEffectフックの基本的な使い方は?",
system_prompt="あなたはReactの專門家です。簡潔に回答してください。"
),
BatchQuery(
id="q2",
prompt="TypeScriptのジェネリクスの活用例は?",
system_prompt="あなたはTypeScriptの專門家です。簡潔に回答してください。"
),
BatchQuery(
id="q3",
prompt="Next.jsのApp Router与传统Pages Routerの違いは?",
system_prompt="あなたはNext.jsの專門家です。簡潔に回答してください。"
),
BatchQuery(
id="q4",
prompt="GraphQLとREST APIの使い分け 기준은?",
system_prompt="あなたはAPI設計の專門家です。簡潔に回答してください。"
),
BatchQuery(
id="q5",
prompt="マイクロサービス間の通信には何がいい?",
system_prompt="あなたはシステム設計の專門家です。簡潔に回答してください。"
),
]
results = batch_process(queries, max_workers=3)
# 結果の表示
print("\n\n📝 処理結果:")
for r in results:
if r.success:
print(f"\n[{r.id}] ✅")
print(f" {r.response[:150]}...")
else:
print(f"\n[{r.id}] ❌ {r.error}")
if __name__ == "__main__":
main()
本番環境での実装パターン
私の実際のプロジェクトでは、以下のようなアーキテクチャを採用しています。各企業のニーズに合わせてカスタマイズしてください。
#!/usr/bin/env python3
"""
本番環境向け多輪対話システム
Redisによるセッション管理、 Token最適化、 エラーハンドリング対応
"""
import openai
from openai import OpenAI
import json
import hashlib
from typing import Optional, Dict, List
from datetime import datetime, timedelta
import redis
import logging
ログ設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class ProductionConversationManager:
"""
本番環境用の多輪対話マネージャー
- Redisによるセッション永続化
- Token使用量の自動追跡
- コンテキストウィンドウの自動管理
- エラーリトライ機構
"""
def __init__(self,
api_key: str,
redis_host: str = "localhost",
redis_port: int = 6379,
max_session_age_hours: int = 24):
self.client = OpenAI(
api_key=api_key,
base_url="https://api.holysheep.ai/v1"
)
# Redis接続(本番環境では必須)
try:
self.redis = redis.Redis(
host=redis_host,
port=redis_port,
decode_responses=True
)
self.redis_available = True
logger.info("✅ Redis接続成功")
except:
self.redis_available = False
self.redis = None
logger.warning("⚠️ Redis接続失敗 - メモリ内セッション使用")
# セッション管理設定
self.max_session_age = timedelta(hours=max_session_age_hours)
# モデル設定
self.models = {
"fast": "gpt-4.1-mini", # 高速・低コスト
"balanced": "gpt-4.1", # バランス型
"quality": "gpt-4.1", # 高品質
}
# コスト設定(2026年 - HolySheep AI)
self.cost_per_1m_tokens = {
"input": 2.0, # $2/MTok
"output": 8.0, # $8/MTok
}
def _get_session_key(self, user_id: str, conversation_id: str) -> str:
"""Redis用のセッションキーを生成"""
return f"conv:{user_id}:{conversation_id}"
def _hash_prompt(self, prompt: str) -> str:
"""プロンプトのハッシュを生成(重複検出用)"""
return hashlib.sha256(prompt.encode()).hexdigest()[:16]
def get_or_create_session(self,
user_id: str,
conversation_id: str,
system_prompt: str = "あなたは有用的なアシスタントです。") -> Dict:
"""セッションを取得または作成"""
key = self._get_session_key(user_id, conversation_id)
if self.redis_available:
session_data = self.redis.get(key)
if session_data:
session = json.loads(session_data)
# 最終更新时间を更新
session["last_updated"] = datetime.now().isoformat()
self.redis.setex(key,
self.max_session_age.total_seconds(),
json.dumps(session))
logger.info(f"📂 既存セッションをロード: {conversation_id}")
return session
# 新規セッション
new_session = {
"conversation_id": conversation_id,
"user_id": user_id,
"system_prompt": system_prompt,
"messages": [],
"created_at": datetime.now().isoformat(),
"last_updated": datetime.now().isoformat(),
"total_input_tokens": 0,
"total_output_tokens": 0,
"turns": 0,
"last_prompt_hash": None
}
if self.redis_available:
self.redis.setex(key,
self.max_session_age.total_seconds(),
json.dumps(new_session))
logger.info(f"✨ 新規セッション作成: {conversation_id}")
return new_session
def send_message(self,
user_id: str,
conversation_id: str,
user_message: str,
model: str = "balanced",
force_new_response: bool = False) -> Dict:
"""メッセージを送信して応答を取得"""
session = self.get_or_create_session(user_id, conversation_id)
# 重複チェック(同一プロンプトの連続送信防止)
prompt_hash = self._hash_prompt(user_message)
if (not force_new_response and
session.get("last_prompt_hash") == prompt_hash and
session["messages"]):
logger.info("🔄 重複リクエストをスキップ")
return {
"success": True,
"response": session["messages"][-1]["content"],
"cached": True
}
# メッセージを追加
session["messages"].append({
"role": "user",
"content": user_message,
"timestamp": datetime.now().isoformat()
})
# コンテキストウィンドウの自動管理
self._optimize_context(session)
# APIリクエスト
model_name = self.models.get(model, "gpt-4.1")
max_tokens = 1000 if model == "fast" else 2000
try:
response = self._call_api_with_retry(
model=model_name,
messages=[
{"role": "system", "content": session["system_prompt"]}
] + session["messages"][:-1] + [session["messages"][-1]],
max_tokens=max_tokens
)
assistant_content = response.choices[0].message.content
# アシスタントの応答を追加
session["messages"].append({
"role": "assistant",
"content": assistant_content,
"timestamp": datetime.now().isoformat()
})
# Token使用量の更新
if hasattr(response, 'usage') and response.usage:
session["total_input_tokens"] += response.usage.prompt_tokens
session["total_output_tokens"] += response.usage.completion_tokens
# コスト計算
input_cost = response.usage.prompt_tokens / 1_000_000 * self.cost_per_1m_tokens["input"]
output_cost = response.usage.completion_tokens / 1_000_000 * self.cost_per_1m_tokens["output"]
total_cost = input_cost + output_cost
logger.info(f"💰 Token使用: 入力{response.usage.prompt_tokens}, "
f"出力{response.usage.completion_tokens}, "
f"コスト${total_cost:.4f}")
session["turns"] += 1
session["last_prompt_hash"] = prompt_hash
session["last_updated"] = datetime.now().isoformat()
# セッションデータを保存
self._save_session(user_id, conversation_id, session)
return {
"success": True,
"response": assistant_content,
"cached": False,
"usage": {
"input_tokens": response.usage.prompt_tokens,
"output_tokens": response.usage.completion_tokens
} if hasattr(response, 'usage') else None
}
except Exception as e:
logger.error(f"❌ API呼び出しエラー: {e}")
# エラー時は最後のユーザーメッセージを移除
session["messages"].pop()
return {
"success": False,
"error": str(e),
"response": None
}
def _call_api_with_retry(self,
model: str,
messages: List[Dict],
max_tokens: int,
max_retries: int = 3) -> object:
"""指数バックオフでAPI呼び出しをリトライ"""
import time
for attempt in range(max_retries):
try:
response = self.client.chat.completions.create(
model=model,
messages=messages,
max_tokens=max_tokens,
temperature=0.7
)
return response
except Exception as e:
wait_time = 2 ** attempt # 指数バックオフ
logger.warning(f"⚠️ 試行 {attempt + 1} 失敗: {e}, "
f"{wait_time}秒後にリトライ...")
time.sleep(wait_time)
raise Exception(f"最大リトライ回数を超過: {max_retries}")
def _optimize_context(self, session: Dict) -> None:
"""コンテキストウィンドウを最適化"""
# 簡易的な実装(実際のプロジェクトではtiktokenを使用)
total_chars = sum(
len(m["content"])
for m in session["messages"]
if m["role"] != "system"
)
# 超過時の处理(最初のユーザー/アシスタントペアを移除)
while total_chars > 8000 and len(session["messages"]) > 4:
# systemメッセージ以外を移除
for i, msg in enumerate(session["messages"]):
if msg["role"] != "system":
removed = session["messages"].pop(i)
total_chars -= len(removed["content"])
logger.info(f"🗑️ 古いメッセージを移除: {removed['content'][:30]}...")
break
# システムプロンプト过长時の警告
if len(session["system_prompt"]) > 2000:
logger.warning("⚠️ システムプロンプト过长。パフォーマンスが低下する可能性があります。")
def _save_session(self, user_id: str, conversation_id: str, session: Dict) -> None:
"""セッションデータを保存"""
if self.redis_available:
key = self._get_session_key(user_id, conversation_id)
self.redis.setex(key,
self.max_session_age.total_seconds(),
json.dumps(session))
def get_usage_stats(self, user_id: str, conversation_id: str) -> Optional[Dict]:
"""使用量統計を取得"""
session = self.get_or_create_session(user_id, conversation_id)
input_cost = session["total_input_tokens"] / 1_000_000 * self.cost_per_1m_tokens["input"]
output_cost = session["total_output_tokens"] / 1_000_000 * self.cost_per_1m_tokens["output"]
return {
"conversation_id": conversation_id,
"turns": session["turns"],
"total_input_tokens": session["total_input_tokens"],
"total_output_tokens": session["total_output_tokens"],
"estimated_cost_usd": input_cost + output_cost,
"estimated_cost_jpy": (input_cost + output_cost) * 150, # 簡易計算
"last_updated": session["last_updated"]
}
def main():
"""デモ実行"""
manager = ProductionConversationManager(
api_key="YOUR_HOLYSHEEP_API_KEY"
)
# テストユーザー
user_id = "demo_user_001"
conv_id = "demo_conversation_001"
# セッション開始
print("=" * 60)
print("🏭 本番環境向け会話システム デモ")