Slide 1

Slide 1 text

生成AI時代に必要な検索と レコメンドをざっくり抑える 2024-07-20 データ事業本部 / 機械学習チーム 中村祥吾

Slide 2

Slide 2 text

Xへの投稿の際は、 ハッシュタグ #devio2024 でお願いいたします。 2 お願い

Slide 3

Slide 3 text

本セッションの資料は 後日『DevelopersIO』で記事が 公開されます。 3 はじめに

Slide 4

Slide 4 text

自己紹介 [名前] 中村祥吾 [所属] データ事業本部 / 機械学習チーム [エイリアス1] ハラショー(社内) [エイリアス2] nokomoro3(ブログ・Ⅹ名) [仕事] 機械学習やデータ分析基盤の開発 [好きなフォント] HackGen, Moralerspace [好きなキーボード] HHKBシリーズ [使用エディタの主な変遷] サクラエディタ→秀丸→Emacs→VSCode 4 https://dev.classmethod.jp/author/shogo-nakamura/

Slide 5

Slide 5 text

5 本セッションの内容

Slide 6

Slide 6 text

去年はこんな感じでした 6 https://dev.classmethod.jp/articles/openai-langchain-llamaindex-devio2023/

Slide 7

Slide 7 text

よく聞くワード RAG (Retrieval-Augmented Generation) 7

Slide 8

Slide 8 text

RAGのおさらい ・ChatGPTに代表されるLLMではそのままでは最新の知識や 独自のナレッジ(社内情報)に基づいた解答は難しい ・プロンプトにすべて格納して質問するのもアリだが プロンプトが長すぎると回答にも影響がある ・なのでその裏で検索した結果を取得して、それを元に回答する手法 8 エンド ポイント

Slide 9

Slide 9 text

検索を勉強しないとでは?? ・結局RAGではRetrieval(検索)が重要との話も ・検索以外はLLMで基本は一番良いものをAPIで叩く ・そもそも ・SNS界隈からは車輪の再発明との発言も ・俺達(私)はRAGの根本的なことが分かってないのかもしれない 9

Slide 10

Slide 10 text

レコメンドは?? 10

Slide 11

Slide 11 text

レコメンドと検索 11 ・検索にはクエリがある(能動的) ・レコメンドはクエリがない(受動的) ・基本的には過去の履歴や直近の履歴で察する ・検索との組み合わせも可能 ・検索は大きくマッチングとランキング ・ランキングをレコメンドでパーソナライズ(個人最適) する事例も

Slide 12

Slide 12 text

読んだ文献 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/

Slide 13

Slide 13 text

目次 13 ・本セッションの説明 ・検索の話 ・検索におけるマッチング ・検索におけるランキング ・レコメンドの話 ・実装に向けて ・あまり話せてないトピック ・評価方法

Slide 14

Slide 14 text

14 検索の話

Slide 15

Slide 15 text

検索とは?? 15 ・IR-bookでは… ・「カード番号を入力するために財布からクレジットカードを 取り出すだけでも、情報検索の一種である」 ・学術的な定義:「情報検索(IR)とは、大規模な コレクションの中から、情報ニーズを満たす非構造化された 性質の資料(通常はテキスト)を見つけ出すこと」

Slide 16

Slide 16 text

シンプルな検索手法 16 ・全部grepする ・クエリで全文書をスキャンする ・ある程度の文書量であれば現代のコンピュータ性能では有用 ・テキスト量が膨大だと難しくなる ・ウェブ検索などのケースは文書量が膨大 ・そのため通常、検索にはインデックスが使用

Slide 17

Slide 17 text

インデックスとは?? 17 ・インデックスはアナログなところにもある ・小学校でならう漢字辞典の使い方 ・音訓さくいん ・部首さくいん ・総画さくいん ・書籍の末尾 ・用語とページ番号が紐づけられている

Slide 18

Slide 18 text

検索システムの大枠 18 ・マッチングとランキングから構成 マッチング ユーザのクエリに関連する文書を素早く特定 ランキング 関連性や重要性で並び替え ・全文検索 ・セマンティック検索 ・ファセット検索 ・クエリ拡張 ・スペル修正 ・エンティティ認識 ・動的インデックス ・TF-IDF ・BM25 ・PageRank ・RankSVM ・LambdaMART ・Two-Towerモデル …

Slide 19

Slide 19 text

19 検索における マッチング

Slide 20

Slide 20 text

マッチングの概要 20 ・全文検索(Full-text Search) ・主に文字列マッチングに基づくアプローチ ・キーワード、フレーズ、正規表現など ・例: ブール検索、フレーズ検索、ワイルドカード検索 ・セマンティック検索 ・意味や文脈を考慮したアプローチ ・自然言語処理(NLP)や機械学習技術を活用 ・例: ベクトル検索、エンティティリンキング、ナレッジグラフ

Slide 21

Slide 21 text

ブール検索 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

Slide 22

Slide 22 text

高速な処理のための工夫 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

Slide 23

Slide 23 text

正規表現の実現 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表現: ※実際には候補の絞り込みとなるので正規表現との一致は 後処理で確認する

Slide 24

Slide 24 text

近接検索の実現 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

Slide 25

Slide 25 text

スペル修正の実現 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 編集距離の計算:

Slide 26

Slide 26 text

ファセット検索 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 } } } ] } } }

Slide 27

Slide 27 text

27 セマンティック検索

Slide 28

Slide 28 text

セマンティック検索 28 ・意味や文脈を考慮したアプローチ ・自然言語処理(NLP)や機械学習技術を活用 ・全文検索と組み合わせてハイブリット検索とも ・実装例 ・ベクトル検索 ・クエリ拡張 ・エンティティ認識とリンキング ・ナレッジグラフ

Slide 29

Slide 29 text

ベクトル検索とは?? 29 ・テキストをベクトルに変換して類似度を計算 ・実際ベクトル化の手法は様々 ・疎なやつ ・古典的なベクトル表現(TF-IDF) ・単純な単語頻度もベクトル ・密なやつ ・特異値分解(SVD)などによる次元削減したベクトル ・機械学習による埋め込みベクトル (Word2Vec、FastText、LLMを使用した方法) そもそも埋め込みモデルは疎なベクトルをある意味的文脈でデータの分布や関係性を損なわずに埋め込まれた密なベクトルに変換する 行為であって決してテキストをベクトルに埋め込むモデルではなく実際にはテキストは一旦疎なベクトルに変換されそこから埋め込み モデルを通して密な埋め込みベクトルに変換されるものである(オタク特有の早口)

Slide 30

Slide 30 text

埋め込みベクトルの例1 30 ・Word2Vec ・特徴 単純な全結合なニューラルネットワークをCBOW(周辺単語から中心単語を予測) またはSkip-gram(中心単語から周辺単語を予測)で学習 ・よく見る例: 王様 - 男性 + 女性 = 女王 ・欠点: 文脈依存や否定の意味まで捉えることが困難 (例1)「この料理は美味しい。」「この料理は美味しくない。」 (例2)「猫が犬を追いかけた。」「犬が猫を追いかけた。」

Slide 31

Slide 31 text

埋め込みベクトルの例2 31 ・Sentence Transformer ・特徴 位置エンコーディングなど構造の特性上、文脈を考慮可能 様々なタスクを使って意味的な学習を行う [文類似度タスク] 2つの文が似ていれば類似度が高くする [自然言語推論] 前提文と仮説文の関係性を3つから選択 [パラフレーズ検出] 2つの文が同じ意味を持つかどうか

Slide 32

Slide 32 text

ベクトル検索のインデックス 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)

Slide 33

Slide 33 text

その他のセマンティック検索 33 ・クエリ拡張 クエリを拡張・修正し、より関連性の高い検索結果を得る技術 辞書・統計ベースの手法から機械学習を用いた手法がある 例: "車" → "車 乗用車"(同義語拡張) "コーヒー" → "コーヒー カフェイン エスプレッソ"(関連語拡張) ・エンティティ認識とリンキング クエリ内のエンティティを文脈から特定し、そのエンティティを検索時の 絞り込みや追加の関連情報を提供することで文脈に合った検索結果を得る 例: ワシントンにある政府機関政府機関は ワシントンのリンゴの生産量は ・ナレッジグラフ、ナレッジベース 上記における追加の関連情報を取得する方法

Slide 34

Slide 34 text

34 検索における ランキング

Slide 35

Slide 35 text

ランキングの手法 35 ・TF-IDF ・BM25 ・PageRank ・LambdaMART ・Deep Learningを用いた手法

Slide 36

Slide 36 text

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((全文書数) / (ある単語が出現する文書数)

Slide 37

Slide 37 text

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 クエリ: "猫 好き"

Slide 38

Slide 38 text

BM25 38 ・TF-IDFは単語数が多いほど検索キーワード含む可能性が高くなる ・そのためBM25では単語数によるペナルティを設ける 𝑓(𝑞𝑖 , 𝐷)はTF、IDF(𝑞𝑖 )はIDF、式はTFの補正となっている |𝐷|は文書の単語数、avgdlは文書集合の平均単語数 𝑘1 は1.2または2.0、𝑏は0.75の定数 学術論文など正当に長い文書のスコアが低下する課題も (対策: BM25FやBM25+などの使用、文書の分割など)

Slide 39

Slide 39 text

その他のランキング手法 39 ・PageRank ウェブページ間のリンク構造を分析するアルゴリズム 重要なページからのリンク先となっているページは重要性が高いとする ・他の特徴量を使ったハイブリッドランキング たとえばBM25に加え、CTRを別フィールドとして格納して 線形和でランキングスコアを計算する ・機械学習を使ったランキングモデルの使用 ・LambdaMART ・Deep Learningを用いた手法

Slide 40

Slide 40 text

その他のランキング手法 40 ・参考 O'Reilly Japan - 機械学習による検索ランキング改善ガイド https://www.oreilly.co.jp/books/9784814400300/ Apache SolrやElasticsearchを題材に 他の特徴量を使ったハイブリッドランキングや プラグインを用いた機械学習モデルによるランキング改善の実例が記載

Slide 41

Slide 41 text

機械学習の例1 41 ・LambdaMART LambdaRankアイディアと勾配ブースティング決定木を組み合わせた手法 LambdaRankは直接最適化するのが難しいNDCGなどのランキングの評価指標を改善する方法 ・クエリと関連する全アイテムをモデルに入力して関連度スコアを予測 ・予測した関連度スコアを使ってNDCGを計算し、各ペアでスコアを入れ替えたNDCGも計算 ・これらのNDCGの差から計算されるλを用いて勾配を求め、モデルを学習 勾配ブースティング 決定木モデル クエリベクトル 文書ベクトル … 予測スコア … 正解順位 NDCG … 予測スコアを 入れ替えたもの NDCG Delta NDCG

Slide 42

Slide 42 text

機械学習の例2 42 ・Two-Towerモデル 直接クエリと対象文書の類似性が低いケースについて それらを更に変換して類似するようなエンコーダ処理を学習する クエリ用の エンコーダ モデル アイテム用の エンコーダ モデル 関連度の計算 クエリ: "有休休暇の付与ルールは?" ランキング対象の文書: 関連度: 0 or 1

Slide 43

Slide 43 text

43 レコメンドの話

Slide 44

Slide 44 text

レコメンドと検索の違い 44 ・検索にはクエリがある(能動的) ・レコメンドはクエリがない(受動的) ・基本的には過去の履歴や直近の履歴で暗黙的に察する レコメンデーション アイテム群 検索クエリ (明示的) 検索 結果 アイテム群 レコメンド 結果 検索 購入履歴の蓄積 (暗黙的)

Slide 45

Slide 45 text

検索との組み合わせ 45 ・ランキング処理をレコメンドで補正する事例 https://aws.amazon.com/jp/blogs/machine-learning/enhance-image-search-experiences-with-amazon-personalize-amazon-opensearch-service- and-amazon-titan-multimodal-embeddings-in-amazon-bedrock/

Slide 46

Slide 46 text

レコメンドの方式 46 ・概要推薦 全ユーザーに対して一般的に人気のあるアイテムを推薦する手法 新規ユーザーや十分なデータがない場合に使用される基本的なアプローチ ・コンテンツベースフィルタリング 過去に好んだアイテムの特徴に基づいて類似したものを推薦する手法 アイテムの内容や属性を分析し、ユーザーの嗜好あったアイテムを決める ・協調フィルタリング 類似したユーザーの行動パターンに基づいてアイテムを推薦する手法 ユーザー間の類似性やアイテム間の類似性を利用し、未知のアイテムを予測

Slide 47

Slide 47 text

コンテンツベース 47 ・類似度の高いアイテム特徴をもつものをレコメンド ・事前に以下が必要 ・アイテム側の属性情報 ・ユーザのプロファイル獲得(過去ログベース) ユーザ1 作者: 田中一郎 ジャンル: ミステリー 出版社: AAA社 ユーザ2 作者: 佐藤太郎 ジャンル: SF 出版社: BBB社 アイテムA 作者: 田中一郎 ジャンル: ミステリー 出版社: BBB社 アイテムB 作者: 田中一郎 ジャンル: SF 出版社: BBB社

Slide 48

Slide 48 text

協調フィルタリング 48 ・過去ログから傾向が似たユーザをグルーピング ・アイテムの属性情報が不要であることも特徴 ユーザ1 ユーザ1と 嗜好が似たユーザ 他のユーザ アイテムA 作者: 田中一郎 ジャンル: ミステリー 出版社: BBB社 アイテムB 作者: 田中一郎 ジャンル: SF 出版社: BBB社

Slide 49

Slide 49 text

検索との組み合わせ 49 ・ランキング処理をレコメンドで補正する事例 https://aws.amazon.com/jp/blogs/machine-learning/enhance-image-search-experiences-with-amazon-personalize-amazon-opensearch-service- and-amazon-titan-multimodal-embeddings-in-amazon-bedrock/

Slide 50

Slide 50 text

50 実装に向けて

Slide 51

Slide 51 text

アーキテクチャの型 51 ・どこをマネージドにするのかという話は別途ある ・各種変換自体に生成AIを活用する手も近年は増えている データソースA データソースB ストレージ 変換処理 検索システム 更新 ・ファイル種毎のテキスト抽出 ・メタデータ抽出 ・ベクトル変換 ユーザクエリ 変換処理 検索処理 回答生成 ・クエリ拡張 ・ベクトル変換 ・SimpleじゃないRAG ユーザ評価 ランキング改善

Slide 52

Slide 52 text

データソースの処理 52 ・各々のファイル形式に対してパースを研究するのも一興

Slide 53

Slide 53 text

チャンキング 53 ・チャンキングについては本セッションではあまり扱わず ・固定長チャンキング 一定の文字数や単語数で機械的に分割する方法。 ・段落ベースのチャンキング 段落の区切りを利用して自然な意味のまとまりで分割する方法。 ・文ベースのチャンキング 文単位で分割し、必要に応じて複数の文を組み合わせる方法。 ・セマンティックチャンキング 自然言語処理を用いて意味的なまとまりで分割する高度な方法。 ・ハイブリッドアプローチ 複数のチャンキング方法を組み合わせて使用する柔軟な方法。 ・オーバーラップチャンキング チャンク間で内容を一部重複させて分割する方法

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

評価方法 55 ・オンライン評価 ABテストは実際のユーザーの行動を直接観察 システムの変更が長期的なユーザー行動にどう影響するかを観察 オフライン評価では捉えきれない実世界の複雑性を考慮できる システム Model(v1) Model(v2) 結果表示 集計・分析 Amazon Redshift Amazon QuickSight A群 B群

Slide 56

Slide 56 text

56 そして、生成AIへ…

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

58