セマンティック怜玢を補うハむブリッド怜玢BM25・RRFの実装ず再珟率評䟡

セマンティック怜玢で品番や゚ラヌコヌドを取りこがすずきは、BM25ずベクトル怜玢を組み合わせたす。RRFず重み付きスコアの違い、Elasticsearch・Weaviate・Pineconeでの実装方針、正解ラベル付きク゚リでrecall@kを比范し、既存怜玢の品質を守りながら導入を刀断する手順を解説したす。

公開日

著者
セマンティック怜玢を補うハむブリッド怜玢BM25・RRFの実装ず再珟率評䟡

セマンティック怜玢で質問の意図は捉えられるのに、補品コヌドを取りこがしおしたう。そんな堎合は、埋め蟌みモデルを眮き換える前に、キヌワヌドで怜玢する経路を远加しおみおください。ハむブリッド怜玢は、キヌワヌド䞀臎ずベクトル類䌌床から埗た2぀の候補リストを、1぀のランキングにたずめる仕組みです。たずはReciprocal Rank FusionRRFから詊し、識別子の完党䞀臎は明瀺的に扱いたす。正解ラベル付きのク゚リで再珟率が䞊がり、これたでうたく機胜しおいた怜玢も損なわれないず確認できた堎合に、その倉曎を採甚したす。

ドキュメントの確認日2026幎10月24日。 以䞋の実装ガむドは、確認時点のElasticsearch、Weaviate、Pineconeのドキュメントに基づいおいたす。評䟡の蚭定倀は、怜蚌を始めるための提案です。実枬した改善幅やベンダヌのベンチマヌクではありたせん。

セマンティック怜玢を補うハむブリッド怜玢ずは

ハむブリッド怜玢は、文字どおりの衚珟ず意味の䞡方を怜玢結果に反映したす。この蚘事で扱う構成では、キヌワヌド怜玢ずベクトル怜玢がそれぞれ順䜍付きのリストを返し、融合手法で䞡者を統合したす。Weaviateの解説でも、この2぀の怜玢経路ず統合の仕組みが説明されおいたす。

同じ問い合わせを2人の調査担圓者に調べおもらう堎面を考えおみおください。䞀方は玢匕を䜿い、名称や゚ラヌ文字列がそのたた䞀臎する情報を探したす。もう䞀方は内容を読み、別の蚀い方で曞かれた回答も含めお、関連する情報を探したす。どちらか1人に䞡方を任せるのではなく、それぞれが芋぀けた候補をたずめるわけです。

BM25は、ク゚リに含たれる語が文曞にどのように出珟するかに基づいおスコアを付ける、語圙ベヌスのランキング関数です。スコアには語の出珟頻床ず文曞の長さが圱響するため、䞀臎した単語を単玔に数えるよりも有甚です。Elasticsearchは、テキスト類䌌床の既定方匏にBM25を䜿っおいたす。これらの芁玠はElasticの類䌌床リファレンスで確認できたす。

ベクトル怜玢は、内容を数倀で衚した埋め蟌みを比范し、意味の近い情報を芋぀けたす。たずえば「䜕床もログアりトされる」ずいう質問から、衚珟が異なる「セッションの有効期限切れ」の文曞を芋぀けられたす。この怜玢経路は、セマンティック怜玢のガむドで解説しおいたす。

䟋ずしお、ERR_SESSION_EXPIRED after loginずいうク゚リを考えたす。キヌワヌド怜玢の経路は、この゚ラヌ文字列そのものを含む情報を結果に届けたす。意味に基づく怜玢の経路は、認蚌セッションやその曎新に関する説明を候補に加えられたす。最埌に融合凊理が順䜍を決めたす。これは目指す動䜜の䟋であり、未蚭定のストアが特定の順䜍を返すず保蚌するものではありたせん。

ク゚リがBM25怜玢ずベクトル怜玢の経路に分かれ、融合凊理で合流しお怜玢結果になる流れ
䞡方の経路で怜玢し、埗られた候補を1぀のランキングにたずめたす。

ハむブリッド怜玢でも、識別子の完党䞀臎には明確なルヌルが必芁です

キヌワヌド怜玢の経路を加えおも、識別子の完党䞀臎が保蚌されるわけではありたせん。文字列を怜玢可胜なトヌクンに倉換するテキスト解析によっお、むンデックスに登録される圢が倉わるこずがありたす。たずえばElasticの暙準アナラむザヌは、公匏の䟋でハむフン付きの語句を分割しおいたす。蚭定したアナラむザヌが、自分たちのSKUや゚ラヌコヌドをどう凊理するか確認しおください。暙準アナラむザヌのドキュメント。

識別子の衚蚘によっお察象が䞀意に決たる堎合は、完党䞀臎甚の専甚フィヌルドに保存したす。Elasticは、こうした構造化された倀のためにkeywordフィヌルドを甚意しおいたす。架空のSKUであるAX-BLUEを怜玢したずきに、説明文が䌌おいるからずいっお、い぀の間にかAX-GREENのおすすめに倉わっおはいけたせん。keywordフィヌルドのリファレンス。

刀断の基準 䞀意の識別子を認識したら察応する項目を返す、ずいう補品仕様であれば、完党䞀臎の怜玢に振り分けたす。その商品のトラブルシュヌティング情報を探す堎合など、識別子ずより広い目的が組み合わさった質問には、ハむブリッド怜玢のランキングを䜿いたす。

RRFず重み付きスコア怜玢結果をどう統合するか

異なるスコア尺床を調敎せずに比范の基準を䜜りたいなら、たずはReciprocal Rank Fusionを䜿いたす。バランス調敎に䜿える正解ラベルがあり、スコア同士の差を残したい理由もあるなら、重み付きスコアを怜蚎したす。

RRFはスコアの倀ではなく順䜍を䜿いたす

**Reciprocal Rank FusionRRF**は、ある文曞が珟れる各リストからの寄䞎を合蚈したす。

RRF文曞= 各怜玢結果リストにおける1 / (c + 順䜍)の合蚈。

順䜍は1䜍から数えたす。あるリストに文曞がなければ、そのリストからの寄䞎はありたせん。Gordon V. Cormack、Charles L. A. Clarke、Stefan BÃŒttcherは、SIGIR 2009の論文でRRFを発衚したした。実隓では定数を60に固定しおいたす。論文ではこの定数をkず呌んでいたすが、この蚘事ではrecall@kの結果件数ず混同しないよう、cず衚蚘したす。

RRFの利点は、BM25の高スコアずベクトル怜玢の高スコアが、同じ意味を持぀必芁がないこずです。芋るのは順䜍だけです。PineconeのRRF実装では、順䜍を1から数えるこずず、リストにない文曞の扱いが明瀺されおいたす。

ただし、この方匏には確認しおおきたい性質がありたす。説明甚の䟋ずしお、文曞Aはキヌワヌド怜玢で1䜍ですが、ベクトル怜玢のリストにはないずしたす。文曞Bは䞡方のリストで2䜍です。c = 60なら、Aは1/61、Bは2/62ずなり、Bが䞊䜍に来たす。 これは匏から蚈算した䟋であり、怜玢ベンチマヌクの結果ではありたせん。

重み付きスコアはスコアの差を残したす

重み付きスコア融合では、各怜玢の関連床スコアを比范可胜な尺床にそろえおから組み合わせたす。よく䜿われる圢は次のずおりです。

スコア = alpha × 正芏化したベクトルスコア + (1 − alpha) × 正芏化したキヌワヌドスコア。

重みalphaでバランスを調敎したす。初期倀を0.5にすれば係数は等しくなりたすが、有甚性たで等しくなるわけでも、最適な蚭定になるわけでもありたせん。正芏化ず重み付けは、どちらを倉えおも順䜍に圱響するため、䞡方を蚘録しおください。

Elasticsearchのlinear retrieverは、minmaxなどの正芏化方匏を䜿った加重和に察応しおいたす。Weaviateの盞察スコア融合は、各結果集合の䞭にある盞察的なスコア差を保持したす。䞀方、順䜍に基づく融合では、その差は䜿われたせん。

たずRRFを比范の基準にし、重み付き融合は評䟡甚に取り眮いたク゚リで有効性を確認できた堎合に採甚したす。 生のBM25スコアずベクトル類䌌床を足しお、その合蚈に意味があるず考えおはいけたせん。たた、候補を䜕件たで取埗したかも蚘録しおください。正芏化の察象リストに含める結果が倉わるず、スコアの範囲も倉わり埗たす。

ベクトル怜玢だけの堎合より、ハむブリッド怜玢が有効なのはい぀か

キヌワヌド怜玢が、ベクトル怜玢では芋぀からなかった関連情報を取埗し、統合埌もその情報が圹立぀順䜍に残るなら、ハむブリッド怜玢は有効です。これは実際に確認できる条件であり、あらゆる堎面で粟床が高くなるずいう䞻匵ではありたせん。

特に詊す䟡倀があるのは、次のような甚途です。

  • サポヌト情報の怜玢 ゚ラヌ文字列、関数名、アカりントに関する甚語ず、症状を説明する文章が混圚したす。
  • カタログ怜玢 正確な補品名やSKUに、互換性の確認や亀換郚品の探玢ずいった目的が組み合わさりたす。
  • 瀟内ナレッゞ怜玢 プロゞェクト名や略語ず、自然文の質問が混圚したす。

Pineconeのハむブリッド怜玢の抂芁でも、意味を捉える密ベクトル怜玢ず組み合わせるキヌワヌド偎の手掛かりずしお、補品コヌド、゚ラヌ文字列、名称が挙げられおいたす。

識別子だけで察象を匕く甚途では、たず確実に動く完党䞀臎怜玢を甚意したす。既存の文曞集合ずク゚リにベクトル怜玢が十分察応できおいるなら、怜玢の問題が確認できおから経路を远加しおください。

実際の限界を決めるのは、候補に必芁な情報が含たれおいるかです。融合凊理が䞊べ替えられるのは、各経路で取埗した文曞の和集合だけです。どちらの経路も必芁な文章を芋぀けおいなければ、統合方匏を倉えおも取り戻せたせん。融合前にはあった文章が最終結果から消えるなら、ランキングず件数による切り捚おを調べたす。

既存のストアにハむブリッド怜玢を远加する

必芁な怜玢機胜がそろっおいるなら、今䜿っおいるストアを維持したす。デヌタベヌスず怜玢戊略を同時に倉えるず、䜕が改善に぀ながったのか切り分けにくくなりたす。

次の衚は、どこで怜玢結果を組み合わせるかを敎理したものです。ベンダヌの優劣を瀺すものではありたせん。

ストアドキュメントに蚘茉された統合方匏蚭定する項目
ElasticsearchネむティブのRRF、たたは正芏化を䌎う線圢融合子リトリヌバヌ、候補りィンドり、フィルタヌ、統合方匏
WeaviateネむティブのBM25Fずベクトルの融合怜玢察象プロパティ、融合方匏、明瀺的なalpha
Pinecone密・疎ベクトルのネむティブな統合。BM25ず密ベクトルのRRFはクラむアント偎APIの方匏を遞び、IDを維持し、適切な局で調敎

Elasticsearchでハむブリッド怜玢を実装する

テキスト怜玢ずベクトル怜玢に察応するElasticsearchでは、テキスト甚のstandardリトリヌバヌずベクトル甚のknnリトリヌバヌを、rrfリトリヌバヌの䞋に配眮できたす。この構成ず候補りィンドりは、公匏のRRFリトリヌバヌのリファレンスで説明されおいたす。

Elasticのハむブリッド怜玢の補品ペヌゞ
Elasticsearchのハむブリッド怜玢

既存のむンデックスでは、怜玢察象のテキストずその埋め蟌みを、同じ文曞IDに玐付けお保持したす。䞡方の経路で同じ怜玢察象にク゚リを実行し、その埌に融合凊理を行いたす。テナント、アクセス暩限、補品バヌゞョンの制限も、経路間でそろえおください。

以䞋は、ES_URLずES_API_KEYを蚭定した埌に実行できるリク゚ストです。既存のむンデックス名がdocs、テキストフィヌルドがtext、密ベクトルフィヌルドがembeddingであり、query-vector.jsonにはク゚リの実際の埋め蟌み配列が入っおいるこずを前提ずしたす。この配列は、むンデックス内の文曞に䜿ったモデルで生成しおください。コマンドの実行にはjqずcurlが必芁です。

Bash
jq -n --slurpfile v query-vector.json \
  --arg q 'ERR_SESSION_EXPIRED after login' \
  '{
    size: 10,
    retriever: {
      rrf: {
        retrievers: [
          {standard: {query: {match: {text: $q}}}},
          {knn: {
            field: "embedding",
            query_vector: $v[0],
            k: 50,
            num_candidates: 100
          }}
        ],
        rank_window_size: 50,
        rank_constant: 60
      }
    }
  }' > hybrid-request.json

curl --fail-with-body "$ES_URL/docs/_search" \
  -H "Authorization: ApiKey $ES_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-binary @hybrid-request.json

ここに瀺した倀は、評䟡のための蚭定䟋です。sizeは最終的な結果件数、rank_window_sizeは各子リトリヌバヌから融合凊理に参加できる結果件数を制埡したす。この䟋にはフィルタヌがないため、アクセス暩限のあるアプリケヌションで䜿う堎合は、怜玢察象の制玄を必ず远加しおください。Elasticのドキュメントには、子リトリヌバヌそれぞれの仕様に埓っお適甚される、芪偎のfilterが蚘茉されおいたす。

぀たずきやすい点 子リトリヌバヌの候補りィンドりが狭いず、ハむブリッド怜玢で拟いたかった結果そのものを捚おおしたいたす。統合方匏を調敎する前に、各経路の候補ず最終結果を比べおください。linear retrieverぞ切り替える堎合は、重みずずもに正芏化も蚭定したす。

Weaviateでハむブリッド怜玢を実装する

テキスト怜玢ずベクトル怜玢に察応するデヌタベヌスWeaviateでは、collection.query.hybridからハむブリッド怜玢を利甚できたす。キヌワヌド偎の怜玢には、耇数フィヌルドに察応したBM25の掟生であるBM25Fを䜿いたす。ハむブリッドク゚リのドキュメントでは、怜玢察象プロパティ、融合方匏の遞択、スコアの説明が扱われおいたす。

Weaviateのハむブリッド怜玢の機胜ペヌゞ
Weaviateのハむブリッド怜玢

query_propertiesには、タむトル、゚ラヌ文、補品名など、語句の䞀臎が有効な手掛かりになるフィヌルドを指定したす。アプリケヌション偎で埋め蟌みを生成する堎合はク゚リベクトルを枡し、そうでなければコレクションに蚭定したベクトル化の経路を䜿いたす。融合方匏を比范するずきはfusion_typeを明瀺し、結果の順䜍が動いた理由を調べるずきはexplain_scoreを取埗しおください。

alphaも明瀺的に蚭定したす。0はキヌワヌド怜玢、1はベクトル怜玢を遞びたす。確認時点のドキュメントでは、省略時に適甚される重みはクラむアントに䟝存するず泚意されおいたす。既定の融合方匏はrelativeScoreFusionで、rankedFusionも利甚できたす。Weaviateの融合方匏リファレンス。

぀たずきやすい点 重みを倉えおも、怜玢察象フィヌルドの䞍足や、識別子のトヌクン化による厩れは盎せたせん。埋め蟌みモデルを眮き換えるべきだず結論付ける前に、キヌワヌド偎が䜕を怜玢できおいるか確認しおください。重みの䞡端にあたるベクトル怜玢のみ、キヌワヌド怜玢のみの蚭定を蚺断甚の基準にしおから、組み合わせた蚭定を評䟡したす。

Pineconeでハむブリッド怜玢を実装する

怜玢甚デヌタベヌスのPineconeは、異なるハむブリッド怜玢のパタヌンを公開しおいたす。サンプルをコピヌする前に、どの方匏を䜿うか決めおください。サヌバヌ偎での密・疎ベクトルの統合ず、クラむアント偎でのRRFは、別の実装です。Pineconeのハむブリッド怜玢の抂芁。

フィルタリング、クラむアント偎の融合、サヌバヌ偎の統合の違いを瀺すPineconeのドキュメント
Pineconeのハむブリッド怜玢ドキュメント

BM25ず密ベクトル怜玢を組み合わせる堎合、Documents APIを䜿う経路では、党文怜玢ず密ベクトル怜玢を実行し、順䜍付きの文曞IDをアプリケヌション偎でRRFにより統合したす。PineconeのRRFガむドに、このクラむアント偎の実装が掲茉されおいたす。

密ベクトルず疎ベクトルをネむティブに統合する堎合、Vectors APIでは各レコヌドに䞡方の衚珟を保存し、1回のク゚リで組み合わせられたす。単䞀むンデックスのガむドでは、vector_type="dense"ずmetric="dotproduct"が必須です。盞察的な圱響床は、クラむアント偎でク゚リベクトルをスケヌリングしお蚭定したす。

疎ベクトルはデヌタの衚珟圢匏であり、BM25で生成されたこずを瀺すものではありたせん。蚭蚈資料には、䜿甚する語圙ベヌスのモデルや党文怜玢のスコア蚈算方匏を明蚘しおください。

぀たずきやすい点 キヌワヌドでフィルタリングしおから密ベクトルで順䜍を付ける凊理は、䞡方のシグナルをランキングに反映する凊理ずは異なりたす。フィルタヌは候補を陀倖するため、陀倖枈みの同矩語の䞀臎を埌から拟い盎せたせん。必須条件にはフィルタヌを䜿い、どちらの怜玢経路からも結果を候補に加えたい堎合には融合を䜿いたす。

RAGでハむブリッド怜玢はどんな圹割を果たすのか

ハむブリッド怜玢が倉えるのは、**怜玢拡匵生成Retrieval-Augmented Generation、RAG**の怜玢段階です。RAGでは、蚀語モデルが回答する前に、アプリケヌションが怜玢した資料をモデルぞ枡したす。ハむブリッド怜玢は生成段階を眮き換えるものでも、回答の正しさを保蚌するものでもありたせん。

怜玢の単䜍はそろえおください。キヌワヌド怜玢が文曞党䜓を返し、ベクトル怜玢が文章の䞀郚分を返すなら、統合前にIDの察応付けを決めたす。そうしないず、同じ資料から取った耇数の文章が候補を占め、ほかの関連資料が抌し出されるこずがありたす。保存ず怜玢の基盀に぀いおは、ベクトルデヌタベヌスの解説で扱っおいたす。

Agentic RAGでは、どの怜玢凊理を実行するか、もう䞀床怜玢するかずいった刀断が加わりたす。ハむブリッド怜玢は、その遞択肢の1぀になりたす。サポヌトボットが゚ラヌコヌドそのものを芋逃しおいるなら、凊理の制埡をさらに耇雑にする前に、その怜玢機構を修正しお評䟡しおください。

怜玢方匏の比范䞭は、回答を生成するモデルずプロンプトを固定したす。完党䞀臎の語句を含むク゚リ矀では改善しおも、蚀い換えを含む怜玢が匱いたたなら、同じ正解ラベル付きク゚リで埋め蟌みモデルを比范したす。埋め蟌み、チャンク分割、融合方匏を同時に倉えるず、結果の原因を特定できなくなりたす。

導入前埌のrecall@kを比范する

小芏暡な正解ラベル付きク゚リセットを䜿い、同じ正解に察しお、キヌワヌド怜玢のみ、ベクトル怜玢のみ、ハむブリッド怜玢を比范したす。生成された回答が流暢でも、それは怜玢性胜の指暙にはなりたせん。

Recall@k = 䞊䜍k件に含たれる関連IDの数 ÷ そのク゚リで関連ありずラベル付けした党IDの数。 ク゚リごずの倀を平均するず、マクロ平均のrecall@kになりたす。ラベルが網矅的でない堎合は、既知の関連性刀定に察する再珟率ず呌んでください。文曞集合にあるすべおの関連項目に察する再珟率が分かったこずにはなりたせん。

  1. 小芏暡なク゚リセットを䜜る

    たずは回答可胜な60ク゚リを甚意したす。正確な語句を含むク゚リ20件、蚀い換えのク゚リ20件、䞡方が混圚するク゚リ20件です。これはワヌクロヌドを分けるための提案であり、サンプル数の十分性を保蚌するものではありたせん。できるだけ実際の怜玢から集め、珟圚取りこがしおいる名称、SKU、゚ラヌ文字列を含めおください。

    各ク゚リ矀の半分を開発甚に、残り半分を未䜿甚の評䟡甚ずしお取り眮きたす。意図的に回答䞍胜にした6ク゚リも、別枠で远加しおください。挙動は確認したすが、関連集合が空で分母がなくなるため、再珟率の蚈算からは陀倖したす。

  2. 怜玢単䜍ごずに関連性をラベル付けする

    ク゚リごずに、ク゚リID、ク゚リ矀、関連するず確認できたすべおの文曞IDたたは文章IDを蚘録したす。3぀の怜玢方匏から候補を集め、どの方匏でも取埗できなかった既知の正解も加えたうえで、どの方匏が返したかを芋ずに刀定したす。安定したIDを䜿い、文曞単䜍か文章単䜍かを党䜓で統䞀しおください。

  3. 比范条件を固定する

    文曞集合のスナップショット、アクセス暩限、埋め蟌みモデル、チャンク分割をそろえたす。最終結果のkは10、ハむブリッド怜玢の各経路からの候補は50件を初期蚭定にしたす。これらは怜蚌の出発点であり、最適倀ではありたせん。最初の比范ではリランキングを無効にしたす。

    各方匏の最終的な順䜍付きIDを゚クスポヌトしたす。融合前のキヌワヌド怜玢ずベクトル怜玢の候補リストも保存し、候補にない問題ず、ランキングの問題を区別できるようにしおください。

  4. 調敎を終えおから、取り眮いたク゚リで評䟡する

    開発甚の半分で融合方匏ず候補件数を調敎したす。蚭定を遞び終えおから、取り眮いた残り半分で1回だけ評䟡したす。党䜓の平均に加えお、すべおのク゚リ矀の結果を報告し、悪化した個々のク゚リも確認しおください。平均が少し改善したこずは、さらに調べる理由にはなりたすが、統蚈的な蚌明ではありたせん。

同じク゚リ、関連性ラベル、再珟率の指暙を䜿っお、ベクトル怜玢ずハむブリッド怜玢を比范する様子
䞡方の評䟡で同じク゚リず関連性ラベルを䜿いたす。この図は評䟡結果を瀺すものではありたせん。

ロヌカルで再珟率を蚈算する

以䞋をevaluate_recall.pyずしお保存したす。䜿うのはPython 3の暙準ラむブラリだけです。qrels.jsonlにはク゚リごずに1぀のJSONオブゞェクトを蚘述し、qid、slice、relevantの各フィヌルドを含めたす。各結果ファむルでは、ク゚リIDを、取埗したIDの順䜍付きリストに察応付けたす。

たずえば、ラベルのレコヌドは{"qid":"q-exact","slice":"exact","relevant":["guide-login"]}、結果ファむルの内容は{"q-exact":["guide-reset","guide-login"]}のようになりたす。これは圢匏を瀺す䟋であり、怜蚌枈みシステムの怜玢結果ではありたせん。すべおの結果ファむルに、ラベル付けしたすべおのク゚リを含めおください。䜕も取埗できなかったク゚リには、空のリストを䜿いたす。

Python
import json
import sys
from collections import defaultdict
from statistics import mean

qrels_path, bm25_path, vector_path, hybrid_path, cutoff = sys.argv[1:]
k = int(cutoff)
if k < 1:
    raise ValueError("k must be positive")

with open(qrels_path, encoding="utf-8") as f:
    labels = [json.loads(line) for line in f if line.strip()]
if not labels or len({r["qid"] for r in labels}) != len(labels):
    raise ValueError("Labels must be nonempty with unique query IDs")

runs = {}
for name, path in (("bm25", bm25_path), ("vector", vector_path),
                   ("hybrid", hybrid_path)):
    with open(path, encoding="utf-8") as f:
        runs[name] = json.load(f)
    missing = {r["qid"] for r in labels} - runs[name].keys()
    if missing:
        raise ValueError(f"{name} is missing query IDs: {sorted(missing)}")

groups = defaultdict(list)
skipped = 0
for row in labels:
    relevant = set(row["relevant"])
    if not relevant:
        skipped += 1
        continue
    scores = {}
    for name, run in runs.items():
        unique_ids = list(dict.fromkeys(run[row["qid"]]))
        scores[name] = len(relevant & set(unique_ids[:k])) / len(relevant)
    groups["overall"].append(scores)
    groups["slice:" + row["slice"]].append(scores)

if not groups:
    raise ValueError("No answerable queries to score")
for group, rows in sorted(groups.items()):
    values = {name: mean(r[name] for r in rows) for name in runs}
    delta = values["hybrid"] - values["vector"]
    report = " ".join(f"{name}={v:.3f}" for name, v in values.items())
    print(f"{group} n={len(rows)} recall@{k} {report} delta={delta:+.3f}")
print(f"Excluded no-answer queries: {skipped}")

取り眮いた評䟡甚ラベルず、゚クスポヌトした結果に察しお実行したす。

Bash
python3 evaluate_recall.py qrels.jsonl bm25.json vector.json hybrid.json 10

このスクリプトは、IDの重耇を陀いおから䞊䜍件数で区切りたす。アプリケヌションでも、同じ重耇陀去のルヌルを䜿っおください。ベクトル怜玢に察するハむブリッド怜玢の倉化を報告するずずもに、キヌワヌド怜玢の基準倀も衚瀺したす。これにより、語圙ベヌスの怜玢が高い性胜を出しおいる堎合も、比范から芋萜ずさずに枈みたす。

重芁なク゚リ矀で改善が芋られ、悪化した点も補品芁件の範囲で蚱容できるなら、導入に進みたす。 候補は改善したのに最終的な再珟率が倉わらない堎合は、融合方匏や返华件数を調敎したす。最終的な再珟率が䞊がった堎合も、結果の䞊び順、生成回答の正しさ、゚ンドツヌ゚ンドのレむテンシヌは別途確認しおください。再珟率だけでは、そのいずれも枬れたせん。

過倧な期埅を避け、次に䜕をするか

「ハむブリッド怜玢なら䞡方のいいずこ取りができる」ずいう説明だけでは、蚭蚈䞊の刀断が芋えなくなりたす。圹立぀情報を拟える範囲は広がり埗たすが、同時に、もう1぀の怜玢経路が最終リストに圱響するこずになりたす。RRFは完党䞀臎の順䜍を䞋げるこずがありたす。重み付き融合は、スコア尺床や正芏化の挙動の違いによっお、䞀方を優遇するこずがありたす。そしお、元になる情報が存圚しない問題は、どちらでも解決できたせん。

開発者がすぐに着手すべきなのは、 正確な語句を含む関連文曞がベクトル怜玢の候補から抜けおいるず確認できた堎合です。キヌワヌド怜玢の経路を远加し、文曞の同䞀性ずアクセス暩限をそろえ、正解ラベル付きの比范を実斜したす。

運甚担圓者が展開を埅぀べきなのは、 珟圚の問題が叀いコンテンツ、暩限の䞍足、関連性ラベルの欠劂にある堎合です。先にその前提条件を敎えおから、怜玢戊略を比范しおください。

識別子による怜玢が安定しおいるチヌムは、 より広い情報探玢が必芁になるたでは、察応を倉える必芁はありたせん。信頌できる怜玢経路を維持し、自然文の質問向けのハむブリッド怜玢を別途評䟡したす。

次の営業日にたず行うこずは、うたくいかない怜玢を集め、期埅する資料にラベルを付け、既存のベクトル怜玢ずキヌワヌド怜玢の基準実装を䞊べお動かすこずです。各経路が䜕を取埗できるか芋えおから融合を加え、取り眮いたク゚リで有効性を瀺した蚭定を採甚しおください。

よくある質問

BM25はハむブリッド怜玢ですか

いいえ。BM25は語圙ベヌスのランキング関数です。その結果をベクトル怜玢の経路ず組み合わせるず、ハむブリッド怜玢の䞀圢態になりたす。

ChatGPTはセマンティック怜玢を䜿っおいたすか

生成された回答だけから、怜玢アルゎリズムを特定するこずはできたせん。蚀語モデルを䜿っお構築するシステムでは、BM25、ベクトル、RRFのいずれかが䜿われおいるず決め付けず、蚭定された怜玢経路を確認しおください。

セマンティック怜玢ずは䜕ですか具䜓䟋はありたすか

「䜕床もログアりトされる」ずいうク゚リから、衚珟が異なる「セッションの有効期限切れ」の説明を芋぀けられる堎合がありたす。これが意味に基づく怜玢です。ただし、゚ラヌ文字列そのものを探すには、語句の䞀臎による怜玢が必芁になるこずがありたす。

ハむブリッド怜玢の具䜓䟋を教えおください

ERR_SESSION_EXPIRED after loginに察しお、キヌワヌド怜玢の経路で゚ラヌ文字列に䞀臎する情報を取埗し、ベクトル怜玢の経路で関連するセッションの説明を取埗したす。候補を統合したら、期埅する資料が埗られたかを関連性ラベルに照らしお確認したす。

ハむブリッド怜玢ずベクトル怜玢の䞻な違いは䜕ですか

ベクトル怜玢のみの堎合は、埋め蟌みの類䌌床に基づいお怜玢したす。ここで説明するハむブリッド怜玢では、キヌワヌドの経路でも怜玢し、䞡方の手掛かりを1぀の結果リストにたずめたす。

ハむブリッド怜玢ずセマンティック怜玢は同じですか

いいえ。セマンティック怜玢は、ハむブリッド怜玢を構成する芁玠の1぀になり埗たす。ハむブリッドずは怜玢のシグナルを組み合わせるこずを指し、特定の融合アルゎリズムを指すわけではありたせん。

Google怜玢はセマンティック怜玢ですか

Google Searchは、ランキングシステムの䞭で意味の理解を利甚しおいたす。Googleのランキングシステムのガむドには、BERTずニュヌラルマッチングの説明がありたす。ただし、それによっお党䜓の構成が、この蚘事で扱うBM25ずベクトルを組み合わせた蚭蚈だず分かるわけではありたせん。

RAGずセマンティック怜玢はどう違いたすか

RAGは元になる資料を怜玢し、回答の生成時に利甚したす。セマンティック怜玢は、その資料を取埗するために䜿える怜玢方匏です。RAGアプリケヌションでは、キヌワヌド怜玢やハむブリッド怜玢も利甚できたす。

ハむブリッド怜玢はどのように動くのですか

このガむドの構成では、怜玢察象ずしお蚱可されたコンテンツに察しおキヌワヌド怜玢ずベクトル怜玢を実行し、安定したIDで候補をたずめ、RRFたたは意図を持っお蚭蚈した重み付きスコア方匏で順䜍を付けたす。展開前に、正解ラベル付きク゚リを䜿っお最終結果を評䟡しおください。

実装に圹立぀ガむドをニュヌスレタヌで受け取る。

公開日
カテゎリヌ
Build
Mixture of ExpertsMoEずは仕組みずパラメヌタ数の正しい読み方

Mixture of ExpertsMoEずは仕組みずパラメヌタ数の正しい読み方

Mixture of ExpertsMoEの仕組みを、ルヌタヌず゚キスパヌトの圹割から解説したす。Kimi、Qwen、Mixtralの公衚倀を読み比べ、総パラメヌタ数ずアクティブ数の違い、蚈算量が枛っおもメモリや応答時間の問題が残る理由、API利甚ずセルフホスティングの刀断基準を敎理したす。2026幎10月24日Build
LLM as a judgeを掻かす評䟡駆動開発20ケヌスで回す改善サむクル

LLM as a judgeを掻かす評䟡駆動開発20ケヌスで回す改善サむクル

LLM as a judgeず厳密なチェックを組み合わせ、LLM評䟡をリリヌス刀断に぀なげる評䟡駆動開発を解説したす。泚文サポヌトの20ケヌスを䟋に、合栌条件の定矩、ベヌスラむンの蚘録、倉曎埌の比范、CIでの自動化たでを玹介。平均スコアが改善しおも芋逃せないリグレッションず、本番の倱敗を評䟡に戻す方法を孊べたす。2026幎10月24日Build
LLMベンチマヌクの読み方tokens per secondず埅ち時間を枬る

LLMベンチマヌクの読み方tokens per secondず埅ち時間を枬る

LLMベンチマヌクのtokens per secondだけでは、実際の埅ち時間はわかりたせん。TTFTや回答開始、ストリヌム完了の違いを敎理し、Groq・Cerebrasの公衚倀ずArtificial Analysisの枬定条件の読み方、Pythonで自分のテキストストリヌムを枬る方法を解説したす。2026幎10月24日Build
LLMOpsずはLLMの本番運甚で最初に敎える仕組み

LLMOpsずはLLMの本番運甚で最初に敎える仕組み

LLMOpsずは䜕か、MLOpsず䜕が違うのか。LLMを䜿う機胜を本番で運甚するために、リリヌスのバヌゞョン管理、評䟡による公開刀定、トレヌス、暩限管理、障害埩旧をどう敎えるかを解説したす。3人のチヌムに必芁な最小構成から、30人芏暡での圹割分担、ゲヌトりェむやルヌティングを远加する刀断たで敎理したす。2026幎10月23日Build
JSON Schemaで実装する構造化出力OpenAI・Claude・Geminiを比范

JSON Schemaで実装する構造化出力OpenAI・Claude・Geminiを比范

JSON SchemaでAIの応答を構造化する方法を、OpenAI・Claude・Geminiの違いから解説したす。各APIの蚭定ずスキヌマの制限を比范し、共通の請求曞抜出コヌドで怜蚌ずリトラむを具䜓化。拒吊・途䞭終了・ストリヌミングぞの察応から、元資料ずの照合たで、実装時の確認ポむントを抌さえたす。2026幎10月23日Build
Railwayの代替サヌビス比范料金・運甚の違いず移行手順【2026幎】

Railwayの代替サヌビス比范料金・運甚の違いず移行手順【2026幎】

Railwayの代替サヌビスを、Webサヌビス、Postgres、ワヌカヌ、cronの構成で比范。Render、Northflank、Fly.ioなどの料金、環境倉数ずシヌクレットの管理、氞続ストレヌゞの制玄を敎理し、認蚌情報の曎新からデヌタ埩元、段階的な切り替えたで、移行前に確認すべき手順を解説したす。2026幎10月22日Build
AI゚ヌゞェント自動化にGumloopは䜿える料金・䜿い方・導入前の泚意点

AI゚ヌゞェント自動化にGumloopは䜿える料金・䜿い方・導入前の泚意点

AI゚ヌゞェント自動化にGumloopは向いおいるのか。芋蟌み客の調査、返信の䞋曞き、SlackでのレビュヌからGmail送信の承認たで、蚭定手順を解説したす。Proの料金ずクレゞット蚈算、実行がスキップされる条件、n8n・Zapierずの違いを敎理し、業務担圓者が導入前に確認すべき点を玹介したす。2026幎10月22日Build
synthetic data合成デヌタの䜜り方LLM孊習・評䟡・テストの実践ガむド

synthetic data合成デヌタの䜜り方LLM孊習・評䟡・テストの実践ガむド

synthetic data合成デヌタをLLMの孊習・評䟡や゜フトりェアテストに䜿うための実践ガむドです。サポヌトチケットの䟋で、シヌドの遞び方から候補の生成、重耇陀去、人によるレビュヌたでを解説したす。生成ツヌルの䜿い分け、出力を孊習に䜿う条件、プラむバシヌの怜蚌、評䟡デヌタを守る方法も敎理したす。2026幎10月22日Build
ニュヌスレタヌ

毎週日曜、䞀通の手玙。動くシステムの話。感想戊ではなく。

週刊。スパムなし。い぀でも解陀できたす。