埋め込みを使った始め方
'How to get started with embeddings'
ノートブックコンパニオンを使用したこのチュートリアルをチェックしてください:
埋め込みの理解
埋め込みは、テキスト、ドキュメント、画像、音声などの情報の数値表現です。この表現は、埋め込まれているものの意味を捉え、多くの産業アプリケーションに対して堅牢です。
テキスト「投票の主な利点は何ですか?」に対する埋め込みは、たとえば、384個の数値のリスト(例:[0.84、0.42、…、0.02])でベクトル空間で表現されることがあります。このリストは意味を捉えているため、異なる埋め込み間の距離を計算して、2つの文の意味がどれだけ一致するかを判断するなど、興味深いことができます。
埋め込みはテキストに限定されません!画像の埋め込み(たとえば、384個の数値のリスト)を作成し、テキストの埋め込みと比較して文が画像を説明しているかどうかを判断することもできます。この概念は、画像検索、分類、説明などの強力なシステムに適用されています!
埋め込みはどのように生成されるのでしょうか?オープンソースのライブラリであるSentence Transformersを使用すると、画像やテキストから最先端の埋め込みを無料で作成することができます。このブログでは、このライブラリを使用した例を紹介しています。
埋め込みの用途は何ですか?
「[…] このMLマルチツール(埋め込み)を理解すると、検索エンジンからレコメンデーションシステム、チャットボットなど、さまざまなものを構築できます。データサイエンティストやMLの専門家である必要はありませんし、大規模なラベル付けされたデータセットも必要ありません。」- デール・マルコウィッツ、Google Cloud。
情報(文、ドキュメント、画像)が埋め込まれると、創造性が発揮されます。いくつかの興味深い産業アプリケーションでは、埋め込みが使用されます。たとえば、Google検索ではテキストとテキスト、テキストと画像をマッチングさせるために埋め込みを使用しています。Snapchatでは、「ユーザーに適切な広告を適切なタイミングで提供する」ために埋め込みを使用しています。Meta(Facebook)では、ソーシャルサーチに埋め込みを使用しています。
埋め込みから知識を得る前に、これらの企業は情報を埋め込む必要がありました。埋め込まれたデータセットを使用することで、アルゴリズムは素早く検索、ソート、グループ化などを行うことができます。ただし、これは費用がかかり、技術的にも複雑な場合があります。この投稿では、シンプルなオープンソースのツールを使用して、データセットを埋め込み、分析する方法を紹介します。
埋め込みの始め方
小規模なよく寄せられる質問(FAQ)エンジンを作成します。ユーザーからのクエリを受け取り、最も類似したFAQを特定します。米国社会保障メディケアFAQを使用します。
しかし、まず、データセットを埋め込む必要があります(他のテキストでは、エンコードと埋め込みの用語を交換可能に使用します)。Hugging FaceのInference APIを使用すると、簡単なPOSTコールを使用してデータセットを埋め込むことができます。
質問の意味を埋め込みが捉えるため、異なる埋め込みを比較してどれだけ異なるか、または類似しているかを確認することができます。これにより、クエリに最も類似した埋め込みを取得し、最も類似したFAQを見つけることができます。このメカニズムの詳細な説明については、セマンティックサーチのチュートリアルをご覧ください。
要するに、以下の手順を実行します:
- Inference APIを使用してメディケアのFAQを埋め込む。
- 埋め込まれた質問を無料ホスティングするためにHubにアップロードする。
- 顧客のクエリと埋め込まれたデータセットを比較し、最も類似したFAQを特定する。
1. データセットの埋め込み
最初のステップは、埋め込みを作成するための既存の事前学習モデルを選択することです。Sentence Transformersライブラリからモデルを選ぶことができます。この場合、「sentence-transformers/all-MiniLM-L6-v2」というモデルを使用します。小さながら強力なモデルです。将来の投稿では、他のモデルとそのトレードオフについて調査します。
Hubにログインします。アカウント設定で書き込みトークンを作成する必要があります。書き込みトークンをhf_token
に保存します。
model_id = "sentence-transformers/all-MiniLM-L6-v2"
hf_token = "http://hf.co/settings/tokensでトークンを取得してください"
埋め込みを生成するために、ヘッダー{"Authorization": f"Bearer {hf_token}"}
を使用して、https://api-inference.huggingface.co/pipeline/feature-extraction/{model_id}
エンドポイントを使用します。以下は、テキストを含む辞書を受け取り、埋め込みのリストを返す関数の例です。
import requests
api_url = f"https://api-inference.huggingface.co/pipeline/feature-extraction/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}
埋め込みを生成するのは初めての場合、APIがそれらを返すまでに時間がかかる場合があります(約20秒)。最初の試行でoutput = query(dict(inputs = texts))
が機能しない場合、10秒待って3回再試行するためにretry
デコレータ(pip install retry
でインストール)を使用します。これは、最初のリクエストでモデルがサーバーにダウンロードされてインストールされる必要があるためであり、2回目以降の呼び出しははるかに速くなります。
def query(texts):
response = requests.post(api_url, headers=headers, json={"inputs": texts, "options":{"wait_for_model":True}})
return response.json()
現在のAPIは厳格なレート制限を強制しません。代わりに、Hugging Faceは利用可能なリソース全体の負荷を均等に分散し、リクエストの安定したフローを優先します。複数のテキストや画像を埋め込む必要がある場合、Hugging Face Accelerated Inference APIを使用すると、推論の速度が向上し、CPUまたはGPUの使用を選択できます。
texts = ["メディケアカードの交換方法は?",
"メディケアパートBの月額保険料はいくらですか?",
"メディケアパートB(医療保険)を解約する方法は?",
"メディケアに登録する方法は?",
"私は働いており、雇用主を通じて健康保険を持っている場合、メディケアパートBに登録できますか?",
"すでにパートAを持っている場合、メディケアパートBに登録する方法は?",
"メディケアの遅延登録ペナルティは何ですか?",
"メディケアとは何で、誰が受けることができますか?",
"メディケアパートAおよびパートBの保険料を支払うのに助けが必要ですか?",
"メディケアの異なるパートは何ですか?",
"所得が高いため、メディケアの保険料は高くなりますか?",
"TRICAREとは何ですか?",
"退役軍人の特典がある場合、メディケアパートBに登録する必要がありますか?"]
output = query(texts)
レスポンスとして、リストのリストが返されます。各リストにはFAQの埋め込みが含まれています。モデル「sentence-transformers/all-MiniLM-L6-v2」は、入力の質問をサイズ384の13の埋め込みにエンコードしています。リストを形状(13×384)のPandas DataFrame
に変換しましょう。
import pandas as pd
embeddings = pd.DataFrame(output)
これは次の行列に似ています:
[[-0.02388945 0.05525852 -0.01165488 ... 0.00577787 0.03409787 -0.0068891 ]
[-0.0126876 0.04687412 -0.01050217 ... -0.02310316 -0.00278466 0.01047371]
[ 0.00049438 0.11941205 0.00522949 ... 0.01687654 -0.02386115 0.00526433]
...
[-0.03900796 -0.01060951 -0.00738271 ... -0.08390449 0.03768405 0.00231361]
[-0.09598278 -0.06301168 -0.11690582 ... 0.00549841 0.1528919 0.02472013]
[-0.01162949 0.05961934 0.01650903 ... -0.02821241 -0.00116556 0.0010672 ]]
2. Hugging Face Hubで無料で埋め込みをホストする
🤗Datasetsは、データセットに素早くアクセスして共有するためのライブラリです。ユーザーインターフェース(UI)を使用してHubに埋め込みデータセットをホストしましょう。そうすれば、誰でも1行のコードでそれを読み込むことができます。また、ターミナルを使用してデータセットを共有することもできます。手順についてはドキュメントを参照してください。このエントリーのノートブックの補完では、ターミナルを使用してデータセットを共有できます。このセクションをスキップしたい場合は、埋め込まれたFAQを含むITESM/embedded_faqs_medicare
リポジトリをご覧ください。
まず、PandasのDataFrame
から埋め込みをCSVにエクスポートします。データセットを好きな方法で保存できます(例:zipやpickleなど)が、PandasやCSVを使用する必要はありません。埋め込みファイルが大きくないため、CSVに保存します。これは、次のセクションで使用するdatasets.load_dataset()
関数によって簡単に推論されるためです(Datasetsのドキュメントを参照)、つまり、ローディングスクリプトを作成する必要はありません。埋め込みはembeddings.csv
という名前で保存します。
embeddings.to_csv("embeddings.csv", index=False)
次の手順に従って、embeddings.csv
をHubにホストします。
- Hub UIの右上隅にあるユーザーをクリックします。
- “新しいデータセット”でデータセットを作成します。
- データセットの所有者(組織または個人)、名前、ライセンスを選択します。プライベートまたはパブリックにするかどうかを選択します。データセットを作成します。
- “ファイル”タブ(以下のスクリーンショット)に移動し、”ファイルの追加”と”ファイルのアップロード”をクリックします。
- 最後に、データセットをドラッグアンドドロップまたはアップロードし、変更を確定します。
これでデータセットが無料でHubにホストされました。埋め込みを共有したい人(またはその他の人)は、簡単にそれらをロードできます。次は、具体的な手順を見ていきましょう。
3. クエリに最も類似したよくある質問を取得する
メディケアの顧客が「メディケアが私をどのようにサポートできるか?」と質問したとします。このユーザーのクエリに最も適したFAQを見つけます。クエリの意味を表す埋め込みを作成し、ベクトル空間内でクエリに最も近い埋め込みを特定します。
pip install datasets
で🤗 Datasetsライブラリをインストールします。次に、Hubから埋め込まれたデータセットをロードし、PyTorchのFloatTensor
に変換します。なお、これはDataset
を操作する唯一の方法ではありません。例えば、NumPy、Tensorflow、またはSciPyを使用することもできます(ドキュメントを参照してください)。実際のデータセットで練習したい場合は、ITESM/embedded_faqs_medicare
リポジトリに埋め込まれたFAQが含まれています。または、このブログの付属のノートブックを使用することもできます。
import torch
from datasets import load_dataset
faqs_embeddings = load_dataset('namespace/repo_name')
dataset_embeddings = torch.from_numpy(faqs_embeddings["train"].to_pandas().to_numpy()).to(torch.float)
以前に定義したクエリ関数を使用して、顧客の質問を埋め込み、PyTorchのFloatTensor
に変換して効率的に操作します。埋め込まれたデータセットがロードされた後、Dataset
のadd_faiss_index
メソッドとsearch
メソッドを使用して、faissライブラリを使用して埋め込まれたクエリに最も近いFAQを特定することができます。以下はその代替方法の素敵なチュートリアルです。
question = ["メディケアはどのように私を助けることができますか?"]
output = query(question)
query_embeddings = torch.FloatTensor(output)
util.semantic_search
関数を使用して、ユーザーのクエリに最も近い(最も類似した)FAQを特定するために、Sentence Transformersライブラリを使用できます。この関数は、埋め込みの近さを判定するためにデフォルトでコサイン類似度を使用します。ただし、ベクトル空間内の2点間の距離を測定する他の関数(例えば、ドット積)を使用することもできます。
pip install -U sentence-transformers
でsentence-transformers
をインストールし、クエリに対して最も類似したFAQの5つを検索します。
from sentence_transformers.util import semantic_search
hits = semantic_search(query_embeddings, dataset_embeddings, top_k=5)
util.semantic_search
は、13個のFAQのうち、顧客のクエリにどれだけ近いかを特定し、上位top_k
のFAQのリストを返します。 hits
は以下のようになります:
[{'corpus_id': 8, 'score': 0.75653076171875},
{'corpus_id': 7, 'score': 0.7418993711471558},
{'corpus_id': 3, 'score': 0.7252674102783203},
{'corpus_id': 9, 'score': 0.6735571622848511},
{'corpus_id': 10, 'score': 0.6505177617073059}]
corpus_id
の値によって、最初のセクションで定義したtexts
のリストをインデックス化し、最も類似したFAQの5つを取得することができます:
print([texts[hits[0][i]['corpus_id']] for i in range(len(hits[0]))])
以下は、顧客のクエリに最も近い5つのFAQです:
['メディケアのパートAおよびパートBの保険料を支払うためのヘルプをどのように受けることができますか?',
'メディケアとは何ですか?誰が受けることができますか?',
'メディケアに登録する方法は?',
'メディケアの異なるパートは何ですか?',
'収入が高いためにメディケアの保険料が高くなりますか?']
このリストは、顧客のクエリに最も近い5つのFAQを表しています。素晴らしいですね!ここでは、PyTorchとSentence Transformersを主な数値ツールとして使用しました。ただし、NumPyやSciPyなどのツールを使用して、コサイン類似度とランキング関数を自分で定義することもできます。
学習を続けるための追加リソース
Sentence Transformersライブラリについて詳しく知りたい場合:
- モデルの新しい場所とモデルのダウンロード方法に関するハブ組織。
- Nils ReimersのツイートでSentence TransformerモデルとGPT-3 Embeddingsを比較しています。ネタバレ:Sentence Transformersは素晴らしいです!
- Sentence Transformersのドキュメント。
- Nimaの最近の研究に関するスレッド。
読んでいただきありがとうございました!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles