# RAG検索

**RAG検索**タブは、セマンティックベクトル検索、キーワードフィルター、チャンク編集、Chatへの結果送信を行う専用インターフェースです。

![RAG検索](images/rag-search.png)

## 検索

1. ドロップダウンから**RAG設定**を選択（各設定に固有のインデックス、エンベディングモデル、パラメータがあります）
2. クエリを入力してEnterまたは検索ボタンをクリック
3. 必要に応じて**Top K**（最大結果数）と**Score Threshold**（最小類似度）を調整

結果はクエリのエンベディングと各インデックスチャンクのコサイン類似度でランク付けされます。

Vault 内の **Markdown** ファイルと **PDF** ファイルの両方がインデックス対象です。PDF テキストは Obsidian 組み込みの PDF.js で自動抽出され、Markdown と同様にチャンク化されます。テキスト抽出不可の PDF（スキャン画像のみなど）はスキップされます。

## PDF 結果の処理

PDF 検索結果には、結果ヘッダーに **PDF** バッジとページ範囲（例: `PDF (pages 2-5 of 24)`）が表示されます。ページ範囲は抽出テキスト内のチャンク位置から算出されます。

- **テキストとして** — 抽出テキストが結果プレビューに表示され、キーワードフィルターが使え、チャンクエディターで編集できます
- **PDF として** — ファイルパスをクリックすると元の PDF が Obsidian で開きます

PDF テキスト抽出が一時的に失敗した場合（暗号化 PDF、読み取りエラーなど）、次回の同期で既存のインデックス済みチャンクは削除されず保持されます。

## キーワードフィルター

セマンティック検索後、結果リスト上部のキーワードフィルターで結果を絞り込めます。複数のフィルターフィールドを組み合わせて精密なフィルタリングが可能です。

- **フィールド内** — スペース区切りのキーワードは**OR**検索（いずれかに一致）
- **フィールド間** — 複数フィールドは**AND**検索（すべてのフィールドの条件を満たす）
- **+ AND**ボタンでフィルターフィールドを追加
- **✕**でフィルターフィールドを削除
- チャンクテキストとファイルパスの両方を対象に検索
- テキスト内の空白は正規化されます（改行・全角スペースなどを統一）。PDF抽出時のアーティファクトがマッチングを妨げません
- スペース除去版のテキストに対してもマッチングを行うため、PDF抽出でスペースが挿入されたCJK単語もヒットします（例：「3つのコア機能」で「3 つのコア機能」にマッチ）
- 「全選択」チェックボックスと件数はフィルタ結果に連動
- すべてのフィルターをクリアするとすべての結果が再表示されます

### AIキーワード提案

各フィルターフィールドには**✦**（スパークル）ボタンがあり、AIを使ってキーワードを類義語・関連語に拡張できます。

- キーワードを入力してから✦をクリック
- 設定した**AI整形モデル**が関連語を生成し、フィールドの内容を置き換えます
- 入力が英語以外の場合、英語の翻訳語や関連英語語も含まれます
- 元のキーワードを部分文字列として含む冗長な候補は自動的に除去されます（OR検索で意味をなさないため）
- **↩**（元に戻す）ボタンで元のキーワードに復元できます
- **AI整形モデル**（検索設定の歯車アイコン）でモデルの選択が必要です

embedding類似度検索では拾いきれない用語のバリエーションを、取得済みの結果の中からキャッチするのに便利です。

## 結果の選択

- 結果行をクリックして選択/解除を切り替え
- **全選択**チェックボックスで表示中（フィルタ済み）の結果をまとめて選択/解除
- **選択中**の数はフィルタに関係なく、全結果中の選択数を表示

## Chatへの送信

チェックボックスで結果を選択し、**Chat**ボタンをクリック。Chatの入力エリアに添付ファイルとして追加されます。

## チャンクの編集

テキスト結果を展開した状態で鉛筆アイコンをクリックすると、チャンク編集モーダルが開きます。

![チャンク編集モーダル](images/rag-search-edit.png)

エディターでできること：

- **テキストの編集** — チャンク内容を自由に修正。変更は検索結果一覧に保存されます。
- **前のチャンクを読み込む** — `▲ 前のチャンクを読み込む`をクリックして同じファイルの前のチャンクを先頭に追加。チャンク間のオーバーラップは自動的に除去されます。
- **次のチャンクを読み込む** — `▼ 次のチャンクを読み込む`をクリックして同じファイルの次のチャンクを末尾に追加。オーバーラップは除去されます。
- **結合して編集** — 隣接チャンクを読み込んだ後、全テキストを一つのブロックとして編集可能。保存で結果が更新されます。

セマンティック検索が周囲のテキストから重要なコンテキストが欠けたチャンクを返した場合に便利です。

編集済みの結果には、結果リスト上で**「編集済み」**バッジとアクセントボーダーが表示されます。AI整形済みのチャンクは再オープン時にテキストのみのエディターとして開き（前後チャンク/整形コントロールなし）、手動編集のチャンクはフル編集インターフェースを保持します。

## AIで整形

チャンクエディターの**✨ AIで整形**をクリックすると、ローカルLLMを使ってテキストを自動的に拡張・整形します。

**動作の流れ:**

1. **初期拡張** — 前後3チャンクずつを並列で読み込み
2. **AI評価** — 検索クエリに対して十分なコンテキストがあるかLLMが評価。不足している場合、指示された方向にさらに3チャンクを読み込み（最大5回）
3. **整形** — 結合テキストをLLMが整形：チャンク分割のアーティファクト、途切れた文、ノイズを除去しつつ、すべての意味のある情報を保持。結果はストリーミングでエディターに表示

**設定:** 検索設定（歯車アイコン）の**AI整形モデル**ドロップダウンでモデルを選択してください。ドロップダウンにはローカルLLMサーバーで利用可能なモデルが表示されます。モデル未選択時はボタンが無効化されます。

**補足:**
- ボタンは使用後に非表示になります（1回限りの操作）
- 整形中および整形後は前後チャンクリンクが非表示になります
- 処理中はテキストエリアが無効化され、処理中であることを示します
- コンテンツの元の言語が保持されます

## インデックス設定

検索バーの歯車アイコンをクリックすると、インラインでインデックス設定を変更できます：

![インデックス設定](images/rag-search-setting.png)

- **チャンクサイズ** — チャンクあたりの文字数
- **チャンクオーバーラップ** — 隣接チャンク間のオーバーラップ文字数
- **対象フォルダ** — インデックス対象を特定のフォルダに限定（カンマ区切り）
- **除外パターン** — ファイルを除外する正規表現パターン（1行に1つ）
- **AI整形モデル** — チャンクエディターの「AIで整形」で使用するLLMモデルを選択（なし＝無効）
- **同期**ボタン（最終同期タイムスタンプ付き）
- **インデックス済みファイル**一覧（ファイルごとのチャンク数表示）

## ChatでのRAG指定と検索経由の比較

| | Chat + RAGドロップダウン | 検索 -> 選択 -> Chat |
|---|---|---|
| **コンテキスト注入先** | システムプロンプト（自動） | ユーザーメッセージの添付ファイル |
| **パラメータ** | RAG設定のデフォルト値を使用 | 検索ごとに調整可能（Top K、閾値） |
| **結果選択** | すべての結果が自動的に含まれる | ユーザーが含める結果を選択 |
| **隣接チャンク** | 利用不可 | エディターで前後チャンクを読み込み可能 |
| **キーワードフィルター** | 利用不可 | 選択前に結果をフィルタリング可能 |
| **AI整形** | 利用不可 | チャンクを自動拡張しLLMで整形 |

検索フローはLLMに送るコンテキストをより細かく制御できます。ChatのRAGドロップダウンは完全自動のコンテキスト注入の便利なショートカットです。
