コンテンツにスキップ
Nibiru docsv0.9.2

AIモジュール

NibiruのファーストクラスAI — チャット、エンベディング、RAG、エージェント — あなたの自社のOllamaに接続されています。有料APIは不要です。

Stable Reading time ~ 2 min Edit on GitHub

NibiruはAIモジュールapplication/module/ai/)を搭載しており、これによりNibiruアプリケーションには一級のAIインターフェースが提供されます。PHPコードはローカルのLLMとチャットしたり、テキストを埋め込みたり、自身のデータ上でRAGを実行したり、ツールを使用したエージェントを実行したりすることができ、すべてが支払いが必要なAPIにデータを送信することなくに行われます。

このモジュールはデフォルトであなたのyour Ollama instanceのOllamaに接続されていますので、推論はあなたのハードウェア、ネットワーク、および条件に基づいて行われます。

プラグイン何をしますか一文で説明
Chatチャットの完了、シングルターンまたはマルチターン$ai->chat()->ask('…')
Embedテキスト → ベクトル + コサインヘルパー$ai->embed()->one('…')
Ragインジェスト + 检索 + 接地されたチャット$ai->rag('docs')->ask('…')
Agentツールを使用する ReAct ループ$ai->agent()->withTools([…])->run('…')
Tool自分のカスタムツールの基底class MyTool extends Tool { … }
Ollama任意の Ollama 対応エンドポイントへの生 HTTP トランスポート(new Ollama($cfg))->chat(…)
use Nibiru\Module\Ai\Ai;
$ai = new Ai();
echo $ai->chat()->ask('How do I scaffold a new module?');
// → "Run `./nibiru -m <name>`. This creates application/module/<name>/ with…"

これがシンプルなケースの全体的なAPIです。DIコンテナ、APIキー、SDKインストールはありません。

各プラグインは、設定を application/module/ai/settings/ai.ini から読みます。

[AI]
ollama.base_url = "https://your-ollama-host.example"
chat.model = "nibiru-coder:1.0"
chat.fallback_model = "qwen2.5-coder:14b"
chat.temperature = 0.4
chat.max_tokens = 1024
embed.model = "nomic-embed-text"
rag.top_k = 6
agent.max_iterations = 6

環境ごとのオーバーライド: ai.production.ini, ai.staging.ini。Nibiruのレジストリはそれらを自動的に検出します。

1. チャット — モデルと会話する

Section titled “1. チャット — モデルと会話する”
$ai = new \Nibiru\Module\Ai\Ai();
// One-shot
echo $ai->chat()->ask('Explain MMVC in two sentences.');
// Multi-turn
$chat = $ai->chat();
$chat->user('How do I scaffold a module?');
$chat->user('And add Graylog hooks?'); / referrs to previous turn
echo $chat->complete();
// Override per call
echo $ai->chat()
->system('Answer in German.')
->model('qwen2.5-coder:14b')
->temperature(0.1)
->ask('Was ist ein Modul?');

Chat プラグインは、主モデルが利用できない場合に自動的に chat.fallback_model にフォールバックします。これは、まだ nibiru-coder を構築している間にも役立ちます。

2. 埋め込み — テキストをベクトルに

Section titled “2. 埋め込み — テキストをベクトルに”
$embed = $ai->embed();
$va = $embed->one('controller');
$vb = $embed->one('module');
$score = \Nibiru\Module\Ai\Plugin\Embed::cosine($va, $vb);
// → 0.78 (close concepts)

コンパクトなストレージ:

$packed = \Nibiru\Module\Ai\Plugin\Embed::pack($vec); / base64 string, 4 bytes/dim
$vec = \Nibiru\Module\Ai\Plugin\Embed::unpack($packed);
$rag = $ai->rag('product-help');
// One-time ingestion
$rag->ingestDir(__DIR__ . '/help/'); / walks .md/.txt/.php
$rag->ingestText('FAQ entry…', ['source' => 'faq-12']);
$rag->ingestFile('/var/data/manual.pdf.txt');
// Then ask grounded questions
echo $rag->ask('How do I cancel my subscription?');
// → "Per the help docs, you can cancel in account → settings… [1]"

ストレージ: コレクションごとに application/module/ai/cache/rag/<name>.json に1つのJSONファイル。再開可能で、DB不要で、メモリに約10kのチャンクを収容できます。

4. エージェント — 行動するツール

Section titled “4. エージェント — 行動するツール”
use Nibiru\Module\Ai\Plugin\Tools;
$ai = new \Nibiru\Module\Ai\Ai();
$agent = $ai->agent()->withTools([
new Tools\PdoQuery(), / read-only SQL
new Tools\HttpGet(), / fetch URLs
new Tools\FileRead(), / read project files
]);
echo $agent->run('How many active users registered last week?');
// → agent decides to call pdo_query with SELECT count(*) FROM users…
// reads observation, writes a final answer.

エージェントはReActスタイルのループを使用します:タスクを読み取る → ツールを選択する → 実行する → 观察する → 繰り返す → 最終的な回答。プロトコルは、すべてのOllamaモデルで動作する単純な\`\`\`tool {...}\`\`\JSONセントinelを使用します — モデル固有のツール呼び出しAPIは不要です。

application/module/ai/
├── ai.php # main class implementing IModule
├── interfaces/ai.php # contract
├── traits/ai.php # cfg() helper
├── plugins/
│ ├── ollama.php # raw transport
│ ├── chat.php # chat completions
│ ├── embed.php # embeddings + cosine + pack
│ ├── rag.php # ingest + retrieve + grounded chat
│ ├── agent.php # ReAct tool loop
│ ├── tool.php # abstract base for custom tools
│ └── tools/
│ ├── pdoQuery.php # read-only SQL
│ ├── httpGet.php # HTTP GET
│ └── fileRead.php # project-local file read
├── settings/ai.ini # config
├── cache/rag/ # RAG vector index files (gitignored)
└── training/
├── Modelfile # the nibiru-coder system prompt
├── build.sh # one-command Modelfile → registered model
├── smoke-test.php # verify the whole stack
└── README.md # training pipeline guide

PHPには、PythonのLangChainやJSのVercel AI SDKのような確立された「AIフレームワーク」がありません。NibiruのAIモジュールは、私たちが書くことができた最も小さな、最も鋭いAPIでこのギャップを埋めます — 3層(トランスポート → プラグイン → モジュール)、DIグラフなし、SDKインストールなし、トークンごとの課金なし。

設計哲学:

  • あなたの脳を持ってください。 Ollamaがデフォルトで、AnthropicとOpenAIをドロップインとして使用できます。プロバイダーのスワップはINIファイルで行い、コード経由ではありません。
  • 各RAGコレクションにつき1つのJSONファイル。 ベクトルデータベースはありません。再起動安全です。デバッグ時にgrepで検索できます。
  • ツールはPHPクラスです。 Toolを拡張し、名前とスキーマと実行メソッドを取得します。エージェントが残りの部分を処理します。
  • モデル固有のツール呼び出しAPIはありません。 単一のフェンス付きJSON規約がどこでも機能します。