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

GoとClickhouseで作るRAGアプリ / Building RAG Applicati...

GoとClickhouseで作るRAGアプリ / Building RAG Application with Go and Clickhouse

Fukuoka.go#23の資料

Avatar for linyows

linyows

July 21, 2026

More Decks by linyows

Other Decks in Programming

Transcript

  1. Fukuoka.go #23 何をやっているか ๏ 次世代のWebmailサービスを開発している ๏ Gmailの代わりになることを想定 ๏ メールサーバはオールインワンMTAのStalwartを使用 ๏

    「検索:stalwart」→ これからメールサーバをつくるならStalwart ๏ StalwartとWebmailはJMAP:JSON Meta Application Protocolを使用する ๏ Webmailにはスマートな検索が必要
  2. Fukuoka.go #23 Storage テキスト解析 マッチング スコアリング RocksDB, FoundationDB, SQLite Stalwart実装

    Stalwart実装 なし PostgreSQL PG実装 PG実装 なし MySQL Stalwart実装 MySQL実装 なし ElasticSearch ES実装 ES実装 ES実装(BM25) Meilisearch MS実装 MS実装 MS実装(バケットソート)
  3. Fukuoka.go #23 RAG Storeを選定する ๏ セマンティック検索にはEmbeddingモデルを使ったベクトルデータを作成しDBに保存す る ๏ ベクトル型とHNSW(Hierarchical Navigable

    Small World)インデックスに対応の DBが必要 ๏ アカウント数、データ量が多い大規模を想定 ๏ 専用ベクトルDBはオンメモリで処理し、列指向DBのClickhouseはディスクストレージを 活用するので比較的安価 ๏ FromやDateでの絞り込みによる構造化検索も必要、ということでClickhouseを使用する
  4. Fukuoka.go #23 Go実装:chunk分割 ๏ htmlタグ、引用、署名を除去 ๏ 段落 → 改行 →

    Max文字数の順で分割 ๏ ISO-2022-JPなどはサーバ側で全て UTF-8:JMAPの仕様
  5. Fukuoka.go #23 Go実装:Clickhouse ๏ ドライバはClickhouse謹製の github.com/ClickHouse/ clickhouse-go/v2 ๏ 標準のnet/httpでも良いが、上のド ライバはバイナリ転送やOTEL対応

    やTCPでのコネクションプールを やってくれるので便利 ๏ nativeインターフェース以外に database/sql 互換インターフェース ももっている
  6. Fukuoka.go #23 Go実装:RRFの簡単な例 ๏ レキシカル検索(日付降順): [A, B, C] セマンティック検索(距離昇順): [B,

    D, A] ๏ スコア(k=60): A = 1/61 + 1/63 ≈ 0.03226 B = 1/62 + 1/61 ≈ 0.03252 C = 1/63 ≈ 0.01587 D = 1/62 ≈ 0.01613 ๏ RRF: B, A, D, C ๏ 両方に出たアイテムは点が2回加算されて上位に来る ๏ ただ、ベクトル検索はどんなクエリにも必ず何かを返すので、絶対的な距離の閾値による足切りが必要