0a9588abb7
- Add pagination support to findAll (page, limit query params) - Add findByTemplateId method to service - Add GET /by-template/:templateId endpoint to controller - Service already includes CRUD for QuestionBank and QuestionBankItem
218 lines
8.1 KiB
Markdown
218 lines
8.1 KiB
Markdown
# 簡易ナレッジベース (Simple Knowledge Base) - システム設計ドキュメント
|
|
|
|
## 1. プロジェクト概要
|
|
|
|
本プロジェクトは、React + NestJS をベースに開発されたフルスタックのナレッジベースQ&Aシステム(RAG - Retrieval-Augmented Generation)です。
|
|
ユーザーは多様な形式のドキュメントをアップロードし、チャンク分割やインデックス設定をカスタマイズした上で、大規模言語モデル(LLM)を利用してナレッジベースに基づいた質問応答を行うことができます。
|
|
|
|
---
|
|
|
|
## 2. コアアーキテクチャ設計
|
|
|
|
### 2.1 技術スタック
|
|
|
|
- **フロントエンド**: React 19 + TypeScript + Vite + Tailwind CSS
|
|
- **バックエンド**: NestJS + LangChain + TypeORM
|
|
- **データベース**: SQLite (ユーザー、モデル設定、ナレッジベースのメタデータ)
|
|
- **ベクトルストレージ**: Elasticsearch
|
|
- **ファイル処理**: Apache Tika (高速モード) + Vision Pipeline (高精度モード)
|
|
- **認証**: JWT
|
|
- **ドキュメント変換**: LibreOffice + ImageMagick
|
|
|
|
### 2.2 システムアーキテクチャ
|
|
|
|
```
|
|
ユーザー -> Reactフロントエンド -> NestJSバックエンド -> SQLite/Elasticsearch
|
|
|
|
|
v
|
|
LangChain Agent
|
|
|
|
|
v
|
|
大言語モデル (LLM)
|
|
|
|
高精度モードのプロセス:
|
|
PDF/Word/PPT -> LibreOffice -> PDF -> ImageMagick -> Vision Model -> 構造化コンテンツ
|
|
```
|
|
|
|
---
|
|
|
|
## 3. コア機能モジュール
|
|
|
|
### 3.1 ユーザー認証システム
|
|
|
|
- **JWT 認証**: ユーザー名/パスワードに基づくログインシステム
|
|
- **ユーザー管理**: ユーザー登録、パスワード変更をサポート
|
|
- **権限制御**: ユーザーデータの隔離。各ユーザーに独立したナレッジベースを提供
|
|
- **管理画面**: 統合された設定モーダルによるユーザー管理(作成/リスト表示)
|
|
|
|
### 3.2 モデル設定管理
|
|
|
|
- **マルチプロバイダー対応**:
|
|
- **OpenAI 互換**: OpenAI API および互換インターフェース(DeepSeek, Claude など)に対応
|
|
- **Google Gemini**: ネイティブ SDK によるサポート
|
|
- **モデルタイプ**:
|
|
- **LLM**: 対話生成モデル
|
|
- **Embedding**: ベクトル化モデル
|
|
- **Rerank**: 再ランキングモデル
|
|
- **ユーザーカスタマイズ**: ユーザーが独自の API キーとモデルパラメータを設定可能
|
|
- **ビジョンサポート**: モデルが画像処理に対応しているかどうかのフラグ管理
|
|
- **統合管理**: 設定モーダルの「モデル管理」タブで一括管理
|
|
|
|
### 3.3 ナレッジベース管理
|
|
|
|
- **ファイルアップロード**: PDF、ドキュメント、画像など多様な形式に対応
|
|
- **デュアルモード処理**:
|
|
- **高速モード**: Apache Tika を使用したテキスト抽出
|
|
- **高精度モード**: Vision Pipeline を使用した画像・テキスト混合処理
|
|
- **インテリジェント・チャンキング**: チャンクサイズとオーバーラップを調整可能
|
|
- **ベクトルインデックス**: ユーザーが選択した Embedding モデルによるベクトル化
|
|
- **ステータス管理**: ファイル処理状況の追跡(待機中、インデックス中、完了、失敗)
|
|
|
|
### 3.4 RAG 質問応答システム
|
|
|
|
- **インテリジェント検索**:
|
|
- キーワード抽出とクエリの最適化
|
|
- ハイブリッド検索(ベクトル検索 + 全文検索)
|
|
- 類似度しきい値によるフィルタリング
|
|
- **ストリーミング生成**:
|
|
- Server-Sent Events (SSE) によるストリーミング出力
|
|
- 処理の進捗をリアルタイムに表示
|
|
- 生成コンテンツを1文字ずつ表示
|
|
- **引用追跡**:
|
|
- 回答の出典ファイルを表示
|
|
- 関連するドキュメントセグメントを表示
|
|
- 類似度スコアの表示
|
|
|
|
### 3.5 多言語サポート
|
|
|
|
- **インターフェースの国際化**: 日本語、中国語、英語に対応
|
|
- **インテリジェント回答**: ユーザーの言語設定に基づいた AI による回答
|
|
- **言語設定の永続化**: ユーザーの選択した言語を自動保存
|
|
|
|
---
|
|
|
|
## 4. データモデル設計
|
|
|
|
### 4.1 SQLite テーブル
|
|
|
|
**ユーザー表 (users)**
|
|
|
|
- id, username, password_hash, is_admin, created_at
|
|
|
|
**モデル設定表 (model_configs)**
|
|
|
|
- id, user_id, name, provider, model_id, base_url, api_key, type, supports_vision
|
|
|
|
**ナレッジベースファイル表 (knowledge_bases)**
|
|
|
|
- id, user_id, name, original_name, storage_path, size, mimetype, status, created_at
|
|
|
|
**ユーザー設定表 (user_settings)**
|
|
|
|
- user_id, selected_llm_id, selected_embedding_id, temperature, max_tokens, top_k, similarity_threshold, language
|
|
|
|
### 4.2 Elasticsearch インデックス
|
|
|
|
**ナレッジベース・チャンクインデックス (knowledge_base_chunks)**
|
|
|
|
```json
|
|
{
|
|
"chunk_id": "string",
|
|
"knowledge_base_id": "string",
|
|
"user_id": "string",
|
|
"file_name": "string",
|
|
"content": "text",
|
|
"embedding": "dense_vector[1536]",
|
|
"chunk_index": "integer",
|
|
"metadata": "object"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. API エンドポイント設計
|
|
|
|
### 5.1 認証
|
|
|
|
- `POST /auth/login` - ログイン
|
|
- `POST /auth/register` - ユーザー登録
|
|
- `POST /auth/change-password` - パスワード変更
|
|
|
|
### 5.2 モデル管理
|
|
|
|
- `GET /model-configs` - モデル設定の取得
|
|
- `POST /model-configs` - モデル設定の作成
|
|
- `PUT /model-configs/:id` - モデル設定の更新
|
|
- `DELETE /model-configs/:id` - モデル設定の削除
|
|
|
|
### 5.3 ナレッジベース
|
|
|
|
- `POST /upload` - ファイルアップロード
|
|
- `GET /knowledge-bases` - ファイル一覧の取得
|
|
- `DELETE /knowledge-bases/:id` - ファイルの削除
|
|
- `DELETE /knowledge-bases/clear` - ナレッジベースの全削除
|
|
|
|
### 5.4 チャット
|
|
|
|
- `POST /chat/stream` - ストリーミングチャット(SSE)
|
|
|
|
### 5.5 ユーザー設定
|
|
|
|
- `GET /user-settings` - 設定の取得
|
|
- `PUT /user-settings` - 設定の更新
|
|
|
|
---
|
|
|
|
## 6. コアフロー
|
|
|
|
### 6.1 ファイル処理フロー
|
|
|
|
**高速モード**:
|
|
|
|
```
|
|
アップロード → メタデータ保存 → Tikaテキスト抽出 → チャンク分割 → ベクトル化 → ESインデックス → ステータス更新
|
|
```
|
|
|
|
**高精度モード**:
|
|
|
|
```
|
|
アップロード → LibreOffice変換 → PDF画像化 → Vision分析 → 構造化コンテンツ → ベクトル化 → ESインデックス
|
|
```
|
|
|
|
### 6.2 RAG 質問応答フロー
|
|
|
|
```
|
|
ユーザーの質問 → キーワード抽出 → ハイブリッド検索 → 類似度フィルタリング → プロンプト構築 → LLM生成 → ストリーミング出力 → 引用表示
|
|
```
|
|
|
|
---
|
|
|
|
## 7. デプロイ構成
|
|
|
|
### 7.1 開発環境
|
|
|
|
- フロントエンド: Vite 開発サーバー (ポート 5173)
|
|
- バックエンド: NestJS 開発サーバー (ポート 3000)
|
|
- Elasticsearch: Docker コンテナ (ポート 9200)
|
|
- Apache Tika: Docker コンテナ (ポート 9998)
|
|
|
|
### 7.2 本番環境
|
|
|
|
- Docker Compose を使用したコンテナ化デプロイ
|
|
- Nginx によるリバースプロキシと負荷分散
|
|
- SSL 証明書の設定
|
|
|
|
---
|
|
|
|
## 8. 特徴的な機能
|
|
|
|
- ✅ **ユーザー分離**: ユーザーごとに独立したモデル設定とナレッジベースを保持
|
|
- ✅ **ストリーミング体験**: 処理状況と生成内容をリアルタイム表示
|
|
- ✅ **インテリジェント検索**: キーワード抽出 + ハイブリッド検索 + 類似度フィルタリング
|
|
- ✅ **引用追跡**: 回答の根拠となるソースと関連セグメントを明確に表示
|
|
- ✅ **マルチモデル対応**: OpenAI 互換インターフェース + Gemini ネイティブサポート
|
|
- ✅ **柔軟な設定**: ユーザー独自の API キーと推論パラメータのカスタマイズ
|
|
- ✅ **多言語対応**: UI と AI 回答の完全な国際化サポート
|
|
- ✅ **ビジョン機能**: 画像処理に対応したマルチモーダルモデルのサポート
|
|
- ✅ **デュアルモード処理**: 高速モード (テキストのみ) + 高精度モード (画像・テキスト混合)
|