📑

Raggle第2回コンペ - StaticEmbeddingで安全に爆速RAGを実施する

2025/02/22に公開

Raggleの第2回コンペでアイデア賞をいただいたのでメモ。ありがとうございます〜

https://raggle.jp/competition/617b10e9-a71b-4f2a-a9ee-ffe11d8d64ae

ソースコード

https://github.com/nishimoto/raggle_rohto_idea_award

下記を参考に、Transformerモデル組み込みたいんやけど...と生成AIに相談してコード作りました。要件定義と手元デバッグ野郎でした。

https://zenn.dev/galirage/articles/raggle_quickstart

解法のコア

このツイートにほぼすべてが詰まっています。Twitter最高!

https://x.com/hotchpotch/status/1881486469753438579

TransformerではないEmbeddingモデルである、static-embedding-japaneseをベクトル検索に用いました。

著者のセコンさんもTwitterに書いてくださっていますが、CPUでも爆速でEmbeddingできます。
今回のコンペで使った文書のEmbeddingに使う時間を比較してみたところ、以下の通りでした。

モデル 時間
static-embedding-japanese 343 ms
text-embedding-3-small(OpenAI API) 5.78 s

上記は 396chunks(1chunk, 1000文字ごとチャンク) での計測時間です。
※ 各々のCPUのスペックやOpenAIのリソース状況によっても異なるので、参考情報としてください。

OpenAI APIより早いため、システムのレスポンス性能という観点で実用的です。また、外部に情報送らなくて済むので、セキュリティ的にも選択肢に入ると感じました。

アンサンブルでのStaticEmbedding利用

  • Transformerを使用していないモデルであるため、通常のTransformerモデルによる結果とは違った文章を取ってこれると思い、OpenAIのtext-embeeding-smallとアンサンブルしました。

  • アンサンブルの際には、StaticEmbeddingで類似度を計算し、コサイン類似度が0.9を下回っている場合のみRAGの候補として追加とすることで参考情報の多様性を担保しました。

精度は?

Raggleから公開されるスコアのCorrectnessを見る限り、98点(1個90点で、残り4個は100点)でした。手元でも見ていましたが、公開されている質問例には解答できていそうでした。以下に質問例を記載しますが、検索に引っかかって来そうなキーワードが入っているためうまく行ってるかもな〜という感想です。

  • 存在意義(パーパス)は、なんですか?
  • 事務連絡者の電話番号は?
  • Vロートプレミアムは、第何類の医薬品ですか?
  • 肌ラボ 極潤ヒアルロン液の詰め替え用には、何mLが入っていますか?
  • LN211E8は、どのようなhiPSCの分化において、どのように作用しますか?

まとめ

今回のコンペでは、static-embedding-japaneseを活用したことで、高速かつ安全に高精度な検索システムを実現できました。特に、OpenAI APIと比較してもレスポンス速度の面で大きなアドバンテージが得られた点は大きな成果です。

開催いただいた株式会社Galirage様、協賛のロート製薬株式会社様、ありがとうございました!

Discussion