💽

ローカルファイルやGist,GitHub Repoをベクトル検索する

に公開

https://zenn.dev/mizchi/articles/pglite-vector-search

これがよさそう、ということで自分も作ることに。

gistdex

https://github.com/ushironoko/gistdex

できたものがこちらです

ドキュメント

https://gistdex.vercel.app/

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を挿せます。以下にテンプレートがあるのでそれを参考に実装いただければと思います。

https://github.com/ushironoko/gistdex/blob/main/templates/adapter-template.ts

実装したら gistdex.config.json にカスタムアダプターとして登録すれば、gistdexが内部で利用できるようになります。

https://github.com/ushironoko/gistdex/blob/main/README.md#creating-custom-adapters

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のドラフトピック最適化のメモとして使っています。

https://github.com/ushironoko/unitedex

各キャラクターの特徴をマークダウンで記述してインデックスしておき、ベクトル検索することでカウンター関係を推定できます。Claude Codeでmcpとして起こしておいて、前もってピックの形をクエリしておくことでコンテキストウィンドウへキャッシュできます。

LLMはとても賢いのでベクトル検索結果を良い感じに汲み取って返してくれます。RAGというやつですね。

また、公開はしていませんが「保育のごあんない.pdf」をmarkitdownでマークダウン化してインデックスし、必要な情報をクエリしたりしています。これは大変便利で、各保育園の1歳児クラスの受け入れ枠等が高精度で取り出せます。

markitdownやWebFetch、@mizchi/readabilityと組み合わせればほとんどのコンテンツをインデックスできるので、実質制限なしみたいなものです。一応セキュリティ的にURLはホワイトリストにした方が良いのでそうしています。

https://github.com/microsoft/markitdown
https://github.com/mizchi/readability

制約

上述のとおり、デフォルトではURLはGistとGitHubのみ許可しています。またローカルファイルの読み込みも一定の制約があります。詳しくは以下のモジュールを眺めるとなんとなく分かると思います。

https://github.com/ushironoko/gistdex/blob/main/src/core/security/security.ts

Discussion