<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>検索</title><link>https://blog.ast.moe/tags/%E6%A4%9C%E7%B4%A2/</link><description>Recent posts from 五里霧中</description><generator>Hugo</generator><item><title>LLM・Embedding model・Jev・古典的なNLPをどう使い分けるか</title><link>https://blog.ast.moe/blog/2026-09-26-3/</link><pubDate>Sat, 26 Sep 2026 20:30:00 +0900</pubDate><guid>https://blog.ast.moe/blog/2026-09-26-3/</guid><description>&lt;p&gt;検索も分類も比較も判断も、とりあえずLLMに渡せばよいという扱いを見かける。自然文で依頼すれば何か返ってくるし、次の質問もそのまま続けられる。その手軽さは実際に便利で、自分もつい何でも任せたくなる。だからこそ、LLMなら何でも解けるような感覚にもなりやすい。&lt;/p&gt;
&lt;p&gt;一方、Jevのような判断モデルを使うときにも、向いていない仕事を渡してしまうことがある。まだ材料が集まっていないのに情報を探させたり、候補が決まっていないのに方針全体を考えさせたりするのは、限定された判断をする道具に調査まで求めている。既知の語を探すだけなら、そもそもモデルを呼ばずに文字列検索で終わる。&lt;/p&gt;
&lt;p&gt;「頼めば何か返ってくる」ことと、その仕事に合った手段であることは別だ。似た資料を集めるならEmbedding modelも候補になるが、類似度だけで資料の正しさは決まらない。LLM、Jev、Embedding model、古典的な検索やテキスト処理について、自分が何を任せたいかを整理しておく。製品間の精度比較ではなく、まず入出力と仕事の種類の話である。&lt;/p&gt;
&lt;h2 id="探すことと判断することを分ける"&gt;探すことと判断することを分ける&lt;/h2&gt;
&lt;p&gt;以下では、自分がよく扱う開発の例で考える。例えばテストが失敗して、「関係するコードを探したい」とする。この段階の答えはファイルや行の候補だ。一方、「この失敗は今の差分に起因するか」は、差分と失敗ログを見比べる判断である。「原因を調べて直す」は、追加の情報収集や実験まで含む作業になる。&lt;/p&gt;
&lt;p&gt;似た文を入力しても、欲しい出力はそれぞれ違う。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;手段&lt;/th&gt;
&lt;th&gt;まず渡すもの&lt;/th&gt;
&lt;th&gt;主な出力&lt;/th&gt;
&lt;th&gt;自分が使いたい場面&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ルール・文字列検索・BM25など&lt;/td&gt;
&lt;td&gt;語、パターン、文書集合&lt;/td&gt;
&lt;td&gt;一致箇所や検索順位&lt;/td&gt;
&lt;td&gt;名前やエラー文が分かっている、候補を機械的に絞れる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding model&lt;/td&gt;
&lt;td&gt;検索文と文書&lt;/td&gt;
&lt;td&gt;ベクトルと類似度による候補&lt;/td&gt;
&lt;td&gt;言い換えが多く、語が一致しない資料も探したい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;集めた証拠と型付きの質問&lt;/td&gt;
&lt;td&gt;Yesの確率、選択肢、段階評価&lt;/td&gt;
&lt;td&gt;候補と評価基準を決めた上で、小さな判断をしたい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM&lt;/td&gt;
&lt;td&gt;問題、資料、必要ならツール&lt;/td&gt;
&lt;td&gt;説明、仮説、コード、次の調査&lt;/td&gt;
&lt;td&gt;問題を分解し、足りない証拠を集め、実装や検証を進めたい&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この表は能力の限界を示すものではない。LLMに分類させることも、Embeddingを特徴量にして分類器を作ることもできる。ただ、素の類似度を判断の確率として読み替えたり、単純な検索をするたびにLLMを起動したりする必要はない、という区別である。&lt;/p&gt;
&lt;h2 id="欲しい答えから作業を分ける"&gt;欲しい答えから作業を分ける&lt;/h2&gt;
&lt;p&gt;例えば、変更後にAPIのテストがタイムアウトしたとする。最初はテスト名やエラー文から関係するコードを探したいかもしれない。ログと差分が揃った後は「今回の変更が原因か」を判断したいし、原因が分からなければ追加調査が必要になる。同じ失敗でも、いま欲しい答えによって作業が変わる。&lt;/p&gt;
&lt;p&gt;自分なら、ツール名から選ぶのではなく、まず「欲しい答えは何か」と「その答えを出す材料は手元にあるか」を確認する。以下はその流れで、四つを順番に全部使う手順ではない。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;flowchart LR
START{&amp;#34;関連する資料やコードを&amp;lt;br/&amp;gt;探す段階か&amp;#34;}
START --&amp;gt;|はい| FIND{&amp;#34;語や条件で探せるか&amp;#34;}
FIND --&amp;gt;|はい| SEARCH[&amp;#34;文字列検索・ルール・BM25&amp;lt;br/&amp;gt;手元: エラー名・関数名・検索条件&amp;#34;]
FIND --&amp;gt;|いいえ| EMBED[&amp;#34;Embeddingとキーワード検索&amp;lt;br/&amp;gt;手元: 症状の説明・探す資料群&amp;#34;]
START --&amp;gt;|いいえ| RESOLVED{&amp;#34;手元の情報を読めば&amp;lt;br/&amp;gt;答えが確定するか&amp;#34;}
RESOLVED --&amp;gt;|はい| DONE[&amp;#34;ここで終了&amp;#34;]
RESOLVED --&amp;gt;|いいえ| JUDGE{&amp;#34;証拠が揃い&amp;lt;br/&amp;gt;問いを閉じられるか&amp;#34;}
JUDGE --&amp;gt;|はい| JEV[&amp;#34;Jevで限定された判断&amp;lt;br/&amp;gt;手元: ログ・差分・判断する選択肢&amp;#34;]
JUDGE --&amp;gt;|いいえ| LLM[&amp;#34;LLMとツールで調査・実装&amp;lt;br/&amp;gt;手元: 問題と追加調査の手段&amp;#34;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;まず、必要なのが候補の発見なのか、手元の証拠を使った判断や実装なのかを分ける。候補を探す場合、エラー文、関数名、テスト名のような既知の語があれば文字列検索を使う。大量の文書を語で順位付けしたいならBM25も候補になる。見つかった箇所を読んで答えが確定するなら、そこで終わってよい。&lt;/p&gt;
&lt;p&gt;候補が足りず、同じ事柄が別の言い方で書かれている資料を探したいならEmbeddingを検討する。ただし固有名詞やコード上の識別子までEmbeddingだけで探す必要はない。語による検索と併用し、得られた類似文書を「確認すべき候補」として扱う。&lt;/p&gt;
&lt;p&gt;候補と証拠が手元にあり、「この差分は失敗に関係するか」「次に調べるならA、B、unknownのどれか」のように問いを閉じられるなら、Jevへ切り出せる。材料が欠けている状態でJevに選ばせても、欠けた情報は補われない。回答が出た後もコードやテストで確かめる。&lt;/p&gt;
&lt;p&gt;原因候補すら定まらない、追加の観測が必要、修正して回帰テストまで進めたい、といった場合はLLMを使うエージェントの出番になる。調査中に識別子が判明したら検索へ戻り、比較したい候補が揃ったら必要に応じてJevへ小さな問いを渡す。LLMを選んだら他の手段を使わない、という分岐ではない。&lt;/p&gt;
&lt;p&gt;また、外部APIへログやコードを送る構成なら、その内容を送ってよいかは選定フローとは別に確認する。答えの形が合っていても、送信できない情報を含むならその構成は使えない。&lt;/p&gt;
&lt;h2 id="まず古典的なテキスト処理と情報検索"&gt;まず古典的なテキスト処理と情報検索&lt;/h2&gt;
&lt;p&gt;エラー名、テスト名、関数名が分かっているなら、最初は&lt;code&gt;rg&lt;/code&gt;や構文に沿った検索でよい。&lt;code&gt;TimeoutError&lt;/code&gt;がどこから返るか、特定のAPI名を使っている箇所はどこか、といった問いは、コードを実際に検索すれば答えが出る。ログに&lt;code&gt;FAILED&lt;/code&gt;があるかどうかも、モデルに判定してもらう話ではない。&lt;/p&gt;</description></item></channel></rss>