なぜ DeepSeek でエージェントを組むのか
エージェント実装はトークン消費が大きく、Claude / GPT-4o では月額がすぐに数百万円規模になる。DeepSeek V3.2 は同程度の精度を 1/20 のコストで提供しており、社内自動化や非機密エージェントの主役として最適である。本稿では DeepSeek を中核に置いたエージェント実装の典型パターンを示す。
ツール呼び出しの基本形
```python from openai import OpenAI client = OpenAI(base_url="https://api.deepseek.com", api_key=...)
tools = [{ "type": "function", "function": { "name": "search_kb", "description": "社内ナレッジベースを検索", "parameters": { "type": "object", "properties": { "query": {"type": "string"}, "top_k": {"type": "integer", "default": 5} }, "required": ["query"] } } }]
resp = client.chat.completions.create( model="deepseek-chat", messages=[...], tools=tools, tool_choice="auto", ) ```
DeepSeek V3.2 の tool calling は OpenAI 互換だが、複雑な JSON スキーマでは時折 `description` を無視するケースがある。`description` の文末に「必ずこの順序で呼び出すこと」のような制約を追記すると改善する。
自己反省ループ
R1 系列は推論プロセスを内部で展開するため、明示的な reflection ステップは V3.2 のほうが効果が大きい。基本パターンは「計画 → 実行 → 自己評価 → 計画修正」の 4 段。各ステップは独立したメッセージとして履歴に積む。
並列ツール実行
エージェントが複数ツールを連続で呼ぶ場合、依存関係のないツール呼び出しは並列実行することでレイテンシを大きく短縮できる。LangGraph の `parallel` ノードや、独自実装でも asyncio.gather で 2-3 倍速化する。
```python import asyncio
async def run_tools(tool_calls): tasks = [run_one(tc) for tc in tool_calls] return await asyncio.gather(*tasks) ```
フォールバックと安全網
- DeepSeek 公式 API がエラー → OpenRouter の DeepSeek 経由に自動切替(LiteLLM)
- ツール呼び出しが 5 回連続失敗 → エージェントを停止しヒトに引き継ぎ
- センシティブ判定 → 出力前に Llama Guard 3 でフィルタ
- ループ検出: 同じツール呼び出しを 3 回以上繰り返したら強制終了
観測
OpenTelemetry + Langfuse で各ステップを span として可視化。トークン使用量、ツール呼び出し回数、最終的な成功フラグをタグ付けし、エージェントの「失敗パターン」をクラスタリングする。社内 R&D では失敗の 60% が「ツール選定ミス」由来で、ツール記述の改善で大半が解消した。
まとめ
DeepSeek を中核に置いたエージェントは、Claude / GPT-4o 系に対して 1 桁安いコストで動かせる代わりに、ツール呼び出しの厳密性で若干劣る。明示的なフォールバック、リトライ、ヒト介入トリガを組み込んだうえで、社内自動化の主戦力として十分実用的である。