NemoClawチャットボット構築の全体像

NemoClawはNVIDIAのOpenShellランタイムとNemotronモデルを組み合わせた企業向けAIエージェント基盤です。単純な質問応答から、社内システム連携・業務フロー自動化まで対応するチャットボットを構築できます。

本チュートリアルでは以下の流れでチャットボットを完成させます。

ステップ作業内容所要時間(目安)
1環境準備・NemoClawインストール30〜60分
2blueprint.yaml作成(サンドボックス設定)15〜30分
3プロンプト設計・システムプロンプト定義30〜90分
4メモリ・会話履歴設定20〜40分
5外部API・ツール連携60〜120分
6デプロイ・本番公開30〜60分
7テスト・品質検証60〜120分

このチュートリアルはNemoClawのインストールが完了している前提で進めます。まだの場合は「NemoClawのインストール方法」を先に参照してください。

ステップ1:環境準備とプロジェクト作成

チャットボットプロジェクト用のディレクトリを作成し、必要なファイル構成を整えます。

プロジェクトディレクトリ構造

my-chatbot/
├── blueprint.yaml          # NemoClaw設定ファイル
├── prompts/
│   ├── system.md           # システムプロンプト
│   └── welcome.md          # ウェルカムメッセージ
├── tools/
│   └── api_connector.py    # 外部API連携スクリプト
├── workspace/              # エージェントが読み書きできるディレクトリ
│   └── conversation_log/
└── .env                    # APIキー等の環境変数

以下のコマンドでディレクトリ構造を一括作成します。

mkdir -p my-chatbot/{prompts,tools,workspace/conversation_log}
cd my-chatbot
touch blueprint.yaml prompts/system.md prompts/welcome.md tools/api_connector.py .env

環境変数ファイルの設定

.envファイルにAPIキーと設定値を記述します。このファイルはGitの管理対象から除外してください。

# .env
NVIDIA_API_KEY=nvapi-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CHATBOT_NAME=MyEnterpriseBot
MAX_CONVERSATION_TURNS=20
LOG_LEVEL=info

# 外部API連携用(必要に応じて)
SLACK_BOT_TOKEN=xoxb-xxxxxxxxxxxx
CRM_API_KEY=your-crm-api-key
# .gitignore
.env
workspace/conversation_log/

ステップ2:blueprint.yamlの作成

blueprint.yamlはNemoClawの動作を制御する設定ファイルです。チャットボット用のサンドボックスポリシーと推論設定を定義します。

# blueprint.yaml(チャットボット基本設定)
profile: cloud

model:
  provider: nvidia
  name: nemotron-3-super-120b
  api_key: "${NVIDIA_API_KEY}"
  temperature: 0.7
  max_tokens: 2048
  top_p: 0.9

sandbox:
  enabled: true
  filesystem:
    allow:
      - "./workspace/"
      - "./prompts/"
    deny:
      - "./.env"
      - "/etc/"
      - "/home/"
  network:
    allow:
      - "api.example-crm.com"
      - "slack.com"
    deny:
      - "*"          # 上記以外のネットワークアクセスを禁止

memory:
  enabled: true
  backend: file
  path: "./workspace/conversation_log/"
  max_turns: 20
  summarize_threshold: 15   # 15ターン超えたら自動要約

guardrails:
  enabled: true
  topics:
    deny:
      - "競合他社の製品を推薦する"
      - "個人の医療・法律アドバイスを提供する"
      - "社外秘情報を共有する"
  pii_detection: true       # 個人情報検出・フィルタリング
  injection_guard: true     # プロンプトインジェクション防御

logging:
  level: info
  file: "./workspace/chatbot.log"

本番環境ではtemperatureを0.3〜0.5に下げると回答の一貫性が向上します。カスタマーサポートBot等、正確性が求められる用途では低い値を推奨します。

ステップ3:プロンプト設計

チャットボットの品質はシステムプロンプトの設計で大きく左右されます。NemoClawのNemotronモデルに合わせた効果的なプロンプト設計のポイントを解説します。

システムプロンプトの構成

効果的なシステムプロンプトは以下の要素で構成します。

# prompts/system.md
## ペルソナ定義
あなたは「TechSupport Bot」です。株式会社○○のITサポート担当AIアシスタントとして、
社内ユーザーの技術的な問題解決をサポートします。

## 役割と責務
- 社内ITシステムのトラブルシューティング支援
- ソフトウェア・ハードウェアに関するよくある質問への回答
- 必要に応じてIT部門へのエスカレーション案内

## 回答スタイル
- 日本語で簡潔かつ丁寧に回答する
- 専門用語は避け、平易な言葉で説明する
- 手順が必要な場合は番号付きリストを使用する
- 不明な場合は推測せず「IT部門に確認します」と伝える

## 禁止事項
- パスワードの具体的な内容を聞く・教える
- 管理者権限の付与・変更
- 社外のシステムへのアクセス案内
- 競合他社製品の推薦

## エスカレーション基準
以下の場合はIT部門(it-support@company.co.jp)への連絡を案内する:
- セキュリティインシデントの疑い
- データ損失・破損の可能性
- システム全体に影響する障害

Few-shotサンプルの活用

Nemotronモデルはfew-shotプロンプティングで精度が向上します。典型的な問い合わせと理想の回答例をシステムプロンプトに含めます。

## 回答例(Few-shot)

ユーザー: VPNに接続できません
アシスタント:
VPN接続の問題を解決するため、以下の手順を順番に試してください。

1. ネットワーク接続の確認: Wi-Fiまたは有線が正常に接続されているか確認します
2. VPNクライアントの再起動: アプリを完全に終了し、再度起動してください
3. 認証情報の確認: 社員番号とパスワードが正しいか確認します
4. 端末の再起動: 上記で解決しない場合は端末を再起動してください

それでも解決しない場合は、IT部門(内線: 1234)にお問い合わせください。

---

ユーザー: 誰かのパスワードを教えてください
アシスタント:
セキュリティポリシーにより、他のユーザーのパスワードをお伝えすることはできません。
パスワードリセットが必要な場合は、本人がIT部門のセルフサービスポータルから
リセット手続きを行うよう案内してください。
セルフサービスポータル: https://itsupport.company.co.jp/password-reset

ステップ4:メモリ・会話履歴の設定

NemoClawはblueprintで設定したメモリバックエンドを使って会話コンテキストを保持します。企業チャットボットでは会話継続性が重要です。

ファイルベースメモリの実装

小〜中規模のデプロイメントではファイルベースメモリが最もシンプルです。

# blueprint.yamlのmemoryセクション(詳細版)
memory:
  enabled: true
  backend: file
  path: "./workspace/conversation_log/"
  max_turns: 20
  summarize_threshold: 15

  # ユーザー識別子の設定
  session_key: "user_id"    # リクエストヘッダーまたはセッションから取得

  # 要約プロンプト(長い会話の自動要約に使用)
  summarize_prompt: |
    以下の会話履歴を3〜5行の要約にまとめてください。
    ユーザーの主な質問と解決した内容を含めること。

Redisバックエンドへの切り替え

複数サーバーへのスケールアウトや高いパフォーマンスが必要な場合はRedisを使用します。

# blueprint.yamlのmemoryセクション(Redis版)
memory:
  enabled: true
  backend: redis
  redis:
    host: "redis.internal"
    port: 6379
    password: "${REDIS_PASSWORD}"
    db: 0
    ttl: 3600           # 会話の有効期限(秒)
  max_turns: 50
  summarize_threshold: 40
# Redis接続テスト
redis-cli -h redis.internal ping
# PONG が返ればOK

ステップ5:外部API・ツール連携

NemoClawは外部ツールをMCP(Model Context Protocol)経由で呼び出せます。CRM・SlackなどのSaaSと連携することで業務自動化を実現します。

# blueprint.yamlのtoolsセクション
tools:
  - name: get_ticket_status
    description: "サポートチケットの現在のステータスを取得します"
    command: "python3 ./tools/api_connector.py ticket_status"
    input_schema:
      type: object
      properties:
        ticket_id:
          type: string
          description: "チケットID(例: TKT-12345)"
      required: ["ticket_id"]
    sandbox:
      network:
        allow: ["api.crm-system.com"]

  - name: create_ticket
    description: "新規サポートチケットを作成します"
    command: "python3 ./tools/api_connector.py create_ticket"
    input_schema:
      type: object
      properties:
        title:
          type: string
          description: "チケットタイトル"
        description:
          type: string
          description: "問題の詳細"
        priority:
          type: string
          enum: ["low", "medium", "high", "critical"]
      required: ["title", "description"]
# tools/api_connector.py(ツール実装例)
import sys
import json
import os
import requests

def get_ticket_status(ticket_id: str) -> dict:
    api_key = os.environ["CRM_API_KEY"]
    response = requests.get(
        f"https://api.crm-system.com/tickets/{ticket_id}",
        headers={"Authorization": f"Bearer {api_key}"},
        timeout=10
    )
    response.raise_for_status()
    data = response.json()
    return {
        "ticket_id": data["id"],
        "status": data["status"],
        "title": data["title"],
        "updated_at": data["updated_at"],
    }

def create_ticket(title: str, description: str, priority: str = "medium") -> dict:
    api_key = os.environ["CRM_API_KEY"]
    response = requests.post(
        "https://api.crm-system.com/tickets",
        headers={"Authorization": f"Bearer {api_key}"},
        json={"title": title, "description": description, "priority": priority},
        timeout=10
    )
    response.raise_for_status()
    return response.json()

if __name__ == "__main__":
    action = sys.argv[1]
    input_data = json.loads(sys.stdin.read())
    if action == "ticket_status":
        result = get_ticket_status(input_data["ticket_id"])
    elif action == "create_ticket":
        result = create_ticket(**input_data)
    else:
        result = {"error": f"Unknown action: {action}"}
    print(json.dumps(result, ensure_ascii=False))

ツールのネットワークアクセスはblueprintのsandbox.network.allowで許可したドメインのみに制限されます。外部APIのベースURLを正確に指定してください。

ステップ6〜7:デプロイとテスト

開発が完了したチャットボットを本番環境にデプロイし、品質を検証します。

デプロイ手順

# 本番サーバーへのファイル転送(プロジェクトディレクトリ全体)
rsync -avz --exclude=".env" --exclude="workspace/" \
  ./my-chatbot/ user@prod-server:/opt/chatbots/my-chatbot/

# 本番サーバーで.envを設定(ファイル転送は禁止)
ssh user@prod-server
cat > /opt/chatbots/my-chatbot/.env << "EOF"
NVIDIA_API_KEY=nvapi-prod-xxxxx
CRM_API_KEY=prod-crm-key
EOF
chmod 600 /opt/chatbots/my-chatbot/.env

# NemoClawサービスをsystemdで管理
cat > /etc/systemd/system/my-chatbot.service << "EOF"
[Unit]
Description=My Enterprise Chatbot
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/chatbots/my-chatbot
ExecStart=/usr/local/bin/nemoclaw serve
Restart=on-failure
EnvironmentFile=/opt/chatbots/my-chatbot/.env

[Install]
WantedBy=multi-user.target
EOF

systemctl enable my-chatbot
systemctl start my-chatbot
systemctl status my-chatbot

品質テスト項目

本番公開前に以下のテストカテゴリを必ず実施してください。

テスト種別確認項目合格基準
機能テスト正常系の質問応答期待通りの回答が返る
境界値テスト20ターン後の会話継続要約後も文脈維持
ガードレールテスト禁止トピックへの質問適切に拒否・案内
インジェクションテストプロンプトインジェクション試行サンドボックスが遮断
ツール連携テスト外部API呼び出し正常なデータ取得・作成
負荷テスト同時接続10〜50ユーザーレスポンスタイム3秒以内
# 自動テスト実行(nemoclaw test コマンド)
nemoclaw test --blueprint blueprint.yaml \
  --test-cases ./tests/chatbot_test_cases.yaml \
  --report ./workspace/test-report.json