はじめに
WhatsApp や Telegram でメッセージを送信した後、返信を受け取るまでに長時間待たされると、ユーザー体験が大幅に低下します。レスポンス遅延はネットワーク転送、モデル推論、コンテキスト処理など複数の工程から発生します。本記事では、ボトルネックを体系的に特定し、最適化する方法をご紹介します。
一、レスポンス遅延の分析
メッセージの送信から返信の受信まで、以下の工程を経ます:
ユーザーがメッセージを送信
│
├── ① チャネル受信遅延(通常 < 1秒)
│
├── ② OpenClaw 処理遅延(通常 < 0.5秒)
│ ├── コンテキストの組み立て
│ ├── スキルのマッチング
│ └── プロンプトの構築
│
├── ③ モデル API 遅延(通常 1-30秒)★ 主要なボトルネック
│ ├── ネットワーク転送
│ ├── キュー待ち
│ └── モデル推論
│
└── ④ 返信送信遅延(通常 < 1秒)
1.1 各工程の遅延測定
# OpenClaw ログの遅延情報を確認
openclaw logs | grep -i "latency\|duration\|took\|elapsed"
# モデル API の遅延を直接テスト
time curl -s https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 100,
"messages": [{"role":"user","content":"hello"}]
}' -o /dev/null -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTLS: %{time_appconnect}s\nFirst Byte: %{time_starttransfer}s\nTotal: %{time_total}s\n"
出力例:
DNS: 0.012s
Connect: 0.145s
TLS: 0.298s
First Byte: 2.156s
Total: 2.890s
二、モデル選択が速度に与える影響
モデルによってレスポンス速度には大きな差があります。
2.1 各モデルの遅延比較
| プロバイダー | モデル | 平均初回Token遅延 | 生成速度 (tokens/s) | 適用シーン |
|---|---|---|---|---|
| Anthropic | Claude Opus | 2-5s | 30-50 | 複雑なタスク |
| Anthropic | Claude Sonnet | 1-3s | 50-80 | 日常会話 |
| Anthropic | Claude Haiku | 0.5-1.5s | 80-120 | 高速返信 |
| OpenAI | GPT-4o | 1-3s | 50-80 | 日常会話 |
| OpenAI | GPT-4o-mini | 0.5-1.5s | 80-120 | 高速返信 |
| Groq | Llama 3 70B | 0.2-0.5s | 200-300 | 超高速返信 |
| Deepseek | Deepseek V3 | 1-3s | 40-60 | コスパ重視 |
| Ollama | Llama 3 8B | 0.1-1s | 20-100* | ローカル実行 |
*ローカルモデルの速度はハードウェア構成に依存します
2.2 シーンに応じたモデル選択
// ~/.config/openclaw/openclaw.json5
{
"models": {
// デフォルトモデル - 速度と品質のバランス
"primary": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514"
},
// 高速レスポンスモデル - シンプルな会話向け
"fast": {
"provider": "groq",
"model": "llama-3.1-70b-versatile"
}
}
}
三、コンテキストウィンドウの最適化
コンテキストが長いほど、モデルの処理時間が増加します。コンテキストサイズの最適化は速度向上の重要な手段です。
3.1 コンテキスト長の制限
{
"conversation": {
// 保持する履歴メッセージ数を削減
"maxMessages": 30,
// 1メッセージの最大長を制限
"maxMessageLength": 4000,
// システムプロンプトの簡素化
"systemPromptMaxLength": 2000
}
}
3.2 要約戦略の使用
会話が一定の長さを超えた場合、自動的に要約を生成して履歴メッセージを置き換えます:
{
"conversation": {
"contextStrategy": "summarize",
"summarizeThreshold": 20, // 20件のメッセージを超えたら要約をトリガー
"summarizeKeepRecent": 5 // 直近5件の元のメッセージを保持
}
}
3.3 スキルコンテキストの制御
読み込まれた各スキルはシステムプロンプトの長さを増加させます:
# 読み込み済みのスキルを確認
openclaw skill list
# 不要なスキルを無効化してコンテキストを削減
# 必要なスキルのみ ~/.openclaw/skills/ ディレクトリに保持
四、ストリーミング出力の設定
ストリーミング出力(Streaming)を有効にすると、ユーザーが返信の冒頭を素早く確認でき、体感遅延が大幅に改善されます。
4.1 ストリーミング出力の有効化
// ~/.config/openclaw/openclaw.json5
{
"streaming": {
"enabled": true,
// バッファサイズ(文字数)、一定量が溜まってから送信
"bufferSize": 50,
// 最大バッファ待機時間(ミリ秒)
"flushInterval": 500
}
}
4.2 各チャネルのストリーミング対応状況
| チャネル | ストリーミング対応 | 実装方式 |
|---|---|---|
| Telegram | 部分対応 | メッセージ編集でシミュレート |
| Discord | 部分対応 | メッセージ編集でシミュレート |
| 非対応 | 完全な返信を待機 | |
| Slack | 対応 | メッセージ更新 |
| API | 完全対応 | SSE イベントストリーム |
ストリーミング非対応のチャネルでは、分割送信を有効にできます:
{
"streaming": {
"fallbackMode": "chunked",
// 各セグメントの最大文字数
"chunkSize": 500
}
}
五、ネットワーク遅延の最適化
5.1 より近い API エンドポイントの選択
{
"models": {
"primary": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
// アジアにいる場合、アジア太平洋リージョンのエンドポイントを使用(利用可能な場合)
"baseUrl": "https://api.anthropic.com"
}
}
}
5.2 DNS の最適化
# より高速な DNS サーバーを使用
# Cloudflare DNS
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
echo "nameserver 1.0.0.1" | sudo tee -a /etc/resolv.conf
# または Google DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
5.3 プロキシの最適化
プロキシ経由で API にアクセスする場合、プロキシの遅延をできるだけ低くしてください:
# プロキシ遅延のテスト
time curl -x http://127.0.0.1:7890 -s https://api.anthropic.com/v1/messages -o /dev/null
# 直接接続の遅延との比較
time curl -s https://api.anthropic.com/v1/messages -o /dev/null
プロキシが顕著な遅延を追加している場合、プロキシノードの変更やより高速なプロキシプロトコルの使用を検討してください。
5.4 HTTP コネクションの再利用
{
"network": {
// HTTP Keep-Alive の有効化
"keepAlive": true,
// 最大同時接続数
"maxSockets": 10,
// アイドル接続タイムアウト
"keepAliveTimeout": 60000
}
}
六、ローカルモデルの最適化
Ollama でローカルモデルを実行する場合、ハードウェア構成が推論速度を直接決定します。
6.1 GPU アクセラレーション
# Ollama が GPU を認識しているか確認
ollama ps
# NVIDIA GPU の場合は CUDA ドライバーのインストールが必要
nvidia-smi
# Ollama が GPU を使用していることを確認
# ログに "using GPU" または "CUDA" が表示されるか確認
journalctl -u ollama | grep -i "gpu\|cuda"
6.2 モデル量子化の選択
量子化により、メモリ要件を大幅に削減し推論速度を向上させることができます:
| 量子化レベル | モデルサイズ (7B) | 速度 | 品質低下 |
|---|---|---|---|
| FP16 | ~14GB | 基準 | なし |
| Q8_0 | ~7.5GB | 1.5x | 極めて小さい |
| Q5_K_M | ~5GB | 2x | 小さい |
| Q4_K_M | ~4GB | 2.5x | 中程度 |
| Q3_K_M | ~3.5GB | 3x | やや大きい |
# 適切な量子化バージョンを選択
ollama pull llama3:8b-q4_K_M
# OpenClaw で指定
{
"models": {
"primary": {
"provider": "ollama",
"model": "llama3:8b-q4_K_M"
}
}
}
6.3 Ollama パフォーマンスチューニング
# GPU レイヤー数を増加(より多くのレイヤーを GPU で計算)
OLLAMA_NUM_GPU=999 ollama serve
# 並列処理数の設定
OLLAMA_NUM_PARALLEL=2 ollama serve
# モデルをメモリに保持(コールドスタート遅延の回避)
OLLAMA_KEEP_ALIVE=24h ollama serve
七、同時リクエスト処理
複数のユーザーが同時にメッセージを送信すると、直列処理では後続ユーザーの待ち時間が長くなります。
7.1 同時実行設定
{
"performance": {
// 最大同時リクエスト数
"maxConcurrentRequests": 5,
// リクエストキュー戦略
"queueStrategy": "fifo",
// キューが満杯時の処理方式
"queueOverflow": "reject_with_message",
"queueOverflowMessage": "現在リクエストが集中しています。しばらくしてから再度お試しください。"
}
}
7.2 マルチモデル負荷分散
{
"models": {
"loadBalancing": {
"enabled": true,
"strategy": "round-robin",
"providers": [
{
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"weight": 2
},
{
"provider": "openai",
"model": "gpt-4o",
"weight": 1
}
]
}
}
}
八、パフォーマンス監視と継続的な最適化
8.1 レスポンス遅延の追跡
# 平均レスポンス時間の監視
openclaw logs | grep "response_time" | awk '{sum+=$NF; count++} END {print "平均遅延:", sum/count, "ms"}'
# 最も遅いリクエストの特定
openclaw logs | grep "response_time" | sort -t: -k2 -n -r | head -10
8.2 最適化チェックリスト
□ シーンに適したモデルを選択(軽量タスクには高速モデル)
□ コンテキスト長を制限(maxMessages ≤ 30)
□ ストリーミング出力を有効化
□ ネットワークを最適化(DNS、プロキシ、コネクション再利用)
□ ローカルモデルの GPU アクセラレーションを有効化
□ 適切な同時実行数を設定
□ 読み込むスキル数を削減
□ 要約戦略で履歴会話を圧縮
以上の方法を一つずつ調査・最適化することで、OpenClaw のレスポンス速度は大幅に向上します。ほとんどの場合、適切なモデルの選択とコンテキスト長の最適化で、遅延問題の 80% は解決できます。