# 現在の実装状況ドキュメント

## システムアーキテクチャ

### 技術スタック

- **フロントエンド**: React + TypeScript + Vite + Tailwind CSS
- **バックエンド**: NestJS + LangChain + Elasticsearch + TypeORM
- **データベース**: SQLite (ユーザー、モデル設定、ナレッジベース、ユーザー設定)
- **ベクトルストレージ**: Elasticsearch
- **ファイル処理**: Apache Tika (高速モード) + Vision Pipeline (高精度モード)
- **認証**: JWT
- **ドキュメント変換**: LibreOffice + ImageMagick

### コアモジュール

#### 1. ユーザー認証システム (Auth)

- JWT 認証システム
- ユーザー登録/ログイン/パスワード変更
- ユーザー管理画面
- ルート保護と権限制御

#### 2. モデル設定管理 (ModelConfig)

- 多様なモデルプロバイダーをサポート：
  - **OpenAI 互換**: OpenAI API および互換インターフェース（DeepSeek, Claude など）に対応
  - **Google Gemini**: ネイティブ SDK によるサポート
- モデルタイプ：
  - **LLM**: 対話生成モデル
  - **Embedding**: ベクトル化モデル
  - **Rerank**: 再ランキングモデル
- ユーザー独自の API キーとモデルパラメータの設定が可能
- ビジョン機能のフラグ管理をサポート

#### 3. ナレッジベース管理 (KnowledgeBase)

- ファイルのアップロードと保存（日本語ファイル名に対応）
- **デュアルモード処理**:
  - **高速モード**: Apache Tika によるテキスト抽出
  - **高精度モード**: Vision Pipeline による画像・テキスト混合処理
- インテリジェントなドキュメントのチャンク分割とベクトル化
- Elasticsearch インデックスとハイブリッド検索
- ファイルステータス管理（待機中、インデックス中、完了、失敗）
- 数百種類のファイル形式をサポート: PDF, Word, PPT, Excel, Markdown, コードファイル, 画像など

#### 4. RAG 質問応答システム (Chat)

- **ストリーミング出力**: Server-Sent Events (SSE) を利用
- **インテリジェント検索**: LangChain キーワード抽出 + ES ハイブリッド検索
- **類似度フィルタリング**: 関連性の低いコンテンツをフィルタリングするしきい値を設定可能
- **引用表示**: ソースの断片、ファイル名、類似度スコアを表示
- **多言語サポート**: ユーザーの言語設定に合わせて AI の回答言語を調整

#### 5. 統合設定管理 (Unified Settings)

- **統合設定モーダル**: 各種管理機能を一つのタブ形式インターフェースに集約
  - **一般設定 (General)**: 言語切り替え、パスワード変更
  - **ユーザー管理 (User)**: ユーザー一覧、ユーザー追加（管理者機能）
  - **モデル管理 (Model)**: LLM, Embedding, Rerank モデルの設定と管理
- **クイックアクセス**: サイドバー下部の「設定」ボタンからワンクリックでアクセス可能
- **一貫した体験**: 統一されたフォーム操作とステータスフィードバック

## チャットフロー

```
ユーザーの質問 → キーワード抽出 → ESハイブリッド検索 → 類似度フィルタリング → コンテキスト構築 → LLMストリーミング生成 → 引用元の表示
```

### 詳細ステップ

1. **キーワード抽出**
   - LangChain を使用して、ユーザーの質問から 3-5 個のキーワードを抽出します。
   - 不要な言葉（「の」「は」「のぼり」など）を除去します。

2. **ハイブリッド検索**
   - キーワードを組み合わせてベクトル検索を実行します。
   - 全文検索を併用して再現率を向上させます。
   - 類似度しきい値でフィルタリングします。
   - 最も関連性の高いセグメントを返します。

3. **ストリーミング生成**
   - 処理の進捗を表示します（「ナレッジベースを検索中...」など）。
   - LLM が生成した回答内容をリアルタイムで出力します。
   - 取得したセグメントに基づき、引用付きの回答を生成します。
   - 多言語での回答をサポートします。

4. **引用元の表示**
   - セグメント内容の要約（最大150文字）を表示します。
   - 出典元ファイル名を表示します。
   - 類似度のパーセンテージを表示します。
   - セグメント番号を表示します。

## 主要な API エンドポイント

### 認証関連

- `POST /auth/login` - ログイン
- `POST /auth/register` - ユーザー登録
- `POST /auth/change-password` - パスワード変更（設定モーダル内から呼び出し）

### チャット API

- `POST /chat/stream` - ストリーミングチャット
  - ユーザーが設定した LLM モデルと API キーを自動取得
  - OpenAI 互換インターフェースと Gemini をサポート
  - SSE ストリーミングレスポンスを返却
  - 多言語パラメータの受け渡しに対応

### モデル管理

- `GET /model-configs` - モデル設定の一覧取得
- `POST /model-configs` - モデル設定の作成
- `PUT /model-configs/:id` - モデル設定の更新
- `DELETE /model-configs/:id` - モデル設定の削除

### ナレッジベース管理

- `POST /upload` - ファイルアップロード（チャンクパラメータの設定が可能）
- `GET /knowledge-bases` - ファイル一覧の取得
- `DELETE /knowledge-bases/:id` - ファイルの削除
- `DELETE /knowledge-bases/clear` - ナレッジベースの全消去

### ユーザー設定

- `GET /user-settings` - 設定の取得
- `PUT /user-settings` - 設定の更新
- **注**: フロントエンドは統一された `SettingsModal` コンポーネントを介してこれらのエンドポイントと通信します。

## 利用方法

1. **ユーザー登録/ログイン**
2. **基本構成の設定**
   - サイドバー下部の「設定」ボタンをクリックします。
   - 「モデル管理」タブで OpenAI 互換の LLM と Embedding モデルを追加します。
   - API キーとモデルパラメータを設定します。
   - 「一般設定」タブで言語を切り替えたり、パスワードを変更したりできます。
3. **ドキュメントのアップロード**
   - PDF, テキスト, 画像などの形式をサポートします。
   - チャンクサイズと Embedding モデルを設定します。
   - 自動的にベクトル化とインデックス化が行われます。
4. **詳細設定の調整**
   - 使用するモデルを選択します。
   - 推論パラメータと検索パラメータを構成します。
   - UI 言語を設定します。
5. **対話を開始**
   - 質問を送信します。
   - ストリーミング処理の経過を観察します。
   - 引用付きのインテリジェントな回答を確認します。

## 特筆すべき機能

- ✅ **ユーザー分離**: 各ユーザーに独立したモデル設定とナレッジベースを提供
- ✅ **ストリーミング体験**: 処理の進捗と生成内容をリアルタイム表示
- ✅ **インテリジェント検索**: キーワード抽出 + ハイブリッド検索 + 類似度フィルタリング
- ✅ **引用追跡**: 回答の根拠となるソースと関連セグメントを明確に表示
- ✅ **マルチモデル対応**: OpenAI 互換インターフェース + Gemini ネイティブサポート
- ✅ **柔軟な設定**: ユーザー独自の API キーと推論パラメータのカスタマイズ
- ✅ **多言語サポート**: UI と AI 回答の両方を完全国際化
- ✅ **ビジョン機能**: 画像処理をサポートするマルチモーダルモデルに対応
- ✅ **ユーザー管理**: 登録、ログイン、パスワード管理の完備
- ✅ **デュアルモード処理**: 高速モード (テキストのみ) + 高精度モード (画像・テキスト混合)
- ✅ **メモリの最適化**: 大容量ファイルを分割処理し、メモリオーバーフローを防止
- ✅ **統合管理**: モデル、ユーザー、一般設定を一つにまとめたモダンな UI
- ✅ **ミニマルなデザイン**: サイドバーとヘッダーの冗余を排除し、対話体験に集中
