外部接続(Webhook等)を伴わず、ローカル環境だけで完結する会話AIボット構築ツールです。 推論には llama.cpp を使用し、Windows、Linux、Mac上で実行することを想定しています。
- ペルソナ設定(キャラクター名・性格・口調・最初のメッセージ・ユーザーの呼び方)
- システムプロンプトのテンプレート編集(条件ブロック
{{#key}}...{{/key}}対応) - モデルパラメータ(temperature / top_p / top_k / repeat_penalty / max_tokens / seed / stop)
- LLMストリーミング応答(SSE形式でトークンごとに順次表示)
- 会話履歴のターン数制限、最大文字数上限
- 変数(正規表現によるユーザー情報の記憶)
- ナレッジ検索(RAG、ローカル完結のベクトル検索)
- トリガー応答(キーワード完全一致/部分一致で固定文を返す)
- シナリオ(ステージ切り替えと段階別プロンプト)
- 入力側NGワード(LLM呼び出し前に遮断)・出力側NGワード(応答差し替え)
- メディアトリガー(LLM応答内キーワードで画像/動画を表示)
- Markdown描画(表・太字・リスト・コードブロック等、フォントサイズ維持)
- チャットウィジェットの外観カスタマイズ(色・背景・ヘッダー・ボタン類)
- アバター(色・画像アップロード、丸型クロップ)
- ダークモード・新規会話ボタン・ヘッダーの表示切替
- ボット設定エクスポート/インポート(画像・ナレッジ含む)
- DDoS対策(レートリミット・同時接続数制限)
- 管理画面でのテストチャット・プロンプトプレビュー
- 会話ログの閲覧・削除
- ボットの複製、公開URLの発行
外部SNS連携やWebhookなど、外部接続を伴う機能は含まれていません。
mebot/
admin_server.py 設定ホスト(管理サーバー)- 既定 http://127.0.0.1:5001
public_server.py 使用・共有ホスト(公開サーバー)- 既定 http://0.0.0.0:5000
core/ 共通ロジック
storage.py データ保存・ボット/ナレッジ/アバター/メディア/背景/ログ
llm_client.py llama.cppクライアント(非ストリーミング+ストリーミング)
prompt_builder.py プロンプト組み立て(テンプレート+条件ブロック)
rag.py ナレッジ検索(ハッシュベクトル/llama.cpp embedding)
content.py 出力NGワード処理・メディアトリガー判定
security.py レートリミッタ・同時接続リミッタ
utils.py 共通ユーティリティ
templates/admin/ 管理画面のHTML
index.html ボット一覧
bot_edit.html ボット設定(全タブ)
config.html 接続・共通設定(セキュリティ含む)
templates/public/ チャットウィジェットのHTML
index.html ボット選択画面
chat.html チャット画面(ストリーミング+Markdown+カスタマイズ)
data/ 実行時に自動生成されるデータ
bots/ ボット設定JSON
knowledge/ ナレッジ(RAG)チャンクとベクトル
avatars/ アバター画像
media/ メディアトリガー用画像/動画
backgrounds/ 背景画像
logs/ 会話ログ(JSONL)
config.json llama.cpp接続設定・サーバー設定・共通セキュリティ設定
start_admin.bat Windows用: 管理サーバー起動
start_public.bat Windows用: 公開サーバー起動
管理サーバーと公開サーバーは別プロセス・別ポートで動作します。管理サーバーは既定で127.0.0.1(このPCのみ)に限定し、公開サーバーは 0.0.0.0 として同一ネットワーク内の他端末からもアクセスできるようにしています(社内共有などを想定)。
- Windows 10/11 (Linux/Mac でも動作可能)
- Python 3.10以降
- llama.cpp (llama-server.exe) とGGUFモデル
コマンドプロンプトでこのフォルダに移動し、以下を実行します。
pip install -r requirements.txt
あらかじめ llama.cpp をビルド(または配布されているビルド済みバイナリを使用)し、GGUFモデルを用意してください。例:
llama-server.exe -m C:\models\gemma-3n-e4b.gguf --port 8080 -c 4096
--port 8080が mebot の既定の接続先ポートです(管理画面の「接続・共通設定」から変更可能)。- ナレッジ検索(RAG)の埋め込みにllama.cpp自体を使いたい場合は
--embeddingオプションを付けて起動し、管理画面の接続設定で「embedding APIを使用する」をオンにしてください。オフのままでも、ローカル完結の簡易ベクトル化方式でナレッジ検索は動作します。
start_admin.batをダブルクリック(管理サーバー: http://127.0.0.1:5001 )start_public.batをダブルクリック(公開サーバー: http://127.0.0.1:5000 、他端末からは同一LAN内のIPでアクセス可)
コマンドラインから直接起動する場合は以下でも構いません。
python admin_server.py
python public_server.py
- 管理サーバー(http://127.0.0.1:5001 )にアクセスし、「接続・共通設定」でllama.cppのベースURLを確認・接続確認します。必要に応じてセキュリティ設定(レートリミット・同時接続数)も調整します。
- 「新しいボットを作成」でボットを作成します。
- 各タブで設定します。
- 基本設定: 有効/無効、説明、アバターカラー(カラーピッカー対応)、公開URLの確認
- ペルソナ・プロンプト: キャラクター設定、最初のメッセージ(表示/非表示切替)、システムプロンプト
- モデルパラメータ: 生成の細かい挙動
- 会話・変数: ストリーミング有無、履歴保持数、プロンプト最大文字数、ユーザー情報の記憶
- NGワード: 入力側(LLM前遮断)・出力側(応答差し替え)をそれぞれ設定
- メディアトリガー: LLM応答内キーワードで画像/動画を表示
- ナレッジ(RAG): 参考情報の登録と、LLMに渡す分量の絞り込み設定
- トリガー・シナリオ: 固定応答、会話の段階分け
- ウィジェット外観: チャット画面の見た目(色・背景・ヘッダー・ボタン類)
- セキュリティ: DDoS対策(レートリミット・同時接続数制限)
- エクスポート: ボット設定をファイルで書き出し(インポートはボット一覧の「新しいボットを作成」から)
- 「テストチャット」タブで動作を確認します。実際にLLMに渡されたシステムプロンプトとナレッジのヒット状況が右側に表示されるため、プロンプトやRAGの分量を絞り込む際に活用してください。
- 保存後、「基本設定」タブの公開URLを、公開サーバーを起動した状態で共有します。
システムプロンプト内では {{キー}} で変数を展開できるほか、{{#キー}}...{{/キー}} で囲んだ範囲を「そのキーが空欄のとき自動的に省略」できます。
例:
あなたは「{{character_name}}」という名前のアシスタントです。
性格: {{personality}}
口調: {{tone}}
{{#user_nickname}}ユーザーの呼び方: {{user_nickname}}{{/user_nickname}}
ユーザーの質問に対して、簡潔かつ正確に答えてください。
user_nickname を空欄にした場合は「ユーザーの呼び方: ...」の行が自動的に省略され、入力した場合はその値が展開されます。
ボット設定を1つのJSONファイルとして書き出し・読み込みできます。
- エクスポート: 各ボットの編集画面の「エクスポート」タブから行います。
- インポート: ボット一覧画面の「新しいボットを作成」ボタンを押すと表示されるモーダルで、「ファイルから読み込み」を選択してエクスポート済みJSONファイルを指定します。
このファイルには以下がすべて含まれます。
- ボット設定(ペルソナ・プロンプト・モデルパラメータ・会話設定・NGワード・メディアトリガー等)
- ナレッジ(RAG)のチャンク
- アバター画像(base64エンコード)
- 背景画像(base64エンコード)
- メディアファイル(画像/動画、base64エンコード)
他のデバイスのmebot管理画面で「新しいボットを作成」→「ファイルから読み込み」を選ぶと、新しいボットIDで取り込まれ、画像類も自動的に復元されます。社内でのボット共有や、別デバイスへのクローン作成に利用できます。
LLMの応答テキストに指定したキーワードが含まれていた場合、そのメッセージの下に対応する画像または動画を表示します。
- 「メディアトリガー」タブで「メディアファイル登録」から画像/動画をアップロードする
- アップロード後に表示されるURL(
/media/<ボットID>/<ファイル名>)をコピーする - 「メディアトリガーを追加」から、検出キーワード・一致方法・メディア種類・URLを設定する
例: LLMが「この商品は商品Aです」と応答したら、商品Aの画像を自動表示、など。
入力側と出力側で別々にNGワードを設定できます。
- 入力側NGワード: ユーザー入力に一致した場合、LLMを呼び出さず定型の謝罪文を返します。LLMへの不適切な入力を遮断します。
- 出力側NGワード: LLMの応答テキストに指定したワードが含まれていた場合、その応答を所定の回答で差し替えます。LLMが不適切な内容を出力した際の自動置換に利用できます。
各ボットごと、および共通設定で以下のセキュリティパラメータを設定できます。
- 1分あたり最大リクエスト数: 同一IPからの1分間リクエスト上限
- 同時接続数上限: 同一IPからの同時進行リクエスト上限
- バースト検出窓(秒) と バースト検出上限(回): 指定秒数以内に指定回数以上のリクエストが来たら即時拒否(短時間の大量アクセス対策)
ボット固有設定が空欄(0)の場合は、共通設定の値がデフォルトとして適用されます。制限に達した場合は HTTP 429 で応答します。
管理画面の「ウィジェット外観」タブで、チャット画面の見た目を細かくカスタマイズできます。
- タイトル・テーマカラー(カラーピッカー+プリセット)
- 入力欄プレースホルダー・ウェルカムメッセージ・フッター注記
- アバター(色 or 画像、画像は正方形推奨で丸型クロップ)
- レイアウト(ヘッダー表示、全画面幅 or 最大幅指定、フォントサイズ、角丸)
- ボタン類(新規会話・ダークモード切替・送信ボタン样式「送信」/「↑」)
- 入力中表示・タイムスタンプ表示
- 背景(背景色・背景画像・フィット方式)
- 吹き出しの色(ボット背景色・文字色、ユーザー文字色)
LLMに渡す情報量を抑えたい場合、以下の設定を小さくしてください。
- 会話・変数タブの「会話履歴の保持ターン数」「LLMへ渡すプロンプトの最大文字数」
- ナレッジ(RAG)タブの「取得件数」「プロンプトに含める合計最大文字数」「チャンクあたり最大文字数」
システムプロンプト自体も、必要な指示のみを簡潔に記述することを推奨します。
data/ フォルダ以下にJSON形式で保存されます。
data/config.json: llama.cpp接続設定・サーバー設定・共通セキュリティ設定data/bots/<ボットID>.json: ボットごとの設定data/knowledge/<ボットID>.json: ナレッジ(RAG)のチャンクとベクトルdata/avatars/<ボットID>.<拡張子>: アバター画像data/media/<ボットID>_<ファイル名>: メディアファイルdata/backgrounds/<ボットID>.<拡張子>: 背景画像data/logs/<ボットID>.jsonl: 会話ログ
バックアップする場合は data/ フォルダごとコピーしてください。
- 外部SNS連携・Webhook等、外部接続を伴う機能は含まれていません。
- 会話セッションはサーバーのメモリ上に保持されるため、公開サーバーを再起動すると進行中の会話はリセットされます(ログは
data/logsに残ります)。 - ナレッジ検索の既定方式(ハッシュベクトル)は軽量な近似検索です。より高精度な検索が必要な場合は、llama.cppのembedding APIを有効にしてください。
- ストリーミング応答を利用するには、llama.cppサーバーがSSE形式のストリーミング出力をサポートしている必要があります(llama-serverは標準でサポートしています)。
- レートリミット・同時接続制限は単一プロセス内でのみ有効です。複数プロセスで公開サーバーを起動した場合は別途ロードバランサ等での制限が必要です。
- MITライセンス