埋め込みの入門 – Hugging Face チュートリアル

TL;DR

Hugging Face は、Inference API を介して sentence-transformers/all-MiniLM-L6-v2 モデルでテキスト埋め込みを生成し、生成されたベクトルを Hub に無料でホストし、セマンティック検索を実行して最も関連性の高い FAQ エントリを取得する実用的なチュートリアルを公開しました。


埋め込みの理解

埋め込みとは、テキスト、画像、音声などのデータの意味的内容を捉える密な数値ベクトルです。たとえば、文 "What is the main benefit of voting?" は、[0.84, 0.42, …, 0.02] のような 384 次元ベクトルで表すことができます。ベクトルは意味をエンコードしているため、ベクトル間の距離(例:余弦類似度)から情報同士の類似度が分かります。

埋め込みはテキストに限らず、画像埋め込みをテキスト埋め込みと比較することで、クロスモーダル検索や分類が可能になります。オープンソースの Sentence Transformers ライブラリは、こうした埋め込みを無料で生成できる最先端モデルを提供しています。

埋め込みが可能にすること

「この ML マルチツール(埋め込み)を理解すれば、検索エンジンからレコメンデーションシステム、チャットボット、その他多くのものまで構築できるようになります。ML の専門知識を持つデータサイエンティストである必要も、大規模なラベル付きデータセットが必要なわけでもありません。」 – Dale Markowitz, Google Cloud

主要なプロダクトは埋め込みに依存しています。Google Search はテキスト間、テキストと画像間のマッチングに、Snapchat は広告ランキングに、Meta はソーシャル検索に埋め込みを利用しています。データセットを埋め込むことで、生のコンテンツを検索可能なベクトル空間に変換できますが、技術的にハードでコストもかかります。本チュートリアルは、そうしたハードルを回避する軽量かつオープンソースのワークフローを示します。

エンドツーエンド FAQ エンジンの例

このガイドでは、米国社会保障制度 Medicare の FAQ データセットを使用してシンプルな FAQ 検索システムを構築します。ワークフローは 3 つのステップで構成されます。

  1. FAQ の質問を埋め込む – Hugging Face Inference API を使用。
  2. 埋め込み行列をアップロード – Hugging Face Hub に無料でホスト。
  3. 埋め込みにクエリを投げる – ユーザーの質問に最も意味的に類似した FAQ を検索。

各ステップは以下で詳しく説明します。

1. データセットの埋め込み

モデル選択

このチュートリアルでは、Sentence Transformers ライブラリからコンパクトでありながら高性能な sentence-transformers/all-MiniLM-L6-v2 を選択します。

model_id = "sentence-transformers/all-MiniLM-L6-v2"

認証

Hugging Face アカウント設定で書き込みトークンを作成し、hf_token に保存します。

hf_token = "<your token>"

API 呼び出し

feature‑extraction エンドポイントを使用して埋め込みを取得します。最初のリクエストはサーバー上でモデルがダウンロードされるため約 20 秒かかりますが、以降の呼び出しは高速です。

import requests
api_url = f"https://api-inference.huggingface.co/pipeline/feature-extraction/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}

def query(texts):
    response = requests.post(
        api_url,
        headers=headers,
        json={"inputs": texts, "options": {"wait_for_model": True}}
    )
    return response.json()

入力例

texts = [
    "How do I get a replacement Medicare card?",
    "What is the monthly premium for Medicare Part B?",
    # … (additional 11 questions) …
]
output = query(texts)

API は各質問につき 384 次元ベクトルのリストを返します。これを Pandas DataFrame に変換すると、形状 (13, 384) の行列になります。

import pandas as pd
embeddings = pd.DataFrame(output)

2. 埋め込みを Hugging Face Hub に無料でホストする

datasets ライブラリを使って、埋め込みを含む CSV ファイルを共有できます。エクスポート後は:

embeddings.to_csv("embeddings.csv", index=False)

embeddings.csv を Hub の UI(New dataset → upload file)または CLI でアップロードします。結果として得られるリポジトリ(例:datasets/ITESM/embedded_faqs_medicare)は、次のコマンド一つでロードできます。

from datasets import load_dataset
faqs = load_dataset("ITESM/embedded_faqs_medicare")

3. クエリに対して最も類似した FAQ を取得する

埋め込みをテンソルとしてロード

import torch
faqs_embeddings = load_dataset('ITESM/embedded_faqs_medicare')
corpus = torch.from_numpy(
    faqs_embeddings["train"].to_pandas().to_numpy()
).float()

ユーザークエリを埋め込む

question = ["How can Medicare help me?"]
query_vec = torch.FloatTensor(query(question))

セマンティック検索

semantic_search ユーティリティ(Sentence Transformers)で余弦類似度を計算し、上位 k 個の最も近いベクトルを返します。

from sentence_transformers.util import semantic_search
hits = semantic_search(query_vec, corpus, top_k=5)

サンプル出力:

[{'corpus_id': 8, 'score': 0.7565},
 {'corpus_id': 7, 'score': 0.7419},
 {'corpus_id': 3, 'score': 0.7253},
 {'corpus_id': 9, 'score': 0.6736},
 {'corpus_id': 10, 'score': 0.6505}]

corpus_id を元の texts リストにマッピングすると、5 件の最も関連性の高い FAQ が得られます。

print([texts[h['corpus_id']] for h in hits[0]])

結果:

  • Medicare のパート A とパート B の保険料について支援を受けるにはどうすればよいですか?
  • Medicare とは何か、誰が受けられるのか?
  • Medicare に申し込む方法は?
  • Medicare の各パートは何ですか?
  • 収入が高いので Medicare の保険料が上がりますか?

同じワークフローは、他のドメインや大規模コーパス、マルチモーダルデータにも適用できます。

追加学習リソース

  • Sentence Transformers Hub – モデルと使用方法のコレクション。
  • Comparative tweet – Nils Reimers が Sentence Transformers と GPT‑3 埋め込みを比較したツイート。
  • Official documentationsbert.net にあります。
  • Research threads – 最近の埋め込みの進展に関するスレッド(例:Nima Boscarino のツイッタースレッド)。

トレーニングと高度なテクニック

推論に慣れたら、以下を試してみてください:

  • 埋め込みモデルのファインチューニング(train-sentence-transformers)。
  • リランカー(クロスエンコーダ)トレーニング(train-reranker)。
  • SPLADE などのスパース埋め込みモデル(train-sparse-encoder)。
  • テキスト、画像、音声、動画向けのマルチモーダル埋め込み(multimodal-sentence-transformers)。
  • 次元削減を最小の損失で実現する Matryoshka 埋め込み。
  • CPU 向けに最適化された静的埋め込み(static-embeddings)。
  • ストレージ削減と検索高速化のための量子化手法。

これらの拡張により、精度向上、レイテンシ低減、コスト効率の良い本番向けセマンティック検索システムのデプロイが可能になります。


このチュートリアルには、すべてのステップを再現する Colab ノートブックが付属しています。

Sources