NullAI 総合ガイド
目次
1. システム概要
1.1 NullAIとは
NullAIは、マルチドメイン対応の知識推論システムです。以下の特徴を持ちます:
- 幻覚(ハルシネーション)低減: 5層アーキテクチャによる検証システム
- マルチドメイン対応: 医療、法律、経済、プログラミング、一般知識
- HuggingFace対応: Transformers、Inference API、GGUF形式をサポート
- 専門家認証: ORCID認証による専門家の編集認証マーク
- サーバーレス対応: GitHub/Supabase/JSONBinによる無料ストレージ
重要: OpenAI/Anthropic/Ollama等の外部APIは利用規約上の理由から削除されました。NullAIはオープンソースモデルのみをサポートします。
1.2 主要コンポーネント
NullAI/
├── null_ai/ # コア設定・モデルルーター
├── backend/ # FastAPI バックエンドAPI
├── frontend/ # React TypeScript フロントエンド
├── ilm_athens_engine/ # 推論エンジン本体
└── 各種ユーティリティ # エンコーダー、デコーダー等
1.3 推論パイプライン
質問入力
↓
[Layer 1] 空間エンコーディング - 質問をドメイン空間座標にマッピング
↓
[Layer 2] エピソードバインディング - 関連知識タイルの検索・結合
↓
[Layer 3] α-Lobe(生成)+ β-Lobe(検証)- 回答生成と妥当性検証
↓
[Layer 4] 修正フロー - 検証失敗時の自動修正
↓
[Layer 5] 状態管理 - 結果の保存と状態更新
↓
回答出力 + 信頼度スコア
2. アーキテクチャ
2.1 バックエンド構成
backend/
├── app/
│ ├── main.py # FastAPIエントリーポイント
│ ├── config.py # 環境設定
│ ├── api/
│ │ ├── questions.py # 質問API(REST + WebSocket)
│ │ ├── auth.py # 認証API(JWT)
│ │ ├── domains.py # ドメイン管理API
│ │ ├── proposals.py # 編集提案API
│ │ ├── models.py # LLMモデル管理API
│ │ └── orcid_auth.py # ORCID認証API
│ ├── middleware/
│ │ └── auth.py # JWT認証ミドルウェア
│ ├── services/
│ │ └── inference_service.py # 推論サービス
│ └── database/
│ ├── models.py # SQLAlchemy ORM
│ └── session.py # DBセッション
2.2 フロントエンド構成
frontend/src/
├── App.tsx # メインアプリ
├── pages/
│ ├── QuestionPage.tsx # チャットUI
│ ├── LoginPage.tsx # ログイン(ORCID/Email/Guest)
│ ├── SignupPage.tsx # ユーザー登録
│ └── DomainEditorPage.tsx # ドメイン編集
├── components/
│ ├── QuestionInput.tsx # 質問入力フォーム
│ ├── ResponseDisplay.tsx # 回答表示
│ └── VerificationBadge.tsx # 認証バッジ
├── contexts/
│ └── AuthContext.tsx # 認証状態管理
├── hooks/
│ └── useWebSocket.ts # WebSocketフック
└── services/
└── api.ts # API クライアント
2.3 推論エンジン構成
ilm_athens_engine/
├── config.py # システム設定
├── model_manager.py # モデルライフサイクル管理
├── inference_engine_deepseek_integrated.py # 統合推論エンジン
├── core/
│ ├── spatial_memory.py # 空間メモリ(Layer 6)
│ ├── episodic_binding.py # エピソードバインディング
│ ├── symbiotic_engine.py # ツインエンジンシステム
│ ├── dendritic_memory.py # 樹木型メモリ構造
│ └── nurse_log_system.py # 継続学習システム
└── deepseek_integration/
├── hf_deepseek_engine.py # HuggingFace統合
└── deepseek_runner.py # Ollama統合
2.4 データフロー
ユーザー → フロントエンド → バックエンドAPI
↓
推論エンジン
↓
┌───────────────┼───────────────┐
↓ ↓ ↓
知識タイルDB LLM推論 Web検索
(IATH形式) (DeepSeek等) (DuckDuckGo等)
↓ ↓ ↓
└───────────────┼───────────────┘
↓
α-Lobe(生成)
↓
β-Lobe(検証)
↓
回答 + 信頼度 + 認証マーク
3. セットアップ手順
3.1 必要環境
- Python 3.10以上
- Node.js 18以上
- GPU(推奨: CUDA対応 または Apple Silicon)
- PostgreSQL(オプション、SQLiteでも動作)
必要なPythonパッケージ(LLM関連)
# HuggingFace Transformers(必須)
pip install transformers torch accelerate
# GGUF形式を使用する場合
pip install llama-cpp-python
3.2 基本セットアップ
# 1. リポジトリをクローン(または既存ディレクトリへ移動)
cd project_locate
# 2. Python仮想環境の作成
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 依存パッケージのインストール
pip install -r requirements.txt
# 4. フロントエンド依存パッケージのインストール
cd frontend
npm install
cd ..
# 5. 環境変数の設定
cp .env.example .env # または手動で作成
3.3 環境変数設定 (.env)
# ========== 基本設定 ==========
SECRET_KEY=your-secret-key-change-in-production
DEBUG=true
ACCESS_TOKEN_EXPIRE_MINUTES=1440
# ========== データベース ==========
DATABASE_URL=sqlite:///./sql_app.db
# PostgreSQLの場合:
# DATABASE_URL=postgresql://user:password@localhost:5432/null_ai
# ========== HuggingFace設定 ==========
# Inference APIを使用する場合(オプション)
# HF_API_KEY=hf_xxx
# ========== サポート対象外のLLM API ==========
# 以下のAPIは利用規約上の理由からサポートされていません:
# - OpenAI API (OPENAI_API_KEY)
# - Anthropic API (ANTHROPIC_API_KEY)
# - Ollama API (OLLAMA_URL)
# ========== ORCID認証(専門家認証機能)==========
# ORCID_CLIENT_ID=APP-XXXXXXXXX
# ORCID_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# ORCID_REDIRECT_URI=http://localhost:8000/api/auth/orcid/callback
# ORCID_SANDBOX=true # 開発時はtrue
# ========== サーバーレスストレージ(オプション)==========
# OPAQUE_STORAGE_BACKEND=local # local, github, supabase, jsonbin
# GitHub Storage
# GITHUB_TOKEN=ghp_xxxxxxxxxxxx
# GITHUB_REPO=username/opaque-data
# Supabase Storage
# SUPABASE_URL=https://xxxxx.supabase.co
# SUPABASE_ANON_KEY=eyJxxxxxxxx
# ========== Web検索(オプション)==========
# BRAVE_API_KEY=your-brave-api-key
# TAVILY_API_KEY=your-tavily-api-key
3.4 Ollamaセットアップ
# Ollamaのインストール(macOS)
brew install ollama
# Ollamaサービスの起動
ollama serve
# モデルのダウンロード(別ターミナル)
ollama pull deepseek-r1:32b # メインモデル(32B推奨)
ollama pull deepseek-r1:14b # 軽量版(RAMが少ない場合)
3.5 データベース初期化
# SQLiteデータベースの初期化
python backend/create_db.py
# 初期ドメインデータの投入
python null_ai/cloud_db_setup.py --provider local --init-data
3.6 システム起動
方法A: 起動スクリプト使用(推奨)
# 全サービス起動
./start_null_ai.sh
# バックエンドのみ
./start_null_ai.sh backend
# フロントエンドのみ
./start_null_ai.sh frontend
# 停止
./start_null_ai.sh stop
# ステータス確認
./start_null_ai.sh status
方法B: 個別起動(開発時)
# ターミナル1: バックエンド
source venv/bin/activate
uvicorn backend.app.main:app --reload --host 0.0.0.0 --port 8000
# ターミナル2: フロントエンド
cd frontend
npm run dev
方法C: Docker Compose
docker-compose up -d
docker-compose logs -f
3.7 アクセス
| サービス | URL |
|---|---|
| フロントエンド | http://localhost:5173 |
| バックエンドAPI | http://localhost:8000 |
| API ドキュメント | http://localhost:8000/docs |
| Ollama | http://localhost:11434 |
4. コマンドリファレンス
4.1 DB拡充コマンド
基本的な使い方
# ヘルプを表示
python null_ai/db_enrichment_cli.py --help
# 利用可能なモデル一覧
python null_ai/db_enrichment_cli.py --list-models
# 利用可能なドメイン一覧
python null_ai/db_enrichment_cli.py --list-domains
# 生成される質問をプレビュー(実行なし)
python null_ai/db_enrichment_cli.py --domain medical --preview --count 20
LLM推論によるDB拡充
# 医療ドメインを50件の質問で拡充
python null_ai/db_enrichment_cli.py --domain medical --count 50
# 全ドメインを拡充(各30件)
python null_ai/db_enrichment_cli.py --all --count 30
# 特定のモデルを使用して拡充
python null_ai/db_enrichment_cli.py --domain legal --model deepseek-r1-32b --count 20
# バッチサイズを指定(レート制限対策)
python null_ai/db_enrichment_cli.py --domain economics --count 100 --batch-size 3
Web検索によるDB拡充
# Web検索で最新情報を収集(DuckDuckGo使用、無料・キー不要)
python null_ai/db_enrichment_cli.py --domain medical --web-search --count 10
# 特定のクエリでWeb検索
python null_ai/db_enrichment_cli.py --domain medical --web-search \
--query "最新の糖尿病治療法 2024"
# クエリファイルから検索
python null_ai/db_enrichment_cli.py --domain legal --web-search \
--queries-file legal_queries.txt
# 利用可能な検索プロバイダーを確認
python null_ai/db_enrichment_cli.py --list-search-providers
4.2 知識タイル生成コマンド
# 単一トピックからタイル生成
python create_tile_from_topic.py --topic "心筋梗塞の治療法" --domain medical
# バッチ生成(トピックファイルから)
python batch_create_tiles.py --topics-file topics.txt --domain medical
# IATHファイルの検証
python compression_verifier.py --file generated_tiles/tile_xxx.iath
4.3 クラウドDB設定コマンド
# Supabaseセットアップ手順を表示
python null_ai/cloud_db_setup.py --provider supabase
# GitHubストレージセットアップ
python null_ai/cloud_db_setup.py --provider github --repo username/opaque-data
# JSONBinセットアップ
python null_ai/cloud_db_setup.py --provider jsonbin
# Supabaseに初期データ投入
python null_ai/cloud_db_setup.py --provider supabase --init-data
4.4 Web検索単独実行
# 医療ドメインで最新情報を検索
python null_ai/web_search_enrichment.py --domain medical --count 10
# 特定クエリで検索
python null_ai/web_search_enrichment.py --domain medical \
--query "COVID-19 最新治療法 2024"
# 全ドメインで検索
python null_ai/web_search_enrichment.py --all-domains --count 5
# 検索プロバイダー一覧
python null_ai/web_search_enrichment.py --list-providers
4.5 テスト実行
# 基本テスト
python test_judge_basic.py
# 包括的テスト
python test_judge_comprehensive.py
# DeepSeek統合テスト
python test_deepseek_integration.py
# E2Eパイプラインテスト
python e2e_pipeline_test.py
# 最終統合テスト
python final_integration_test.py
5. API仕様
5.1 認証API
ユーザー登録
POST /api/auth/signup
Content-Type: application/json
{
"email": "user@example.com",
"password": "securepassword"
}
ログイン(JWTトークン取得)
POST /api/auth/token
Content-Type: application/x-www-form-urlencoded
username=user@example.com&password=securepassword
ORCID認証開始
GET /api/auth/orcid/authorize?redirect_url=http://localhost:5173
5.2 質問API
質問送信(REST)
POST /api/questions/
Authorization: Bearer {token}
Content-Type: application/json
{
"question": "糖尿病の最新治療法について教えてください",
"domain_id": "medical",
"session_id": null
}
レスポンス例
{
"session_id": "sess_abc123",
"question": "糖尿病の最新治療法について教えてください",
"response": "糖尿病の最新治療法には...",
"confidence": 0.87,
"memory_augmented": true,
"thinking_steps": ["知識検索中...", "回答生成中...", "検証中..."]
}
WebSocketストリーミング
const ws = new WebSocket('ws://localhost:8000/api/questions/ws/session_id');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
// data.type: 'thinking', 'response', 'complete', 'error'
};
ws.send(JSON.stringify({
question: "質問内容",
domain_id: "medical"
}));
5.3 ドメインAPI
ドメイン一覧取得(ゲストアクセス可)
GET /api/domains/
特定ドメイン取得
GET /api/domains/medical
ドメイン更新(Editor以上)
PUT /api/domains/medical
Authorization: Bearer {token}
Content-Type: application/json
{
"domain_id": "medical",
"name": "Medical",
"description": "医療・健康に関する知識領域",
"axes": [
{"name": "診断", "description": "症状から疾患を特定", "keywords": ["症状", "検査"]}
]
}
5.4 編集提案API
提案一覧取得(ゲストアクセス可)
GET /api/proposals/?status=pending&domain_id=medical
提案作成(認証必須)
POST /api/proposals/
Authorization: Bearer {token}
Content-Type: application/json
{
"proposal_type": "create",
"domain_id": "medical",
"title": "新しい治療法の追加",
"description": "最新の糖尿病治療法について",
"proposed_content": {...},
"justification": "最新の研究結果に基づく"
}
提案レビュー(Editor以上)
PUT /api/proposals/{proposal_id}/review
Authorization: Bearer {token}
Content-Type: application/json
{
"status": "approved",
"reviewer_comment": "内容を確認しました",
"validation_score": 0.9
}
5.5 モデル管理API
モデル一覧取得
GET /api/models/?domain_id=medical
Authorization: Bearer {token}
モデル接続テスト
POST /api/models/deepseek-r1-32b/test
Authorization: Bearer {token}
6. 知識ベース管理
6.1 知識タイル構造
{
"metadata": {
"knowledge_id": "ktile-medical-20241124-001",
"topic": "糖尿病の診断基準",
"domain": "medical",
"created_at": "2024-11-24T10:30:00Z",
"source_type": "llm",
"is_expert_verified": true,
"expert_orcid_id": "0000-0001-2345-6789"
},
"content": {
"question": "糖尿病の診断基準は何ですか?",
"thinking_process": "診断基準について、HbA1c、空腹時血糖値...",
"final_response": "糖尿病の診断基準は以下の通りです..."
},
"coordinates": {
"medical_space": [45.2, 120.5, 30.0],
"meta_space": [87.5, 92.0, 85.0]
},
"verification": {
"alpha_score": 0.92,
"beta_score": 0.88,
"hallucination_risk": 0.05
}
}
6.2 IATHファイル形式
NullAIは独自のバイナリ形式(.iath)を使用して知識タイルを保存します:
- 圧縮: zstandard圧縮
- ヘッダー: ドメインコード、バージョン、タイムスタンプ
- 本体: JSON形式の知識タイルデータ
# IATHファイルのデコード
python iath_decoder.py generated_tiles/tile_xxx.iath
# IATHファイルの作成
python iath_encoder.py --input tile_data.json --output tile.iath
6.3 樹木型メモリ構造(DendriticMemorySpace)
知識タイルは3次元円筒座標系で管理されます:
座標系:
- r (半径): 0-100 - 知識の具体性(中心=抽象、外側=具体)
- θ (角度): 0-360° - 知識のカテゴリ
- z (高さ): -50〜50 - 時間/重要度
知識検索時に、質問が座標にマッピングされ、近接する知識タイルが自動的に参照されます。
7. 認証システム
7.1 ユーザーロール
| ロール | 説明 | 権限 |
|---|---|---|
| guest | 未登録ユーザー | 閲覧、質問 |
| viewer | 登録ユーザー | + 提案の閲覧 |
| editor | 編集者 | + 提案の作成・レビュー |
| expert | ORCID認証済み専門家 | + 認証マーク付き編集 |
| admin | 管理者 | + 全管理機能 |
7.2 認証マークの種類
| マーク | 説明 | 表示 |
|---|---|---|
| none | 未検証 | なし |
| community | コミュニティレビュー済み | 青バッジ |
| expert | ORCID認証専門家による編集/レビュー | 緑バッジ |
| multi_expert | 複数の専門家による検証 | 金バッジ |
7.3 ORCID認証の設定
ORCID開発者アカウントの作成
- https://orcid.org/developer-tools にアクセス
- アプリケーション登録
- Client IDとClient Secretを取得
環境変数の設定
ORCID_CLIENT_ID=APP-XXXXXXXXX
ORCID_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ORCID_REDIRECT_URI=http://localhost:8000/api/auth/orcid/callback
ORCID_SANDBOX=true # 開発時はtrue
- 認証フロー
- ユーザーが「Sign in with ORCID」をクリック
- ORCIDの認証ページにリダイレクト
- 認証後、コールバックURLにリダイレクト
- JWTトークン発行(expert権限付与)
8. クラウドデプロイメント
8.1 サーバーレスストレージオプション
Supabase(推奨)
無料枠: 500MB、50,000リクエスト/月
# セットアップ手順を表示
python null_ai/cloud_db_setup.py --provider supabase
# 初期データ投入
python null_ai/cloud_db_setup.py --provider supabase --init-data
環境変数:
OPAQUE_STORAGE_BACKEND=supabase
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_ANON_KEY=eyJxxxxxxxx
GitHub Storage
無料枠: 無制限(パブリックリポジトリ)
# セットアップ手順を表示
python null_ai/cloud_db_setup.py --provider github --repo username/opaque-data
環境変数:
OPAQUE_STORAGE_BACKEND=github
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
GITHUB_REPO=username/opaque-data
GITHUB_BRANCH=main
GITHUB_DATA_PATH=data
JSONBin
無料枠: 10,000リクエスト/月
# セットアップ手順を表示
python null_ai/cloud_db_setup.py --provider jsonbin
環境変数:
OPAQUE_STORAGE_BACKEND=jsonbin
JSONBIN_API_KEY=$2b$xxxxxxxx
JSONBIN_BIN_ID=xxxxxxxxxxxxxxxx
8.2 ストレージ比較
| バックエンド | 無料枠 | 特徴 | 推奨用途 |
|---|---|---|---|
| Local | 無制限 | ファイルベース | 開発 |
| GitHub | 無制限* | バージョン管理、透明性 | オープンソースプロジェクト |
| Supabase | 500MB | SQLクエリ、リアルタイム | 本番環境 |
| JSONBin | 10K/月 | シンプル | 小規模プロジェクト |
*パブリックリポジトリの場合
8.3 フロントエンドデプロイ
Vercel(推奨)
# Vercel CLIインストール
npm i -g vercel
# デプロイ
cd frontend
vercel
Netlify
# ビルド
cd frontend
npm run build
# Netlifyにdistフォルダをアップロード
GitHub Pages
# gh-pagesパッケージをインストール
npm install gh-pages --save-dev
# package.jsonにスクリプト追加
# "deploy": "gh-pages -d dist"
# デプロイ
npm run build
npm run deploy
9. トラブルシューティング
9.1 Ollamaに接続できない
# Ollamaが起動しているか確認
curl http://localhost:11434/api/tags
# 起動していない場合
ollama serve
# モデルがダウンロードされているか確認
ollama list
9.2 モデルのダウンロードが遅い
# より軽量なモデルを使用
ollama pull deepseek-r1:14b # 32Bの代わりに14B
# models_config.jsonでデフォルトモデルを変更
9.3 メモリ不足エラー
- 32Bモデルには32GB以上のRAMが推奨
- RAMが少ない場合は14Bモデルを使用
- Docker使用時はメモリ制限を確認
9.4 データベースエラー
# データベースをリセット
rm sql_app.db
python backend/create_db.py
9.5 ORCID認証が失敗する
ORCID_REDIRECT_URIがORCIDの設定と一致しているか確認- 開発時は
ORCID_SANDBOX=trueを設定 - Client IDとClient Secretが正しいか確認
9.6 Web検索が動作しない
# 検索プロバイダーの状態を確認
python null_ai/db_enrichment_cli.py --list-search-providers
# DuckDuckGoはAPIキー不要で動作するはず
# Brave/TavilyはAPIキーが必要
9.7 フロントエンドがAPIに接続できない
# CORSの設定を確認(backend/app/main.py)
# allow_origins=["*"] または具体的なオリジンを設定
# 環境変数を確認
# frontend/.env
VITE_API_URL=http://localhost:8000
付録A: ファイル一覧と役割
コアモジュール
| ファイル | 役割 |
|---|---|
null_ai/config.py |
設定管理(モデル、ドメイン) |
null_ai/model_router.py |
マルチLLMルーター |
null_ai/db_enrichment_cli.py |
DB拡充CLI |
null_ai/web_search_enrichment.py |
Web検索拡充 |
null_ai/serverless_storage.py |
クラウドストレージ |
null_ai/cloud_db_setup.py |
クラウドDB設定 |
推論エンジン
| ファイル | 役割 |
|---|---|
layer1_spatial_encoding.py |
空間座標エンコーディング |
layer2_episodic_binding.py |
エピソードバインディング |
judge_alpha_lobe.py |
α-Lobe(回答生成) |
judge_beta_lobe_basic.py |
β-Lobe(基本検証) |
judge_beta_lobe_advanced.py |
β-Lobe(高度検証) |
judge_correction_flow.py |
修正フロー |
hallucination_detector.py |
ハルシネーション検出 |
データ処理
| ファイル | 役割 |
|---|---|
knowledge_tile_generator.py |
知識タイル生成 |
iath_encoder.py |
IATHエンコーダー |
iath_decoder.py |
IATHデコーダー |
coordinate_mapper.py |
座標マッピング |
付録B: 設定ファイル一覧
| ファイル | 用途 |
|---|---|
.env |
環境変数(秘密情報) |
domain_schemas.json |
ドメイン定義 |
medical_space_axes_definition.json |
医療ドメイン座標軸 |
legal_space_axes_definition.json |
法律ドメイン座標軸 |
cardiology_ontology.json |
循環器オントロジー |
legal_ontology.json |
法律オントロジー |
docker-compose.yml |
Dockerコンテナ設定 |
付録C: よく使うコマンド一覧
# ========== 起動・停止 ==========
./start_null_ai.sh # 全サービス起動
./start_null_ai.sh stop # 全サービス停止
./start_null_ai.sh status # ステータス確認
# ========== DB拡充 ==========
python null_ai/db_enrichment_cli.py --domain medical --count 50
python null_ai/db_enrichment_cli.py --domain medical --web-search --count 10
python null_ai/db_enrichment_cli.py --all --count 30
# ========== 確認・一覧 ==========
python null_ai/db_enrichment_cli.py --list-models
python null_ai/db_enrichment_cli.py --list-domains
python null_ai/db_enrichment_cli.py --list-search-providers
python null_ai/db_enrichment_cli.py --domain medical --preview
# ========== クラウド設定 ==========
python null_ai/cloud_db_setup.py --provider supabase
python null_ai/cloud_db_setup.py --provider github --repo user/repo
# ========== テスト ==========
python test_judge_basic.py
python e2e_pipeline_test.py
このドキュメントは NullAI v1.0.0 に基づいています。 最終更新: 2024年11月24日