Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyで動かす検索機能

Avatar for matsudai matsudai
September 12, 2025
83

 Rubyで動かす検索機能

engineer unite meetup vol.2

https://enun.connpass.com/event/367436/

Avatar for matsudai

matsudai

September 12, 2025
Tweet

Transcript

  1. もくじ • 背景 • 検索手法 ◦ RAGのステップ ◦ キーワード検索とセマンティック検索 ◦

    セマンティック検索の実装 • デモ • まとめ リポジトリ:  https://github.com/matsudai/enun_vol2_sample
  2. 背景 • Google検索に「AI による概要」が追加されるなどRAGが普及。 ◦ RAG (Retrieval Augmented Generation) …

    検索結果からの生成。 • 大手クラウドからは文書を登録→検索で使える簡単なサービスの提供。 ◦ Google Cloudでは「Vertex AI Search」、AWSでは「Knowledge bases for Amazon Bedrock」など。   → 仕組みを知りたいので触ってみる!
  3. 検索手法 ② キーワード検索とセマンティック検索 • キーワード検索: いわゆる全文検索・タグ検索など。 ◦ キーワードを抽出して突合する。 ◦ 分かち書き(文節での区切り)や正規化(半角・全角を揃える)など古くから研究。

    例:「これはペンです」 → 「これ/は/ペン/です」 → 「ペン」で検索可能。 • セマンティック検索: ◦ 意図・文脈による突合。 ◦ あいまいな表現・キーワードが未記載でも検索できる。 例:「これはペンです」「紙に書けます」が近い文脈。 ◦ → 今回はこちらを実装してみる!
  4. 検索手法 ③ セマンティック検索の実装 • メジャーな手法は埋め込み検索: ◦ 1)ベクトル化: 文章をトークン(単語)に分割 → トークンの並びをベクトルで表現。

    ◦ 2)検索: ベクトルの類似度(距離など)で近いものを判定。 • 実装方針: ◦ 1)検索対象の情報を事前にベクトル化 「これはペンです」     [1, 26, 8, 92, ...]        [0.1, 0.6, 0.8, …] 「目玉焼きを食べる」    [13, 9, 5, 32, ...]        [0.3, 0.2, 0.6, …] ◦ 2)ユーザ入力(検索クエリ)をベクトル化して、上記と突合 「紙に書くもの」      [9, 58, 6, 44, ...]        [0.2, 0.5, 0.9, …] トークナイザ DB ファイル 入力 埋め込みモデル トークナイザ 埋め込みモデル 距離計算
  5. 検索手法 ③ セマンティック検索の実装 • 技術選定: ◦ トークナイザ/埋め込みモデル: infloat/multilingual-e5-small ▪ Microsoftが開発した多言語対応の埋め込みモデル。

    ▪ ランタイムに ONNX Runtime Ruby を利用。 ※ Microsoftが主導して作成された、オープンな機械学習モデルのフォーマット。   Python以外での利用が難しいモデルを変換できる。 ◦ DB: SQLite (拡張に sqlite-vec) ▪ ローカル環境でDB+ベクトルの類似度計算が可能。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル
  6. 検索手法 ③ セマンティック検索の実装 • 実装: ◦ 埋め込みを生成します。 ◦ 正確なベクトルを計算するため 「Average

    pooling」処理をします。 Pythonだと自動でやってくれるのですが Rubyの場合は自前実装です。 (細かいことは気にしないで OK!) 例:  [1, 26, 8, 92, ...] → [0.1, 0.6, 0.8, …] トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
  7. 検索手法 ③ セマンティック検索の実装 • 実装: ◦ 埋め込みを生成します。 ◦ 正確なベクトルを計算するため 「Average

    pooling」処理をします。 Pythonだと自動でやってくれるのですが Rubyの場合は自前実装です。 (細かいことは気にしないで OK!) 例:  [1, 26, 8, 92, ...] → [0.1, 0.6, 0.8, …] トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
  8. 検索手法 ③ セマンティック検索の実装 • 実装: ◦ SQLiteにベクトルを保存します。  ※ SQLite vec

    拡張で使える vec_f32() 関数を利用します。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
  9. 検索手法 ③ セマンティック検索の実装 • 実装: ◦ ユーザ入力も同様に、ベクトル化します。 ◦ SQL vec

    拡張の構文 MATCH にて、近いベクトルを 持つテキストを検索します。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
  10. 検索手法 ③ セマンティック検索の実装 • 実装: ◦ ユーザ入力も同様に、ベクトル化します。 ◦ DBから、近いベクトルを持つテキストを検索します。  ※

    SQL vec 拡張の構文 MATCH を利用します。                   Happy End … トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
  11. • RAGにおいてより業務に近い「検索」の部分を自分で実装してみた。 ◦ 実装自体はそこまで難しくなく、モデルの精度やコスパが大事。 • ローカルのモデルはクラウドのものとは違うユースケースになりそう。 ◦ Pros. : 高速・無料・機密性

    ◦ Cons. : 精度・PC資源(メモリ・CPU・ストレージ) ◦ → 定額制のAIエージェントであれば試行回数が稼げるので良さそう? ▪ 例: AI小説の執筆、仕様書を考慮したコーディングなど。 まとめ リポジトリ:  https://github.com/matsudai/enun_vol2_sample