Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rubyで動かす検索機能
Search
matsudai
September 12, 2025
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyで動かす検索機能
engineer unite meetup vol.2
https://enun.connpass.com/event/367436/
matsudai
September 12, 2025
More Decks by matsudai
See All by matsudai
Rubyでゲームを作りたい
matsudai
0
59
SmTでRaspberry Pi Picoを動かす
matsudai
0
100
Ruby × 車 (その後) ~課題:オフライン対応~
matsudai
0
72
Ruby × 車 ~ 愛車のデータを取得せよ! ~
matsudai
2
290
流行れ! AI Tuber!
matsudai
0
170
Islands on Rails !!
matsudai
0
80
ruby.wasmが簡単にビルドできるようになっていた
matsudai
0
190
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
1.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
How to train your dragon (web standard)
notwaldorf
97
6.8k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
WENDY [Excerpt]
tessaabrams
13
39k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
270
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
GraphQLとの向き合い方2022年版
quramy
50
15k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Embracing the Ebb and Flow
colly
88
5.2k
Transcript
Rubyで動かす検索機能 ONNXモデルによるベクトル検索の実装とRAGへの応用
自己紹介 名前: matsudai / ふじはら 所属: R&D室 係長 松江でソフトウェアエンジニアをやっています。 Ruby、React、Javaなどを利用した製造業向け Webシステム開発など。
趣味:ゲーム、プログラミング。 リポジトリ: https://github.com/matsudai/enun_vol2_sample
もくじ • 背景 • 検索手法 ◦ RAGのステップ ◦ キーワード検索とセマンティック検索 ◦
セマンティック検索の実装 • デモ • まとめ リポジトリ: https://github.com/matsudai/enun_vol2_sample
背景 • Google検索に「AI による概要」が追加されるなどRAGが普及。 ◦ RAG (Retrieval Augmented Generation) …
検索結果からの生成。 • 大手クラウドからは文書を登録→検索で使える簡単なサービスの提供。 ◦ Google Cloudでは「Vertex AI Search」、AWSでは「Knowledge bases for Amazon Bedrock」など。 → 仕組みを知りたいので触ってみる!
検索手法 ① RAGのステップ 生成AIは一般的な知識を持っているため、必要なデータの検索が重要。 → 膨大な量の業務データから、生成に必要なものだけ取得する🤔 検索 生成 (OpenAI APIなど)
入力 DB ファイル
検索手法 ② キーワード検索とセマンティック検索 • キーワード検索: いわゆる全文検索・タグ検索など。 ◦ キーワードを抽出して突合する。 ◦ 分かち書き(文節での区切り)や正規化(半角・全角を揃える)など古くから研究。
例:「これはペンです」 → 「これ/は/ペン/です」 → 「ペン」で検索可能。 • セマンティック検索: ◦ 意図・文脈による突合。 ◦ あいまいな表現・キーワードが未記載でも検索できる。 例:「これはペンです」「紙に書けます」が近い文脈。 ◦ → 今回はこちらを実装してみる!
検索手法 ③ セマンティック検索の実装 • メジャーな手法は埋め込み検索: ◦ 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 ファイル 入力 埋め込みモデル トークナイザ 埋め込みモデル 距離計算
検索手法 ③ セマンティック検索の実装 • 技術選定: ◦ トークナイザ/埋め込みモデル: infloat/multilingual-e5-small ▪ Microsoftが開発した多言語対応の埋め込みモデル。
▪ ランタイムに ONNX Runtime Ruby を利用。 ※ Microsoftが主導して作成された、オープンな機械学習モデルのフォーマット。 Python以外での利用が難しいモデルを変換できる。 ◦ DB: SQLite (拡張に sqlite-vec) ▪ ローカル環境でDB+ベクトルの類似度計算が可能。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル
検索手法 ③ セマンティック検索の実装 • 実装: ◦ 入力をトークンに変換します。 例: 「これはペンです」 → [1,
26, 8, 92, ...] トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
検索手法 ③ セマンティック検索の実装 • 実装: ◦ 埋め込みを生成します。 ◦ 正確なベクトルを計算するため 「Average
pooling」処理をします。 Pythonだと自動でやってくれるのですが Rubyの場合は自前実装です。 (細かいことは気にしないで OK!) 例: [1, 26, 8, 92, ...] → [0.1, 0.6, 0.8, …] トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
検索手法 ③ セマンティック検索の実装 • 実装: ◦ 埋め込みを生成します。 ◦ 正確なベクトルを計算するため 「Average
pooling」処理をします。 Pythonだと自動でやってくれるのですが Rubyの場合は自前実装です。 (細かいことは気にしないで OK!) 例: [1, 26, 8, 92, ...] → [0.1, 0.6, 0.8, …] トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
検索手法 ③ セマンティック検索の実装 • 実装: ◦ SQLiteにベクトルを保存します。 ※ SQLite vec
拡張で使える vec_f32() 関数を利用します。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
検索手法 ③ セマンティック検索の実装 • 実装: ◦ ユーザ入力も同様に、ベクトル化します。 ◦ SQL vec
拡張の構文 MATCH にて、近いベクトルを 持つテキストを検索します。 トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
検索手法 ③ セマンティック検索の実装 • 実装: ◦ ユーザ入力も同様に、ベクトル化します。 ◦ DBから、近いベクトルを持つテキストを検索します。 ※
SQL vec 拡張の構文 MATCH を利用します。 Happy End … トークナイザ DB ファイル or ユーザ入力 埋め込みモデル 検索!
デモ リポジトリ: https://github.com/matsudai/enun_vol2_sample
• RAGにおいてより業務に近い「検索」の部分を自分で実装してみた。 ◦ 実装自体はそこまで難しくなく、モデルの精度やコスパが大事。 • ローカルのモデルはクラウドのものとは違うユースケースになりそう。 ◦ Pros. : 高速・無料・機密性
◦ Cons. : 精度・PC資源(メモリ・CPU・ストレージ) ◦ → 定額制のAIエージェントであれば試行回数が稼げるので良さそう? ▪ 例: AI小説の執筆、仕様書を考慮したコーディングなど。 まとめ リポジトリ: https://github.com/matsudai/enun_vol2_sample