シンプルなチャットボット
最小構成のチャットボットを Flask で作ります。
設計
- 状態は クライアント (ブラウザ) が持つ。
- サーバーは履歴を受け取って Claude に転送するだけ。
- Streaming で応答を逐次返す。
サーバー側
import voyageai
vo = voyageai.Client() # 環境変数 VOYAGE_API_KEY
result = vo.embed(
texts=["猫が好きです", "犬が好きです", "天気がいいです"],
model="voyage-3-large",
input_type="document", # or "query"
)
vectors = result.embeddings # list[list[float]]
クライアント側 (擬似)
system=[
{"type": "text", "text": SYSTEM_BASE},
{"type": "text", "text": LONG_GUIDELINES, "cache_control": {"type": "ephemeral"}},
]
履歴の長期化対策: Sliding Window + Summary
会話が長くなると input が肥大化します。次の戦略を組み合わせます:
wzxhzdk:2
summarize() も Claude で実装すれば自然な要約に。
ベストプラクティス
- システムプロンプトはキャッシュ対象に。
- 入力検証: 極端に長い入力 / 連投 を制限。
- ユーザー識別はハッシュ化して
metadata.user_idに。 - 失敗時は 古い応答に戻す or 再試行 UI を提供。
- レート制限はサーバー側でクオータ実装。
Cache をかける
長い system は cache_control: ephemeral で。
ユーザーが多いほどヒット率が上がる。
system=[
{"type": "text", "text": SYSTEM_BASE},
{"type": "text", "text": LONG_GUIDELINES, "cache_control": {"type": "ephemeral"}},
]
Tip: ユーザーごとのカスタム system
「このユーザーは英語で答える」「あのユーザーは詳細な技術解説を好む」など、 ユーザー設定 + 共通システム のハイブリッドが理想。
この academy アプリも参考に
本講座の Playground は同じパターンで実装されています (app.py の api_playground)。