You’re in!
ウェビナー
スパース埋め込みとデンス埋め込みの探求:Milvusによる効果的な情報検索ガイド
さて、本日は「Sparse and Dense Embeddings」を探求する本日のセッションをご紹介できることを嬉しく思います。そしてゲストスピーカーはFrank Liuさんです。FrankはzillsのOperationsディレクターであり、AIおよびMLの責任者です。FrankはYahooでMLソフトウェアエンジニアとして働いていました。彼のMLへの情熱は職場の外にも広がっています。
自由時間には、MLモデルを訓練し、独自のアーキテクチャを実験しています。FrankはStanford Universityで電気工学のBSおよびMSの学位を取得しています。それではFrank、ようこそ。ありがとうございます、Christie。ご紹介に感謝します。
ええと、本日は皆さんに、えー、私のsparse and dense embeddingsについてのとりとめのない話を聞きに来ていただき、ありがとうございます。特に、実際に私の前回のウェビナーに来てくださった方々には、たぶん1か月ほど前だったと思います。あの回は純粋にdense embeddingsについて、よりembeddingsの入門的な内容でした。なぜそれらが重要なのか? ええと、つまり、Vector databaseの中でそれらをどのように使える可能性があるのか? そして注意すべき点、たとえば落とし穴、えー、適切なembedding modelの選び方、などなどです。そして今日の、えー、今日のウェビナー、今日の講演は、その延長線上にあるものになります。ええと、sparse embeddingsとdense embeddingsについて少し話したいと思います。そしてこれは、Zillow'sとMelvaの両方にとって、本当に、本当にエキサイティングな時期です。というのも、Mils 2.
4のリリースにより、過去に何度も実演してきたようなdense vector searchだけでなく、sparseに加えてdense、えー、今日の人々や皆さんがhybrid searchと呼ぶものも実行できるようになったからです。ということで、改めて皆さんようこそ。えー、ご参加いただき本当にありがとうございます。それでは早速始めましょう。まず、皆さんに簡単なおさらいをしたいと思います。ここにはvector searchにかなり新しい方、vector databasesや特にsparse vectorsにもかなり新しい方がいらっしゃることを知っています。えー、そして本題に入る前に、動機についてごくごく簡単に少し話したいと思います。
実際、考えてみると、vectorsは、非構造化データを解き放つものです。えー、私たちはしばしばこれらのembedding modelsについて話します。これらのdense embedding modelsと、それらを使って本当に、本当に豊かなsemantic searchを行う能力について話します。documentsだけでなく、images、video、audioのようなものに対してもです。そしていったんそれらのvectorsを得たら、それらをzills CloudやVissのようなvector databaseの中に保存し、本当に、本当に大規模なapproximate nearest neighbor searchを行うことができます。そして各vectorは、入力データの優れた表現です。
そうですね。ではここで少し進むと、えー、前回のウェビナーに参加された方は、実はこのスライドを特に覚えているかもしれません。これは、えー、今では少し古いですが、考え方はまだ同じだと思います。つまり、embedding modelsは本当に働き者であり、これはhugging phase上のLAMA twoのダウンロード数と、all, all mini LL six V twoと呼ばれる、かなり人気はあるものの少し古いsentence transformer modelのダウンロード数の比較です。そして、つまり、思うに、このembedding modelの5 millionと、えー、LAMA two seven Bの約800,000という、モデル数の点で本当に、本当に際立った対比がありますよね? ですので、これはembedding modelsへの関心が非常に高いことを示していると思います。
それは至るところで使われています。そして私たちにとって重要なのは、dense embeddingsがどのように機能するかだけでなく、sparse embeddingsがどのように機能するかも理解できることです。どのような場合にそれらを使いたいと思うのか? そして最もエキサイティングで、最も関連性が高いと思うのは、えー、それらをNovus 2. 4の中でどのように使えるかということです。ではそこから進めると、えー、embedding modelsはたくさんあります。
繰り返しになりますが、これは私が取り上げた前回のウェビナーのスライドで、そこで扱った内容の一部を皆さんに手短におさらいしてもらうためのものです。まだそのプレゼンテーションを確認する時間がなかった場合に備えて、ですね。ええと、それから、これらの dense embeddings を可視化する方法もたくさんあります。これは Arises Phoenix Library のものです。データの分布や分布の変化を理解したり、個々の embeddings を見て、どの特定のクラスターが少し問題になっているのかを把握したりするのに、とても優れたツールです。しかしこれは、dense embeddings がこの高次元空間で実際にどのように見えるのかを示す、非常に良い例です。少なくとも 3 次元を占有しています。
ええと、これは、つまり次元削減して 3 次元にしたものです。それらは、つまり、この高次元空間内の本当に任意の点を占有できます。そしてそれこそが dense embeddings の背後にある考え方全体です。ええと、それから、こうした dense embeddings を生成する方法もたくさんあります。リカレントニューラルネットワークは、その選択肢の 1 つです。
ええと、sentence BERT もあります。2 つの文を取り、コサイン類似度で比較できるという考え方です。そしてこれは特に combined coder です。個々のテキストごとに 1 つの embedding を与えてくれます。あるいは、それは短い文かもしれませんし、使用している BERT モデルのトークン長によっては、より長い形式のドキュメントかもしれません。そして実際、これらの dense embeddings が得られると、それらを生成し、Vector database の中に保存し、それら全体に対して検索、つまりセマンティック検索を行えるようになるのは、本当に非常に便利です。そしてそれが、世の中にあるセマンティック検索を活用する多くのアプリケーションの基盤です。Retrieval, augmented generation、つまり、プロンプトに一致するドキュメントを見つけ、それらのプロンプトを取り出して挿入し、それらを大規模言語モデルに挿入する、ということですね。ええと、パーソナライズ検索やレコメンデーションのようなものも、すべてテキストと embedding モデルで実現できます。
しかし今日は、本題である sparse embeddings に進みたいと思います。sparse embeddings は新しいトピックではありません。かなり長い間存在してきましたし、実際、dense embeddings を補完するものでもあると私は思っています。その点についても、このセッションの後半で少し説明します。しかし sparse embeddings の背後にある全体的な考え方は、dense embeddings では、持っているすべての次元、たとえば 768 次元があるとすると、すべての次元に非ゼロの値がある、というものです。ゼロ値を持つ次元がいくつかあるかもしれませんし、あるいは、たとえば value activated dense embeddings を使うなら、その値の半分くらいはゼロになるかもしれません。
しかし、それでもなお、それらの値の大多数は非ゼロになります。つまり、それらには何らかの値があります。それが dense embeddings の基本的な考え方です。一方で sparse embeddings では、たとえば、はるかに高い次元数を持つことがあります。たとえば 10,000、20,000、場合によっては 50,000 次元さえ持つかもしれません。しかし sparse embeddings と dense embeddings の大きな違いは、それらの次元のうち実際に活性化されるものが非常に、非常に少ないということです。
それらの次元のうち、実際に非ゼロであるものは非常に少ないのです。そしてそれこそが sparse embeddings の背後にある考え方全体です。これから、それらの違いのようなものや、これらの sparse embeddings をどのように生成できるのかについても、少し掘り下げていきます。ただ、まず言っておきたいのは、dense embeddings は優れています。素晴らしいものです。ええと、これらのさまざまな embedding モデルを使うことができます。
それらは、あなたのために非常に優れた高密度埋め込みを生成し、あなたがベクトルデータベースで使えるようにします。では、なぜスパース埋め込みが必要なのでしょうか?なぜそれに関心があるのでしょうか?その理由は、高密度埋め込みには語彙情報が欠けているからです。入力データのセマンティクスを理解したり、その背後にある意図、ええと、たとえばあなたの文やプロンプトを理解したりするのは得意ですが、そのキーワード情報が欠けています。それが欠けているのです。多くのアプリケーションが本当に本当に必要とし、要求することが多い情報が欠けています。その例をいくつか挙げましょう。検索について話すとき、つまり、あなたがどのように物事を検索するかを想像してみてください。
たとえば Google で、ええと、あるいは Bing で、私たちが実際にしていることは検索と呼びましょう。私たちはキーワード検索をしているのです。その例をいくつか挙げます。今日よくある Google 検索にはこうしたものがあります。ええと、rub rubrics cube A、キューブを解くためのアルゴリズムは何か?1ポートには何カップあるのか?ネクタイの結び方。これらはすべて、Google 検索に関しては、私たちは皆非常に、非常にキーワード中心です。そして検索全般に関しても、ええと、もしこれらのキーワードがなければ、もしこれらの、つまり、検索しようとしているものを説明するための名詞や形容詞がなければ、たとえば、Ruby's cube algorithm の代わりに、どうやってそれを解けばいいのか、と言うかもしれません。
たとえば、3×3×3の回転可能なキューブをどう解けばいいのか、のように言うかもしれません。そんな感じです。その場合は、はい、セマンティック検索や純粋な高密度検索のほうがはるかにはるかに優れているでしょう。しかし今日、多くの場合、ええと、私たちはキーワード語彙検索に慣れており、まさにそこにスパースベクトルが登場するのです。つまり、ベクトルデータベース、ええと、現在の nobis のようなベクトルデータベースは、高密度ベクトルをサポートするだけでなく、スパースベクトルもサポートしており、語彙検索とセマンティック検索の優れた組み合わせを本当に提供します。そして繰り返しになりますが、すでに述べたように、キーワードは Google 検索だけでなく、今日の検索全般においても非常に非常に重要な役割を果たしています。非常に、非常にキーワードベースなのです。ここですでにいくつか例を挙げましたが、ええと、これで私がここで言おうとしていることの全体的なイメージが伝わればと思います。ええと、結局のところ語彙検索は、ドメイン外データに対して本当に本当に優れています。
たとえば法的文書で訓練された埋め込みモデルがあるとします。ええと、しかし突然、大量の金融文書が入力データとして入ってき始めたとします。そのとき、つまり、そのときこそ語彙検索、すなわち T-F-I-E-F や BM 25 のようなキーワードベース検索のスパースベクトルが、私が持っているその高密度埋め込みモデルを本当に本当に上回ることになります。単純に、その高密度埋め込みモデルは、私が最初に持っていたデータで訓練されていなかったからです。さて先に進むと、スパース埋め込みと高密度埋め込みを組み合わせる方法もたくさんあります。ええと、その方法の一つは単純な加重平均ですが、今日よく使われる別のものとして reciprocal rank fusion、RRF と呼ばれるものがあると思います。ええと、reciprocal rank fusion について、ここでは詳細にはあまり入りませんが、考え方としては、2つの異なる、つまり、ここではたとえば、ええと、bm があり、文書をランク付けする3つの異なる方法があります。タイトルブースティング付きの BM 25、BM 20 コンテンツブースティング、そしてそれらの高密度ベクトルによるセマンティック検索があります。
そしてRFは、単に、あなたが異なる、ええと、ランキング方法に基づいて各ドキュメントの重要度をランク付けできるようにするための方法ですよね?そしてそれは、ええ、つまり、情報検索で一般的に使われる手法で、ええ、テキスト検索だけでなく、情報検索の他のモダリティにも使われます。そして繰り返しますが、スパース埋め込みとデンス埋め込みを組み合わせる方法は本当にたくさんあります。ええ、加重平均は、私がすでに述べた別のシンプルな方法です。ええ、たとえばT-F-I-D-FまたはBM 25のスパースベクトルのスコアがあり、デンスベクトルのスコアがある場合、単純に、デンスベクトル、ええ、またはデンス埋め込みにたとえば0.6の重みを付け、スパースベクトルに0.
4の重みを付けて、ええ、それらを足し合わせる、と言うことができます。はい、それが一つのやり方ですよね?ええと、それからRFはもう一つの方法で、世の中には他にも本当にたくさんの方法がありますが、今日はそれらすべてには立ち入りません。ええ、私がRFに言及した理由は、ええと、少し後でMO 2.4におけるスパース・デンスベクトル検索をデモするときにそれを使うからです。ですので、ぜひ楽しみにしていてください。
ええ、それから、スパース埋め込みと埋め込みを生成するためのいくつかのアルゴリズムについて、ごくごく簡単に説明したいと思います。ええ、すでにいくつか言及しましたが、今日はおそらく最も重要だと私が考える2つについてだけ説明したいと思います。ええ、少なくとも最も関連性の高いものです、ええ、あるいは、つまり、これらから派生したアルゴリズムはたくさんありますが、ええ、これらはかなりよく知られている部類です。ええと、そして、つまり、それらは、こうした他の多くのスパース埋め込みアルゴリズムを理解する助けにもなります。そして最初は、私が純粋な語彙的スパース埋め込みと呼びたいものです。
つまりT-F-I-D-Fのようなものです。T-F-I-D-Fについて、ここに少し見た目の派手な方程式をいくつか示します。実際には、構成要素は2つだけです。1つ目の構成要素は、用語頻度の構成要素で、2つ目の構成要素は、逆文書頻度です。ええと、派手に聞こえるのは分かりますが、心配はいりません。用語頻度とは、特定の用語がドキュメント内に出現する回数を意味し、逆文書頻度とは、その用語が私のコーパス内のすべてのドキュメントに出現する回数、またはその逆数を意味します。
ですので繰り返しますが、この方程式は少し変に見えるかもしれませんし、少し派手に見えるかもしれませんが、これについて例を見ていきます。ええと、後ほどのデモで3つのシンプルなドキュメントを用意し、A-T-F-I-D-Fベクトル化を使います。そうすると、それらのベクトルがどのように見えるかを確認でき、その後そこから進めていきます。それから、私が学習済みスパース埋め込みと呼びたいものもあります。そして、学習済みというのは、つまり、少し、ええ、つまり、それは、それは、それは、それは、学習済みであると同時に、それほどクールではない、という言い方のほうが適切だと思います。そしてこれは特に、ええ、表現です。
これは実際にZillowのエンジニアの一人による、splayedの良い図またはダイアグラムです。そしてsplayedは、学習済みスパースイベントと考えることができるものです。splayedの背後にある考え方は、もし覚えていれば、ええ、前回のウェビナーでBertについて話したとき、Bert、ええ、はマスク言語モデリングと呼ばれるもので訓練されています。つまり実際には、各トークン、各位置で、そのトークンに何が入り得るかの確率分布を出力します。では、この例をかなり詳しく見ていきましょう、いいですね?この場合、私は文、Novus is a vector database built for scale similarity searchをburdenモデルに入力しています。そしてそのburdenモデルの出力は、実際には単一のトークンだけではありません。
そうではなく、つまり、実際には、実際には異なるトークン全体にわたる分布です。たとえば、ええと、つまり、たとえば構築されたベクトルデータベース、ええと、構築された、例としてこの単語を取り上げましょう、そうですよね?ええと、built という単語に加えて、created である可能性もあります、つまり、それも Burt モデルが私に与える別の可能性です。さて、この場合に私がすることは、今度は created を取り出します。すると、それには、少しスコアが割り当てられています。最後に私の語彙全体にわたってそれを集計し、それが最終的に私のスパースベクトルになります。ですからここで分かるように、これは単に純粋な語彙的キーワード検索を与えているだけではなく、少し用語拡張も行っています。
つまり、この場合、build という用語を拡張しています。実際には build だけでなく、これら残りのトークンもそうしています。私はそれらすべてのトークンを拡張し、そのスライドに潜在的に何が含まれている可能性があるかについて、より多くの情報を与えています。これは本当に非常に重要な違いの一つです、そうですよね?まあ、それが私がそれを learned sparse と呼ぶ理由であり、Ben、なぜなら、それは built に似た他の用語で、その特定のスロットにも入り得るものを与えてくれるからです。そしてそれが、その、ええと、それが、それが、なぜ splayed のようなモデルや、そして、これら他の learned smarts や embeddings が非常に強力なのかという理由です。なぜなら、それらはあなたに lala と、ある種の少しの意味的表現の両方を与えてくれるからです、そうですよね?元の tenure の背後にある意味を少し与えてくれます。では先に進んで、ええと、スパースベクトルの話題で Colbert two について、つまり、非常に、非常に簡単に話したいと思います。
Colbert はスパース埋め込みモデルではありません。ええと、実際には私は、Colbert は単独のモデルではないと主張します。実際には、情報検索を行う方法のようなものです。しかし Kohlberg に言及したい理由は、今日非常に人気があるからです。ええと、そしてそれは実際に、ええと、つまり、あなたの検索、あなたの、検索や検索ソリューションを拡張できる方法の一つです。
つまりベクトル、あなたのデータベースです。スパース埋め込みについて、密埋め込みについて、そしてベクトルデータベースについて話すにあたって、少しだけ立ち戻りたいと思います。以前、つまり、ベクトルデータベースを見たとき、それらは一つのベクトルをサポートしていましたよね?そして一つのベクトルは一つのベクトルデータの断片に対応します。素晴らしいですよね?つまり、その上で近似標準検索を行えますし、ええと、その上でフィルタ付き検索を行えますし、ええと、それは submit search recognition などなどを行うための本当に素晴らしい方法になります。しかしスパースベクトルの導入により、私たちは「ねえ、語彙検索もできる機能を提供しています」と言っているだけではなく、マルチベクトル検索と呼ばれるものを行う機能も導入しています。
つまり、一つの、つまり、一つのドキュメントまたは一つの非構造化データの断片に対して、複数のベクトルを関連付けることができます。そしてそれこそが、本当に、それこそが私が Colbert について非常に、非常に簡単に話したい理由です。たとえ、たとえそれが実際にはスパース、ええと、スパースベクトルとは何の関係もないとしても、ええと、このプレゼンテーションでは。そして覚えているなら、もし、つまり、Burt の例に戻ると、二つの文を比較する方法の一つは、両方の文を取り出して、それらを separator token とともに Burt モデルに入れることです、そうですよね?そしてその出力に対して、次に、ええと、つまり、その上に fully connected layer を置き、その上に dense layer を置きます。そしてその出力は、ええと、スコアになります、つまり、0 と 1 の間、ええと、または negative level と 1 の間、あるいは何でも望むものです。それはスコアになりますが、これは、ええと、最近傍データ検索を行うには本当に、本当に非効率な方法です。通常、この種の方法は、ええと、re-ranking が何であるかを知らない人たちのために言うと、reuniting を行うために使われます。
ええと、要するに、私のトップkが得られたら、トップ100の、ええと、PCの非構造化データが得られたら、それらを再ランク付けして、たとえばトップ10、あるいはトップ20を取り出す、ということです。ええと、そしてそれが、それが本当に最も関連性の高い結果を与えてくれるわけですよね?それが再ランキングです。さて、ある意味では、伝統的または素朴なやり方として考えられるのですが、そう考えると、非常に非常に高コストです。クエリを、私のすべてのドキュメントと比較しなければならないわけです。つまり、この巨大な推論パスをBertに通すのです。特にドキュメントが非常に長い場合は、ええと、トランスフォーマー、つまりトランスフォーマーのエンコーダーとデコーダーは、入力されるトークン数に対して二次関数的に増えるため、非常に長い時間がかかることになり、つまり、時間がかかり、計算量も多くなります。
そしてそこにColbertが登場して、本当に、必ずしも問題を解決すると言うわけではありませんが、はるかに、はるかに、再ランキングを行う速度、結果のようなものを得る速度を本当に改善し、大幅に改善してくれます。Colbertの背後にある考え方は、クエリがあり、ドキュメントもあるのですが、今私がやっているのは、各トークンごとに、各出力埋め込み、つまり各出力トークンごとに、文の埋め込みではなく、あるいは、ええと、長文の埋め込みではなく、各トークン埋め込みごとに、最大類似度スコアを計算するということです。それを、ドキュメント内で得られるすべての埋め込みとも比較するわけです、そうですよね?そしてそれらをすべて合計するとスコアになります。つまり、もし私のクエリの、それらすべてのトークンが、たとえばドキュメント内の1つまたは複数のトークンに非常に関連しているなら、おそらく、非常に非常に強い一致があるということです。これが、ええと、これが、これがColbertが活用して本当に本当にしっかりしたサイトを提供する、この種の、ええと、パラダイムです。
さて、改めて強調したいのですが、Colbertはスパース埋め込みモデルではありません。Cobertは結局のところBertを活用しています。それは、ええと、それは実際には、密埋め込みモデル以上のものです。実際には、そう考えるなら、マルチベクトル密埋め込みモデルです。クエリとドキュメントは、もはや単一の埋め込みで表現されません。
それらは今や複数のトークン埋め込みで表現されています。場合によっては、多数、数百のトークン、数百、数千のトークン埋め込みで表現されることもあります。ドキュメントのサイズとクエリのサイズによります。しかし、私たちはパラダイムへ移行しており、つまり、単なる密ベクトルだけでなく、スパースと密ベクトルの組み合わせだけでもなく、よりマルチベクトルなソリューションの方向へ移行しているため、Kohlbergについて、そしてNovusにとっての未来がどのようになり得るかについても、非常に簡単に話すのに良いタイミングだと思いました、そうですよね?というわけで、繰り返しますが、この内容のどれについてでも質問があれば、遠慮なく、ええと、それらをチャットに、に、ええと、チャットに入れてください。ええと、そして、順に取り上げます。
このプレゼンテーションの終盤に向けて、ですが今はデモの時間です。ええと、みなさん、すみません。ちょっとの間、落ちてしまいました。ではスライドに戻ります。はい、皆さんこれ見えていますか、Christy、見えますか?はい。
はい、いいですね。改めて、すみません。ここ数日、Wi-Fiが不安定で、ええと、そんな感じです。では、とにかく、すぐ本題に戻りましょう。BGM threeの背後にある考え方は、多言語対応であるということです。
多機能であり、マルチグラニュラーでもあります。ここで粒度というのは、つまり、その考え方としては、本当に非常に短いフレーズ、短い文、そして非常に非常に長いドキュメントの両方をサポートしているということです。最大で、ええと、ええと、8,000、約8,200トークン長まで対応しています、そうですよね?これがB GM threeの背後にある考え方です。そして、ええと、私が少し余分に、少し余分な時間を特に割いて焦点を当てたいものの1つが、BGSのスパースベクトルです。これは厳密にはsplayedと同じではありませんが、その意味ではsplayed的なものです。
つまり、ええと、実際には、ほら、ある種の、追加の重み項のようなものがあります。それは display と同じものとしてすぐに使われます。実際にはそれらすべてのベクトル、すべての出力トークンに掛けるための追加の重み項があって、それから、それに基づいてビットの総和を行います。なので、私は、私は強調したいのですが、それは display であって、つまり、ええと、splayed とまったく同じではありません、ええ、でも、ええと、ほら、興味のある方のために、この後でその論文へのリンクを少し共有できればと思います。それでは早速入っていきましょう、いいですか?ええと、そして、ほら、ここで共有を停止します。
このノートブックを開きます。そこで私は、つまりこれから、これからやるのは、本当に本当にシンプルな例になります。この特定のデモノートブックで私がやりたいことは、ええと、どのようにできるかを見ていきます、まあ、最初に非常に非常に簡単な T-F-I-D-F の例を見ていきます。そしてその後にやることとして、BGEMthree を使って、ええと、これら3つのドキュメントに対して sparse ベクトルを生成します、まあ、実際には sparse と dense の両方のベクトルを生成します。それらを vus にインデックスして、それから re を行います、Reciprocal RankFusion を使って実際に、ええと、この、ええと、これらすべてのドキュメントに対して、ええと、sparse dense のようなハイブリッド検索を行います。
そうですね?ただそこに行く前に、ええと、T-T-F-I-D-F の簡単な例をやります。このノートブックを通じて、ほら、PI Novas を取得します。そして Pine Novus の最新バージョン、pine Novus 2. 4 の本当に興味深い機能の1つは、私たちがこの model library と呼ぶものが含まれていることで、その model library の中の model では、このライブラリを使ってマシン上で直接 inference を実行できます。つまり実際には、例えば、ええと、ほら、それは、それは、それは本質的に一般的に使われるモデルのラッパーであり、Python だけから本当に、ええと、ほら、embeddings を生成し、それらを VIS に挿入して、楽しく使える機能を提供します。second learn を使えます。
Second learn にはその中に TFID effect rise が、ええと、あります。ええと、そしてそれから私たちは、ほら、これから、私たちはまずこれら3つのドキュメント上で T-F-I-D-F sparse ベクトルを計算します。なので私がやるのは、これから、これから、これからまずそれを実行します。また、すべての import をここで1つの大きな import として行います。そして、ほら、これらはすでに全部あるので、これがかなり速く、かなり効率的に実行されるのがわかるでしょう。
最初に私がやることは、A-T-F-I-D、T-F-I-D-D effect T を作成することで、それからそこから私がやるのは、実際にそれを docs に fit して、さらに transform することです。なので X equals、like、transformdocs とできて、それが私に与えてくれるものは、x は実際には、そして実際には、もし、oops、こうした方が簡単かもしれませんが、X は今や 3 by 27 の sparse matrix です、そうですね?で、それは実際にはどういう意味でしょうか?最初に皆さんにお見せするのは、ええと、ある種の、ここでそのいわゆる feature names を取得します。ここで起きていることは、これらの tokens すべて、私たちの docs にあるすべての tokens が今や表現されていて、ほら、それは、それは今や dictionary の一部、この TFID of VECTORIZE dictionary の一部になっているということです。なので、最初の文にある 1956 が含まれているのがわかります、ええ、それから England も含まれています、ええと、ここですね、それは最後の文にあります。ええ、また例えば born も含まれています、それは最後の文にあります、ええと、失礼、最後のドキュメントです。
どこ、あれはどこだっけ?ここです。そこで、私はすべてのトークン、すべてのドキュメント全体に現れるすべての単語を取り出し、それに基づいて語彙を生成します、あるいは失礼、生成された TFID ベクトルに基づいて、ということです。そこから、今度は実際に x の dense vector representation も出力します。x は、繰り返しになりますが、sparse vectors です。これは sparse で、私の 3 つすべてのドキュメントの sparse vector representation です。そして、ここで最初のものに注目していただきたいと思います。皆さんにお見せしたいですし、今日この webinar に参加している方々に、これらのベクトル、あるいはこれらの値が実際に何を意味しているのかをお見せしたいと思います。
では 1956 ですね?これはこれらすべての docs 全体で一度だけ現れ、しかも最初の文にだけ現れます。なので実際には、そのために、いわば quote-unquote 高いスコアが生成されています。ここで最後の値を見ると、これは was で、was は実際には最初の文、この最初の document だけでなく、2 番目と 3 番目の documents にもあります。ですから、これは実際にはより一般的な term であり、複数の documents に現れるため、TF audio vector によってより低いスコアが割り当てられますよね?つまり、たとえそれが、たとえそれが、これらすべての documents に一度ずつ現れているとしても、全体の corporate を通して見ると、より一般的に現れているように見えます。だから、より低い重みが与えられるのです。
そして、これを他の documents にも同様に外挿できますよね?つまり、繰り返しになりますが、私はこの sparse vector set を dense vectors として表現しました。そして、これらは、それぞれの個別の値が何であるかについての、本当に良い高レベルの説明になっています。いいですか?これで TFID fizer は片付きました。えー、次に私がやりたいのは、これもまたかなり特別なことです。そこで、使っていきます。ここで BGM three について非常に簡単に話しましたね。私がやりたいのは、BGM three を使って sparse と dense vectors を生成することです。
それらを vis に入れて、ここでは同じ documents を使いますよね?えー、そして繰り返しになりますが、3 つの documents だけを使っているのは、BGM three が少し重いからです。私はかなり、そうですね、少し古い laptop を使っていて、これにあまりにも時間がかかってほしくないんです。なので、これからやるのは、先ほど述べたように、BGM three を使い、これらの vectors を生成し、insert wheels が必要になります。とてもクールです。でもその前に、まず query vector を作成します。
私の query は、えー、query research になります。これが私の query ですね?えー、これからやることは、この query をこの hybrids bartan search でこれら 3 つの documents と照合し、最終的に最も関連性の高いものを取得できることを期待します。さて、ここでやることは、えー、Pines の最新バージョンの model capabilities についてごく簡単に話しました。そこで、それがどのようなものかを皆さんにお見せするために、おっと、最新バージョンの 2. 4 0.
0 を使っています。さて、VUS 2. 4 0. 0 は sparse と dense vector の両方もサポートしています。したがって、これらの両方が自分の machine で利用可能であることを確認したいところです。
私の machine 上では、Nova standalone の instance がすでに起動して実行されています。繰り返しになりますが、これは 2. 4 なので、このバージョンの client Nova で問題なく接続できるはずです。これからやるのは、えー、bg e embedding function と呼ばれるものを作成することです。そして実際にここに行って、embedding function と言って、それから、えー、1716 をやります。
これは false です。なので、昔ながらの、えー、えー、32 bit floats を使います。そして device full と言いたいです。これを行う理由は、この machine に GP がないからです。えー、物事もかなりシンプルにしておきたいんです。そして、dense vectors の dimensionality も確認できます。
はい。ええと、見てみましょう、それがどんな感じになるか見てみましょう。なので繰り返しになりますが、これを以前に使ったことがあるかどうかによって、実際には必要なファイルを取得しに行きます。必要なtorch、ええと、必要なtorchモデルをHugging Faceから直接取得します。なぜなら私はすでにそれをやっているからです。この場合は動作します。
ええと、問題ありません。そして実際にそれがどんなものか見てみることができます。なので10 24、かなり最近ですね。ではそれを消しましょう。これからやることは、実際にこのembedding関数を使う、またはこのCFを使ってembeddingを計算することです。ではdocs embeddingsをやりましょう。
おっと、はい、docsです。cfでquery embeddingsをやります。そしてクエリは1つだけなので、まずリストに入れて、それからembedding関数に渡します。ではこれをすぐに実行します。ええと、思っていたよりずっと速いですね。
なので、うーん、おそらくもっと多くのdocsをそこに追加できたと思います。でもdosとpenningsが潜在的にどんな見た目なのか、かなり素早く見てみることができます。そして繰り返しになりますが、これは、ほら、それが表示されて、今これらのdents embeddingsがありますよね、ということを示しています。それらは、このliで、私は3つのドキュメントを持っているので、3つの異なるBens embeddingsを生成しましたし、これらのsparse embeddingもあります。さて、これが本当に本当にクールな点で、この、ええと、このモデルだけでなく、私が知る限り、これは新しいモデル機能でもありますよね?これらを非常に非常に簡単に、Python interviewの快適な環境から、自分のラップトップ上でオンデマンドに生成できます。なのでここから、ほら、私たちの語彙は実際かなり大きいことがわかります。ええと、そして私たちがやったことは、今、flow 30 twosを持つ三by二50Kのsparse arrayを生成した、ということです。そこには43個のstored elementsがあるのが見えますし、これはsparse、ええと、sparse growth formatを圧縮できます。
さて、ここで上のほうでやったような同じこと、つまり、ほら、too denseを呼ぶようなことはしません。それはおそらく少し多すぎるでしょう。ええと、要素数が非常に多くなります。先ほど述べたように、非ゼロは非常に非常に少ないだけです。でもこのsparse vectorsのまま進めていき、そこから進みます。そして、これらのsmart vectors side wheelsを使うのが、うーん、ええと、本当にどれほど簡単かをお見せします。そこから、私は、BIVのコピー&ペーストをします。
ええと、これは、これは何をしているかというと、ええと、Novusに詳しく、ZE Cloudに詳しい方々向けです。ほとんどの方がそうだと期待していますが、うーん、もし詳しくない方がいれば、ぜひzi. com/cloudに行ってください。インスタンスを立ち上げて、いろいろ試してみてください。あるいは繰り返しになりますが、SPR vectorsに興味があるなら、mobiles 2. 4をダウンロードし、ええと、そのversionまたはcluster versionをダウンロードして、うーん、いろいろ触ってみてください、ということです。ここで私がやることは、必要なimportはすでに全部済ませてあります。なのでconnectionsはすでにimport済みです。
ラップトップ上のMoses moneyのローカルインスタンスに、ええと、接続します。うまくいくといいのですが。はい、うまくいきました。そしてここから、ええと、実際にはかなりあります。なので、すでにある程度事前に入力してあります。うーん、実際にはいくつかのfieldsを生成します、または、失礼、schemaを生成します。
この場合の私のschemaは実際にはDOCで構成されていて、ええと、primary keyを弱めるものです。元のtextで構成されていますよね?つまり、元のdocumentもvector databaseの中に保存しています。これは主に簡単にするためにやっています。そうすれば、ほら、元のembeddingsのために別のdata storeに戻って参照する必要がなくなります。そしてsparse vectorとdense vectorも保存しています。さて、本当に本当に重要なことが一つ、いやいくつかあります。VUS 2. 4の中に新しいdata typeを導入しました。sparse float Vectorと呼ばれるものです。そうですね?そしてこれこそが本当に使いたいdata、data typeです。ですが今後、実際にはこれら両方にindexを作成できることがわかるでしょう。
さて、これらのフィールドを使って、コレクションのスキーマを定義できます。そして繰り返しになりますが、これはすでにインポート済みです。Collection schema はまさにここで重要です。つまり、これらのフィールドを使って、スキーマを定義できます。そしてそこから、そのスキーマを使って、コレクションを作成できます。この場合は、sparse stems と名付けています。
動くか見てみましょう。問題ありません。ええと、ここから何をするかというと、実際にこれを打ち込んでいきます。そうすれば、少し覚えやすくなると思います。実際には、sparse column と dense column の両方に対してインデックスを作成します。では、sparse index をやってみましょう。
ここで行うのは、2つのことを指定することです。index type と metrics type、つまり metric type も指定します。indextype は、ええと、sparse index と呼ぶことにします。つまりこれは、すべての sparse elements に対して inverted index を構築しているということです。そしてここで metric も指定します。これは inner product にします、はい。ですので、dense vectors に対して inner product metric を使えるように、sparse vectors に対しても inner product metric を使えることが分かります。dense index に何を使うかも指定しておきます。
これは多くの皆さんにとってかなり馴染みのあるものだとよいのですが。ええと、この場合は index type に flat indexing を使います。繰り返しになりますが、その理由は単に、物事をシンプルにしておくためです。ドキュメント数が非常に少ないからです。もし、たとえば大量のドキュメントがある場合、または vector database に大量のベクトルが保存されている場合は、HNSW や BFPQ のようなもの、そのあたりを使うことができます。そこから metric, type を L2 として定義します。
cosign もできます、すみません、cosign も使えます。ええと、何を本当にやりたいかによります。いろいろ試してみるとよいと思います。ええと、そこで行う方法はいろいろあります。そこから実際に、それらすべてに対して、インデックスを作成できますよね? では、ここで定義されている collection を使います。
つまり collection do create index を行い、フィールドが2つあります。まず sparse vector fields で、spars index を使います。つまり基本的には、これを index parameters として指定しています。作成したいのです。dense factor についても同じことをします。うまくいくといいのですが、ええと、ああ、見てみましょう。何か、何か起きました。
ちょっと待ってください、これを本当に手早く確認します。何を間違えているのでしょうか? ああ、おそらく元のコレクションを drop していなかったのかもしれません。見てみます。元のコレクションを drop します。よし、もう一度試しましょう。
今度はうまくいくといいのですが。はい、できました。少し前にうまくいかなかった理由は、このデモをすでにノートブックで実行していたからです。Sparse Dense Demo というコレクションをすでに作成していて、すでに存在していたそれらのインデックスを再作成しようとしていたのです。ですので、繰り返しになりますが、これらのデモを行うたびに、常に新しい環境から始めることを覚えておいてください。教訓ですね。
そこから進むと、コレクションとインデックスを起動して動かすために実際に必要なのは本当にそれだけです。そこから先は実際かなり簡単です。では、これから entity を作成します。挿入する entities を作成します。これらは今は単に docs になります。また、sparse embeddings と dense embeddings にもなります。
なので dots embeddings, sparse dos, beddings dense を行います。これらが entities になります。そして、それらを collection に insert してから flush します。これが行うことは、ここでスキーマを text sparse vector と dense vector として作成・定義したので、これらを受け取り、3つのいわゆる columns を持つ mist にコンパイルする、ということです。
そして、これらすべてを取得して、いま作成したばかりのコレクションに挿入しています。Flush を呼び出すというのは、これを封印するという意味です。なのでここから先は、ええと、基本的には本当に必要なことはほぼこれで全部です。えー、それでこれからやるのは、ここに事前に用意したコードも少しあるので、それをコピー&ペーストして、この、えー、この、えー、このセルの中に入れます。ここでやることは、ええと、これらのパラメータを選択して、つまり、ここで用意したこれらのパラメータに基づいて、えー、えー、ここで実行したこれらのパラメータに基づいて、実際にこれらの aand m 検索リクエストを作成します。
それらは sparse と dense の列にまたがるものになりますよね?そして次にできることとして、実際にこれらをまとめて 1 つの、えー、私たちが sparse dense hybrid search と呼ぶものに結合できます。なのでここでやることは、これもコピー&ペーストします。ここで何が起きているのか、皆さんに正確にお見せします。これらの a n 検索リクエストを使って、それらを hybrid search という新しい関数に追加できます。そしてこの検索は、実際に re-ran it を受け取ります。
さて、ここで私のスライドを覚えていれば、reciprocal rank fusion について話しました。これは本質的には、ドキュメントをランク付けする複数の方法を与え、それらを組み合わせられるようにする方法です。これは information method です。えー、ここでは rank、えー、RF ranker を使います。そして実際に、少しだけ進めて 2 にして、それから output feel を渡します。繰り返しますが、非常に、非常に素早く説明すると、私たちが行ったのは search request を作成したということです。
Search request は実際には sparse と dense の両方の列です。most 2. 4 の中には、ここにこれらの pres があり、えー、それらを、私たちが、定義してあります。そしてこれらの search pres、これらの requests を使って、実際には単に hybrid search を行うだけです。本当にそれだけの簡単なことです。
ではこれを実行して、今度はエラーにならないことを願いましょう。まあ、いや、なっています。何かエラーが出ています。では何が起きているのか見てみましょう。ああ、えー、これは本当に、本当に単純なミスですね。
コレクションをロードするのを忘れていました。ダウンロードして、それからこれを再実行します。うまくいくといいのですが。はい、結果を見てみましょう。なので分かるように、えー、この hybrid search に基づいて、実際に、これは、これは、これはある種返してくれます。
ええと、Alan turn was first burden conductedsubstantial research と言っています。そして ai、えー、が実際に最も近い sense です。これは、つまり、ドキュメントが 3 つしかないとしても、実際にはかなり良いですよね?繰り返しますが、私たちのクエリは who started AI research で、これらが私たちの 3 つのドキュメントです。そして、つまり、これは確かに最も関連性がありますよね?ただこれは、3 つしかないとはいえ、本当にスケーラブルなベクトルデータベースで、このような新しい hybrid sparse and search を使って実現できる素晴らしいことの一例にすぎないと思います。そしてまた、つまり、ベクトルデータベースは単なるベクトルデータベース以上のものになりつつある、という考え方です。そうですよね?それらは retrieval のための search エンジンにもなりつつあり、ええと、さらに広く言えば、テキストだけでなく、他の種類の非構造化データ全体にわたって、本当に、本当に、つまり、複雑な分析を行えるようにする手段にもなっています。ということで、今日のこのセッションで私が話したかったことは以上です。えー、聞いてくださっている皆さんが、えー、私のとりとめのない話と今日のデモを楽しんでくださったことを願っています。
ええと、えー、それから私が発表したスライドについても、今から喜んで質問をお受けします。ええと、Christie、何か、えー、Chat にありますか。はい。最初の簡単なものは、あなたのノートブックへのリンクを共有できますか、というものです。もちろんできます。ええと、つまり、やり方を考えます、これを行う方法を考えます、えー、ウェビナーの少し後に。
はい、もちろんです。そうですね、これは本当に素晴らしい内容でした、Frank。とても多くの情報が短時間で詰まっていました。ええと、私は、T-F-I-D-Fタイプから表示された新しいBG threeまで、スパース埋め込みを生成するためのさまざまなアルゴリズムについてのあなたの説明が本当に気に入りました。ええと、新しいvis、APIもとても気に入りました。これは新しいものですね。
ええと、それから、ええと、ご存じのように、あなたは2つのベクトルとVUS 2. 4を作成しましたが、いくつのベクトルをサポートしているのですか?今は3つだと思います。そうですね、mils Mils 2. 4。Milvusは常に両方、つまりバイナリ、ある種のブーミングベクトルと密ベクトルの両方をサポートしてきました。ですから今回の場合、フローベクトルに加えて、ええと、ある種のleneベクトルまたはバイナリベクトル、どう呼んでもよいですが、それに加えて、スパースベクトルもサポートしています。
つまり今では、3種類の異なるタイプのベクトルをサポートしています。ええと、そして繰り返しますが、スパースベクトルは主にテキストに使われますが、スパースベクトルを採用し始めている他のモダリティもあります。ええと、一般的には、より離散的なモダリティ、たとえば分子検索のようなもの、ええと、もちろん技術検索のようなものはスパースベクトルの恩恵をより受けると思いますが、コンピュータビジョンにも使われているのを見たことがあります。それについてはまだ完全には納得していません。しかし、ええと、sym tech searchや、失礼、electrical tech searchに関しては、スパースベクトルには間違いなく価値があります。
そうですね、そうですね。ですから、私たちは3種類の異なるベクトル、スパース、stents、そしてバイナリをサポートしています。また、各コレクションは、今回のデモで見たように、複数のベクトルを持てるようになりました。ええと、見えている質問として、密埋め込みと密検索の違いは何ですか?はい、密埋め込みとは単にベクトル、または、そうですね、たとえば固定次元性を持つベクトルで、通常は単一のコレクション、単一のモデルに対するものです。ええと、そしてその中には、そうですね、単なる一連の数値があります。
さて、私が密検索について話すとき、私が言っているのは、それらの密ベクトルの大規模なコレクションを使って、自分のクエリベクトルに最も関連性の高いベクトルが何かを見つけることです。つまり、ここに単一のクエリベクトルがあり、そして、たとえばこれらの密ベクトルが1億個あるとします。個々の要素自体は密ベクトルであり、密検索とは、単一の密ベクトルを使って、それを私の1億個の密ベクトルと比較し、最も関連性の高いものを取り出すプロセスです。わかりました。ええと、ここに別の質問が見えたと思います。
ええと、ああ、ええと、これはメタデータについての例だと思います。誰かが、rag docsを定義済みのURLセットと定義済みのPDF docsセットに制約できるサンプルコードを教えてもらえますか、と言っていました。なので、ここで私たちがやっていることとメタデータの違いについて、何か触れてもらえますか、Frank。はい、では、では、では、私たちがやっていることですが、この特定のデモノートブックでは、私が定義したのはこれらのフィールドスキーマで、ええと、これらのフィールドスキーマは単にデータベース内の個々の列です。ただ、field schemaのようなこともできました。metadata zeroと呼びますよね?そしてこれは何らかのデータ型にできます。ええと、たとえばmaxのようなものにできます。
はい。そしてこのメタデータですが、今、私はこのスパースベクトルを持っていて、つまり、これらすべてのドキュメントを持っています。メタデータは、たとえば、ええと、それが由来する本、または元のURL xsが由来するもののようなものにできます。ですから、たとえばH http、そうですね、example. com/uh, alan、おっと、のように見えるものにできます。
それは元のドキュメントがあるURである可能性があります。そうですね、そしてそれは、メタデータについて話し、それらすべてを、たとえばあなたのPDFに関するpostersと組み合わせて使うことについて話すとき、ええと、それこそが私たちが話していることです。ですから、スキーマを構築できるさまざまな方法があります。使用できるフィールドタイプも多数あります。そしてそれらすべてを組み合わせることが、ええと、そこでは非常に優れた方法です。
そして、一部の人が抱く質問としては、この新しい、ええと、この、BGE threeのsparseとdenseで新たにサポートされたものを見たときに、denseだけの場合と比べて、通常どのような精度向上が得られるのか、あるいは、ということだと思います。それは素晴らしい質問です。それは素晴らしい質問です。ええと、データに大きく依存すると言えるでしょう。データに大きく依存します。そして繰り返しになりますが、これは、ええと、少し戻る話だと思います。私の画面がまだ皆さんに見えているといいのですが、私が話していること、つまりここで話していた内容のいくつかに関係します。私たちは、そうですね、keyword searchには大きな価値があると思います。なぜなら、私たちは、ええと、物事が非常に、非常に、非常にkeywordsに支配されている世界に生きているからです。ええと、そして今後もkeywordsに支配され続けると思います。
そしてsparse vectorsが提供する価値は、まず第一に、out of domain dataに非常に適しているということです。つまり、denseな、dense embedding modelがあって、それが、先ほど例に挙げたように、非金融データで学習されている、ええと、あるいは法務データで学習されているけれど、それを別のドメインのデータに適用する場合です。Sparse vectorsはその点で優れていますよね。ええと、非常に、非常に汎化しやすく、そして「やあ、クエリにkeywordがある。うん、ドキュメントにもkeywordがある。ええと、そのドキュメントはおそらくある程度関連していると、私は事実としてわかっている」と言える能力を与えてくれますよね。Sparse vectorsの弱点だと思うところは、ええと、splayedのような、あるいは、あるいはこの、この、あるいは、あるいはbgm three spars vectorsのような、少しsemantic meaningを与えてくれる、こうしたlearned sparse vectorsを使わない限り、最終的には、私は思うのですが、dense vectorsは常に、dense vectorsは常に変化し、改善され続けるということです。
ええと、一方で、こうしたlearned sparse vectorsを使っていない場合、たとえばBM 25を使っている場合、ええと、T-F-I-D-F BM 25を使っている場合、それはほぼstaticです。つまり、そうしたアルゴリズムはinformation retrievalの分野で長い間存在しており、それほど大きく変わっていません。ですから、通常見られる欠点はそこだと思います。つまり、それは、それは、それはトレードオフです。私たち人間が手作業で作り上げたもので、本当に、本当にうまく機能するものと、より良くなり、自分自身の個人的なデータセットに合わせて、そうですね、tuneableになり得る可能性を持つものとの比較です。Sparse vectorsから、あるいはbgeから、ええと、BGM threeを使うことで、どれだけ得られるのか、どれだけ改善が見られるのかを言うのは本当に、本当に難しいです。
しかし、ええと、自分のデータセットでテストするべきだと思いますよね。ええと、そして、それによって得られるさまざまな種類の改善を見るのは、いつも、ええと、いつも興味深いものです。では、Frank、ぱっと思いつく範囲で、dense vectorsだけが必要なのか、どう考えるべきかについて人々にアドバイスするとしたらどうしますか?Sparseとdenseの両方にすべきでしょうか?人々には何を勧めますか?ええと、そうですね、私はこう言います。もし、text dataだけを使っているなら、text-based ragだけを持っているなら、sparseとdenseの両方を使います。もし追加の、そうですね、もし、もし、ええと、少し余分な、ああ、関わってくる追加のopedが多少あることを気にしないなら、ええと、そして当然、当然ながら計算量も少し増えますが、その追加の計算があなたのビジネスや組織にそれほど影響しないのであれば、両方使ってください、ですよね。ええと、決して、まれです。そうですね、少し調整すれば、非常に、非常にまれだとわかると思います。Sparse vectorsが本当にパフォーマンスを損なうことは非常にまれです。
ええと、そして繰り返しますが、その理由は、2つを組み合わせる方法がいくつもあるからですよね?スパースベクトルにより大きく重み付けすることもできますし、密ベクトルにより大きく重み付けすることもできます。自分にとってうまく機能する良い中間点はいつでも見つけられます。いいですか?私がスパースベクトルを避けることを検討する可能性があるのは、ええと、たとえば今日の純粋なモダリティで、連続的なものがある場合です。連続的というのは、つまり、動画や、あるいは音声のようなものです。そう言う理由は、それらをバケット化せずに、何らかの形で分類せずに、スパースベクトルに変換するのが難しいからです。ええと、ImageNetを考えてみると、画像を1000カテゴリに分類しましたが、それは物事を行う方法としてはそれほど高精度とは言えません。
ええと、今では、画像を実際に受け取ってスパースベクトルに変換できるアルゴリズムも存在します。ええと、ただ繰り返しますが、私はそれらをあまり試していません。検索の観点からそれらがどれほど優れているのかは、私は、私は、私はよくわかりません。ええと、しかし確実にスパース、つまりスパースベクトルは、単に、ええと、テキストのモダリティがある場合には非常に有効です。いいですか?そして別の質問が来ました。概念を正しく理解しているなら、スパースベクトルは、キーワードを含む文、いくつかの既製の、領域外の、ええと、またはドメイン外のキーワードを含む文により適している、ということですね。私は、多くの略語や、建物名や事業部名のようなエンティティ名があるエンタープライズ環境で働いています。
スパースベクトルは、単純な既製の、ええと、ベクトルよりも、検索、サーチ、そしてRAGに役立つのでしょうか。まあ、つまり、私はスパースベクトルのほうがさらに役立つと主張しますよね?略語やエンティティ名、建物名があるなら、それらはおそらく、汎用的な埋め込みモデルが非常に、非常に頻繁に見ているものではないでしょう。ええと、特にこれらの非常に、非常にドメイン特化型のものについてはそうです。そしてスパースベクトルを使うと、スパースベクトルは、いわばキーワードをそのまま受け取るので、ええと、スパースベクトルのほうが、より適用しやすいのです。たとえばM 25のようなものを使う場合ですね?それらのほうが、より、より汎化しやすいのです。OpenAIのような事前学習済み埋め込みモデル、ええと、embedding model oh oh threeのようなものがある場合、ええと、あなたは本当にトークナイザに縛られます。つまり、固定語彙を持っているわけです。そしてBM 25やT-F-I-D-Fのようなものでは、ええと、その語彙に関して非常に、非常に柔軟でいられますよね?そしてそれでも望む結果を得ることができます。ちょうど私が、ええと、ええと、この、これらのセルで行ったように、それを正確に再定義するのは、ある意味で簡単です。
つまり、それらのドキュメントを単にfitしてtransformすれば、ええと、そして、それで準備完了です。いいですか?よさそうですね。ええと、これ以上の質問は、ええと、来ていないようです。ええと、ああ、わかりました。誰かが、誰かがちょうど、わかりました。
では質問です。ええと、スパースベクトル検索と密ベクトル検索をどのように組み合わせますか?各検索結果をどのように重み付けしますか?あるいは少なくとも体系的に行うにはどうしますか?これは、素晴らしい質問ですね。それは組み込みで用意されていますが、はい、もう少しそれについて話しましょう。良い質問です。ええと、正直なところ、私はまず加重平均から始めると思います。
ええと、つまり、繰り返しますが、スパースベクトルと密ベクトルがあります。ええと、そこから行う方法はいくつかかなり簡単なものがありますが、RRFはかなり堅実な方法だと思います。ええと、繰り返しますが、それについては、ここ、このスライドで話しています。ええと、Milsのドキュメントを見ると、ランキングに使えるさまざまなもののいくつかが見られるでしょう。何が最適に機能するかは、あなたのアプリケーション次第です。ええと、私は、それを試してみて、ええと、そこから進めると思います。
でもRFは、は、かなり広く使われていて、ええと、それをベースラインとして使い始める必要はありません。それに速いです。それが利点です。ええと、はい。わかりました。では、ええと、今日は素晴らしい参加者の皆さんに恵まれたと思います。
ええと、最後まで残って質問してくださり、そして素晴らしい質問をしてくださり、ありがとうございます。ですので、ええと、この録画へのリンクを数日中にメールでお送りします。ええと、いくつかリンクも追加します。ええと、それから、チャットに投稿したあのHugging Faceのリンクにも、弊社提供の、ええと、サンプルコードへのリンクがいくつか含まれています。ええと、皆さんありがとうございました。
皆さん、ありがとう。Frank。


