世界を動かす技術を、日本語で。

HNに表示: 3Bニューラル埋め込みを用いてゼロからウェブ検索エンジンを構築する

概要

  • Web検索エンジン をゼロから構築した2ヶ月間の挑戦記録
  • 従来の検索エンジン の問題点と Transformerベース技術 の活用動機
  • 大規模クロール・埋め込み生成・分散インフラ の構築工程
  • 正確な意味理解・高品質コンテンツ発見 を目指した設計思想
  • 構成・正規化・チャンク化 など主要技術要素の詳細解説

Web検索エンジン自作プロジェクトの動機と全体像

  • 従来検索エンジン の品質低下と SEOスパム 増加に対する課題意識
  • Transformer系テキスト埋め込みモデル の自然言語理解力への期待
  • なぜ「常に高品質なコンテンツが上位に出ないのか」という素朴な疑問
  • キーワード一致中心の既存検索の限界と 人間的な知能 への憧れ
  • NLP・ML・分散システム・パフォーマンス工学 など広範な分野への挑戦意欲
  • 自作検索エンジン を持つことの面白さ・学びの場としての意義

2ヶ月間の構築ハイライト

  • 200台GPUクラスター30億件 のSBERT埋め込み生成
  • 数百台のクローラー毎秒5万ページ をクロール、最終 2.8億ページ のインデックス化
  • クエリ応答遅延500ms 実現
  • RocksDB・HNSW200コア/4TB RAM/82TB SSD に分散シャーディング
  • ライブデモ として一般公開

システム全体構成(アーキテクチャマップ)

  • Proving ground :ニューラル埋め込みによる検索精度検証環境
  • Normalization :HTML正規化・ノイズ除去
  • Chunking :文単位の分割
  • Semantic context :文脈維持・意味的関連付け
  • Statement chaining :文・段落の連鎖的意味理解
  • Initial results :初期検索結果の評価
  • Crawler/Pipeline/Storage/Service mesh/GPU buildout :分散処理基盤
  • Sharded HNSW :高速近傍探索のシャーディング
  • Optimizing latency :低遅延化
  • Knowledge graph/SERP/AI assistant/State tracking :知識グラフ・対話型支援
  • Search quality/Live demo/Costs/Conclusion :品質評価・コスト・まとめ

Proving Ground(検証環境)

  • Webページを分割・埋め込み化 し、複雑な自然言語クエリへの精度を検証
  • 例:S3ドキュメントに対する「人間的」な意図理解の比較
    • 伝統的検索:キーワード一致・無関係な断片表示
    • ニューラル検索:意図・文脈理解による正確な抜粋提示
  • 意図理解型検索 の特徴
    • クエリ全体の意味理解
    • クエリエンジニアリング不要
    • 暗黙的・概念的な複合クエリへの対応
    • キーワードスパム・SEO対策に強い耐性
  • 高品質・隠れた知見発見価値観の近いコミュニティ探索 など新しい体験

Normalization(正規化)

  • HTMLタグ の意図(レイアウト・テキスト・メディア・インタラクティブ等)から テキスト抽出 に特化
  • WHATWGのセマンティック要素をサブセット化した独自ミニ仕様
    • 一貫した構造化(table, ul, ol等)
    • セマンティックなテキスト要素のみ保持(p, table, pre, blockquote, ul, ol, dl)
    • テキストのトリミング・フラット化
    • 不要ノード(script, head, comments等)の除去
    • main > articleがあれば優先
  • ノイズ除去 の具体例
    • メニューバー・ナビゲーション・バナー・フッター等のサイトクローム
    • コメント・関連記事リンク・UI要素・SNSボタン
  • セマンティック要素未使用サイト への対応
    • ヒューリスティック・NLPによる判別
    • クラス名・ID等のパターンマッチは誤除去リスク
    • DOM構造の視覚的分類や統計的テキストモデルも将来的に検討
  • 大規模サイトの特別処理例 (Wikipedia等)
    • 見出し・クラス・IDによる細かな除去ルール
    • <sup class="reference">や"hatnote"等のメタ情報除去
    • サイドバー・ナビボックス・参考文献リスト等の除去
  • リッチ構造化データ の活用
    • OpenGraph等<meta>タグ
    • 検索エンジン用構造化データ(知識グラフ・リッチリザルト強化)

Chunking(チャンク化)

  • 埋め込みモデル は長文入力が不得意なため、 ページ全体ではなく文単位 で分割
  • n文字/単語ごとの単純分割は意味破壊リスク
  • 文単位分割 のためspaCyのsentencizerを採用
    • 文法・略語・小数点・URL・非形式的文体にも高精度
  • 文単位チャンク の利点
    • クエリへのピンポイントな回答抽出
    • ダイレクトスニペットやハイライトへの活用
    • 意味的まとまりを保ちつつパラグラフ単位への拡張も容易

Semantic Context(意味的文脈)

  • チャンク化の課題 :文脈切断による意味損失("it"や"the"等の指示語問題)
  • 正規化されたセマンティックドキュメントツリー を活用
    • 見出しによるセクション分割・ラベル付け
    • テーブル見出し・段落・説明リスト等の構造的関連付け
    • リード文とリストの意味的結合
  • 例:PostgreSQL Performance Tuning Guide
    • 見出し・セクション・個別文を階層的に関連付けて保持
    • 検索時に文脈情報を付加し、深い意味理解に活用

この後も、 Statement chainingパイプライン設計HNSWインデックスの高速化知識グラフ連携 等、各要素の詳細解説が続く構成。全体として、 高品質・意味理解型の検索体験 を目指すための技術的工夫と設計思想を網羅的に整理。

Hackerたちの意見

これめっちゃクールだね!サービスメッシュについての質問なんだけど、自分で作るのが一般的にベストな方法なの?ネットワークはまだ初心者なんだ。

最後に、著者はCommon Crawlのデータを追加することを考えてるみたい。ウェブグラフから生成したランキング情報が、どのページをクロールするかを選ぶのに大きな助けになると思う。スケールでの具体例を見るのが好きだな。ベクターデータベースがこんなにコスト効率が良いとは驚きだよ。

同じアイデアの小さいバージョンを、仕事の求人だけでやってたんだ。最初はHNSWを見てたけど、予測可能な計算時間コストでスケールさせる方法が分からなかった。結局、メモリがちょっと足りなかったからIVFを使うことにした。coreNNも見てみないとね。

これほんとにすごい!前はこの検索エンジンで全ての検索をやりたかったんだけど、可能そうな気がする一方で、検索に関してはちょっと無駄な時間になるかもって思ってる。でも、いくつかの検索をこれで試してみて、感想を言えるようにしたいな。大ヒットするかもしれないけど、完全に正確ではないかも。例えば、lemmyを検索したらfediverseを見つけたくて、でも出てきたのはliberapayのページだった。だから、あのCommon Crawlの約束をちゃんと守って、archive.orgとか他のサイトも調べてほしいな。AI業界に何十億も使われてるのに、資金調達やコミュニティの力で、こういう代替案を本当に成功させてほしい。今の検索エンジンのほぼ独占状態にはみんなうんざりしてるよね。Ecosiaも自分たちの検索エンジンを作ろうとしてたよね、彼らは絶対に君の助けを借りるべきだし、チームに入ってほしいな。俺は分散型の検索エンジンが欲しいんだ。持続可能にしたいのは分かるけど、オープンソースにしてほしい。今、何もせずに社会を悪化させるだけのポットホールにお金が流れてるのが本当に多いから、このプロジェクトは十分に機能していて、すごい可能性があると思う。オープンソースにして、コミュニティが収益化やクラウドファンディングの方法を見つけて、持続可能にできることを願ってる。でも、ブログ記事は全部読んでないんだ。興奮しすぎて検索エンジンを使い始めちゃったから。記事はすごく深い感じがして、このアイデアが他の人たちが自分のプロトタイプを作るのに役立つと思う。オープンソースの検索エンジンをちゃんと作るためにも。正直言って、これはちょっと魔法みたいで、俺はそれに賛成だよ。こんなプロジェクトに興奮したのは数ヶ月ぶりだ!オープンソースは大変だって分かってるし、第三国から来たけど、これは本当にすごいから、できるだけ寄付するつもりだよ。50ドルくらいだけど、オンラインで一銭も使ったことがない俺が寄付したいと思ってるんだ。お願いだからオープンソースにして、Common Crawlを使ってほしい。君の人生とキャリアに幸運を祈ってるよ。

ただただ驚き!尊敬するよ!素晴らしい記事だね。検索エンジンに必要な要素は、キュレーションされたよくフィルタリングされたデータだっていうのが印象的だな(ゴミを入れればゴミが出る)。これはLLMのトレーニングでも大きな学びだったと思う。もっと質の高いデータで作業する方がいいよね。全てのコンテンツがLLMによって評価された検索エンジンがどうなるのか、興味あるな。

今、友達の小さなビジネスのウェブサイトを上位表示させようとしてるんだけど、SEOについてはそこそこ理解してるつもり。技術的に正しいことをやって、地域や提供しているサービスに特化した手書きのコンテンツも結構作ったんだ。2ヶ月経ったけど、Bingはまだファビコンすらクロールしてない。Googleは1ヶ月後にやっとやったけどね。関連性の薄いサービスや、ゴミみたいな全国的なリード収集サイト、Yelpのトップ10ブログのスパム、さらには300マイル離れた地域のサービス提供者にすら上回られてる。ページランクやクロールに何か問題があるのは確かだね。

APIからCORSエラーが出てるんだけど、https://search.wilsonl.in/のデモは他の人には動いてる?

CORSエラーは実際のリクエストが失敗してるからだね(502 Bad Gateway)。死亡のハグ?

これ大好きだし、君の書き方が素晴らしいと思う。こんなに詳細に自分の作品を共有してくれてありがとう。知識パネルの横にある知識グラフを改善することについて、どんなことを考えてるの?これを正しく読んでるなら、ウィキペディアに存在するトップの結果に対してだけ知識パネルの結果があるみたいだけど、合ってる?

すごいな!これ、めっちゃモチベーション上がるわ。ドキュメント検索エンジンの開発、続ける気になった。

すごく面白いプロジェクトだね!ちょっと興味本位で、主要な検索エンジンでいい結果が出せなかったクエリを送ってみたんだ。「高解像度のウルトラワイドモニターのおすすめは?」ってやつ。今のところ、このエンジンでの回答も他のエンジンと同じ誤謬があるみたい。広範なランキングに「特化」したメタページが、特定のアイテムに関する専門的なデータよりも優先されてる感じ。ランキングを求める欲求が一番重視されてるみたい。もしこのクエリに手動で答えるとしたら、ハードウェアフォーラムやオタク系ブログを見て、N個の候補を選んで、全製品の仕様や特徴を調べるかな。もちろん、特定のウェブサイトがこの分析を行ったかどうかを一般的に答えるのは難しいけど、こういう状況では具体的なデータを引用しているサイトを上位に表示させるのが有利かも。ユーザーとしては、この分析をまとめるために使った初期の情報源を提示してほしいな。もちろん、エンジンはこういうボトムアップの評価をしないから、実際には起こらないけどね。

いくらかかったの?