ローカルファイルやGist,GitHub Repoをベクトル検索する
これがよさそう、ということで自分も作ることに。
gistdex
できたものがこちらです
ドキュメント
npx @ushironoko/gistdex index --gist "gist_url"
のようにCLIからワンライナーでローカルのベクトルDBへインデックスできます。
npx @ushironoko/gistdex query --k-top 3 --full "search query"
のようにするとクエリできます。
Gist,GitHub Repoのインデックス
上で示したように、GistとGitHub RepoのみURL指定でインデックスできるようにしています。これは元々結局最強のメモツールってGist(とGitHub)なんかもしれんと思いたったことがきっかけであり、実装されています。
--gist
フラグでGist、--github
フラグでGitHub Repoのコンテンツをインデックスできます。
ローカルファイルのインデックス
ぶっちゃけこちらの方が便利です。--file
または --files
フラグでローカルファイルをインデックスできます。
また、globでの対象指定ができます。
npx @ushironoko/gistdex index --files "./docs/*.md"
とすると、すべてのマークダウンファイルをインデックス対象にできます。
テキストのインデックス
こちらも便利です。
npx @ushironoko/gistdex index --text "hogehoge"
とすると文字列をインデックスできます。主に他のCLIツールからの引数で受け取る想定です。
npx @mizchi/readability "https://..." | xargs npx @ushironoko/gistdex index --text {} --title "hogepiyo"
組み込みのDB
デフォルトではSQLiteかメモリを選べます。メモリだと揮発するので基本はSQLite推奨です。
npx @ushironoko/gistdex init
すると対話型で設定できます。なお、この時にGoogle Generative AI API Keyが要求されます。embeddingに必須なので使う際はお手元にご用意ください。
カスタムアダプター
カスタムアダプターを実装すると、任意のベクトルDBを挿せます。以下にテンプレートがあるのでそれを参考に実装いただければと思います。
実装したら gistdex.config.json
にカスタムアダプターとして登録すれば、gistdexが内部で利用できるようになります。
mcp use
一応mcp serverとして起動できます。
npx @ushironoko/gistdex --mcp
でmcpモードになります。
ただし、Claude Desktopのようなデスクトップ環境ではすぐにサーバーが落ちてしまう不具合があるので基本はClaude Code向けです。誰か直してほしい。
Windows版Claude Desktopでも動作するようになりました。
以下のように claude_desktop_config.json
を記述すると動作します。
{
"mcpServers": {
"gistdex": {
"command": "npx",
"args": ["@ushironoko/gistdex@latest", "--mcp"],
"env": {
"GOOGLE_GENERATIVE_AI_API_KEY": "your-api-key"
}
}
}
}
使用例
ここからは完全に趣味の域ですが、MOBAのドラフトピック最適化のメモとして使っています。
各キャラクターの特徴をマークダウンで記述してインデックスしておき、ベクトル検索することでカウンター関係を推定できます。Claude Codeでmcpとして起こしておいて、前もってピックの形をクエリしておくことでコンテキストウィンドウへキャッシュできます。
LLMはとても賢いのでベクトル検索結果を良い感じに汲み取って返してくれます。RAGというやつですね。
また、公開はしていませんが「保育のごあんない.pdf」をmarkitdownでマークダウン化してインデックスし、必要な情報をクエリしたりしています。これは大変便利で、各保育園の1歳児クラスの受け入れ枠等が高精度で取り出せます。
markitdownやWebFetch、@mizchi/readabilityと組み合わせればほとんどのコンテンツをインデックスできるので、実質制限なしみたいなものです。一応セキュリティ的にURLはホワイトリストにした方が良いのでそうしています。
制約
上述のとおり、デフォルトではURLはGistとGitHubのみ許可しています。またローカルファイルの読み込みも一定の制約があります。詳しくは以下のモジュールを眺めるとなんとなく分かると思います。
Discussion