<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Jessica Garson - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Jessica Garson - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/jp/search-labs/author/jessica-garson</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/jessica-garson</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/jessica-garson.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Mon, 14 Sep 2026 22:39:07 GMT</lastBuildDate>
  <item>
    <title><![CDATA[ユースケースにBetter Binary Quantization (BBQ)を実装する方法]]></title>
    <description><![CDATA[ユースケースで Better Binary Quantization (BBQ) を実装する理由とその方法について説明します。]]></description>
    <content:encoded><![CDATA[<p>ベクトル検索は、テキストのセマンティック検索や、画像、ビデオ、オーディオの類似性検索を実装する際の基盤を提供します。ベクトル検索では、ベクトルはデータの数学的表現であり、そのサイズは膨大で、場合によっては遅くなることがあります。Better Binary Quantization (以下、BBQ と呼びます) は、ベクトルの圧縮方法として機能します。これにより、ベクトルを縮小して検索と処理を高速化しながら、適切な一致を見つけることができます。この記事では、BBQ と、ベクトルを自動的に再スコアリングする量子化インデックスにのみ使用可能なフィールドである rescore_vector について説明します。</p><p>この記事で説明したすべての完全なクエリと出力は<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">、Elasticsearch Labs コード リポジトリ</a>で確認できます。</p><h2>ユースケースで Better Binary Quantization (BBQ) を実装する理由は何ですか?</h2>注: BBQ の背後にある数学の仕組みを詳しく理解するには、以下の<a href="https://www.elastic.co/jp/search-labs/blog/bbq-implementation-into-use-case#further-learning">「さらに学ぶ」セクション</a>をご覧ください。このブログでは、実装に重点を置いています。<p>数学は興味深いものですが、ベクトル検索がなぜ正確であり続けるのかを完全に理解したい場合には重要です。結局のところ、現在のベクトル検索アルゴリズムではデータの読み取り速度によって制限されることが判明しているため、これはすべて圧縮に関することです。したがって、そのデータすべてをメモリに収めることができれば、ストレージから読み取る場合と比べて速度が大幅に向上します (<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">メモリは SSD よりも約 200 倍高速です</a>)。</p><p>いくつか留意すべき点があります:</p><ul><li><p><a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World) などのグラフベースのインデックスは、ベクター検索では最も高速です。</p><ul><li><p>HNSW: 効率的な高次元類似性検索を可能にする多層グラフ構造を構築する近似最近傍検索アルゴリズム。</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW: 効率的な高次元類似性検索を可能にする多層グラフ構造を構築する近似最近傍検索アルゴリズム。" /><ul><li><p>HNSW の速度は、基本的にメモリ、または最悪の場合、ストレージからのデータ読み取り速度によって制限されます。</p><ul><li><p>理想的には、保存されているすべてのベクトルをメモリにロードできるようにする必要があります。</p></li></ul></li><li><p>埋め込みモデルは通常、浮動小数点数ごとに 4 バイトの float32 精度のベクトルを生成します。</p></li><li><p>そして最後に、ベクトルや次元の数によっては、すべてのベクトルを保存するためのメモリがすぐに不足する可能性があります。</p></li></ul><p>これを当然のこととして考えると、それぞれが数百、数千の次元を持つ可能性のある数百万、数十億のベクトルを取り込み始めると、すぐに問題が発生することがわかります。「<a href="https://www.elastic.co/jp/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">圧縮率のおおよその数値</a>」というセクションでは、おおよその数値が示されています。</p><h2>始めるには何が必要ですか?</h2><p>始めるには、次のものが必要です。</p><ul><li><p>Elastic Cloud またはオンプレミスを使用している場合は、Elasticsearch のバージョン 8.18 以降が必要になります。BBQ は 8.16 で導入されましたが、この記事では 8.18 で導入された<code>vector_rescore</code>使用します。</p></li><li><p>さらに、クラスター内に<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/ml-settings.html">機械学習 (ML) ノード</a>があることも確認する必要があります。(注: モデルをロードするには最低 4 GB の ML ノードが必要ですが、完全な本番環境のワークロードには、はるかに大きなノードが必要になる可能性があります。)</p></li><li><p>Serverless を使用している場合は、ベクターに最適化されたインスタンスを選択する必要があります。</p></li><li><p>また、ベクター データベースに関する基本的な知識も必要になります。Elastic のベクトル検索の概念にまだ慣れていない場合は、まず次のリソースを確認することをお勧めします。</p><ul><li><p><a href="https://www.elastic.co/jp/search-labs/blog/elastic-vector-database-practical-example">弾性ベクトルデータベースのナビゲート</a></p></li><li><p><a href="https://www.elastic.co/jp/blog/retrieval-augmented-generation-explained">検索拡張生成の背後にある大きなアイデア</a></p></li></ul></li></ul><h2>より良いバイナリ量子化（BBQ）実装</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Elasticsearch バーベキュー実装。" /><p>このブログをシンプルに保つために、組み込み関数が利用可能な場合はそれを使用します。この場合、機械学習ノード上の Elasticsearch 内で直接実行される<a href="https://www.elastic.co/jp/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a>ベクトル埋め込みモデルがあります。<code>text_embedding</code>モデルを、任意の埋め込みツール ( <a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">OpenAI</a> 、 <a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a> 、 <a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a>など) に置き換えることができることに注意してください。希望するモデルがまだ統合されていない場合は、<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">独自の密なベクトル埋め込みも使用</a>できます。</p><p>まず、特定のテキストのベクトルを生成するための推論エンドポイントを作成する必要があります。これらのコマンドはすべて、Kibana <a href="https://www.elastic.co/jp/guide/en/kibana/8.18/console-kibana.html">Dev Tools コンソール</a>から実行します。このコマンドは<code>.multilingual-e5-small</code>をダウンロードします。まだ存在しない場合はエンドポイントが設定されます。実行には 1 分ほどかかる場合があります。予想される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/01-create-an-inference-endpoint-output.json">01-create-an-inference-endpoint-output.json</a>で確認できます。 </p>PUT _inference/text_embedding/my_e5_model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_threads": 1,
    "model_id": ".multilingual-e5-small",
    "adaptive_allocations": {
      "enabled": true,
      "min_number_of_allocations": 1
    }
  }
}<p>これが返されると、モデルが設定され、次のコマンドを使用してモデルが期待どおりに動作するかどうかをテストできます。期待される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">02-embed-text-output.json</a>で確認できます。</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>トレーニング済みのモデルがどのノードにも割り当てられないという問題が発生した場合は、モデルを手動で起動する必要がある場合があります。</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>ここで、埋め込みモデルからの出力と一致するように、標準テキスト フィールド ( <code>my_field</code> ) と 384 次元の密なベクトル フィールド ( <code>my_vector</code> ) の 2 つのプロパティを持つ新しいマッピングを作成しましょう。<code>index_options.type to bbq_hnsw</code>もオーバーライドします。予想される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/03-create-byte-qauntized-index-output.json">03-create-byte-qauntized-index-output.json</a>で確認できます。</p>PUT bbq-my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}<p>Elasticsearch がベクトルを生成するようにするには、 <a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/ingest.html">Ingest Pipeline</a>を利用できます。このパイプラインには、エンドポイント ( <code>model_id</code> )、ベクトルを作成する<code>input_field</code> 、およびそれらのベクトルを格納する<code>output_field</code>の 3 つが必要です。以下の最初のコマンドは、内部で<a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/current/inference-apis.html">推論サービス</a>を使用する推論取り込みパイプラインを作成し、2 番目のコマンドはパイプラインが正しく動作していることをテストします。予想される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/04-create-and-simulate-ingest-pipeline-output.json">04-create-and-simulate-ingest-pipeline-output.json</a>で確認できます。</p>PUT _ingest/pipeline/my_inference_pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my_e5_model",
        "input_output": [
          {
            "input_field": "my_field",
            "output_field": "my_vector"
          }
        ]
      }
    }
  ]
}

POST _ingest/pipeline/my_inference_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "my_field": "my awesome text field"
      }
    }
  ]
}<p>これで、以下の最初の 2 つのコマンドを使用してドキュメントを追加し、3 番目のコマンドで検索が機能することをテストする準備が整いました。予想される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">05-bbq-index-output.json</a>で確認できます。</p>PUT bbq-my-byte-quantized-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT bbq-my-byte-quantized-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p><a href="https://www.elastic.co/jp/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">この投稿</a>で推奨されているように、圧縮の利点を活用しながら高い再現精度を維持するのに役立つため、大量のデータに拡張する場合は、再スコアリングとオーバーサンプリングが推奨されます。Elasticsearch バージョン 8.18 以降では、 <a href="https://www.elastic.co/jp/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector</a>を使用してこの方法で実行できます。予想される出力は、Outputs フォルダー内のファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/06-bbq-search-8-18-output.json">06-bbq-search-8-18-output.json</a>にあります。</p>GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "rescore_vector": {
              "oversample": 3
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>これらのスコアは、生データで得られるスコアと比べてどうでしょうか?上記のすべてを<code>index_options.type: hnsw</code>を使ってもう一度実行すると、スコアが非常に似ていることがわかります。予想される出力は、Outputs フォルダーのファイル<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">07-raw-vector-output.json</a>で確認できます。</p>PUT my-raw-vector-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "hnsw"
        }
      }
    }
  }
}

PUT my-raw-vector-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT my-raw-vector-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET my-raw-vector-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<h2>圧縮比のおおよその数値</h2><p>ベクトル検索を使用する場合、ストレージとメモリの要件がすぐに大きな課題になる可能性があります。次の内訳は、さまざまな量子化手法によってベクター データのメモリ フットプリントがいかに劇的に削減されるかを示しています。</p><p>ベクトル（V）</p><p>寸法（D）</p><p>生（V x D x 4）</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0.5 + 4))</p><p>バーベキュー（V×（D×0.125+4））</p><p>10,000,000</p><p>384</p><p>14.31GB</p><p>3.61GB</p><p>1.83GB</p><p>0.58GB</p><p>50,000,000</p><p>384</p><p>71.53GB</p><p>18.07GB</p><p>9.13GB</p><p>2.89GB</p><p>1億</p><p>384</p><p>143.05GB</p><p>36.14GB</p><p>18.25GB</p><p>5.77GB</p><h2>まとめ</h2><p>BBQ は、精度を犠牲にすることなくベクター データを圧縮するために適用できる最適化です。これはベクトルをビットに変換することで機能し、データを効果的に検索できるようにし、AI ワークフローを拡張して検索を高速化し、データ ストレージを最適化できるようにします。</p><h2>さらなる学習</h2><p>バーベキューについてさらに詳しく知りたい場合は、次のリソースをぜひチェックしてください。</p><ul><li><p><a href="https://www.elastic.co/jp/search-labs/blog/better-binary-quantization-lucene-elasticsearch">LuceneとElasticsearchにおけるバイナリ量子化（BBQ）</a></p></li><li><p><a href="https://www.elastic.co/jp/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">より良いバイナリ量子化（BBQ）と積量子化</a></p></li><li><p><a href="https://www.elastic.co/jp/search-labs/blog/optimized-scalar-quantization-elasticsearch">最適化されたスカラー量子化：さらに優れたバイナリ量子化</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">より良いバイナリ量子化（BBQ）：バイトからBBQへ、より良いベクトル検索の秘密 by Ben Trent</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</guid>
    <category><![CDATA[Vector Database]]></category>
    <category><![CDATA[基本]]></category>
    <dc:creator><![CDATA[Sachin Frayne,Jessica Garson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3dd0495b536b2615/6a17e2b0414c6488459450e3/66842055367cdd795532b01c167f2a4b03dc65e3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>