File size: 18,660 Bytes
a2ed773
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
# NullAI システム起動ガイド

## 概要

NullAIは、マルチドメイン対応の知識推論システムです。医療、法律、経済、プログラミングなど、複数の専門領域に対応し、ユーザーが自由にLLMモデルやドメインを追加・管理できます。

### 主な特徴

- **ゲストアクセス**: 登録不要でシステムを利用可能
- **ORCID認証**: 専門家はORCIDで認証し、編集内容に認証マークが付与される
- **サーバーレス対応**: GitHub/Supabase/JSONBinを使用した無料ストレージ
- **HuggingFace対応**: Transformers、Inference API、GGUF形式をサポート
- **樹木型空間記憶**: DendriticMemorySpaceによる効率的な知識管理

> **重要**: OpenAI/Anthropic/Ollama等の外部APIは利用規約上の理由から削除されました。
> NullAIはHuggingFace Transformersおよびオープンソースモデルのみをサポートします。

## システム要件

- Python 3.10以上
- Node.js 18以上
- GPU(推奨: CUDA対応 または Apple Silicon MPS)
- PostgreSQL(オプション、SQLiteでも動作)
- ORCID開発者アカウント(専門家認証機能使用時)

## クイックスタート

### 1. 環境構築

```bash
# リポジトリのクローン(または既存ディレクトリへ移動)
cd project_locate

# Python仮想環境の作成
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# Python依存パッケージのインストール
pip install -r requirements.txt

# フロントエンド依存パッケージのインストール
cd frontend
npm install
cd ..
```

### 2. HuggingFace Transformersのセットアップ

```bash
# 必要なPythonパッケージのインストール
pip install transformers torch accelerate

# GPU確認
python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}, MPS: {torch.backends.mps.is_available()}')"

# モデルの事前ダウンロード(オプション - 初回実行時に自動ダウンロードされる)
python -c "from transformers import AutoModelForCausalLM, AutoTokenizer; AutoTokenizer.from_pretrained('deepseek-ai/DeepSeek-R1-Distill-Qwen-7B')"

# GGUF形式を使用する場合(CPU環境向け)
pip install llama-cpp-python
```

### 3. 環境変数の設定

```bash
# .envファイルを作成
cat > .env << 'EOF'
# API設定
SECRET_KEY=your-secret-key-here-change-in-production
DEBUG=true
ACCESS_TOKEN_EXPIRE_MINUTES=1440

# データベース
DATABASE_URL=sqlite:///./sql_app.db

# HuggingFace設定(オプション - Inference APIを使用する場合)
# HF_API_KEY=hf_xxx

# ========================================
# 以下のAPIは利用規約上の理由からサポートされていません:
# - OPENAI_API_KEY (OpenAI)
# - ANTHROPIC_API_KEY (Anthropic)
# - OLLAMA_URL (Ollama)
# HuggingFace Transformersを使用してください。
# ========================================

# 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、本番はfalse

# サーバーレスストレージ設定(オプション)
# OPAQUE_STORAGE_BACKEND=local  # local, github, supabase, jsonbin

# GitHub Storage
# GITHUB_TOKEN=ghp_xxxxxxxxxxxx
# GITHUB_REPO=username/opaque-data
# GITHUB_BRANCH=main
# GITHUB_DATA_PATH=data

# Supabase Storage
# SUPABASE_URL=https://xxxxx.supabase.co
# SUPABASE_ANON_KEY=eyJxxxxxxxx

# JSONBin Storage
# JSONBIN_API_KEY=$2b$xxxxxxxx
# JSONBIN_BIN_ID=xxxxxxxxxxxxxxxx
EOF
```

### 4. データベース初期化

```bash
# データベーステーブルの作成
python backend/create_db.py
```

### 5. システムの起動

#### 方法A: 個別起動(開発時推奨)

```bash
# ターミナル1: バックエンドAPIサーバー
cd project_locate
source venv/bin/activate
uvicorn backend.app.main:app --reload --host 0.0.0.0 --port 8000

# ターミナル2: フロントエンド開発サーバー
cd project_locate/frontend
npm run dev
```

#### 方法B: Docker Compose(本番環境推奨)

```bash
# Docker Composeで全サービスを起動
docker-compose up -d

# ログの確認
docker-compose logs -f
```

### 6. アクセス

- **フロントエンド**: http://localhost:5173
- **バックエンドAPI**: http://localhost:8000
- **API ドキュメント**: http://localhost:8000/docs
- **Ollama**: http://localhost:11434

## 初期設定

### ユーザー登録

1. http://localhost:5173 にアクセス
2. 「Sign up」をクリック
3. メールアドレスとパスワードを入力して登録

### 管理者権限の付与

```bash
# SQLiteの場合
sqlite3 sql_app.db "UPDATE users SET role='admin' WHERE email='your@email.com';"

# または Python スクリプトで
python -c "
from backend.app.database.session import SessionLocal
from backend.app.database.models import User
db = SessionLocal()
user = db.query(User).filter(User.email=='your@email.com').first()
user.role = 'admin'
db.commit()
print('Admin role granted')
"
```

## DB拡充コマンド

### 基本的な使い方

```bash
# ヘルプを表示
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
```

### DB拡充の実行

```bash
# 医療ドメインを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検索による拡充

Web検索を使用して最新情報を収集し、DBを拡充できます:

```bash
# 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
```

#### 追加の検索プロバイダー(オプション)

より高品質な検索結果を得るには、以下の無料APIを設定できます:

```bash
# Brave Search API(無料2,000クエリ/月)
# https://brave.com/search/api/ で取得
BRAVE_API_KEY=your-brave-api-key

# Tavily AI Search(AI最適化検索)
# https://tavily.com/ で取得
TAVILY_API_KEY=your-tavily-api-key
```

### 拡充結果

結果は `enrichment_output/` ディレクトリにJSON形式で保存されます:

```
enrichment_output/
├── enrichment_medical_20241124_120000.json
├── enrichment_legal_20241124_121500.json
├── web_enrichment_medical_20241124_130000.json  # Web検索結果
└── ...
```

## モデル管理

### Web UIでのモデル追加

1. 管理者としてログイン
2. 「Settings」→「Models」に移動
3. 「Add Model」をクリック
4. 必要な情報を入力:
   - Model ID: 一意の識別子(例: `custom-medical-llm`   - Display Name: 表示名
   - Provider: `huggingface`, `huggingface_api`, `local`, `gguf`
   - Model Name: HuggingFaceモデルID(例: `deepseek-ai/DeepSeek-R1-Distill-Qwen-7B`   - Supported Domains: 対応ドメイン

> **サポートされていないプロバイダー**: `openai`, `anthropic`, `ollama` は利用規約上の理由から削除されました。

### APIでのモデル追加

```bash
# HuggingFaceモデルを追加
curl -X POST http://localhost:8000/api/models/ \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model_id": "qwen2-72b",
    "display_name": "Qwen2.5 72B",
    "provider": "huggingface",
    "model_name": "Qwen/Qwen2.5-72B-Instruct",
    "supported_domains": ["medical", "legal", "general"],
    "description": "高性能多言語モデル"
  }'

# モデル接続テスト
curl -X POST http://localhost:8000/api/models/qwen2-72b/test \
  -H "Authorization: Bearer YOUR_TOKEN"

# サポートされているプロバイダー情報を取得
curl http://localhost:8000/api/models/providers/info
```

## ドメイン管理

### 新しいドメインの追加

1. Web UIの「Domains」タブで追加
2. または `domains_config.json` を直接編集:

```json
{
  "domains": [
    {
      "domain_id": "philosophy",
      "name": "Philosophy",
      "description": "哲学・思想に関する知識領域",
      "default_model_id": "deepseek-r1-32b",
      "icon": "philosophy",
      "is_active": true
    }
  ]
}
```

### ドメイン固有の質問テンプレート追加

`null_ai/db_enrichment_cli.py``DOMAIN_QUESTION_TEMPLATES` に追加:

```python
"philosophy": {
    "categories": [
        {
            "name": "哲学者",
            "questions": [
                "{philosopher}の主要な思想は何ですか?",
                "{philosopher}の代表的な著作について教えてください。",
            ]
        }
    ],
    "topics": {
        "philosopher": ["プラトン", "アリストテレス", "カント", "ニーチェ"]
    }
}
```

## ORCID認証の設定

### 1. ORCID開発者アカウントの作成

1. https://orcid.org/developer-tools にアクセス
2. 「Register for the free ORCID public API」をクリック
3. アプリケーション情報を入力:
   - **Application Name**: NullAI
   - **Website URL**: http://localhost:5173 (開発時)
   - **Redirect URIs**: http://localhost:8000/api/auth/orcid/callback
4. Client IDとClient Secretを取得

### 2. 開発用サンドボックス

開発時はORCIDサンドボックス環境を使用できます:
- サンドボックス: https://sandbox.orcid.org
- `.env``ORCID_SANDBOX=true`を設定

### 3. 本番環境

本番環境では:
- 本番用ORCID認証情報を取得
- `.env``ORCID_SANDBOX=false`を設定
- Redirect URIを本番URLに更新

## ユーザーロールとアクセスレベル

| ロール | 説明 | 権限 |
|-------|------|-----|
| guest | 未登録ユーザー | 閲覧、質問 |
| viewer | 登録ユーザー | + 提案の閲覧 |
| editor | 編集者 | + 提案の作成・レビュー |
| expert | ORCID認証済み専門家 | + 認証マーク付き編集 |
| admin | 管理者 | + 全管理機能 |

### 認証マークの種類

- **none**: 未検証
- **community**: コミュニティレビュー済み
- **expert**: ORCID認証専門家による編集/レビュー
- **multi_expert**: 複数の専門家による検証

## サーバーレスストレージ設定

### GitHub Storage(推奨)

GitHubリポジトリをデータベースとして使用:

1. データ保存用リポジトリを作成
2. Personal Access Token (PAT)を生成:
   - Settings > Developer settings > Personal access tokens
   - `repo`スコープを付与
3. 環境変数を設定:
```bash
OPAQUE_STORAGE_BACKEND=github
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
GITHUB_REPO=username/opaque-data
GITHUB_BRANCH=main
GITHUB_DATA_PATH=data
```

### Supabase Storage

Supabase無料プラン(500MB、50,000リクエスト/月):

1. https://supabase.com でプロジェクト作成
2. テーブルを作成:
```sql
CREATE TABLE domains (id text primary key, data jsonb);
CREATE TABLE proposals (id text primary key, data jsonb);
CREATE TABLE tiles (id text primary key, data jsonb);
```
3. 環境変数を設定:
```bash
OPAQUE_STORAGE_BACKEND=supabase
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_ANON_KEY=eyJxxxxxxxx
```

### JSONBin Storage

シンプルなJSONストレージ(10,000リクエスト/月無料):

1. https://jsonbin.io でアカウント作成
2. 新しいBinを作成(初期データ: `{"collections": {}}`)
3. 環境変数を設定:
```bash
OPAQUE_STORAGE_BACKEND=jsonbin
JSONBIN_API_KEY=$2b$xxxxxxxx
JSONBIN_BIN_ID=xxxxxxxxxxxxxxxx
```

### ストレージ比較

| バックエンド | 無料枠 | 特徴 |
|------------|-------|-----|
| Local | 無制限 | ローカル開発用 |
| GitHub | 無制限* | バージョン管理、透明性 |
| Supabase | 500MB | SQLクエリ、リアルタイム |
| JSONBin | 10K/月 | シンプル、セットアップ簡単 |

*プライベートリポジトリは制限あり

## トラブルシューティング

### HuggingFace Transformersの確認

```bash
# Transformersが正しくインストールされているか確認
python -c "from transformers import AutoModel; print('OK')"

# GPUが利用可能か確認
python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}, MPS: {torch.backends.mps.is_available()}')"
```

### モデルのダウンロードが遅い

```bash
# キャッシュディレクトリを確認
python -c "from transformers import TRANSFORMERS_CACHE; print(TRANSFORMERS_CACHE)"

# 軽量モデルを使用(7Bモデル)
# config.pyでデフォルトモデルを deepseek-r1-7b に変更
```

### メモリ不足エラー

```bash
# 32Bモデルには32GB以上のVRAM/RAMが推奨
# メモリが足りない場合:
# 1. 7Bモデルを使用 (models_config.json でデフォルト変更)
# 2. 4bit量子化を有効化 (config.pyで use_4bit_quantization: true)
# 3. GGUF形式の量子化モデルを使用
```

### データベースエラー

```bash
# データベースをリセット
rm sql_app.db
python backend/create_db.py
```

## API エンドポイント一覧

| エンドポイント | メソッド | 説明 |
|---------------|---------|------|
| `/api/auth/signup` | POST | ユーザー登録 |
| `/api/auth/token` | POST | ログイン(トークン取得) |
| `/api/questions/` | POST | 質問を送信 |
| `/api/questions/ws/{session_id}` | WS | ストリーミング回答 |
| `/api/domains/` | GET | ドメイン一覧 |
| `/api/domains/{id}` | GET/PUT/DELETE | ドメイン操作 |
| `/api/models/` | GET/POST | モデル一覧/追加 |
| `/api/models/{id}` | GET/PUT/DELETE | モデル操作 |
| `/api/models/{id}/test` | POST | モデル接続テスト |
| `/api/proposals/` | GET/POST | 編集提案一覧/作成 |
| `/api/proposals/{id}/review` | PUT | 提案レビュー |
| `/health` | GET | ヘルスチェック |

## アーキテクチャ

```
┌─────────────────────────────────────────────────────────────┐
│                     NullAI System                         │
├─────────────────────────────────────────────────────────────┤
│  Frontend (React + TypeScript)                              │
│  ├── Authentication UI                                      │
│  ├── Chat Interface (REST/WebSocket)                       │
│  ├── Domain Editor                                          │
│  └── Model Management                                       │
├─────────────────────────────────────────────────────────────┤
│  Backend (FastAPI)                                          │
│  ├── Auth API (JWT)                                         │
│  ├── Questions API                                          │
│  ├── Domains API                                            │
│  ├── Models API                                             │
│  └── Proposals API                                          │
├─────────────────────────────────────────────────────────────┤
│  NullAI Core                                              │
│  ├── ModelRouter (Multi-LLM Support)                        │
│  ├── ConfigManager                                          │
│  ├── DendriticMemorySpace (Tree-like Memory)               │
│  └── DB Enrichment CLI                                      │
├─────────────────────────────────────────────────────────────┤
│  Inference Engine                                           │
│  ├── IlmAthensEngine (Orchestrator)                        │
│  ├── SpatialEncodingEngine (Coordinate Mapping)            │
│  ├── Judge Layer (Alpha + Beta Lobe)                       │
│  └── NurseLogSystem (Continuous Learning)                  │
├─────────────────────────────────────────────────────────────┤
│  Data Layer                                                 │
│  ├── IathDB (Compressed Knowledge Tiles)                   │
│  ├── SQLite/PostgreSQL (User Data)                         │
│  └── JSON Config Files                                      │
├─────────────────────────────────────────────────────────────┤
│  LLM Providers                                              │
│  ├── Ollama (Local)                                         │
│  ├── OpenAI API                                             │
│  ├── Anthropic API                                          │
│  └── Custom Endpoints                                       │
└─────────────────────────────────────────────────────────────┘
```

## ライセンス

MIT License