Closed4

Weaviateでハイブリッド検索を試してみる(旧)

kun432kun432

2024/10/14追記

この記事はもう古いので、Weaviateのハイブリッド検索については以下の記事を参照(その記事ももはや古いのだが・・・)

https://zenn.dev/kun432/scraps/e42395634783bc

あと、Weaviateについては、個人的な印象・経験則だと、一般的なベクトルデータベースとは異なる設計思想になっているので、やや学習コストが高い、というか、発想の転換が必要だと思う(Pineconeとか他のベクトルDBの経験があるほど、それに引きずられそう、自分はそうだった)。
以下に、複数のWeaviate試してみた記事のインデックスを用意したので、そちらを参考にしたほうがいいかもしれない。

https://zenn.dev/kun432/scraps/56fcb57ae0a5de

追記ここまで


経緯はここ

https://zenn.dev/kun432/scraps/927885cd23d085

Pineconeのハイブリッド検索、ちょっとまだ頭の生理ができてないので、一旦Weaviateも試してみる。以下の記事をざっと見た感じ、実装は比較的シンプルに思えるし、日本語で試されているというのもちょっと期待できる気がしたので。

https://weaviate.io/developers/weaviate/quickstart

https://qiita.com/hosaka_/items/1e2fc8e6263f95024609

前提

kun432kun432

まずは公式のQuickstartに従って進めてみたのだけど、ちょっとピンとこなかった。

https://weaviate.io/developers/weaviate/quickstart

https://weaviate.io/developers/wcs/quickstart

何が難しいかというと、

  • WeaviateではベクトルDBに登録するデータのスキーマをまず作成する。スキーマを作ることはわかるんだけど、これがベクトル検索においてどう活用されるのか?がよくわからない
  • 一般的なベクトルDBではベクトル変換「後」の埋め込みをベクトルDBに追加するが、Weaviateではモジュールを使うと、データを追加すればWeaviate側でベクトル変換してくれる。これ自体はすごいなと思うんだけど、まずはシンプルにやりたい。
  • これらを踏まえて、チュートリアルの実例を見てみたけどもどうもピンとこない

という感じで、難しーなー、みたいなことを呟いてみた。

https://twitter.com/kun432/status/1703761876562104791

そしたらweaviateの中の人がコメントくれたので、もう少し今どきのLLMで実装するようなシンプルなRAGの例が欲しいということを伝えたら、まだ公開前のチュートリアルのリンクを教えてくれた。

https://twitter.com/_jphwang/status/1704036838690680916

ということで、Quickstartも踏まえつつ、こちらのチュートリアルを進めてみる。

https://weaviate.io/developers/weaviate/starter-guides/generative

kun432kun432

全然気づいてなかったけど、こんな記事が。

https://weaviate.io/blog/weaviate-non-english-languages

Weaviateを英語以外の言語で使用する際の現在の制限事項

ご覧いただいたように、Weaviate ベクターデータベースは、英語以外の言語でもセマンティック検索やジェネレーティブ検索のアプリケーションに使用することができます。しかし、現在のところ、英語以外の言語に対する公式なサポート/ポリシーがないため、いくつかの制限があります。

この制限は主にWeaviateのキーワードベース検索機能BM25に影響します。つまり、英語以外の言語、特に Unicode エンコーディングを必要とする言語では、BM25 検索はエラーを返します。

この制限はWeaviateのハイブリッド検索機能にも影響します。ハイブリッド検索クエリを実行してもエラーは発生しませんが、alpha != 0 のハイブリッド検索クエリはすべて、純粋なセマンティック検索と同じ結果を返します。alpha = 0 のハイブリッド検索(純粋なキーワードベース検索)は、空の結果リストを返します。

そう、トークナイザーが対応してなかったので、ハイブリッドは動かなかったはずなんだよね。

お分かりのように、Weaviateは現在、英語以外の言語を完全にサポートしていません。しかし、将来的には他の言語もサポートしたいと考えています。現在、日本語と中国語のトークナイザーの実装を試しています。英語以外の言語サポートの追加に貢献することに興味がある方は、Slackでご連絡ください。

なんと!で、リンクされているGitHubのPRを見てみるとすでにマージされている。

https://github.com/weaviate/weaviate/pull/4028

PR見てると、日本語の場合は、

  • トリグラム
  • gse (Go製のトークナイザーっぽい)

が使える様子。で使い方がわからないなと思って探してみたけど、上記のPRはv1.24.0でマージされていて、同じ対応でDockerイメージを修正するPRの方を見ると、"USE_GSE=True"を環境変数で設定すれば有効になるってことなのかしら?

https://github.com/weaviate/weaviate/releases/tag/v1.24.0

https://github.com/weaviate/weaviate/blob/86e0e9331b623696aaad39016289ec54140bcb4a/adapters/repos/db/helpers/tokenizer.go#L43-L58

ちょっと後で試してみたい。

kun432kun432

ハイブリッド検索についてはこちらでまとめている。ちょっとキーワード検索時のスコアのバグを見つけてしまったけども、日本語に対応したトークナイザーを使ったキーワード検索およびハイブリッド検索自体はおそらく問題なく動作していると思われる。

https://zenn.dev/kun432/scraps/e42395634783bc

それ以外に、Weaviateの基本的な機能について全10回に分けてまとめている。他のベクトルDBを触ったことがあると、少し思想が違う感を受けると思うのでわかりにくさを感じるかもしれない(自分もその一人)が、それを踏まえて記載しているので、参考になれば。

このスクラップは2024/03/18にクローズされました