• 執筆者一覧Contributors
  • メルマガ登録Newsletter
ローカルLLMのためのプライベートWeb検索エンジンを作った

ローカルLLMのためのプライベートWeb検索エンジンを作った

December 5, 2025

清水 亮 ryo_shimizu

新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。

ローカルLLMのためのプライベート検索エンジンを作った


ChatGPT に代表される生成AIを「なんとかローカルで動かしたい」という欲望は、エンジニアなら一度は抱くものだと思う。
「クラウドに一切つながずに、自分のPCだけで完結するAIアシスタント」。響きだけなら最高だ。

しかし、いざやってみるとすぐに壁にぶつかる。
モデルはローカルで動いても、「知識」はローカルにないのである。


ローカルLLMにもWebの知識は必要だが…

LLMは大量のテキストで事前学習されているとはいえ、「いま」「ここ」で必要な具体的な情報はだいたいWebにある。

こういったものは、事前学習済みLLMの「過去の記憶」ではなく、Web検索しないと出てこない。

つまり、「完全ローカルで動くAI」を作ろうとしても、結局どこかのタイミングで Web検索エンジンに頼らざるを得ない

では素直に、LLMからクラウドの検索APIを叩けばよいか?
…となると、次の問題が出てくる。


検索APIは「使えば使うほどお金がかかる」

最近は各社が検索APIや「AI向け検索サービス」を提供している。品質も良いし、簡単に使える。
だが、だいたい従量課金である。

ローカルLLMと組み合わせて「会話の裏側で毎回Web検索する」ような仕組みにすると、
LLMがそこそこ賢く振る舞えば振る舞うほど、検索APIの利用料金が青天井で増えていく

ローカルでLLMを回しているのに、
水道の蛇口のように「検索API課金」がチョロチョロではなくドバドバ流れ続ける、という本末転倒な状態になる。


検索履歴から「何を考えているか」までバレる問題

もうひとつ、見逃せないのが プライバシーの問題 だ。

普通にクラウドの検索エンジンを使えば、
「どんなキーワードで何をどれだけ調べたか」という履歴は、当然ながら相手側に残る。

個人であれ企業であれ、

といったものが、検索ログを見れば透けて見える。
せっかくLLM本体をローカルに閉じ込めて守っていても、検索履歴がダダ漏れでは意味がない

「モデルもデータもローカル。検索クエリまでローカルで完結したい」
というのが、本気でプライバシーを考えるなら自然な発想になる。


アイデア:Webを「前もって」丸ごとベクトル化して持ってくる

そこで発想を変えた。

検索するたびにクラウドに聞きに行くのではなく、
「検索の元ネタ」そのものをあらかじめローカルに持ってくればいいのでは?

具体的には、次のような構成を考えた。

  1. クラウド上でWebクローラーを動かす
    • 通常の検索エンジンと同じように、Webページをクロールして集める
  2. 各ページの本文テキストを抽出し、埋め込み(ベクトル化) する
    • LLM用の埋め込みモデルなどを使って、内容をベクトルに変換
  3. そのベクトル群をクラウド側のデータベース(ベクトルDB)に保存
  4. 一定のタイミングで、そのベクトルDBを 丸ごとローカルにコピー する
  5. ローカル環境では、コピーしたベクトルDBに対して
    完全オフラインのベクトル検索 を行う

こうすると、

という状態が作れる。


クラウド側:10ノード+GPUで1日100万ページをインデックス

もちろん、Webページを1枚1枚手で集めてベクトル化するわけにはいかない。
そこで、クラウド側にはそれなりのインフラを用意することになる。

今回の実験では、ざっくりと次のような構成にした。

アーキテクチャとしては、

  1. クローラーがHTMLを取得
  2. パーサーが本文を抽出(広告やナビゲーションなどをできる限り除去)
  3. テキストをGPUノードに送り、埋め込みを計算
  4. ベクトルとメタデータ(URL、タイトル、タイムスタンプなど)をベクトルDBに保存

といった、シンプルだがそこそこスループットの出るパイプラインを組んだ。

この構成でFreeAI社の持つAIスーパーコンピュータ継之助を中心に実験したところ、1日あたり約30万ページをインデックス することに成功した。もちろんWeb全体から見ればまだまだ一部だが、「個人用検索エンジン」にしては十分野心的な規模である。


ローカル側:「自分専用のWeb」を持ち歩く感覚

クラウド側でインデックスされたベクトルDBは、定期的にスナップショットを取ってローカルに持ってくる。
サイズはそれなりに大きいが、最近のストレージ事情を考えれば、TB級までは現実的な範囲だ。

ローカル環境では、

という流れになる。

ここで重要なのは、

という点だ。

言い換えると、
「ある時点のWebの断面」を、自分のマシンの中にまるごとコピーしておいて、
それをLLMと一緒に使う——そんな感覚のシステムになっている。


もちろん課題もあるが、「方向性」としてはアリ

実際には、まだまだ課題も多い。

など、真面目にやろうとすればするほど設計ポイントは増える。

それでも、「ローカルLLM×プライベート検索エンジン」という組み合わせは、
次のような意味で非常に面白い。


「検索もローカルに持ってくる」という発想

これまで、「検索」はクラウド側にあるのが当たり前だった。
だが、LLMがローカルで動くようになってきた今、

モデルだけでなく、検索インフラそのものを分割する
「クロール&インデックスはクラウド、検索と利用はローカル」

という形は、十分に検討に値する。

クラウドとローカルの役割をうまく分担させることで、
コスト・プライバシー・利便性のバランスを取り直すことができる。

今回、10ノード+GPUという構成で1日100万ページをインデックスする実験に成功したことで、
「個人でもここまでの規模感の“自前検索エンジン”を持てる」ことが見えてきた。

ローカルLLMを本気で育てたいなら、
次に必要なのは 「ローカル検索をどう作るか」 だ。

そのためのひとつのアプローチとして、
「プライベートWeb検索エンジン」を作ってみた、という話である。