🤖

ローカルドキュメント探しの工数を、CLI一発に圧縮した話

に公開

ローカルに仕様書や議事録が増えるほど、目的のドキュメントに到達するまでの探索コストが増える。
特に古いドキュメントは「保存場所」「ファイル名」「当時の表現」が曖昧になりやすく、キーワード検索ではヒット率が下がる。結果として、複数ファイルを開いて中身を確認する作業が発生し、時間がかかる。

この探索を短縮するために、ローカルファイルをデータ化してセマンティック検索(意味検索)できる仕組みを導入した。

https://github.com/ryujimorimoto/ja-qmd


整理のジレンマと方針転換

効率化のために整理(命名規則・フォルダ構造・タグ運用など)を徹底する方法はあるが、運用コストが継続的に発生する。
一方で、整理をしないと検索コストが上がる。このトレードオフがある。

そこで「整理に寄せる」のではなく、「検索側を強化して運用を単純化する」方針に寄せた。
具体的には、検索対象ディレクトリを決めて、そこにドキュメントを集約し、発見は検索に委ねる。


採用したツール:QMD(Quick Markdown Search)

採用したのは QMD(Quick Markdown Search)。Markdownを対象にローカルで検索できるCLIで、BM25全文検索・ベクトル検索・LLMリランキングを組み合わせた構成になっている。

作業環境は以下。

  • OS:macOS
  • 実行:ローカルLLMで実行

今回やったこと(フォークして調整)

公式リポジトリをフォークしてローカルに展開し、以下を実施した。

  • 日本語対応:正規化を入れて検索の揺れを低減
  • LLMモデルバージョンの不整合を解消(モデル指定を調整)
  • bunと依存ライブラリを導入
  • 動作確認

LLMモデル指定は以下のように調整した(自分の修正メモ)。

const DEFAULT_GENERATE_MODEL = "hf:ggml-org/Qwen3-0.6B-GGUF/Qwen3-0.6B-Q8_0.gguf";
// const DEFAULT_GENERATE_MODEL = "hf:ggml-org/Qwen3-1.7B-GGUF/Qwen3-1.7b-q8_0.gguf";

QMDの使い方(導入から検索まで)

以下は、READMEのQuick Startに沿った手順。

1) インストール

bun install -g https://github.com/ryujimorimoto/ja-qmd

2) 検索対象ディレクトリをコレクションとして登録

検索対象を複数登録できる。例:notes / meetings / docs。

qmd collection add ~/notes --name notes
qmd collection add ~/Documents/meetings --name meetings
qmd collection add ~/work/docs --name docs

3) コレクションに文脈情報を付与(任意)

検索結果に補助情報を持たせる用途。

qmd context add qmd://notes "Personal notes and ideas"
qmd context add qmd://meetings "Meeting transcripts and notes"
qmd context add qmd://docs "Work documentation"

4) 埋め込み(Embedding)作成

ベクトル検索を使う場合、事前にEmbeddingを生成する。

qmd embed

検索コマンドの使い分け

QMDは複数の検索方法を提供している。

キーワード検索(BM25中心)

qmd search "project timeline"

セマンティック検索(ベクトル検索)

qmd vsearch "how to deploy"

ハイブリッド検索+LLMリランキング

qmd query "quarterly planning process"

今回の用途(要件のニュアンスで探す)では query が適している。
ドキュメント本文の内容も参照し、候補と一致度(スコア)を提示するため。


結果の取得(本文確認)

検索結果に出たファイルを取得して確認する。README上の例は以下。

qmd get "meetings/2024-01-15.md"
qmd get "#abc123"
qmd multi-get "journals/2025-05*.md"
qmd get notes/meeting.md:50 -l 100

補助オプション(絞り込み・出力形式)

コレクションを絞る、JSONで出すなど、運用に合わせた出力が可能。

qmd search "API" -c notes
qmd search "authentication" --json -n 10
qmd search "API" --all --files --min-score 0.3
qmd query "error handling" --all --files --min-score 0.4

インデックスの更新・状態確認

索引の状態確認や更新。

qmd status
qmd update
qmd update --pull

導入効果(作業時間)

  • 導入前:探索に 10〜20分
  • 導入後:探索に 数十秒

「こんな要件の仕様書を探して」という入力から、文脈で候補を提示し、本文まで確認して一致度(%)を返す挙動が得られた。


課題・改善点と今後

課題・改善点

  • CLIで候補提示はできるが GUIがない
  • まずMarkdownを対象にしているが、将来的には docs / csv / xlsm など他形式、画像・動画も検索対象にしたい

Discussion