Upload folder using huggingface_hub
Browse files- API_SPECIFICATION.md +27 -0
- COMPREHENSIVE_GUIDE_JA.md +944 -0
- EXAMPLES.md +31 -0
- IMPLEMENTATION_GUIDE.md +19 -0
- QUICK_REFERENCE_JA.md +384 -0
- TROUBLESHOOTING.md +29 -0
- schema.sql +145 -0
API_SPECIFICATION.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Ilm-Athens API仕様書
|
| 2 |
+
|
| 3 |
+
This document is a placeholder and will be filled out with relevant content.
|
| 4 |
+
|
| 5 |
+
## 概要
|
| 6 |
+
|
| 7 |
+
このドキュメントでは、Ilm-Athensの各コンポーネントが外部に公開するAPIについて詳述します。
|
| 8 |
+
|
| 9 |
+
## DB層 API (gRPC)
|
| 10 |
+
|
| 11 |
+
...
|
| 12 |
+
|
| 13 |
+
### `GetKnowledgeTile`
|
| 14 |
+
|
| 15 |
+
...
|
| 16 |
+
|
| 17 |
+
## 推論エンジン API (gRPC)
|
| 18 |
+
|
| 19 |
+
...
|
| 20 |
+
|
| 21 |
+
### `GenerateResponse`
|
| 22 |
+
|
| 23 |
+
...
|
| 24 |
+
|
| 25 |
+
## Webプラットフォーム API (REST)
|
| 26 |
+
|
| 27 |
+
...
|
COMPREHENSIVE_GUIDE_JA.md
ADDED
|
@@ -0,0 +1,944 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NullAI 総合ガイド
|
| 2 |
+
|
| 3 |
+
## 目次
|
| 4 |
+
|
| 5 |
+
1. [システム概要](#1-システム概要)
|
| 6 |
+
2. [アーキテクチャ](#2-アーキテクチャ)
|
| 7 |
+
3. [セットアップ手順](#3-セットアップ手順)
|
| 8 |
+
4. [コマンドリファレンス](#4-コマンドリファレンス)
|
| 9 |
+
5. [API仕様](#5-api仕様)
|
| 10 |
+
6. [知識ベース管理](#6-知識ベース管理)
|
| 11 |
+
7. [認証システム](#7-認証システム)
|
| 12 |
+
8. [クラウドデプロイメント](#8-クラウドデプロイメント)
|
| 13 |
+
9. [トラブルシューティング](#9-トラブルシューティング)
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## 1. システム概要
|
| 18 |
+
|
| 19 |
+
### 1.1 NullAIとは
|
| 20 |
+
|
| 21 |
+
NullAIは、**マルチドメイン対応の知識推論システム**です。以下の特徴を持ちます:
|
| 22 |
+
|
| 23 |
+
- **幻覚(ハルシネーション)低減**: 5層アーキテクチャによる検証システム
|
| 24 |
+
- **マルチドメイン対応**: 医療、法律、経済、プログラミング、一般知識
|
| 25 |
+
- **HuggingFace対応**: Transformers、Inference API、GGUF形式をサポート
|
| 26 |
+
- **専門家認証**: ORCID認証による専門家の編集認証マーク
|
| 27 |
+
- **サーバーレス対応**: GitHub/Supabase/JSONBinによる無料ストレージ
|
| 28 |
+
|
| 29 |
+
> **重要**: OpenAI/Anthropic/Ollama等の外部APIは利用規約上の理由から削除されました。NullAIはオープンソースモデルのみをサポートします。
|
| 30 |
+
|
| 31 |
+
### 1.2 主要コンポーネント
|
| 32 |
+
|
| 33 |
+
```
|
| 34 |
+
NullAI/
|
| 35 |
+
├── null_ai/ # コア設定・モデルルーター
|
| 36 |
+
├── backend/ # FastAPI バックエンドAPI
|
| 37 |
+
├── frontend/ # React TypeScript フロントエンド
|
| 38 |
+
├── ilm_athens_engine/ # 推論エンジン本体
|
| 39 |
+
└── 各種ユーティリティ # エンコーダー、デコーダー等
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
### 1.3 推論パイプライン
|
| 43 |
+
|
| 44 |
+
```
|
| 45 |
+
質問入力
|
| 46 |
+
↓
|
| 47 |
+
[Layer 1] 空間エンコーディング - 質問をドメイン空間座標にマッピング
|
| 48 |
+
↓
|
| 49 |
+
[Layer 2] エピソードバインディング - 関連知識タイルの検索・結合
|
| 50 |
+
↓
|
| 51 |
+
[Layer 3] α-Lobe(生成)+ β-Lobe(検証)- 回答生成と妥当性検証
|
| 52 |
+
↓
|
| 53 |
+
[Layer 4] 修正フロー - 検証失敗時の自動修正
|
| 54 |
+
↓
|
| 55 |
+
[Layer 5] 状態管理 - 結果の保存と状態更新
|
| 56 |
+
↓
|
| 57 |
+
回答出力 + 信頼度スコア
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
## 2. アーキテクチャ
|
| 63 |
+
|
| 64 |
+
### 2.1 バックエンド構成
|
| 65 |
+
|
| 66 |
+
```
|
| 67 |
+
backend/
|
| 68 |
+
├── app/
|
| 69 |
+
│ ├── main.py # FastAPIエントリーポイント
|
| 70 |
+
│ ├── config.py # 環境設定
|
| 71 |
+
│ ├── api/
|
| 72 |
+
│ │ ├── questions.py # 質問API(REST + WebSocket)
|
| 73 |
+
│ │ ├── auth.py # 認証API(JWT)
|
| 74 |
+
│ │ ├── domains.py # ドメイン管理API
|
| 75 |
+
│ │ ├── proposals.py # 編集提案API
|
| 76 |
+
│ │ ├── models.py # LLMモデル管理API
|
| 77 |
+
│ │ └── orcid_auth.py # ORCID認証API
|
| 78 |
+
│ ├── middleware/
|
| 79 |
+
│ │ └── auth.py # JWT認証ミドルウェア
|
| 80 |
+
│ ├── services/
|
| 81 |
+
│ │ └── inference_service.py # 推論サービス
|
| 82 |
+
│ └── database/
|
| 83 |
+
│ ├── models.py # SQLAlchemy ORM
|
| 84 |
+
│ └── session.py # DBセッション
|
| 85 |
+
```
|
| 86 |
+
|
| 87 |
+
### 2.2 フロントエンド構成
|
| 88 |
+
|
| 89 |
+
```
|
| 90 |
+
frontend/src/
|
| 91 |
+
├── App.tsx # メインアプリ
|
| 92 |
+
├── pages/
|
| 93 |
+
│ ├── QuestionPage.tsx # チャットUI
|
| 94 |
+
│ ├── LoginPage.tsx # ログイン(ORCID/Email/Guest)
|
| 95 |
+
│ ├── SignupPage.tsx # ユーザー登録
|
| 96 |
+
│ └── DomainEditorPage.tsx # ドメイン編集
|
| 97 |
+
├── components/
|
| 98 |
+
│ ├── QuestionInput.tsx # 質問入力フォーム
|
| 99 |
+
│ ├── ResponseDisplay.tsx # 回答表示
|
| 100 |
+
│ └── VerificationBadge.tsx # 認証バッジ
|
| 101 |
+
├── contexts/
|
| 102 |
+
│ └── AuthContext.tsx # 認証状態管理
|
| 103 |
+
├── hooks/
|
| 104 |
+
│ └── useWebSocket.ts # WebSocketフック
|
| 105 |
+
└── services/
|
| 106 |
+
└── api.ts # API クライアント
|
| 107 |
+
```
|
| 108 |
+
|
| 109 |
+
### 2.3 推論エンジン構成
|
| 110 |
+
|
| 111 |
+
```
|
| 112 |
+
ilm_athens_engine/
|
| 113 |
+
├── config.py # システム設定
|
| 114 |
+
├── model_manager.py # モデルライフサイクル管理
|
| 115 |
+
├── inference_engine_deepseek_integrated.py # 統合推論エンジン
|
| 116 |
+
├── core/
|
| 117 |
+
│ ├── spatial_memory.py # 空間メモリ(Layer 6)
|
| 118 |
+
│ ├── episodic_binding.py # エピソードバインディング
|
| 119 |
+
│ ├── symbiotic_engine.py # ツインエンジンシステム
|
| 120 |
+
│ ├── dendritic_memory.py # 樹木型メモリ構造
|
| 121 |
+
│ └── nurse_log_system.py # 継続学習システム
|
| 122 |
+
└── deepseek_integration/
|
| 123 |
+
├── hf_deepseek_engine.py # HuggingFace統合
|
| 124 |
+
└── deepseek_runner.py # Ollama統合
|
| 125 |
+
```
|
| 126 |
+
|
| 127 |
+
### 2.4 データフロー
|
| 128 |
+
|
| 129 |
+
```
|
| 130 |
+
ユーザー → フロントエンド → バックエ���ドAPI
|
| 131 |
+
↓
|
| 132 |
+
推論エンジン
|
| 133 |
+
↓
|
| 134 |
+
┌───────────────┼───────────────┐
|
| 135 |
+
↓ ↓ ↓
|
| 136 |
+
知識タイルDB LLM推論 Web検索
|
| 137 |
+
(IATH形式) (DeepSeek等) (DuckDuckGo等)
|
| 138 |
+
↓ ↓ ↓
|
| 139 |
+
└───────────────┼───────────────┘
|
| 140 |
+
↓
|
| 141 |
+
α-Lobe(生成)
|
| 142 |
+
↓
|
| 143 |
+
β-Lobe(検証)
|
| 144 |
+
↓
|
| 145 |
+
回答 + 信頼度 + 認証マーク
|
| 146 |
+
```
|
| 147 |
+
|
| 148 |
+
---
|
| 149 |
+
|
| 150 |
+
## 3. セットアップ手順
|
| 151 |
+
|
| 152 |
+
### 3.1 必要環境
|
| 153 |
+
|
| 154 |
+
- Python 3.10以上
|
| 155 |
+
- Node.js 18以上
|
| 156 |
+
- GPU(推奨: CUDA対応 または Apple Silicon)
|
| 157 |
+
- PostgreSQL(オプション、SQLiteでも動作)
|
| 158 |
+
|
| 159 |
+
#### 必要なPythonパッケージ(LLM関連)
|
| 160 |
+
|
| 161 |
+
```bash
|
| 162 |
+
# HuggingFace Transformers(必須)
|
| 163 |
+
pip install transformers torch accelerate
|
| 164 |
+
|
| 165 |
+
# GGUF形式を使用する場合
|
| 166 |
+
pip install llama-cpp-python
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
### 3.2 基本セットアップ
|
| 170 |
+
|
| 171 |
+
```bash
|
| 172 |
+
# 1. リポジトリをクローン(または既存ディレクトリへ移動)
|
| 173 |
+
cd project_locate
|
| 174 |
+
|
| 175 |
+
# 2. Python仮想環境の作成
|
| 176 |
+
python -m venv venv
|
| 177 |
+
source venv/bin/activate # Windows: venv\Scripts\activate
|
| 178 |
+
|
| 179 |
+
# 3. 依存パッケージのインストール
|
| 180 |
+
pip install -r requirements.txt
|
| 181 |
+
|
| 182 |
+
# 4. フロントエンド依存パッケージのインストール
|
| 183 |
+
cd frontend
|
| 184 |
+
npm install
|
| 185 |
+
cd ..
|
| 186 |
+
|
| 187 |
+
# 5. 環境変数の設定
|
| 188 |
+
cp .env.example .env # または手動で作成
|
| 189 |
+
```
|
| 190 |
+
|
| 191 |
+
### 3.3 環境変数設定 (.env)
|
| 192 |
+
|
| 193 |
+
```bash
|
| 194 |
+
# ========== 基本設定 ==========
|
| 195 |
+
SECRET_KEY=your-secret-key-change-in-production
|
| 196 |
+
DEBUG=true
|
| 197 |
+
ACCESS_TOKEN_EXPIRE_MINUTES=1440
|
| 198 |
+
|
| 199 |
+
# ========== データベース ==========
|
| 200 |
+
DATABASE_URL=sqlite:///./sql_app.db
|
| 201 |
+
# PostgreSQLの場合:
|
| 202 |
+
# DATABASE_URL=postgresql://user:password@localhost:5432/null_ai
|
| 203 |
+
|
| 204 |
+
# ========== HuggingFace設定 ==========
|
| 205 |
+
# Inference APIを使用する場合(オプション)
|
| 206 |
+
# HF_API_KEY=hf_xxx
|
| 207 |
+
|
| 208 |
+
# ========== サポート対象外のLLM API ==========
|
| 209 |
+
# 以下のAPIは利用規約上の理由からサポートされていません:
|
| 210 |
+
# - OpenAI API (OPENAI_API_KEY)
|
| 211 |
+
# - Anthropic API (ANTHROPIC_API_KEY)
|
| 212 |
+
# - Ollama API (OLLAMA_URL)
|
| 213 |
+
|
| 214 |
+
# ========== ORCID認証(専門家認証機能)==========
|
| 215 |
+
# ORCID_CLIENT_ID=APP-XXXXXXXXX
|
| 216 |
+
# ORCID_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
| 217 |
+
# ORCID_REDIRECT_URI=http://localhost:8000/api/auth/orcid/callback
|
| 218 |
+
# ORCID_SANDBOX=true # 開発時はtrue
|
| 219 |
+
|
| 220 |
+
# ========== サーバーレスストレージ(オプション)==========
|
| 221 |
+
# OPAQUE_STORAGE_BACKEND=local # local, github, supabase, jsonbin
|
| 222 |
+
|
| 223 |
+
# GitHub Storage
|
| 224 |
+
# GITHUB_TOKEN=ghp_xxxxxxxxxxxx
|
| 225 |
+
# GITHUB_REPO=username/opaque-data
|
| 226 |
+
|
| 227 |
+
# Supabase Storage
|
| 228 |
+
# SUPABASE_URL=https://xxxxx.supabase.co
|
| 229 |
+
# SUPABASE_ANON_KEY=eyJxxxxxxxx
|
| 230 |
+
|
| 231 |
+
# ========== Web検索(オプション)==========
|
| 232 |
+
# BRAVE_API_KEY=your-brave-api-key
|
| 233 |
+
# TAVILY_API_KEY=your-tavily-api-key
|
| 234 |
+
```
|
| 235 |
+
|
| 236 |
+
### 3.4 Ollamaセットアップ
|
| 237 |
+
|
| 238 |
+
```bash
|
| 239 |
+
# Ollamaのインストール(macOS)
|
| 240 |
+
brew install ollama
|
| 241 |
+
|
| 242 |
+
# Ollamaサービスの起動
|
| 243 |
+
ollama serve
|
| 244 |
+
|
| 245 |
+
# モデルのダウンロード(別ターミナル)
|
| 246 |
+
ollama pull deepseek-r1:32b # メインモデル(32B推奨)
|
| 247 |
+
ollama pull deepseek-r1:14b # 軽量版(RAMが少ない場合)
|
| 248 |
+
```
|
| 249 |
+
|
| 250 |
+
### 3.5 データベース初期化
|
| 251 |
+
|
| 252 |
+
```bash
|
| 253 |
+
# SQLiteデータベースの初期化
|
| 254 |
+
python backend/create_db.py
|
| 255 |
+
|
| 256 |
+
# 初期ドメインデータの投入
|
| 257 |
+
python null_ai/cloud_db_setup.py --provider local --init-data
|
| 258 |
+
```
|
| 259 |
+
|
| 260 |
+
### 3.6 システム起動
|
| 261 |
+
|
| 262 |
+
#### 方法A: 起動スクリプト使用(推奨)
|
| 263 |
+
|
| 264 |
+
```bash
|
| 265 |
+
# 全サービス起動
|
| 266 |
+
./start_null_ai.sh
|
| 267 |
+
|
| 268 |
+
# バックエンドのみ
|
| 269 |
+
./start_null_ai.sh backend
|
| 270 |
+
|
| 271 |
+
# フロントエンドのみ
|
| 272 |
+
./start_null_ai.sh frontend
|
| 273 |
+
|
| 274 |
+
# 停止
|
| 275 |
+
./start_null_ai.sh stop
|
| 276 |
+
|
| 277 |
+
# ステータス確認
|
| 278 |
+
./start_null_ai.sh status
|
| 279 |
+
```
|
| 280 |
+
|
| 281 |
+
#### 方法B: 個別起動(開発時)
|
| 282 |
+
|
| 283 |
+
```bash
|
| 284 |
+
# ターミナル1: バックエンド
|
| 285 |
+
source venv/bin/activate
|
| 286 |
+
uvicorn backend.app.main:app --reload --host 0.0.0.0 --port 8000
|
| 287 |
+
|
| 288 |
+
# ターミナル2: フロントエンド
|
| 289 |
+
cd frontend
|
| 290 |
+
npm run dev
|
| 291 |
+
```
|
| 292 |
+
|
| 293 |
+
#### 方法C: Docker Compose
|
| 294 |
+
|
| 295 |
+
```bash
|
| 296 |
+
docker-compose up -d
|
| 297 |
+
docker-compose logs -f
|
| 298 |
+
```
|
| 299 |
+
|
| 300 |
+
### 3.7 アクセス
|
| 301 |
+
|
| 302 |
+
| サービス | URL |
|
| 303 |
+
|---------|-----|
|
| 304 |
+
| フロントエンド | http://localhost:5173 |
|
| 305 |
+
| バックエンドAPI | http://localhost:8000 |
|
| 306 |
+
| API ドキュメント | http://localhost:8000/docs |
|
| 307 |
+
| Ollama | http://localhost:11434 |
|
| 308 |
+
|
| 309 |
+
---
|
| 310 |
+
|
| 311 |
+
## 4. コマンドリファレンス
|
| 312 |
+
|
| 313 |
+
### 4.1 DB拡充コマンド
|
| 314 |
+
|
| 315 |
+
#### 基本的な使い方
|
| 316 |
+
|
| 317 |
+
```bash
|
| 318 |
+
# ヘルプを表示
|
| 319 |
+
python null_ai/db_enrichment_cli.py --help
|
| 320 |
+
|
| 321 |
+
# 利用可能なモデル一覧
|
| 322 |
+
python null_ai/db_enrichment_cli.py --list-models
|
| 323 |
+
|
| 324 |
+
# 利用可能なドメイン一覧
|
| 325 |
+
python null_ai/db_enrichment_cli.py --list-domains
|
| 326 |
+
|
| 327 |
+
# 生成される質問をプレビュー(実行なし)
|
| 328 |
+
python null_ai/db_enrichment_cli.py --domain medical --preview --count 20
|
| 329 |
+
```
|
| 330 |
+
|
| 331 |
+
#### LLM推論によるDB拡充
|
| 332 |
+
|
| 333 |
+
```bash
|
| 334 |
+
# 医療ドメインを50件の質問で拡充
|
| 335 |
+
python null_ai/db_enrichment_cli.py --domain medical --count 50
|
| 336 |
+
|
| 337 |
+
# 全ドメインを拡充(各30件)
|
| 338 |
+
python null_ai/db_enrichment_cli.py --all --count 30
|
| 339 |
+
|
| 340 |
+
# 特定のモデルを使用して拡充
|
| 341 |
+
python null_ai/db_enrichment_cli.py --domain legal --model deepseek-r1-32b --count 20
|
| 342 |
+
|
| 343 |
+
# バッチサイズを指定(レート制限対策)
|
| 344 |
+
python null_ai/db_enrichment_cli.py --domain economics --count 100 --batch-size 3
|
| 345 |
+
```
|
| 346 |
+
|
| 347 |
+
#### Web検索によるDB拡充
|
| 348 |
+
|
| 349 |
+
```bash
|
| 350 |
+
# Web検索で最新情報を収集(DuckDuckGo使用、無料・キー不要)
|
| 351 |
+
python null_ai/db_enrichment_cli.py --domain medical --web-search --count 10
|
| 352 |
+
|
| 353 |
+
# 特定のクエリでWeb検索
|
| 354 |
+
python null_ai/db_enrichment_cli.py --domain medical --web-search \
|
| 355 |
+
--query "最新の糖尿病治療法 2024"
|
| 356 |
+
|
| 357 |
+
# クエリファイルから検索
|
| 358 |
+
python null_ai/db_enrichment_cli.py --domain legal --web-search \
|
| 359 |
+
--queries-file legal_queries.txt
|
| 360 |
+
|
| 361 |
+
# 利用可能な検索プロバイダーを確認
|
| 362 |
+
python null_ai/db_enrichment_cli.py --list-search-providers
|
| 363 |
+
```
|
| 364 |
+
|
| 365 |
+
### 4.2 知識タイル生成コマンド
|
| 366 |
+
|
| 367 |
+
```bash
|
| 368 |
+
# 単一トピックからタイル生成
|
| 369 |
+
python create_tile_from_topic.py --topic "心筋梗塞の治療法" --domain medical
|
| 370 |
+
|
| 371 |
+
# バッチ生成(トピックファイルから)
|
| 372 |
+
python batch_create_tiles.py --topics-file topics.txt --domain medical
|
| 373 |
+
|
| 374 |
+
# IATHファイルの検証
|
| 375 |
+
python compression_verifier.py --file generated_tiles/tile_xxx.iath
|
| 376 |
+
```
|
| 377 |
+
|
| 378 |
+
### 4.3 クラウドDB設定コマンド
|
| 379 |
+
|
| 380 |
+
```bash
|
| 381 |
+
# Supabaseセットアップ手順を表示
|
| 382 |
+
python null_ai/cloud_db_setup.py --provider supabase
|
| 383 |
+
|
| 384 |
+
# GitHubストレージセットアップ
|
| 385 |
+
python null_ai/cloud_db_setup.py --provider github --repo username/opaque-data
|
| 386 |
+
|
| 387 |
+
# JSONBinセットアップ
|
| 388 |
+
python null_ai/cloud_db_setup.py --provider jsonbin
|
| 389 |
+
|
| 390 |
+
# Supabaseに初期データ投入
|
| 391 |
+
python null_ai/cloud_db_setup.py --provider supabase --init-data
|
| 392 |
+
```
|
| 393 |
+
|
| 394 |
+
### 4.4 Web検索単独実行
|
| 395 |
+
|
| 396 |
+
```bash
|
| 397 |
+
# 医療ドメインで最新情報を検索
|
| 398 |
+
python null_ai/web_search_enrichment.py --domain medical --count 10
|
| 399 |
+
|
| 400 |
+
# 特定クエリで検索
|
| 401 |
+
python null_ai/web_search_enrichment.py --domain medical \
|
| 402 |
+
--query "COVID-19 最新治療法 2024"
|
| 403 |
+
|
| 404 |
+
# 全ドメインで検索
|
| 405 |
+
python null_ai/web_search_enrichment.py --all-domains --count 5
|
| 406 |
+
|
| 407 |
+
# 検索プロバイダー一覧
|
| 408 |
+
python null_ai/web_search_enrichment.py --list-providers
|
| 409 |
+
```
|
| 410 |
+
|
| 411 |
+
### 4.5 テスト実行
|
| 412 |
+
|
| 413 |
+
```bash
|
| 414 |
+
# 基本テスト
|
| 415 |
+
python test_judge_basic.py
|
| 416 |
+
|
| 417 |
+
# 包括的テスト
|
| 418 |
+
python test_judge_comprehensive.py
|
| 419 |
+
|
| 420 |
+
# DeepSeek統合テスト
|
| 421 |
+
python test_deepseek_integration.py
|
| 422 |
+
|
| 423 |
+
# E2Eパイプラインテスト
|
| 424 |
+
python e2e_pipeline_test.py
|
| 425 |
+
|
| 426 |
+
# 最終統合テスト
|
| 427 |
+
python final_integration_test.py
|
| 428 |
+
```
|
| 429 |
+
|
| 430 |
+
---
|
| 431 |
+
|
| 432 |
+
## 5. API仕様
|
| 433 |
+
|
| 434 |
+
### 5.1 認証API
|
| 435 |
+
|
| 436 |
+
#### ユーザー登録
|
| 437 |
+
```http
|
| 438 |
+
POST /api/auth/signup
|
| 439 |
+
Content-Type: application/json
|
| 440 |
+
|
| 441 |
+
{
|
| 442 |
+
"email": "user@example.com",
|
| 443 |
+
"password": "securepassword"
|
| 444 |
+
}
|
| 445 |
+
```
|
| 446 |
+
|
| 447 |
+
#### ログイン(JWTトークン取得)
|
| 448 |
+
```http
|
| 449 |
+
POST /api/auth/token
|
| 450 |
+
Content-Type: application/x-www-form-urlencoded
|
| 451 |
+
|
| 452 |
+
username=user@example.com&password=securepassword
|
| 453 |
+
```
|
| 454 |
+
|
| 455 |
+
#### ORCID認証開始
|
| 456 |
+
```http
|
| 457 |
+
GET /api/auth/orcid/authorize?redirect_url=http://localhost:5173
|
| 458 |
+
```
|
| 459 |
+
|
| 460 |
+
### 5.2 質問API
|
| 461 |
+
|
| 462 |
+
#### 質問送信(REST)
|
| 463 |
+
```http
|
| 464 |
+
POST /api/questions/
|
| 465 |
+
Authorization: Bearer {token}
|
| 466 |
+
Content-Type: application/json
|
| 467 |
+
|
| 468 |
+
{
|
| 469 |
+
"question": "糖尿病の最新治療法について教えてください",
|
| 470 |
+
"domain_id": "medical",
|
| 471 |
+
"session_id": null
|
| 472 |
+
}
|
| 473 |
+
```
|
| 474 |
+
|
| 475 |
+
#### レスポンス例
|
| 476 |
+
```json
|
| 477 |
+
{
|
| 478 |
+
"session_id": "sess_abc123",
|
| 479 |
+
"question": "糖尿病の最新治療法について教えてください",
|
| 480 |
+
"response": "糖尿病の最新治療法には...",
|
| 481 |
+
"confidence": 0.87,
|
| 482 |
+
"memory_augmented": true,
|
| 483 |
+
"thinking_steps": ["知識検索中...", "回答生成中...", "検証中..."]
|
| 484 |
+
}
|
| 485 |
+
```
|
| 486 |
+
|
| 487 |
+
#### WebSocketストリーミング
|
| 488 |
+
```javascript
|
| 489 |
+
const ws = new WebSocket('ws://localhost:8000/api/questions/ws/session_id');
|
| 490 |
+
|
| 491 |
+
ws.onmessage = (event) => {
|
| 492 |
+
const data = JSON.parse(event.data);
|
| 493 |
+
// data.type: 'thinking', 'response', 'complete', 'error'
|
| 494 |
+
};
|
| 495 |
+
|
| 496 |
+
ws.send(JSON.stringify({
|
| 497 |
+
question: "質問内容",
|
| 498 |
+
domain_id: "medical"
|
| 499 |
+
}));
|
| 500 |
+
```
|
| 501 |
+
|
| 502 |
+
### 5.3 ドメインAPI
|
| 503 |
+
|
| 504 |
+
#### ドメイン一覧取得(ゲストアクセス可)
|
| 505 |
+
```http
|
| 506 |
+
GET /api/domains/
|
| 507 |
+
```
|
| 508 |
+
|
| 509 |
+
#### 特定ドメイン取得
|
| 510 |
+
```http
|
| 511 |
+
GET /api/domains/medical
|
| 512 |
+
```
|
| 513 |
+
|
| 514 |
+
#### ドメイン更新(Editor以上)
|
| 515 |
+
```http
|
| 516 |
+
PUT /api/domains/medical
|
| 517 |
+
Authorization: Bearer {token}
|
| 518 |
+
Content-Type: application/json
|
| 519 |
+
|
| 520 |
+
{
|
| 521 |
+
"domain_id": "medical",
|
| 522 |
+
"name": "Medical",
|
| 523 |
+
"description": "医療・健康に関する知識領域",
|
| 524 |
+
"axes": [
|
| 525 |
+
{"name": "診断", "description": "症状から疾患を特定", "keywords": ["症状", "検査"]}
|
| 526 |
+
]
|
| 527 |
+
}
|
| 528 |
+
```
|
| 529 |
+
|
| 530 |
+
### 5.4 編集提案API
|
| 531 |
+
|
| 532 |
+
#### 提案一覧取得(ゲストアクセス可)
|
| 533 |
+
```http
|
| 534 |
+
GET /api/proposals/?status=pending&domain_id=medical
|
| 535 |
+
```
|
| 536 |
+
|
| 537 |
+
#### 提案作成(認証必須)
|
| 538 |
+
```http
|
| 539 |
+
POST /api/proposals/
|
| 540 |
+
Authorization: Bearer {token}
|
| 541 |
+
Content-Type: application/json
|
| 542 |
+
|
| 543 |
+
{
|
| 544 |
+
"proposal_type": "create",
|
| 545 |
+
"domain_id": "medical",
|
| 546 |
+
"title": "新しい治療法の追加",
|
| 547 |
+
"description": "最新の糖尿病治療法について",
|
| 548 |
+
"proposed_content": {...},
|
| 549 |
+
"justification": "最新の研究結果に基づく"
|
| 550 |
+
}
|
| 551 |
+
```
|
| 552 |
+
|
| 553 |
+
#### 提案レビュー(Editor以上)
|
| 554 |
+
```http
|
| 555 |
+
PUT /api/proposals/{proposal_id}/review
|
| 556 |
+
Authorization: Bearer {token}
|
| 557 |
+
Content-Type: application/json
|
| 558 |
+
|
| 559 |
+
{
|
| 560 |
+
"status": "approved",
|
| 561 |
+
"reviewer_comment": "内容を確認しました",
|
| 562 |
+
"validation_score": 0.9
|
| 563 |
+
}
|
| 564 |
+
```
|
| 565 |
+
|
| 566 |
+
### 5.5 モデル管理API
|
| 567 |
+
|
| 568 |
+
#### モデル一覧取得
|
| 569 |
+
```http
|
| 570 |
+
GET /api/models/?domain_id=medical
|
| 571 |
+
Authorization: Bearer {token}
|
| 572 |
+
```
|
| 573 |
+
|
| 574 |
+
#### モデル接続テスト
|
| 575 |
+
```http
|
| 576 |
+
POST /api/models/deepseek-r1-32b/test
|
| 577 |
+
Authorization: Bearer {token}
|
| 578 |
+
```
|
| 579 |
+
|
| 580 |
+
---
|
| 581 |
+
|
| 582 |
+
## 6. 知識ベース管理
|
| 583 |
+
|
| 584 |
+
### 6.1 知識タイル構造
|
| 585 |
+
|
| 586 |
+
```json
|
| 587 |
+
{
|
| 588 |
+
"metadata": {
|
| 589 |
+
"knowledge_id": "ktile-medical-20241124-001",
|
| 590 |
+
"topic": "糖尿病の診断基準",
|
| 591 |
+
"domain": "medical",
|
| 592 |
+
"created_at": "2024-11-24T10:30:00Z",
|
| 593 |
+
"source_type": "llm",
|
| 594 |
+
"is_expert_verified": true,
|
| 595 |
+
"expert_orcid_id": "0000-0001-2345-6789"
|
| 596 |
+
},
|
| 597 |
+
"content": {
|
| 598 |
+
"question": "糖尿病の診断基準は何ですか?",
|
| 599 |
+
"thinking_process": "診断基準について、HbA1c、空腹時血糖値...",
|
| 600 |
+
"final_response": "糖尿病の診断基準は以下の通りです..."
|
| 601 |
+
},
|
| 602 |
+
"coordinates": {
|
| 603 |
+
"medical_space": [45.2, 120.5, 30.0],
|
| 604 |
+
"meta_space": [87.5, 92.0, 85.0]
|
| 605 |
+
},
|
| 606 |
+
"verification": {
|
| 607 |
+
"alpha_score": 0.92,
|
| 608 |
+
"beta_score": 0.88,
|
| 609 |
+
"hallucination_risk": 0.05
|
| 610 |
+
}
|
| 611 |
+
}
|
| 612 |
+
```
|
| 613 |
+
|
| 614 |
+
### 6.2 IATHファイル形式
|
| 615 |
+
|
| 616 |
+
NullAIは独自のバイナリ形式(`.iath`)を使用して知識タイルを保存します:
|
| 617 |
+
|
| 618 |
+
- **圧縮**: zstandard圧縮
|
| 619 |
+
- **ヘッダー**: ドメインコード、バージョン、タイムスタンプ
|
| 620 |
+
- **本体**: JSON形式の知識タイルデータ
|
| 621 |
+
|
| 622 |
+
```bash
|
| 623 |
+
# IATHファイルのデコード
|
| 624 |
+
python iath_decoder.py generated_tiles/tile_xxx.iath
|
| 625 |
+
|
| 626 |
+
# IATHファイルの作成
|
| 627 |
+
python iath_encoder.py --input tile_data.json --output tile.iath
|
| 628 |
+
```
|
| 629 |
+
|
| 630 |
+
### 6.3 樹木型メモリ構造(DendriticMemorySpace)
|
| 631 |
+
|
| 632 |
+
知識タイルは3次元円筒座標系で管理されます:
|
| 633 |
+
|
| 634 |
+
```
|
| 635 |
+
座標系:
|
| 636 |
+
- r (半径): 0-100 - 知識の具体性(中心=抽象、外側=具体)
|
| 637 |
+
- θ (角度): 0-360° - 知識のカテゴリ
|
| 638 |
+
- z (高さ): -50〜50 - 時間/重要度
|
| 639 |
+
```
|
| 640 |
+
|
| 641 |
+
知識検索時に、質問が座標にマッピングされ、近接する知識タイルが自動的に参照されます。
|
| 642 |
+
|
| 643 |
+
---
|
| 644 |
+
|
| 645 |
+
## 7. 認証システム
|
| 646 |
+
|
| 647 |
+
### 7.1 ユーザーロール
|
| 648 |
+
|
| 649 |
+
| ロール | 説明 | 権限 |
|
| 650 |
+
|-------|------|-----|
|
| 651 |
+
| guest | 未登録ユーザー | 閲覧、質問 |
|
| 652 |
+
| viewer | 登録ユーザー | + 提案の閲覧 |
|
| 653 |
+
| editor | 編集者 | + 提案の作成・レビュー |
|
| 654 |
+
| expert | ORCID認証済み専門家 | + 認証マーク付き編集 |
|
| 655 |
+
| admin | 管理者 | + 全管理機能 |
|
| 656 |
+
|
| 657 |
+
### 7.2 認証マークの種類
|
| 658 |
+
|
| 659 |
+
| マーク | 説明 | 表示 |
|
| 660 |
+
|-------|------|-----|
|
| 661 |
+
| none | 未検証 | なし |
|
| 662 |
+
| community | コミュニティレビュー済み | 青バッジ |
|
| 663 |
+
| expert | ORCID認証専門家による編集/レビュー | 緑バッジ |
|
| 664 |
+
| multi_expert | 複数の専門家による検証 | 金バッジ |
|
| 665 |
+
|
| 666 |
+
### 7.3 ORCID認証の設定
|
| 667 |
+
|
| 668 |
+
1. **ORCID開発者アカウントの作成**
|
| 669 |
+
- https://orcid.org/developer-tools にアクセス
|
| 670 |
+
- アプリケーション登録
|
| 671 |
+
- Client IDとClient Secretを取得
|
| 672 |
+
|
| 673 |
+
2. **環境変数の設定**
|
| 674 |
+
```bash
|
| 675 |
+
ORCID_CLIENT_ID=APP-XXXXXXXXX
|
| 676 |
+
ORCID_CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
| 677 |
+
ORCID_REDIRECT_URI=http://localhost:8000/api/auth/orcid/callback
|
| 678 |
+
ORCID_SANDBOX=true # 開発時はtrue
|
| 679 |
+
```
|
| 680 |
+
|
| 681 |
+
3. **認証フロー**
|
| 682 |
+
- ユーザーが「Sign in with ORCID」をクリック
|
| 683 |
+
- ORCIDの認証ページにリダイレクト
|
| 684 |
+
- 認証後、コールバックURLにリダイレクト
|
| 685 |
+
- JWTトークン発行(expert権限付与)
|
| 686 |
+
|
| 687 |
+
---
|
| 688 |
+
|
| 689 |
+
## 8. クラウドデプロイメント
|
| 690 |
+
|
| 691 |
+
### 8.1 サーバーレスストレージオプション
|
| 692 |
+
|
| 693 |
+
#### Supabase(推奨)
|
| 694 |
+
|
| 695 |
+
無料枠: 500MB、50,000リクエスト/月
|
| 696 |
+
|
| 697 |
+
```bash
|
| 698 |
+
# セットアップ手順を表示
|
| 699 |
+
python null_ai/cloud_db_setup.py --provider supabase
|
| 700 |
+
|
| 701 |
+
# 初期データ投入
|
| 702 |
+
python null_ai/cloud_db_setup.py --provider supabase --init-data
|
| 703 |
+
```
|
| 704 |
+
|
| 705 |
+
環境変数:
|
| 706 |
+
```bash
|
| 707 |
+
OPAQUE_STORAGE_BACKEND=supabase
|
| 708 |
+
SUPABASE_URL=https://xxxxx.supabase.co
|
| 709 |
+
SUPABASE_ANON_KEY=eyJxxxxxxxx
|
| 710 |
+
```
|
| 711 |
+
|
| 712 |
+
#### GitHub Storage
|
| 713 |
+
|
| 714 |
+
無料枠: 無制限(パブリックリポジトリ)
|
| 715 |
+
|
| 716 |
+
```bash
|
| 717 |
+
# セットアップ手順を表示
|
| 718 |
+
python null_ai/cloud_db_setup.py --provider github --repo username/opaque-data
|
| 719 |
+
```
|
| 720 |
+
|
| 721 |
+
環境変数:
|
| 722 |
+
```bash
|
| 723 |
+
OPAQUE_STORAGE_BACKEND=github
|
| 724 |
+
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
|
| 725 |
+
GITHUB_REPO=username/opaque-data
|
| 726 |
+
GITHUB_BRANCH=main
|
| 727 |
+
GITHUB_DATA_PATH=data
|
| 728 |
+
```
|
| 729 |
+
|
| 730 |
+
#### JSONBin
|
| 731 |
+
|
| 732 |
+
無料枠: 10,000リクエスト/月
|
| 733 |
+
|
| 734 |
+
```bash
|
| 735 |
+
# セットアップ手順を表示
|
| 736 |
+
python null_ai/cloud_db_setup.py --provider jsonbin
|
| 737 |
+
```
|
| 738 |
+
|
| 739 |
+
環境変数:
|
| 740 |
+
```bash
|
| 741 |
+
OPAQUE_STORAGE_BACKEND=jsonbin
|
| 742 |
+
JSONBIN_API_KEY=$2b$xxxxxxxx
|
| 743 |
+
JSONBIN_BIN_ID=xxxxxxxxxxxxxxxx
|
| 744 |
+
```
|
| 745 |
+
|
| 746 |
+
### 8.2 ストレージ比較
|
| 747 |
+
|
| 748 |
+
| バックエンド | 無料枠 | 特徴 | 推奨用途 |
|
| 749 |
+
|------------|-------|-----|---------|
|
| 750 |
+
| Local | 無制限 | ファイルベース | 開発 |
|
| 751 |
+
| GitHub | 無制限* | バージョン管理、透明性 | オープンソースプロジェクト |
|
| 752 |
+
| Supabase | 500MB | SQLクエリ、リアルタイム | 本番環境 |
|
| 753 |
+
| JSONBin | 10K/月 | シンプル | 小規模プロジェクト |
|
| 754 |
+
|
| 755 |
+
*パブリックリポジトリの場合
|
| 756 |
+
|
| 757 |
+
### 8.3 フロントエンドデプロイ
|
| 758 |
+
|
| 759 |
+
#### Vercel(推奨)
|
| 760 |
+
|
| 761 |
+
```bash
|
| 762 |
+
# Vercel CLIインストール
|
| 763 |
+
npm i -g vercel
|
| 764 |
+
|
| 765 |
+
# デプロイ
|
| 766 |
+
cd frontend
|
| 767 |
+
vercel
|
| 768 |
+
```
|
| 769 |
+
|
| 770 |
+
#### Netlify
|
| 771 |
+
|
| 772 |
+
```bash
|
| 773 |
+
# ビルド
|
| 774 |
+
cd frontend
|
| 775 |
+
npm run build
|
| 776 |
+
|
| 777 |
+
# Netlifyにdistフォルダをアップロード
|
| 778 |
+
```
|
| 779 |
+
|
| 780 |
+
#### GitHub Pages
|
| 781 |
+
|
| 782 |
+
```bash
|
| 783 |
+
# gh-pagesパッケージをインストール
|
| 784 |
+
npm install gh-pages --save-dev
|
| 785 |
+
|
| 786 |
+
# package.jsonにスクリプト追加
|
| 787 |
+
# "deploy": "gh-pages -d dist"
|
| 788 |
+
|
| 789 |
+
# デプロイ
|
| 790 |
+
npm run build
|
| 791 |
+
npm run deploy
|
| 792 |
+
```
|
| 793 |
+
|
| 794 |
+
---
|
| 795 |
+
|
| 796 |
+
## 9. トラブルシューティング
|
| 797 |
+
|
| 798 |
+
### 9.1 Ollamaに接続できない
|
| 799 |
+
|
| 800 |
+
```bash
|
| 801 |
+
# Ollamaが起動しているか確認
|
| 802 |
+
curl http://localhost:11434/api/tags
|
| 803 |
+
|
| 804 |
+
# 起動していない場合
|
| 805 |
+
ollama serve
|
| 806 |
+
|
| 807 |
+
# モデルがダウンロードされているか確認
|
| 808 |
+
ollama list
|
| 809 |
+
```
|
| 810 |
+
|
| 811 |
+
### 9.2 モデルのダウンロードが遅い
|
| 812 |
+
|
| 813 |
+
```bash
|
| 814 |
+
# より軽量なモデルを使用
|
| 815 |
+
ollama pull deepseek-r1:14b # 32Bの代わりに14B
|
| 816 |
+
|
| 817 |
+
# models_config.jsonでデフォルトモデルを変更
|
| 818 |
+
```
|
| 819 |
+
|
| 820 |
+
### 9.3 メモリ不足エラー
|
| 821 |
+
|
| 822 |
+
- 32Bモデルには32GB以上のRAMが推奨
|
| 823 |
+
- RAMが少ない場合は14Bモデルを使用
|
| 824 |
+
- Docker使用時はメモリ制限を確認
|
| 825 |
+
|
| 826 |
+
### 9.4 データベースエラー
|
| 827 |
+
|
| 828 |
+
```bash
|
| 829 |
+
# データベースをリセット
|
| 830 |
+
rm sql_app.db
|
| 831 |
+
python backend/create_db.py
|
| 832 |
+
```
|
| 833 |
+
|
| 834 |
+
### 9.5 ORCID認証が失敗する
|
| 835 |
+
|
| 836 |
+
- `ORCID_REDIRECT_URI`がORCIDの設定と一致しているか確認
|
| 837 |
+
- 開発時は`ORCID_SANDBOX=true`を設定
|
| 838 |
+
- Client IDとClient Secretが正しいか確認
|
| 839 |
+
|
| 840 |
+
### 9.6 Web検索が動作しない
|
| 841 |
+
|
| 842 |
+
```bash
|
| 843 |
+
# 検索プロバイダーの状態を確認
|
| 844 |
+
python null_ai/db_enrichment_cli.py --list-search-providers
|
| 845 |
+
|
| 846 |
+
# DuckDuckGoはAPIキー不要で動作するはず
|
| 847 |
+
# Brave/TavilyはAPIキーが必要
|
| 848 |
+
```
|
| 849 |
+
|
| 850 |
+
### 9.7 フロントエンドがAPIに接続できない
|
| 851 |
+
|
| 852 |
+
```bash
|
| 853 |
+
# CORSの設定を確認(backend/app/main.py)
|
| 854 |
+
# allow_origins=["*"] または具体的なオリジンを設定
|
| 855 |
+
|
| 856 |
+
# 環境変数を確認
|
| 857 |
+
# frontend/.env
|
| 858 |
+
VITE_API_URL=http://localhost:8000
|
| 859 |
+
```
|
| 860 |
+
|
| 861 |
+
---
|
| 862 |
+
|
| 863 |
+
## 付録A: ファイル一覧と役割
|
| 864 |
+
|
| 865 |
+
### コアモジュール
|
| 866 |
+
|
| 867 |
+
| ファイル | 役割 |
|
| 868 |
+
|---------|-----|
|
| 869 |
+
| `null_ai/config.py` | 設定管理(モデル、ドメイン) |
|
| 870 |
+
| `null_ai/model_router.py` | マルチLLMルーター |
|
| 871 |
+
| `null_ai/db_enrichment_cli.py` | DB拡充CLI |
|
| 872 |
+
| `null_ai/web_search_enrichment.py` | Web検索拡充 |
|
| 873 |
+
| `null_ai/serverless_storage.py` | クラウドストレージ |
|
| 874 |
+
| `null_ai/cloud_db_setup.py` | クラウドDB設定 |
|
| 875 |
+
|
| 876 |
+
### 推論エンジン
|
| 877 |
+
|
| 878 |
+
| ファイル | 役割 |
|
| 879 |
+
|---------|-----|
|
| 880 |
+
| `layer1_spatial_encoding.py` | 空間座標エンコーディング |
|
| 881 |
+
| `layer2_episodic_binding.py` | エピソードバインディング |
|
| 882 |
+
| `judge_alpha_lobe.py` | α-Lobe(回答生成) |
|
| 883 |
+
| `judge_beta_lobe_basic.py` | β-Lobe(基本検証) |
|
| 884 |
+
| `judge_beta_lobe_advanced.py` | β-Lobe(高度検証) |
|
| 885 |
+
| `judge_correction_flow.py` | 修正フロー |
|
| 886 |
+
| `hallucination_detector.py` | ハルシネーション検出 |
|
| 887 |
+
|
| 888 |
+
### データ処理
|
| 889 |
+
|
| 890 |
+
| ファイル | 役割 |
|
| 891 |
+
|---------|-----|
|
| 892 |
+
| `knowledge_tile_generator.py` | 知識タイル生成 |
|
| 893 |
+
| `iath_encoder.py` | IATHエンコーダー |
|
| 894 |
+
| `iath_decoder.py` | IATHデコーダー |
|
| 895 |
+
| `coordinate_mapper.py` | 座標マッピング |
|
| 896 |
+
|
| 897 |
+
---
|
| 898 |
+
|
| 899 |
+
## 付録B: 設定ファイル一覧
|
| 900 |
+
|
| 901 |
+
| ファイル | 用途 |
|
| 902 |
+
|---------|-----|
|
| 903 |
+
| `.env` | 環境変数(秘密情報) |
|
| 904 |
+
| `domain_schemas.json` | ドメイン定義 |
|
| 905 |
+
| `medical_space_axes_definition.json` | 医療ドメイン座標軸 |
|
| 906 |
+
| `legal_space_axes_definition.json` | 法律ドメイン座標軸 |
|
| 907 |
+
| `cardiology_ontology.json` | 循環器オントロジー |
|
| 908 |
+
| `legal_ontology.json` | 法律オントロジー |
|
| 909 |
+
| `docker-compose.yml` | Dockerコンテナ設定 |
|
| 910 |
+
|
| 911 |
+
---
|
| 912 |
+
|
| 913 |
+
## 付録C: よく使うコマンド一覧
|
| 914 |
+
|
| 915 |
+
```bash
|
| 916 |
+
# ========== 起動・停止 ==========
|
| 917 |
+
./start_null_ai.sh # 全サービス起動
|
| 918 |
+
./start_null_ai.sh stop # 全サービス停止
|
| 919 |
+
./start_null_ai.sh status # ステータス確認
|
| 920 |
+
|
| 921 |
+
# ========== DB拡充 ==========
|
| 922 |
+
python null_ai/db_enrichment_cli.py --domain medical --count 50
|
| 923 |
+
python null_ai/db_enrichment_cli.py --domain medical --web-search --count 10
|
| 924 |
+
python null_ai/db_enrichment_cli.py --all --count 30
|
| 925 |
+
|
| 926 |
+
# ========== 確認・一覧 ==========
|
| 927 |
+
python null_ai/db_enrichment_cli.py --list-models
|
| 928 |
+
python null_ai/db_enrichment_cli.py --list-domains
|
| 929 |
+
python null_ai/db_enrichment_cli.py --list-search-providers
|
| 930 |
+
python null_ai/db_enrichment_cli.py --domain medical --preview
|
| 931 |
+
|
| 932 |
+
# ========== クラウド設定 ==========
|
| 933 |
+
python null_ai/cloud_db_setup.py --provider supabase
|
| 934 |
+
python null_ai/cloud_db_setup.py --provider github --repo user/repo
|
| 935 |
+
|
| 936 |
+
# ========== テスト ==========
|
| 937 |
+
python test_judge_basic.py
|
| 938 |
+
python e2e_pipeline_test.py
|
| 939 |
+
```
|
| 940 |
+
|
| 941 |
+
---
|
| 942 |
+
|
| 943 |
+
*このドキュメントは NullAI v1.0.0 に基づいています。*
|
| 944 |
+
*最終更新: 2024年11月24日*
|
EXAMPLES.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Ilm-Athens コード例集
|
| 2 |
+
|
| 3 |
+
This document is a placeholder and will be filled out with relevant content.
|
| 4 |
+
|
| 5 |
+
## 概要
|
| 6 |
+
|
| 7 |
+
このドキュメントは、Ilm-Athensの各機能を利用するための具体的なコード例を提供します。
|
| 8 |
+
|
| 9 |
+
## 例1: 特定のトピックに関するKnowledge Tileを生成する
|
| 10 |
+
|
| 11 |
+
```python
|
| 12 |
+
#
|
| 13 |
+
# Code example for generating a knowledge tile from a topic.
|
| 14 |
+
#
|
| 15 |
+
```
|
| 16 |
+
|
| 17 |
+
## 例2: Knowledge Tileをエンコード・デコードする
|
| 18 |
+
|
| 19 |
+
```python
|
| 20 |
+
#
|
| 21 |
+
# Code example for encoding and decoding a knowledge tile.
|
| 22 |
+
#
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
## 例3: 座標を指定して知識を検索する
|
| 26 |
+
|
| 27 |
+
```python
|
| 28 |
+
#
|
| 29 |
+
# Code example for searching knowledge by coordinate.
|
| 30 |
+
#
|
| 31 |
+
```
|
IMPLEMENTATION_GUIDE.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Ilm-Athens 実装ガイド
|
| 2 |
+
|
| 3 |
+
This document is a placeholder and will be filled out with relevant content.
|
| 4 |
+
|
| 5 |
+
## 概要
|
| 6 |
+
|
| 7 |
+
このドキュメントは、Ilm-Athensシステムの開発、セットアップ、および保守を行うエンジニア向けの実装ガイドです。
|
| 8 |
+
|
| 9 |
+
## アーキテクチャ
|
| 10 |
+
|
| 11 |
+
...
|
| 12 |
+
|
| 13 |
+
## セットアップ手順
|
| 14 |
+
|
| 15 |
+
...
|
| 16 |
+
|
| 17 |
+
## 主要コンポーネント
|
| 18 |
+
|
| 19 |
+
...
|
QUICK_REFERENCE_JA.md
ADDED
|
@@ -0,0 +1,384 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# NullAI クイックリファレンス
|
| 2 |
+
|
| 3 |
+
## システム起動
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
# 全サービス起動
|
| 7 |
+
./start_null_ai.sh
|
| 8 |
+
|
| 9 |
+
# 個別起動
|
| 10 |
+
./start_null_ai.sh backend # バックエンドのみ
|
| 11 |
+
./start_null_ai.sh frontend # フロントエンドのみ
|
| 12 |
+
./start_null_ai.sh stop # 停止
|
| 13 |
+
./start_null_ai.sh status # ステータス確認
|
| 14 |
+
```
|
| 15 |
+
|
| 16 |
+
## アクセスURL
|
| 17 |
+
|
| 18 |
+
| サービス | URL |
|
| 19 |
+
|---------|-----|
|
| 20 |
+
| フロントエンド | http://localhost:5173 |
|
| 21 |
+
| API | http://localhost:8000 |
|
| 22 |
+
| API Docs | http://localhost:8000/docs |
|
| 23 |
+
|
| 24 |
+
## DB拡充コマンド
|
| 25 |
+
|
| 26 |
+
### LLM推論による拡充
|
| 27 |
+
```bash
|
| 28 |
+
python null_ai/db_enrichment_cli.py --domain medical --count 50
|
| 29 |
+
python null_ai/db_enrichment_cli.py --all --count 30
|
| 30 |
+
python null_ai/db_enrichment_cli.py --domain legal --model deepseek-r1-32b --count 20
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
### Web検索による拡充
|
| 34 |
+
```bash
|
| 35 |
+
python null_ai/db_enrichment_cli.py --domain medical --web-search --count 10
|
| 36 |
+
python null_ai/db_enrichment_cli.py --domain medical --web-search --query "糖尿病 最新治療法 2024"
|
| 37 |
+
```
|
| 38 |
+
|
| 39 |
+
### 確認コマンド
|
| 40 |
+
```bash
|
| 41 |
+
python null_ai/db_enrichment_cli.py --list-models
|
| 42 |
+
python null_ai/db_enrichment_cli.py --list-domains
|
| 43 |
+
python null_ai/db_enrichment_cli.py --list-search-providers
|
| 44 |
+
python null_ai/db_enrichment_cli.py --domain medical --preview
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
## クラウドDB設定
|
| 48 |
+
|
| 49 |
+
```bash
|
| 50 |
+
python null_ai/cloud_db_setup.py --provider supabase
|
| 51 |
+
python null_ai/cloud_db_setup.py --provider github --repo username/opaque-data
|
| 52 |
+
python null_ai/cloud_db_setup.py --provider jsonbin
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
## 主要な環境変数
|
| 56 |
+
|
| 57 |
+
```bash
|
| 58 |
+
# 基本
|
| 59 |
+
SECRET_KEY=your-secret-key
|
| 60 |
+
DATABASE_URL=sqlite:///./sql_app.db
|
| 61 |
+
|
| 62 |
+
# HuggingFace(オプション - Inference APIを使う場合)
|
| 63 |
+
HF_API_KEY=hf_xxx
|
| 64 |
+
|
| 65 |
+
# ORCID認証
|
| 66 |
+
ORCID_CLIENT_ID=APP-xxx
|
| 67 |
+
ORCID_CLIENT_SECRET=xxx
|
| 68 |
+
ORCID_SANDBOX=true
|
| 69 |
+
|
| 70 |
+
# クラウドストレージ
|
| 71 |
+
OPAQUE_STORAGE_BACKEND=supabase
|
| 72 |
+
SUPABASE_URL=https://xxx.supabase.co
|
| 73 |
+
SUPABASE_ANON_KEY=xxx
|
| 74 |
+
|
| 75 |
+
# Web検索
|
| 76 |
+
BRAVE_API_KEY=xxx
|
| 77 |
+
TAVILY_API_KEY=xxx
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
## サポートモデルプロバイダー
|
| 81 |
+
|
| 82 |
+
| プロバイダー | 説明 | GPU要否 | 備考 |
|
| 83 |
+
|------------|------|---------|------|
|
| 84 |
+
| **huggingface** | HuggingFace Transformers | 推奨 | ローカル推論(高品質) |
|
| 85 |
+
| **ollama** | Ollama | 不要 | ローカル推論サーバー(高速) |
|
| 86 |
+
| huggingface_api | Inference API | 不要 | リモート推論 |
|
| 87 |
+
| local | ローカルモデル | 推奨 | Transformers互換 |
|
| 88 |
+
| gguf | llama.cpp形式 | 不要 | 量子化モデル |
|
| 89 |
+
|
| 90 |
+
**注意**: OpenAI/Anthropic等の競合APIは利用規約上の理由からサポートされていません。
|
| 91 |
+
|
| 92 |
+
### Ollamaとの切り替え
|
| 93 |
+
|
| 94 |
+
NullAIはTransformersとOllamaの両方をサポートしています:
|
| 95 |
+
|
| 96 |
+
**Ollama使用時の利点:**
|
| 97 |
+
- ✅ 高速な推論(モデルが常駐)
|
| 98 |
+
- ✅ GPUなしでも高速動作
|
| 99 |
+
- ✅ メモリ効率が良い
|
| 100 |
+
- ✅ 簡単なモデル管理
|
| 101 |
+
|
| 102 |
+
**Transformers使用時の利点:**
|
| 103 |
+
- ✅ より高品質な出力
|
| 104 |
+
- ✅ モデルの細かい制御
|
| 105 |
+
- ✅ インターネット不要
|
| 106 |
+
|
| 107 |
+
### Ollama推論の使用方法
|
| 108 |
+
|
| 109 |
+
```bash
|
| 110 |
+
# 1. Ollamaをインストール・起動
|
| 111 |
+
# start_null_ai.shが自動起動します
|
| 112 |
+
# または手動: ollama serve
|
| 113 |
+
|
| 114 |
+
# 2. モデルをダウンロード
|
| 115 |
+
ollama pull llama3.1
|
| 116 |
+
ollama pull qwen2.5:7b
|
| 117 |
+
ollama pull deepseek-r1:7b
|
| 118 |
+
ollama pull mistral
|
| 119 |
+
|
| 120 |
+
# 3. Ollamaモデルでdb拡充
|
| 121 |
+
/Users/motonishikoudai/project_locate/venv/bin/python null_ai/db_enrichment_cli.py \
|
| 122 |
+
--domain medical \
|
| 123 |
+
--model ollama-llama3 \
|
| 124 |
+
--count 10
|
| 125 |
+
|
| 126 |
+
# 4. 利用可能なOllamaモデル一覧
|
| 127 |
+
/Users/motonishikoudai/project_locate/venv/bin/python null_ai/db_enrichment_cli.py --list-models | grep Ollama
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
### プロバイダーの切り替え
|
| 131 |
+
|
| 132 |
+
環境変数またはCLIオプションで簡単に切り替え可能:
|
| 133 |
+
|
| 134 |
+
```bash
|
| 135 |
+
# Transformersを使用(デフォルト)
|
| 136 |
+
python null_ai/db_enrichment_cli.py --domain medical --count 10
|
| 137 |
+
|
| 138 |
+
# Ollamaを使用(高速)
|
| 139 |
+
python null_ai/db_enrichment_cli.py --domain medical --model ollama-llama3 --count 10
|
| 140 |
+
|
| 141 |
+
# 特定のOllamaモデルを使用
|
| 142 |
+
python null_ai/db_enrichment_cli.py --domain legal --model ollama-deepseek-r1 --count 20
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
## ユーザーロール
|
| 146 |
+
|
| 147 |
+
| ロール | 権限 |
|
| 148 |
+
|-------|-----|
|
| 149 |
+
| guest | 閲覧、質問 |
|
| 150 |
+
| viewer | + 提案閲覧 |
|
| 151 |
+
| editor | + 提案作成・レビュー |
|
| 152 |
+
| expert | + 認証マーク付き編集 |
|
| 153 |
+
| admin | + 全管理機能 |
|
| 154 |
+
|
| 155 |
+
## 認証マーク
|
| 156 |
+
|
| 157 |
+
| マーク | 説明 |
|
| 158 |
+
|-------|-----|
|
| 159 |
+
| none | 未検証 |
|
| 160 |
+
| community | コミュニティレビュー済み(青) |
|
| 161 |
+
| expert | 専門家編集(緑) |
|
| 162 |
+
| multi_expert | 複数専門家検証(金) |
|
| 163 |
+
|
| 164 |
+
## ドメイン一覧
|
| 165 |
+
|
| 166 |
+
| ID | 名前 |
|
| 167 |
+
|----|-----|
|
| 168 |
+
| medical | 医療・健康 |
|
| 169 |
+
| legal | 法律・法務 |
|
| 170 |
+
| economics | 経済・金融 |
|
| 171 |
+
| programming | プログラミング |
|
| 172 |
+
| general | 一般知識 |
|
| 173 |
+
|
| 174 |
+
## API エンドポイント
|
| 175 |
+
|
| 176 |
+
```
|
| 177 |
+
POST /api/auth/signup # ユーザー登録
|
| 178 |
+
POST /api/auth/token # ログイン
|
| 179 |
+
GET /api/auth/orcid/authorize # ORCID認証開始
|
| 180 |
+
|
| 181 |
+
POST /api/questions/ # 質問送信
|
| 182 |
+
WS /api/questions/ws/{id} # ストリーミング
|
| 183 |
+
|
| 184 |
+
GET /api/domains/ # ドメイン一覧
|
| 185 |
+
PUT /api/domains/{id} # ドメイン更新
|
| 186 |
+
|
| 187 |
+
GET /api/proposals/ # 提案一覧
|
| 188 |
+
POST /api/proposals/ # 提案作成
|
| 189 |
+
PUT /api/proposals/{id}/review # 提案レビュー
|
| 190 |
+
|
| 191 |
+
GET /api/models/ # モデル一覧
|
| 192 |
+
POST /api/models/{id}/test # モデルテスト
|
| 193 |
+
|
| 194 |
+
# Knowledge Base (DB) ダウンロード - 誰でも可能
|
| 195 |
+
GET /api/knowledge/export/iath # .iathファイルダウンロード
|
| 196 |
+
GET /api/knowledge/export/json # JSON形式でエクスポート
|
| 197 |
+
GET /api/knowledge/export/package # 完全パッケージ (ZIP)
|
| 198 |
+
|
| 199 |
+
# モデル世代交代(倒木システム)
|
| 200 |
+
GET /api/succession/status # 世代交代ステータス
|
| 201 |
+
POST /api/succession/trigger # 世代交代実行
|
| 202 |
+
POST /api/succession/create-standalone-package # DB付きパッケージ生成
|
| 203 |
+
GET /api/succession/history/inference # 推論履歴取得
|
| 204 |
+
GET /api/succession/history/succession # 世代交代履歴
|
| 205 |
+
GET /api/succession/exports # エクスポートファイル一覧
|
| 206 |
+
GET /api/succession/snapshots # DBスナップショット一覧
|
| 207 |
+
POST /api/succession/snapshots/restore # スナップショット復元
|
| 208 |
+
GET /api/succession/stats # 統計情報
|
| 209 |
+
```
|
| 210 |
+
|
| 211 |
+
## DBダウンロード(自由な編集)
|
| 212 |
+
|
| 213 |
+
### 概要
|
| 214 |
+
**誰でも(ゲスト含む)**Knowledge Baseをダウンロードしてローカルで自由に編集できます。
|
| 215 |
+
エキスパート認証なしでも、ローカルで実験・カスタマイズが可能。
|
| 216 |
+
|
| 217 |
+
### 使用方法
|
| 218 |
+
|
| 219 |
+
```bash
|
| 220 |
+
# .iathファイルをダウンロード
|
| 221 |
+
curl http://localhost:8000/api/knowledge/export/iath -o knowledge.iath
|
| 222 |
+
|
| 223 |
+
# JSON形式でダウンロード(人間が読める)
|
| 224 |
+
curl http://localhost:8000/api/knowledge/export/json -o knowledge.json
|
| 225 |
+
|
| 226 |
+
# 完全パッケージ(DB + README + config)
|
| 227 |
+
curl http://localhost:8000/api/knowledge/export/package -o knowledge_package.zip
|
| 228 |
+
```
|
| 229 |
+
|
| 230 |
+
### ダウンロード後の利用
|
| 231 |
+
|
| 232 |
+
```bash
|
| 233 |
+
# ZIPを展開
|
| 234 |
+
unzip knowledge_package.zip
|
| 235 |
+
|
| 236 |
+
# ローカルで編集
|
| 237 |
+
vim knowledge_base.json
|
| 238 |
+
|
| 239 |
+
# NullAIにインポート
|
| 240 |
+
cp knowledge_base.iath /path/to/null_ai/ilm_athens_medical_db.iath
|
| 241 |
+
```
|
| 242 |
+
|
| 243 |
+
### メリット
|
| 244 |
+
- ✅ エキスパート認証不要
|
| 245 |
+
- ✅ 完全にオープン、自由に編集
|
| 246 |
+
- ✅ フォークして独自バージョンを作成
|
| 247 |
+
- ✅ オフラインで実験可能
|
| 248 |
+
- ✅ バージョン管理が容易
|
| 249 |
+
|
| 250 |
+
## モデル世代交代(倒木システム)
|
| 251 |
+
|
| 252 |
+
### 概要
|
| 253 |
+
推論履歴を自動保存し、高品質なデータが蓄積されたらトレーニングデータとしてエクスポート。
|
| 254 |
+
森林の倒木が次世代の栄養となるように、古いモデルの知識を新モデルに継承。
|
| 255 |
+
|
| 256 |
+
### 使用方法
|
| 257 |
+
|
| 258 |
+
```bash
|
| 259 |
+
# ステータス確認
|
| 260 |
+
curl http://localhost:8000/api/succession/status
|
| 261 |
+
|
| 262 |
+
# 世代交代実行(手動)
|
| 263 |
+
curl -X POST http://localhost:8000/api/succession/trigger \
|
| 264 |
+
-H "Content-Type: application/json" \
|
| 265 |
+
-d '{"min_confidence": 0.8}'
|
| 266 |
+
|
| 267 |
+
# 推論履歴確認
|
| 268 |
+
curl "http://localhost:8000/api/succession/history/inference?limit=10"
|
| 269 |
+
|
| 270 |
+
# 統計情報
|
| 271 |
+
curl http://localhost:8000/api/succession/stats
|
| 272 |
+
```
|
| 273 |
+
|
| 274 |
+
### エクスポート形式
|
| 275 |
+
- **JSONL** (ChatML/Instruction/Completion形式)
|
| 276 |
+
- **CSV** (表形式)
|
| 277 |
+
- **Parquet** (大規模データ用)
|
| 278 |
+
- **HuggingFace Datasets** (transformers連携)
|
| 279 |
+
|
| 280 |
+
### 自動トリガー
|
| 281 |
+
- 高品質推論(信頼度≥0.8)が1000件蓄積されると自動実行
|
| 282 |
+
- 推論結果は `inference_history/` に日別保存
|
| 283 |
+
- エクスポートデータは `training_data/` に保存
|
| 284 |
+
- DBスナップショットは `db_archives/` に世代管理
|
| 285 |
+
|
| 286 |
+
### スタンドアロンパッケージ生成
|
| 287 |
+
|
| 288 |
+
**DB付き完全パッケージ**を生成し、単体で使える推論エンジンを作成:
|
| 289 |
+
|
| 290 |
+
```bash
|
| 291 |
+
# スタンドアロンパッケージを生成
|
| 292 |
+
curl -X POST http://localhost:8000/api/succession/create-standalone-package \
|
| 293 |
+
-H "Content-Type: application/json" \
|
| 294 |
+
-d '{"min_confidence": 0.8}'
|
| 295 |
+
|
| 296 |
+
# 生成されたパッケージは succession_packages/ に保存
|
| 297 |
+
ls succession_packages/
|
| 298 |
+
# null_ai_model_gen1_20250125_123456.zip
|
| 299 |
+
```
|
| 300 |
+
|
| 301 |
+
### パッケージ内容
|
| 302 |
+
|
| 303 |
+
```
|
| 304 |
+
null_ai_model_gen1_*.zip
|
| 305 |
+
├── training_data/ # トレーニングデータ
|
| 306 |
+
│ ├── *.jsonl # ChatML/Instruction形式
|
| 307 |
+
│ ├── *.csv # CSV形式
|
| 308 |
+
│ ├── *.parquet # Parquet形式
|
| 309 |
+
│ └── dataset_*/ # HuggingFace Datasets
|
| 310 |
+
├── knowledge_base/ # Knowledge Base(推論用DB)
|
| 311 |
+
│ ├── knowledge.iath # IATH形式DB
|
| 312 |
+
│ └── db_stats.json # DB統計
|
| 313 |
+
├── run_inference.py # 推論実行スクリプト
|
| 314 |
+
├── config.json # 設定ファイル
|
| 315 |
+
└── README.md # 使い方ガイド
|
| 316 |
+
```
|
| 317 |
+
|
| 318 |
+
### パッケージの使い方
|
| 319 |
+
|
| 320 |
+
```bash
|
| 321 |
+
# 展開
|
| 322 |
+
unzip null_ai_model_gen1_*.zip
|
| 323 |
+
cd null_ai_model_gen1_*/
|
| 324 |
+
|
| 325 |
+
# 1. Knowledge Baseを使って推論
|
| 326 |
+
python run_inference.py --question "糖尿病の治療法は?"
|
| 327 |
+
|
| 328 |
+
# 2. ファインチューニング
|
| 329 |
+
# training_data/ のデータでモデルを訓練
|
| 330 |
+
|
| 331 |
+
# 3. ファインチューニング後のモデルで推論
|
| 332 |
+
python run_inference.py --model ./output/checkpoint-1000 --question "質問"
|
| 333 |
+
```
|
| 334 |
+
|
| 335 |
+
### 利点
|
| 336 |
+
- ✅ 完全に独立して動作
|
| 337 |
+
- ✅ トレーニングデータ + KB が一体化
|
| 338 |
+
- ✅ すぐに使える推論スクリプト付き
|
| 339 |
+
- ✅ 世代ごとにバージョン管理
|
| 340 |
+
- ✅ 他のプロジェクトで再利用可能
|
| 341 |
+
|
| 342 |
+
## 多言語対応
|
| 343 |
+
|
| 344 |
+
### サポート言語
|
| 345 |
+
- 🇯🇵 日本語
|
| 346 |
+
- 🇬🇧 English
|
| 347 |
+
|
| 348 |
+
### 言語切り替え
|
| 349 |
+
- フロントエンド右上の言語スイッチャーで切り替え
|
| 350 |
+
- ブラウザの言語設定を自動検出
|
| 351 |
+
- 選択した言語はlocalStorageに保存
|
| 352 |
+
|
| 353 |
+
## トラブルシューティング
|
| 354 |
+
|
| 355 |
+
```bash
|
| 356 |
+
# HuggingFaceモデルダウンロード確認
|
| 357 |
+
python -c "from transformers import AutoModel; print('OK')"
|
| 358 |
+
|
| 359 |
+
# GPU確認
|
| 360 |
+
python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}, MPS: {torch.backends.mps.is_available()}')"
|
| 361 |
+
|
| 362 |
+
# DB初期化
|
| 363 |
+
rm sql_app.db
|
| 364 |
+
python backend/create_db.py
|
| 365 |
+
|
| 366 |
+
# 依存関係インストール(HuggingFace対応)
|
| 367 |
+
pip install transformers torch accelerate
|
| 368 |
+
pip install llama-cpp-python # GGUF使用時
|
| 369 |
+
pip install -r requirements.txt
|
| 370 |
+
cd frontend && npm install
|
| 371 |
+
```
|
| 372 |
+
|
| 373 |
+
## ファイル構成
|
| 374 |
+
|
| 375 |
+
```
|
| 376 |
+
project_locate/
|
| 377 |
+
├── null_ai/ # コアフレームワーク
|
| 378 |
+
├── backend/ # FastAPI バックエンド
|
| 379 |
+
├── frontend/ # React フロントエンド
|
| 380 |
+
├── ilm_athens_engine/ # 推論エンジン
|
| 381 |
+
├── generated_tiles/ # 生成された知識タイル
|
| 382 |
+
├── enrichment_output/ # DB拡充結果
|
| 383 |
+
└── documentation/ # ドキュメント
|
| 384 |
+
```
|
TROUBLESHOOTING.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Ilm-Athens トラブルシューティングガイド
|
| 2 |
+
|
| 3 |
+
This document is a placeholder and will be filled out with relevant content.
|
| 4 |
+
|
| 5 |
+
## 概要
|
| 6 |
+
|
| 7 |
+
このドキュメントは、Ilm-Athensシステムの運用中に発生する可能性のある一般的な問題とその解決策をまとめたものです。
|
| 8 |
+
|
| 9 |
+
## DeepSeek統合の問題
|
| 10 |
+
|
| 11 |
+
### 問題: 思考チェーンが短い
|
| 12 |
+
**原因:** ...
|
| 13 |
+
**解決策:** ...
|
| 14 |
+
|
| 15 |
+
### 問題: 座標マッピングが失敗する
|
| 16 |
+
**原因:** ...
|
| 17 |
+
**解決策:** ...
|
| 18 |
+
|
| 19 |
+
## 可逆圧縮の問題
|
| 20 |
+
|
| 21 |
+
### 問題: 復号後のデータが一致しない
|
| 22 |
+
**原因:** ...
|
| 23 |
+
**解決策:** ...
|
| 24 |
+
|
| 25 |
+
## パフォーマンスの問題
|
| 26 |
+
|
| 27 |
+
### 問題: レイテンシが目標を超過する
|
| 28 |
+
**原因:** ...
|
| 29 |
+
**解決策:** ...
|
schema.sql
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-- SQL Schema for NullAI Public Knowledge Base
|
| 2 |
+
-- Compatible with PostgreSQL
|
| 3 |
+
|
| 4 |
+
-- Enables UUID generation
|
| 5 |
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
| 6 |
+
|
| 7 |
+
-- Users Table
|
| 8 |
+
CREATE TABLE users (
|
| 9 |
+
id VARCHAR PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 10 |
+
email VARCHAR UNIQUE,
|
| 11 |
+
username VARCHAR UNIQUE,
|
| 12 |
+
display_name VARCHAR,
|
| 13 |
+
hashed_password VARCHAR,
|
| 14 |
+
auth_provider VARCHAR NOT NULL DEFAULT 'local',
|
| 15 |
+
google_id VARCHAR UNIQUE,
|
| 16 |
+
github_id VARCHAR UNIQUE,
|
| 17 |
+
orcid_id VARCHAR UNIQUE,
|
| 18 |
+
"role" VARCHAR NOT NULL DEFAULT 'viewer',
|
| 19 |
+
is_expert BOOLEAN NOT NULL DEFAULT false,
|
| 20 |
+
is_guest BOOLEAN NOT NULL DEFAULT false,
|
| 21 |
+
expert_verification_status VARCHAR DEFAULT 'none',
|
| 22 |
+
expert_credentials JSONB,
|
| 23 |
+
avatar_url VARCHAR,
|
| 24 |
+
bio TEXT,
|
| 25 |
+
affiliation VARCHAR,
|
| 26 |
+
google_access_token VARCHAR,
|
| 27 |
+
google_refresh_token VARCHAR,
|
| 28 |
+
github_access_token VARCHAR,
|
| 29 |
+
orcid_access_token VARCHAR,
|
| 30 |
+
orcid_refresh_token VARCHAR,
|
| 31 |
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 32 |
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 33 |
+
last_login_at TIMESTAMPTZ
|
| 34 |
+
);
|
| 35 |
+
|
| 36 |
+
CREATE INDEX idx_users_email ON users(email);
|
| 37 |
+
CREATE INDEX idx_users_username ON users(username);
|
| 38 |
+
CREATE INDEX idx_users_google_id ON users(google_id);
|
| 39 |
+
CREATE INDEX idx_users_github_id ON users(github_id);
|
| 40 |
+
CREATE INDEX idx_users_orcid_id ON users(orcid_id);
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
-- Workspaces Table
|
| 44 |
+
-- For the public DB, we will likely only have one main public workspace.
|
| 45 |
+
CREATE TABLE workspaces (
|
| 46 |
+
id VARCHAR PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 47 |
+
name VARCHAR NOT NULL,
|
| 48 |
+
slug VARCHAR UNIQUE NOT NULL,
|
| 49 |
+
description TEXT,
|
| 50 |
+
owner_id VARCHAR NOT NULL REFERENCES users(id),
|
| 51 |
+
is_public BOOLEAN NOT NULL DEFAULT false,
|
| 52 |
+
allow_guest_edit BOOLEAN NOT NULL DEFAULT false,
|
| 53 |
+
allow_guest_view BOOLEAN NOT NULL DEFAULT true,
|
| 54 |
+
db_type VARCHAR DEFAULT 'postgresql',
|
| 55 |
+
db_path VARCHAR,
|
| 56 |
+
db_connection_string VARCHAR,
|
| 57 |
+
tile_count INTEGER DEFAULT 0,
|
| 58 |
+
domain_count INTEGER DEFAULT 0,
|
| 59 |
+
member_count INTEGER DEFAULT 1,
|
| 60 |
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 61 |
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
| 62 |
+
);
|
| 63 |
+
|
| 64 |
+
CREATE INDEX idx_workspaces_slug ON workspaces(slug);
|
| 65 |
+
CREATE INDEX idx_workspaces_owner_id ON workspaces(owner_id);
|
| 66 |
+
|
| 67 |
+
-- Knowledge Tiles Table
|
| 68 |
+
CREATE TABLE knowledge_tiles (
|
| 69 |
+
id VARCHAR PRIMARY KEY DEFAULT 'ktile_' || uuid_generate_v4(),
|
| 70 |
+
workspace_id VARCHAR NOT NULL REFERENCES workspaces(id),
|
| 71 |
+
domain_id VARCHAR,
|
| 72 |
+
topic VARCHAR NOT NULL,
|
| 73 |
+
content TEXT NOT NULL,
|
| 74 |
+
tags JSONB,
|
| 75 |
+
version INTEGER NOT NULL DEFAULT 1,
|
| 76 |
+
is_latest_version BOOLEAN NOT NULL DEFAULT true,
|
| 77 |
+
based_on_version INTEGER,
|
| 78 |
+
contributor_id VARCHAR REFERENCES users(id),
|
| 79 |
+
confidence_score REAL DEFAULT 0.0,
|
| 80 |
+
verification_type VARCHAR NOT NULL DEFAULT 'none',
|
| 81 |
+
verification_count INTEGER NOT NULL DEFAULT 0,
|
| 82 |
+
last_verified_by_id VARCHAR REFERENCES users(id),
|
| 83 |
+
last_verified_at TIMESTAMPTZ,
|
| 84 |
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 85 |
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
| 86 |
+
);
|
| 87 |
+
|
| 88 |
+
CREATE INDEX idx_knowledge_tiles_workspace_id ON knowledge_tiles(workspace_id);
|
| 89 |
+
CREATE INDEX idx_knowledge_tiles_domain_id ON knowledge_tiles(domain_id);
|
| 90 |
+
CREATE INDEX idx_knowledge_tiles_verification_type ON knowledge_tiles(verification_type);
|
| 91 |
+
CREATE INDEX idx_knowledge_tiles_contributor_id ON knowledge_tiles(contributor_id);
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
-- Proposals Table
|
| 95 |
+
CREATE TABLE proposals (
|
| 96 |
+
id VARCHAR PRIMARY KEY DEFAULT 'prop_' || uuid_generate_v4(),
|
| 97 |
+
workspace_id VARCHAR NOT NULL REFERENCES workspaces(id),
|
| 98 |
+
tile_id VARCHAR REFERENCES knowledge_tiles(id),
|
| 99 |
+
proposer_id VARCHAR NOT NULL REFERENCES users(id),
|
| 100 |
+
status VARCHAR NOT NULL DEFAULT 'pending',
|
| 101 |
+
proposal_type VARCHAR NOT NULL,
|
| 102 |
+
justification TEXT,
|
| 103 |
+
proposed_content JSONB,
|
| 104 |
+
reviewer_id VARCHAR REFERENCES users(id),
|
| 105 |
+
reviewer_comment TEXT,
|
| 106 |
+
reviewed_at TIMESTAMPTZ,
|
| 107 |
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 108 |
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
| 109 |
+
);
|
| 110 |
+
|
| 111 |
+
CREATE INDEX idx_proposals_workspace_id ON proposals(workspace_id);
|
| 112 |
+
CREATE INDEX idx_proposals_tile_id ON proposals(tile_id);
|
| 113 |
+
CREATE INDEX idx_proposals_proposer_id ON proposals(proposer_id);
|
| 114 |
+
CREATE INDEX idx_proposals_status ON proposals(status);
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
-- OAuth State Table
|
| 118 |
+
CREATE TABLE oauth_states (
|
| 119 |
+
id VARCHAR PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 120 |
+
state VARCHAR UNIQUE NOT NULL,
|
| 121 |
+
provider VARCHAR NOT NULL,
|
| 122 |
+
redirect_url VARCHAR,
|
| 123 |
+
user_id VARCHAR REFERENCES users(id),
|
| 124 |
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 125 |
+
expires_at TIMESTAMPTZ NOT NULL
|
| 126 |
+
);
|
| 127 |
+
|
| 128 |
+
CREATE INDEX idx_oauth_states_state ON oauth_states(state);
|
| 129 |
+
|
| 130 |
+
-- Workspace Members Table (Optional for this setup, but good to have)
|
| 131 |
+
CREATE TABLE workspace_members (
|
| 132 |
+
id VARCHAR PRIMARY KEY DEFAULT uuid_generate_v4(),
|
| 133 |
+
workspace_id VARCHAR NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
|
| 134 |
+
user_id VARCHAR NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
| 135 |
+
"role" VARCHAR NOT NULL DEFAULT 'viewer',
|
| 136 |
+
can_read BOOLEAN DEFAULT true,
|
| 137 |
+
can_write BOOLEAN DEFAULT false,
|
| 138 |
+
can_delete BOOLEAN DEFAULT false,
|
| 139 |
+
can_invite BOOLEAN DEFAULT false,
|
| 140 |
+
joined_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
| 141 |
+
UNIQUE (workspace_id, user_id)
|
| 142 |
+
);
|
| 143 |
+
|
| 144 |
+
CREATE INDEX idx_workspace_members_workspace_id ON workspace_members(workspace_id);
|
| 145 |
+
CREATE INDEX idx_workspace_members_user_id ON workspace_members(user_id);
|