Upgrade to Pro — share decks privately, control downloads, hide ads and more …

生成AI時代に必要な検索とレコメンドをざっくり抑える

nakamura.shogo
July 20, 2024
810

 生成AI時代に必要な検索とレコメンドをざっくり抑える

nakamura.shogo

July 20, 2024
Tweet

Transcript

  1. 自己紹介 [名前] 中村祥吾 [所属] データ事業本部 / 機械学習チーム [エイリアス1] ハラショー(社内) [エイリアス2]

    nokomoro3(ブログ・Ⅹ名) [仕事] 機械学習やデータ分析基盤の開発 [好きなフォント] HackGen, Moralerspace [好きなキーボード] HHKBシリーズ [使用エディタの主な変遷] サクラエディタ→秀丸→Emacs→VSCode 4 https://dev.classmethod.jp/author/shogo-nakamura/
  2. 読んだ文献 12 ・Introduction to Information Retrieval (IR-book) ・https://nlp.stanford.edu/IR-book/ ・Googleを支える技術|技術評論社 ・https://gihyo.jp/book/2008/978-4-7741-3432-1

    ・Elastic Stack実践ガイド[Elasticsearch/Kibana編] - インプレスブックス] ・https://book.impress.co.jp/books/1119101078 ・O'Reilly Japan - 機械学習による検索ランキング改善ガイド ・https://www.oreilly.co.jp/books/9784814400300/ ・O'Reilly Japan - 推薦システム実践入門 ・https://www.oreilly.co.jp/books/9784873119663/
  3. ブール検索 21 ・転置インデックスにより実現 (1)美味しい寿司と刺身を食べました。 (2)新鮮な魚で作った刺身が好きです。 (3)寿司屋で美味しい寿司を食べました。 美味しい: [1, 3] 寿司:

    [1, 3] と: [1] 刺身: [1, 2] を: [1, 3] 食べました: [1, 3] 新鮮な: [2] 魚: [2] で: [2, 3] 作った: [2] が: [2] 好きです: [2] 寿司屋: [3] 文書集合: 転置インデックス: ("寿司" OR "刺身") AND "美味しい" 検索クエリ: 文書1と3が該当 検索結果: 辞書 + posting list
  4. 高速な処理のための工夫 22 ・処理順 ・posting listの小さい単語から処理 ・マージ方法 ・posting listをdocIDでソートしておく ・skip listの使用

    ・辞書のデータ構造を工夫 ・B-Tree, FST(Finite State Transducer) ・インデックス分割による分散処理 ・水平分割(ドキュメントの分割) ・垂直分割(キーワードの分割) 美味しい: [1, 3] 寿司: [1, 3] と: [1] 刺身: [1, 2] を: [1, 3] 食べました: [1, 3] 新鮮な: [2] 魚: [2] で: [2, 3] 作った: [2] が: [2] 好きです: [2] 寿司屋: [3] 転置インデックス: 辞書 + posting list
  5. 正規表現の実現 23 ・正規表現に対応可能なインデックスを構築 例: k-gramインデックス 文字列をk文字ずつの部分文字列に分割したものでインデックスを構築する (1) "hello world" (2)

    "hello there" (3) "world wide web" $he: [1, 2] hel: [1, 2] ell: [1, 2] llo: [1, 2] lo : [1, 2] o w: [1] wor: [1, 3] orl: [1, 3] rld: [1, 3] ld$: [1] ... 文書集合: 3-gramインデックス: ($は先頭と末尾を表す) "hel.*ld" 検索クエリ: 文書1が該当 検索結果: "$he" AND "hel" AND "ld$" クエリの3-gram表現: ※実際には候補の絞り込みとなるので正規表現との一致は 後処理で確認する
  6. 近接検索の実現 24 ・位置インデックスを使った近接検索への対応 (1) "東京の桜は春に美しく咲きます" (2) "大阪城の桜祭りは有名です" (3) "春の京都で桜を見るのが私の夢です" 東京:

    {1: [1]} の: {1: [2], 2: [2], 3: [2]} 桜: {1: [3], 2: [3], 3: [5]} は: {1: [4], 2: [4]} 春: {1: [5], 3: [1]} に: {1: [6]} 美しく: {1: [7]} 咲き: {1: [8]} ます: {1: [9]} 大阪城: {2: [1]} 祭り: {2: [5]} 有名: {2: [6]} です: {2: [7], 3: [9]} 京都: {3: [3]} で: {3: [4]} を: {3: [6]} 見る: {3: [7]} 私: {3: [8]} 夢: {3: [9]} 文書集合: 位置インデックス: "春" と "桜" が3単語以内に出現する文書 検索クエリ: 文書1が該当 検索結果: 桜: {1: [3], 3: [5]}⇒|3-5|=2 春: {1: [5], 3: [1]}⇒|5-1|=4
  7. スペル修正の実現 25 ・「孤立用語修正」と「文脈依存修正」 ・孤立用語修正は、k-gramと編集距離を使用 ・文脈依存修正は、上記を単語単位でやることでも可能だが より高度な機械学習を使うケースも "hello": "hel", "ell", "llo"

    "help": "hel", "elp" "helicopter": "hel", "eli", "lic", "ico", ... ... 3-gramの辞書: "helo" 検索クエリ: "hello"または"help" 修正結果: "hel" OR "elo" クエリの3-gram表現: "hello": 1 "help": 1 "helicopter": 7 編集距離の計算:
  8. ファセット検索 26 ・ファセット検索は検索結果を複数の次元(ファセット)で分類し、 それらの分類を使って検索結果を絞り込んでいく検索方法 // Elasticsearchにおけるクエリ例 GET /books/_search { "size":

    0, "query": { "bool": { "must": [ { "match": { "title": "日本の歴史" } } ], "filter": [ { "term": { "genre.keyword": "戦国時代" } }, { "range": { "publish_date": { "gte": "2015-01-01", "lt": "2020-01-01" } } }, { "range": { "price": { "gte": 2000, "lt": 3000 } } } ] } } }
  9. ベクトル検索とは?? 29 ・テキストをベクトルに変換して類似度を計算 ・実際ベクトル化の手法は様々 ・疎なやつ ・古典的なベクトル表現(TF-IDF) ・単純な単語頻度もベクトル ・密なやつ ・特異値分解(SVD)などによる次元削減したベクトル ・機械学習による埋め込みベクトル

    (Word2Vec、FastText、LLMを使用した方法) そもそも埋め込みモデルは疎なベクトルをある意味的文脈でデータの分布や関係性を損なわずに埋め込まれた密なベクトルに変換する 行為であって決してテキストをベクトルに埋め込むモデルではなく実際にはテキストは一旦疎なベクトルに変換されそこから埋め込み モデルを通して密な埋め込みベクトルに変換されるものである(オタク特有の早口)
  10. 埋め込みベクトルの例1 30 ・Word2Vec ・特徴 単純な全結合なニューラルネットワークをCBOW(周辺単語から中心単語を予測) またはSkip-gram(中心単語から周辺単語を予測)で学習 ・よく見る例: 王様 - 男性

    + 女性 = 女王 ・欠点: 文脈依存や否定の意味まで捉えることが困難 (例1)「この料理は美味しい。」「この料理は美味しくない。」 (例2)「猫が犬を追いかけた。」「犬が猫を追いかけた。」
  11. ベクトル検索のインデックス 32 ・最近傍を求めるのはコストが高いため、近似最近傍探索を実施 ・例: HNSW(Hierarchical Navigable Small World ) 高次元データの近似最近傍探索を

    効率的に行うためのアルゴリズム 多層のグラフ構造を持っており、 クラスタリングよりも変更に強く、 検索速度と精度のバランスが良い ・その他の近似最近傍探索は以下も参照 ・近似最近傍探索の最前線 - Speaker Deck ・https://speakerdeck.com/matsui_528/jin-si-zui-jin-bang-tan-suo-falsezui-qian-xian ・OpenSearch における 10 億規模のユースケースに適した k-NN アルゴリズムの選定 | Amazon Web Services ブログ ・https://aws.amazon.com/jp/blogs/news/choose-the-k-nn-algorithm-for-your-billion-scale-use-case-with- opensearch/ [[1603.09320] Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs](https://arxiv.org/abs/1603.09320)
  12. その他のセマンティック検索 33 ・クエリ拡張 クエリを拡張・修正し、より関連性の高い検索結果を得る技術 辞書・統計ベースの手法から機械学習を用いた手法がある 例: "車" → "車 乗用車"(同義語拡張)

    "コーヒー" → "コーヒー カフェイン エスプレッソ"(関連語拡張) ・エンティティ認識とリンキング クエリ内のエンティティを文脈から特定し、そのエンティティを検索時の 絞り込みや追加の関連情報を提供することで文脈に合った検索結果を得る 例: ワシントンにある政府機関政府機関は ワシントンのリンゴの生産量は ・ナレッジグラフ、ナレッジベース 上記における追加の関連情報を取得する方法
  13. TF-IDF 36 ・TF-IDFはTFとIDFの掛け算 単語 IDF 猫 0.176 は 0.000 魚

    0.477 が 0.000 大好き 0.477 可愛い 0.477 犬 0.477 散歩 0.477 好き 0.176 だ 0.176 私 0.477 の 0.477 寝る 0.477 単語 文書1の TF 文書2の TF 文書3の TF 猫 0.286 0.125 は 0.286 0.200 0.125 魚 0.143 が 0.143 0.200 0.125 大好き 0.143 可愛い 0.143 犬 0.200 散歩 0.200 好き 0.200 0.125 だ 0.200 0.125 私 0.125 の 0.250 寝る 0.125 文書1: 猫は魚が大好き。猫は可愛い。 文書2: 犬は散歩が好きだ。 文書3: 私の猫は寝るのが好きだ。 単語 文書1の TF-IDF 文書2の TF-IDF 文書3の TF-IDF 猫 0.050 0.022 は 魚 0.068 が 大好き 0.068 可愛い 0.068 犬 0.095 散歩 0.095 好き 0.035 0.022 だ 0.035 0.022 私 0.060 の 0.119 寝る 0.060 × = TF: ある単語が文書内で出現する頻度 式: (ある単語の出現回数) / (文書内の全単語数) IDF:ある単語が文書集合全体でどれだけ希少かを示す指標 式: log((全文書数) / (ある単語が出現する文書数)
  14. TF-IDF 37 ・TF-IDFをランキングに使う場合 ・クエリ内の各単語について、文書毎にTF-IDFを計算して合計 ・クエリと文書それぞれをTF-IDFベクトルで表現し類似度計算 クエリ: "猫 好き" 単語 文書1の

    TF-IDF 文書2の TF-IDF 文書3の TF-IDF 猫 0.050 0.022 好き 0.035 0.022 合計 0.050 0.035 0.044 単語 クエリの TF-IDF 猫 0.088 好き 0.088 単語 文書1の TF-IDF 文書2の TF-IDF 文書3の TF-IDF 猫 0.050 0.022 好き 0.035 0.022 類似度 0.707 0.707 1.000 クエリ: "猫 好き"
  15. その他のランキング手法 40 ・参考 O'Reilly Japan - 機械学習による検索ランキング改善ガイド https://www.oreilly.co.jp/books/9784814400300/ Apache SolrやElasticsearchを題材に

    他の特徴量を使ったハイブリッドランキングや プラグインを用いた機械学習モデルによるランキング改善の実例が記載
  16. コンテンツベース 47 ・類似度の高いアイテム特徴をもつものをレコメンド ・事前に以下が必要 ・アイテム側の属性情報 ・ユーザのプロファイル獲得(過去ログベース) ユーザ1 作者: 田中一郎 ジャンル:

    ミステリー 出版社: AAA社 ユーザ2 作者: 佐藤太郎 ジャンル: SF 出版社: BBB社 アイテムA 作者: 田中一郎 ジャンル: ミステリー 出版社: BBB社 アイテムB 作者: 田中一郎 ジャンル: SF 出版社: BBB社
  17. アーキテクチャの型 51 ・どこをマネージドにするのかという話は別途ある ・各種変換自体に生成AIを活用する手も近年は増えている データソースA データソースB ストレージ 変換処理 検索システム 更新

    ・ファイル種毎のテキスト抽出 ・メタデータ抽出 ・ベクトル変換 ユーザクエリ 変換処理 検索処理 回答生成 ・クエリ拡張 ・ベクトル変換 ・SimpleじゃないRAG ユーザ評価 ランキング改善
  18. 評価方法 54 ・オフライン評価の指標がいくつかある 正解のランキングを準備して算出 指標 説明 Precision(適合率): 検索結果中の関連文書の割合を測定します。 検索結果の正確性を評価します。 Recall(再現率):

    関連文書のうち、実際に検索結果に含まれている割合を測定します。 MAP(Mean Average Precision): 複数のクエリに対する平均適合率の平均を計算します。 MRR (Mean Reciprocal Rank): 最初の正解が現れる順位の逆数の平均を計算します。 特に最初の正解の位置が重要な場合に有用です。 NDCG (Normalized Discounted Cumulative Gain): 検索結果の順位と関連性を考慮した指標です。 上位の結果により重みを置いて評価します。 ERR(Expected Reciprocal Rank): ユーザーが検索結果リストを上から下へ見ていく行動をモデル化した 指標です。
  19. 58