NemoClawチャットボット構築の全体像
NemoClawはNVIDIAのOpenShellランタイムとNemotronモデルを組み合わせた企業向けAIエージェント基盤です。単純な質問応答から、社内システム連携・業務フロー自動化まで対応するチャットボットを構築できます。
本チュートリアルでは以下の流れでチャットボットを完成させます。
| ステップ | 作業内容 | 所要時間(目安) |
|---|---|---|
| 1 | 環境準備・NemoClawインストール | 30〜60分 |
| 2 | blueprint.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