こう 聞かれます
- 「埋め込み (エンベディング) とは
何ですか」 - 「ベクトル検索と
キーワード検索は、 どう 違いますか」 - 「検索の
機能を 作るなら、 どちらを 使いますか」
面接官が 見ている点
- 埋め込みを
「文の 意味を 数の 並びに した物」と、 仕組みで 説明できるか - 近さを
どう 測るか (コサイン類似度) を、 ことばで 説明できるか - ベクトル検索を
万能と せず、 キーワード検索との 得意と 不得意を 比べ、 組み合わせを言えるか
短い答え
- 埋め込みは、
文を 数の 並び (ベクトル) に 変えた物で、 意味の 近い 文ほど ベクトルも 近くなります。 ベクトル検索は、 質問の ベクトルに 近い 文書を 探す仕組みです。 - キーワード検索は
同じ 言葉を 含むかで 探すので、 型番や 固有の 名前に 強く、 言い 換えに 弱いです。 ベクトル検索は その逆で、 言い 換えに 強く、 言葉の 正確な 一致に 弱いことがあります。 - その
ため、 実務では 2 つを 組み合わせる (ハイブリッド検索) ことが 多く、 RAG で LLM に 渡す文書を 探すときにも 使います。
少し 詳しい答え
埋め込みとは
埋め込みの
「パスワードを忘れた」
→ [0.81, 0.12, 0.05]
「ログインできない」
→ [0.77, 0.20, 0.09]
「送料はいくらですか」
→ [0.03, 0.10, 0.92]上の 2 つは
埋め込みの
近さの測り方
ベクトルの
TypeScript
function cosineSimilarity(a: number[], b: number[]): number {
let dot = 0;
let normA = 0;
let normB = 0;
for (let i = 0; i < a.length; i++) {
dot += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}ベクトル検索では、
キーワード検索との 得意と不得意
| 問い合わせ | キーワード検索 | ベクトル検索 |
|---|---|---|
| ログインできない (文書は | 言葉が | 意味が |
| 型番 AB-1234 の説明書 | 同じ | 似た |
| 社内の | 同じ | モデルが |
キーワード検索は、
組み合わせと トレードオフ
ハイブリッド検索は、
そのかわり、
よく ある間違い
- ベクトル検索なら
キーワード検索は 要らないと言う 型番や 固有の 名前、 略語のような 言葉の 一致には、 キーワード検索の ほうが 強いことがあります - 埋め込みの
モデルを 途中で 替えて、 古い ベクトルと混ぜる モデルが 違うと ベクトルの 意味の 空間も 違うので、 比べられません。 替えたら 全部作り直します - 長い
文書を 1 本の ベクトルにする 入れられる 長さに 上限が あり、 大きすぎると 中の 話題が 混ざって 近さが 測りにくくなります。 かたまりに分けます
深掘りの問い
- 「ベクトルの
検索の 結果が 意図と ずれる とき、 まず 何を 見ますか」 実際の 質問と、 出てきてほしい 文書の 組を いく つか 用意し、 上位に 入っているかを 確かめる、と答えます - 「ベクトルは
どこに 保存しますか」 今使っている DB に ベクトルの 機能が あれば まず それを 使い、 量や 速さが 足りなくなったら 専用の 仕組みを 考える、と答えます - 「検索の
ほかに、 埋め込みは 何に 使えますか」 似た 問い 合わせを まとめる、 似た 記事を 勧める、 重なった 文書を 見つける、 などを挙げます