Embeddingsの概要

テキストのembeddingsは、テキスト文字列の数値表現であり、浮動小数点数のベクトルとして表現されます。2つの埋め込まれたテキスト(単語、フレーズ、文など)間の距離を使用して、それらのテキストがお互いにどの程度関連しているかを測定できます。一般的な測定方法はコサイン類似度ですが、ユークリッド距離やドット積などの他の距離関数を使用して類似度を測定することもできます(以下のFAQを参照)。一般に、距離が小さいほど、テキスト間の意味的または構文的な関連性が高いと予測されます。

文字列の類似度を比較したり、文字列をお互いの距離でクラスタリングしたりすることで、検索(RAGアーキテクチャで人気)、レコメンデーション異常検知など、さまざまなアプリケーションが可能になります。


Anthropicでembeddingsを取得する方法

embeddingsプロバイダーを選択する際は、ニーズと好みに応じて、いくつかの要因を考慮できます。

  • データセットのサイズとドメインの特異性: モデルの学習データセットのサイズと、埋め込みたいドメインとの関連性。一般的に、より大きなデータセットやドメイン固有のデータを使用すると、ドメイン内のembeddingsの品質が向上します。
  • モデルアーキテクチャ: モデルの設計と複雑さ。Transformersのようなより最新の手法とアーキテクチャは、より高品質のembeddingsを学習し生成する傾向があります。
  • 推論パフォーマンス: embeddingsの検索速度とエンドツーエンドのレイテンシ。これは、大規模な本番環境での展開では特に重要な考慮事項です。
  • カスタマイズ: プライベートデータでの継続的な学習や、非常に特定のドメイン向けのモデルの特殊化のオプション。これにより、ユニークな語彙のパフォーマンスを向上させることができます。

Anthropicは独自のembeddingモデルを提供していません。上記の4つの考慮事項すべてを網羅する幅広いオプションと機能を備えたembeddingsプロバイダーの1つがVoyage AIです。Voyage AIは最先端のembeddingモデルを提供し、金融やヘルスケアなどの特定の業界ドメイン向けのカスタマイズされたモデルや、個々の顧客向けの特注のファインチューニングされたモデルを提供しています。

このガイドの残りの部分はVoyage AI向けですが、特定のユースケースに最適なembeddingsベンダーを見つけるために、さまざまなembeddingsベンダーを評価することをお勧めします。


Voyage AIの使い方

Voyage AIの実装例については、embeddingsノートブックをご覧ください。

Voyage embeddingsにアクセスするには:

  1. Voyage AIのWebサイトでサインアップします。
  2. APIキーを取得します。
  3. 便宜上、APIキーを環境変数として設定します。
Python
export VOYAGE_API_KEY="<your secret key>"

公式のvoyageai Pythonパッケージを使用するか、以下で説明するHTTPリクエストを使用して、embeddingsを実行できます。

Voyage Pythonパッケージ

voyageaiパッケージは、次のコマンドを使用してインストールできます。

Python
pip install -U voyageai

次に、クライアントオブジェクトを作成し、それを使用してテキストを埋め込み始めることができます。

Python
import voyageai

vo = voyageai.Client()
# これにより、環境変数VOYAGE_API_KEYが自動的に使用されます。
# または、vo = voyageai.Client(api_key="<your secret key>")を使用することもできます。

texts = ["Sample text 1", "Sample text 2"]

result = vo.embed(texts, model="voyage-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddingsは、それぞれ1024個の浮動小数点数を含む2つのembeddingベクトルのリストになります。

上記のコードを実行すると、2つのembeddingsが画面に出力されます。

Python
[0.02012746, 0.01957859, ...]  # "Sample text 1"のembedding
[0.01429677, 0.03077182, ...]  # "Sample text 2"のembedding

embeddingsを作成する際、embed()関数にいくつかの他の引数を指定できます。仕様は次のとおりです。

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - ["I like cats", "I also like dogs"]のような文字列のリストとしてのテキストのリスト。現在、リストの最大長は128で、リスト内のトークンの総数はvoyage-2の場合は最大320K、voyage-large-2/voyage-code-2の場合は最大120Kです。
  • model (str) - モデルの名前。推奨オプション:voyage-2voyage-large-2voyage-code-2
  • input_type (str, オプション, デフォルトはNone) - 入力テキストのタイプ。デフォルトはNone。他のオプション:querydocument
    • input_typeがNoneに設定されている場合、入力テキストはVoyageのembeddingモデルによって直接エンコードされます。または、入力がドキュメントまたはクエリの場合、ユーザーはinput_typequeryまたはdocumentに指定できます。そのような場合、Voyageは特別なプロンプトを入力テキストの前に付加し、拡張された入力をembeddingモデルに送信します。
    • 検索/検索のユースケースでは、クエリまたはドキュメントをエンコードする際にinput_type引数を指定して、検索品質を向上させることをお勧めします。input_type引数の有無に関係なく生成されたembeddingsは互換性があります。
  • truncation (bool, オプション, デフォルトはNone) - 入力テキストをコンテキストの長さに合わせて切り捨てるかどうか。
    • Trueの場合、長すぎる入力テキストは、embeddingモデルによってベクトル化される前に、コンテキストの長さに収まるように切り捨てられます。
    • Falseの場合、指定されたテキストがコンテキストの長さを超えると、エラーが発生します。
    • 指定されていない場合(デフォルトはNone)、入力テキストがコンテキストウィンドウの長さをわずかに超えている場合、Voyageはembeddingモデルに送信する前に入力テキストを切り捨てます。大幅に超えている場合は、エラーが発生します。

Voyage HTTP API

Voyage HTTP APIをリクエストすることで、embeddingsを取得することもできます。たとえば、ターミナルでcurlコマンドを使用してHTTPリクエストを送信できます。

Shell
curl https://api.voyageai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $VOYAGE_API_KEY" \
  -d '{
    "input": ["Sample text 1", "Sample text 2"],
    "model": "voyage-2"
  }'

得られるレスポンスは、embeddingsとトークン使用量を含むJSONオブジェクトです。

Shell
{
  "object": "list",
  "data": [
    {
      "embedding": [0.02012746, 0.01957859, ...],
      "index": 0
    },
    {
      "embedding": [0.01429677, 0.03077182, ...],
      "index": 1
    }
  ],
  "model": "voyage-2",
  "usage": {
    "total_tokens": 10
  }
}

Voyage AIのembeddingエンドポイントはhttps://api.voyageai.com/v1/embeddings(POST)です。リクエストヘッダーにはAPIキーを含める必要があります。リクエストボディは、次の引数を含むJSONオブジェクトです。

  • input (str, List[str]) - 単一のテキスト文字列、または文字列のリストとしてのテキストのリスト。現在、リストの最大長は128で、リスト内のトークンの総数はvoyage-2の場合は最大320K、voyage-large-2/voyage-code-2の場合は最大120Kです。
  • model (str) - モデルの名前。推奨オプション:voyage-2voyage-large-2voyage-code-2
  • input_type (str, オプション, デフォルトはNone) - 入力テキストのタイプ。デフォルトはNone。他のオプション:querydocument
  • truncation (bool, オプション, デフォルトはNone) - 入力テキストをコンテキストの長さに合わせて切り捨てるかどうか
    • Trueの場合、長すぎる入力テキストは、embeddingモデルによってベクトル化される前に、コンテキストの長さに収まるように切り捨てられます
    • Falseの場合、指定されたテキストがコンテキストの長さを超えると、エラーが発生します
    • 指定されていない場合(デフォルトはNone)、入力テキストがコンテキストウィンドウの長さをわずかに超えている場合、Voyageはembeddingモデルに送信する前に入力テキストを切り捨てます。大幅に超えている場合は、エラーが発生します
  • encoding_format (str, オプション, デフォルトはNone) - embeddingsがエンコードされる形式。Voyageは現在、2つのオプションをサポートしています。
    • 指定されていない場合(デフォルトはNone):embeddingsは浮動小数点数のリストとして表されます
    • "base64":embeddingsはBase64エンコーディングに圧縮されます

Voyage embeddingの例

Voyageでembeddingsを取得する方法がわかったので、簡単な例で実際に見てみましょう。

検索対象の6つのドキュメントの小さなコーパスがあるとします

Python
documents = [
    "The Mediterranean diet emphasizes fish, olive oil, and vegetables, believed to reduce chronic diseases.",
    "Photosynthesis in plants converts light energy into glucose and produces essential oxygen.",
    "20th-century innovations, from radios to smartphones, centered on electronic advancements.",
    "Rivers provide water, irrigation, and habitat for aquatic species, vital for ecosystems.",
    "Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.",
    "Shakespeare's works, like 'Hamlet' and 'A Midsummer Night's Dream,' endure in literature."
]

まず、Voyageを使用して、それぞれをembeddingベクトルに変換します

Python
import voyageai

vo = voyageai.Client()

# ドキュメントをembedding
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

embeddingsにより、ベクトル空間でセマンティック検索/検索を行うことができます。次に、例のクエリ、

Python
query = "When is Apple's conference call scheduled?"

をembeddingに変換し、最近傍探索を行って、embedding空間の距離に基づいて最も関連性の高いドキュメントを見つけます。

Python
import numpy as np

# クエリをembedding
query_embd = vo.embed(
    [query], model="voyage-2", input_type="query"
).embeddings[0]

# 類似度を計算
# Voyage embeddingsは長さ1に正規化されているため、ドット積と
# コサイン類似度は同じです。
similarities = np.dot(doc_embds, query_embd)

retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])

ドキュメントとクエリのembeddingには、それぞれinput_type="document"input_type="query"を使用していることに注意してください。詳細はこちらをご覧ください。

出力は5番目のドキュメントで、実際にクエリに最も関連性が高いものです。

Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.

利用可能なVoyageモデル

Voyageは、次のembeddingモデルの使用を推奨しています。

モデルコンテキスト長Embedding次元説明
voyage-large-2160001536Voyage AIの最も強力な汎用embeddingモデル。
voyage-code-2160001536コード検索用に最適化(他の選択肢より17%優れている)され、汎用コーパスでもSoTA。詳細については、Voyageのブログ記事を参照してください。
voyage-240001024レイテンシと品質の両方に最適化された基本的な汎用embeddingモデル。
voyage-lite-02-instruct40001024分類、クラスタリング、文の類似性タスクのために指示調整されており、これらがこのモデルの推奨される唯一の使用例です。

voyage-2voyage-large-2は汎用embeddingモデルで、ドメイン全体で最先端のパフォーマンスを実現し、高い効率性を維持します。voyage-code-2はコード分野向けに最適化されており、より柔軟な使用のために4倍のコンテキスト長を提供しますが、比較的レイテンシが高くなります。

Voyageは、より高度で専門的なモデルを積極的に開発しており、個々の顧客向けにカスタマイズされたモデルを微調整するサービスも提供しています。カスタムモデルの詳細については、Anthropicのアカウントマネージャーにメールするか、Anthropicのサポートにお問い合わせください。

  • voyage-finance-2:近日公開予定
  • voyage-law-2:近日公開予定
  • voyage-multilingual-2:近日公開予定
  • voyage-healthcare-2:近日公開予定

AWS MarketplaceでのVoyage

Voyage embeddingsは、AWS Marketplaceでも利用できます。AWSでVoyageにアクセスするための手順は次のとおりです。

  1. モデルパッケージをサブスクライブします
    1. モデルパッケージのリストページに移動し、デプロイするモデルを選択します
    2. Continue to subscribeボタンをクリックします
    3. Subscribe to this softwareページの詳細を注意深く確認します。標準のエンドユーザーライセンス契約(EULA)、価格、サポート条件に同意する場合は、「Accept Offer」をクリックします
    4. Continue to configurationを選択し、リージョンを選択すると、Product Arnが表示されます。これは、Boto3を使用してデプロイ可能なモデルを作成するために必要なモデルパッケージARNです
      1. 選択したリージョンに対応するARNをコピーし、次のセルで使用します
  2. モデルパッケージをデプロイします

ここから、Sagemaker StudioでJupyterLabスペースを作成し、Voyageのノートブックをアップロードして、その中の指示に従います。


よくある質問

2つのembeddingベクトル間の距離はどのように計算しますか?

コサイン類似度が一般的な選択肢ですが、ほとんどの距離関数でうまくいきます。Voyage embeddingsは長さ1に正規化されているため、コサイン類似度は基本的に2つのベクトル間のドット積と同じです。2つのembeddingベクトル間のコサイン類似度を計算するには、次のコードスニペットを使用できます。

Python
import numpy

similarity = np.dot(embd1, embd2)
# Voyage embeddingsは長さ1に正規化されているため、コサイン類似度は
# ドット積と同じです。

大規模なコーパスで最もK近いembeddingベクトルを見つけたい場合は、ほとんどのベクトルデータベースに組み込まれている機能を使用することをお勧めします。

文字列をembeddingする前にトークン数を数えることはできますか?

はい!次のコードで行うことができます。

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])

価格

最新の価格の詳細については、Voyageの価格ページをご覧ください。