5.4K Views
October 23, 25
スライド概要
Product Engineering Night #10 〜10月号〜 での発表資料
https://product-engineer.connpass.com/event/371322/
Helpfeelの独自検索アルゴリズム「意図予測検索」にLLMを組み込んでいく話です。
LLMをプロダクトになじませる 株式会社 Helpfeel プロダクトエンジニア @daizplus 1
自己紹介 daiiz (@daizplus) ● 京都から来ました! ● ソフトウェア作家 ○ 趣味でも仕事でも検索ネタで開発 ○ 技術同⼈誌*の執筆 ■ ● 今週末の技術書博覧会12にも出展します! 疑問解決エンジン「Helpfeel」の開発者 ○ プロダクトの⽴ち上げ期(LLM登場より前!) からずっと開発に携わる ○ 新規ソリューションの開発 * https://books.daiiz.dev/ 2
Helpfeel = どんな質問にも答える疑問解決エンジン https://www.helpfeel.com/ 3
Helpfeel = どんな質問にも答える疑問解決エンジン https://www.helpfeel.com/showcase 4
今⽇の発表の⽬標 ● ● ● LLMを組み込んで進化する過程の紹介 ○ LLM以前の姿からエージェント型まで ○ 裏⽅的な利⽤から表舞台に出ていくまで LLMを適⽤する際に考えてきたことの共有 ○ FAQのメンテナーとエンドユーザーの双⽅にとって良い体験とは? ○ トレードオフいろいろ ○ どう探すか、何を⾒せるか Helpfeelの検索の開発の魅⼒を伝える ○ フルスクラッチで作り込めるので楽しいですよ! 5
意図予測検索 Helpfeel独⾃の検索アプローチ 6
意図予測検索 = 質問を探すための「⽂書拡張」技術 ● どんな⾔葉でも検索できる ● 本⽂にない表現でも検索できる ● 無闇に記事を増やす必要がない 7
⼀般的な全⽂検索での課題 ユーザーの⾔葉を頼りにして直接記事を探す ユーザー 思いついた⾔葉 不良品 異なる お⾦を返して 解釈が 難しい 記事 返⾦⽅法 返⾦⽅法 のご案内 返⾦⽅法 のご案内 のご案内 大きなギャップ 記事が無 闇に増える 管理が 難しい 8
質問を探すための「⽂書拡張」技術 「ある記事」に対して、複数の質問(意図表現)を⽣成し、様々な⾔い回しからたどり着ける。 意図表現 ユーザー 思いついた⾔葉 商品が壊れています 商品が不良品でした 不良品 ▪ ▪ 意図を選択 ▪ 意図表現 (中間) 記事 異なる商品が届いた 異なる 別の商品が届いた 別の物が来た 思っていたのと違う お⾦を返して 不具合があります 違う商品が届いた 返⾦⽅法 のご案内 返⾦してほしい 商品が届いた ▪ ▪ ▪ お⾦を返して欲しい ※従来は「返⾦」でしかヒットしない 9
質問を探すための「⽂書拡張」技術 ① 意図展開 意図表現 ユーザー 思いついた⾔葉 商品が壊れています 商品が不良品でした 不良品 ▪ ▪ 意図を選択 ▪ 意図表現 (中間) 記事 異なる商品が届いた 異なる 別の商品が届いた 別の物が来た 思っていたのと違う お⾦を返して 不具合があります 違う商品が届いた 返⾦⽅法 のご案内 返⾦してほしい 商品が届いた ▪ ▪ ▪ お⾦を返して欲しい 10
質問を探すための「⽂書拡張」技術 ② 検索 意図表現 ユーザー 思いついた⾔葉 商品が壊れています 商品が不良品でした 不良品 ▪ ▪ 意図を選択 ▪ 意図表現 (中間) 記事 異なる商品が届いた 異なる 別の商品が届いた 別の物が来た 思っていたのと違う お⾦を返して 不具合があります 違う商品が届いた 返⾦⽅法 のご案内 返⾦してほしい 商品が届いた ▪ ▪ ▪ お⾦を返して欲しい 11
(補⾜)意図展開の具体例 意図表現 記事 12
(補⾜)意図展開の具体例 意図表現 13
意図予測検索: 第1世代 → 第4世代 地道な 改良 自 LLM 進 体の 化 課題の 明確化 問題の 複雑化 世間の 期待感 14
Helpfeelの意図予測検索の4つの世代 意図展開の支援 情報の構造化 スニペット生成 ベクトル検索 意図表現の生成 エージェンティック検索 15
第2世代 ベクトル検索 ● ● キーワード検索とのハイブリッド ○ 従来の検索を⾏って即時に表⽰ ○ 同時にベクトル検索のリクエストを発⾏ ○ 両者の結果をマージして完成 インクリメンタルサーチのスピード感を 保ちつつ、セマンティック検索を融合 ○ 前世代までとのハイブリッドが基本⽅針 となる 16
第3世代へのモチベーション ● 検索対象が増えつつある ● 検索対象が複雑化しつつある ○ ● FAQ記事だけでなく、PDF⽂書も検索したい ○ ● 全ページに意図表現を書くのは... ハルシネーションは限りなくゼロにしたい ○ ● ⼀⾏の意図表現では表しきれない クリエイティビティよりも回答の安定性を優先する なるべく早く応答したい 17
第3世代 RAG より複雑な問題への回答を可能にする進化 意図展開の支援 ベクトル検索 情報の構造化 スニペット生成 意図表現の生成 エージェンティック検索 18
RAG: Retrieval-Augmented Generation ● LLMに外部知識を与えることで回答 🔍検索クエリ 大量の文書 Retriever DB 精度を向上させる技術 ○ ● 組織に特化した検索を実現 Retrieverが取得した情報に基づいて 回答を⽣成する ○ 検索精度が鍵になる ○ ⽣成の安定性も重要 Generator ✨最終回答 19
一般的な RAGでの課題 ● ● ベクトル化する情報の粒度 ○ ページ単位? ○ ⽂字数、段落で区切る? 情報の重み付け ○ ● 大量の文書 Chunks Retriever Vector DB すべての記述を平等に扱ってよいのか 回答の作り⽅ ○ 🔍検索クエリ Generator 最後のまとめ⽣成過程で誤りが混⼊する 可能性がある ○ リアルタイム⽣成には運要素がある ✨最終回答 20
HelpfeelでのRAG デモ動画 21
HelpfeelでのRAGの見どころ デモ動画 22
HelpfeelでのRAGの見どころ 応答が速い! デモ動画 確実な原典参照! ハルシネーションがほぼゼロ! 23
(再掲)一般的な RAGでの課題 ● ● ベクトル化する情報の粒度 ○ ページ単位? ○ ⽂字数、段落で区切る? 情報の重み付け ○ ● 大量の文書 Chunks Retriever Vector DB すべての記述を平等に扱ってよいのか 回答の作り⽅ ○ 🔍検索クエリ Generator 最後のまとめ⽣成過程で誤りが混⼊する 可能性がある ○ リアルタイム⽣成には運要素がある ✨最終回答 24
Helpfeelでの事前生成型 RAG 🔍検索クエリ Retriever 大量の文書 Vector DB Snippets 引用ベース の回答生成 事実抽出 Reranked snippets ✨最終回答 25
HelpfeelでのRAGの仕組み 🔍検索クエリ Retriever Reranked snippets 大量の文書 Vector DB Snippets 引用ベース の回答生成 事実抽出 Generatorがこっちに来た ✨最終回答 26
事前生成型 RAGの嬉しさ 即興で喋らないRAGの恩恵 ● ● ● ユーザー ○ 応答速度が速い ○ 出典が明確な安定した回答を得られる FAQメンテナー ○ 回答を事前検証が可能 ○ ハルシネーションゼロも可能 運⽤観点 ○ 検索時の⽣成コストほぼなし ○ LLMコストを⾒積もりやすい 27
HelpfeelでのRAGの仕組み 🔍検索クエリ Retriever Reranked snippets 大量の文書 Vector DB Snippets 引用ベース の回答生成 事実抽出 ナレッジグラフを構築 ✨最終回答 28
(補足)ナレッジグラフ構築と事実の抽出 ● LLMを情報の構造化ツールとして利⽤し、ラフなナレッジグラフを構築する ● ナレッジグラフ ○ 情報を体系的に整理するための⼿法として2000年頃から研究されている ○ JSAI2024 「⽣成AI時代のナレッジグラフ」などで、再び盛り上がっている "1993"^^xsd:gYear schema:birthDate schema:birth Place 伝統工芸品 schema:home Location 伝統工芸品 29
ナレッジグラフ構築と事実の抽出 ● LLMで情報を理解して、⽂書中の記述の重みづけを⾏う ● 優先して扱うべき重要な事実を特定する 事実 抽出 情報の構造化 30
ナレッジグラフ構築と事実の抽出 ● LLMで情報を理解して、⽂書中の記述の重みづけを⾏う ● 優先して扱うべき重要な事実を特定する 利⽤可能 交通機関 バス 利⽤可能 鉄道 ⼀定 の距 当 社 が 離以 上の 場合 必 要 ⾶⾏機 と 認 め た 場 合 その他の 交通機関 情報の構造化 31
要約回答の生成 : ナレッジグラフのシリアライズ ● LLMを⽤いてRDFトリプルの⽣成根拠(引⽤箇所)を確認する ● 引⽤⽂を回答提⽰⽤に調整する トリプル集合 バス 利⽤可能 交通機関 鉄道 利⽤可能 ⼀定 の距 離以 当 上の 社 場合 が 必 ⾶⾏機 要 引用箇所の特定 { 原文テキスト } { 要約回答 } と 認 め た Hallucination ☠ 場 合 その他の 交通機関 情報の構造化 スニペット生成 32
意図表現の生成 ● 要約回答 = ハイコンテクストな意図表現 ○ ここでもHelpfeelの⽂書拡張の考え⽅が使える ○ 要約回答から意図表現を⽣成できる ?⋯ ?⋯ ?⋯ ?⋯ ?⋯ ?⋯ 要約回答 記事 意図表現 スニペット生成 意図表現の生成 33
事前生成型 RAGも ⽂書拡張である 意図表現の⼿前のモジュールだと考える 意図表現 ユーザー 思いついた⾔葉 商品が壊れています 商品が不良品でした 不良品 ▪ ▪ 意図を選択 ▪ 異なる商品が届いた 異なる 別の商品が届いた 別の物が来た 思っていたのと違う お⾦を返して 記事 不具合があります 要約回答 違う商品が届いた 返⾦⽅法 のご案内 返⾦してほしい 商品が届いた ▪ ▪ ▪ お⾦を返して欲しい 34
Helpfeelでの事前生成型 RAG(まとめ) ● ベクトル化する情報の粒度 ○ ● 情報の重み付け ○ ● → スニペット → ナレッジグラフ構築による事実抽出 要約回答(スニペット)の作り⽅ ○ 抽出された事実に基づく引⽤ベースの ⽂章を事前⽣成 ○ 質問と回答をつなぐひとことを⽣成 35
Helpfeelでの事前生成型 RAG(まとめ) ● 嬉しさ 大量の文書 ● ○ 要約回答を検証可能 ○ リアルタイム⽣成よりも⾼速 ○ 意図表現を効率よく⽣成可能 Vector DB Snippets 引用ベース の回答生成 事実抽出 課題 ○ 要約回答のカバー率 ○ 要約回答の柔軟性の⽋如 意図表現の 生成 36
第4世代 エージェンティック検索 膨⼤なドキュメントから対話的に解決可能にする進化 意図展開の支援 ベクトル検索 情報の構造化 スニペット生成 意図表現の生成 エージェンティック検索 37
エージェンティック検索(絶賛開発中) ● Agent (@openai/agents) tools ○ ● ● LLMにナレッジの接続 探索範囲の拡張 ○ ⼈⼿でカバーしきれない膨⼤な⽂書 ○ 多様なリソース 複雑な質問への柔軟な回答 ○ 想定質問を超えた複合的な問題に対応 ○ 回答のクリエイティビティを優先(RAGで の意思決定と逆) 38
エージェンティック検索(絶賛開発中) ● Agent (@openai/agents) tools ○ ● ● LLMにナレッジを接続 探索範囲の拡張 ○ ⼈⼿でカバーしきれない膨⼤な⽂書 ○ 多様なリソース 複雑な質問への柔軟な回答 ○ 想定質問を超えた複合的な問題に対応 ○ 回答のクリエイティビティを優先(RAGで の意思決定と逆) 39
エージェンティック検索(絶賛開発中)の可能性 ● 既存FAQの活⽤ ● ○ 整備されたナレッジ ○ 洗練された意図予測検索 アクションの実⾏ ○ 予約や購⼊をその場で実⾏ ○ ⾃⼰解決できる範囲を拡張して次の ステージへ 40
まとめ ● ● ● LLMを組み込んで進化する過程の紹介 ○ キーワード検索 + ベクトル検索 ○ 事前⽣成型のRAG ○ AIエージェント LLMを適⽤する際に考えてきたことの共有 ○ 最先端のAI技術をどんどん試す ○ 精度、速度、表現⼒などのトレードオフ Helpfeelの検索の魅⼒が伝わっていると嬉しい ○ ぜひ⼀緒に未来の検索を作りましょう! 41
おまけ 42
第2世代 ベクトル検索 意図表現を意味的に検索可能にする進化 意図展開の支援 ベクトル検索 情報の構造化 スニペット生成 意図表現の生成 エージェンティック検索 43
ベクトル検索 : 字面マッチを超えた検索 ● ● 意図表現をベクトル化 ○ Azure OpenAIのEmbedding APIを利⽤ ○ バイナリ量⼦化して保存 ベクトルDBでの近似近傍探索 ○ Qdrant Cloudを利⽤ ○ クエリとの類似度を計算 ○ Helpfeelでは初のリモートでの検索 意図表現 🔍検索クエリ Embeddings (埋め込みベクトル) 1bit量子化 1536次元 ✨検索結果 44
ベクトル検索 : 嬉しさ ○ 意味が似ていればヒットする ○ ⽇本語以外でも⼤丈夫 が 味 い 近 ● 意味的な検索が可能になった 意 ● 意図表現の増加に⻭⽌めがかかる ○ ライターは本質的な⾔い換えだけに 集中できる が 味 じ 同 意 45
ベクトル検索 : 嬉しさ ○ 意味が似ていればヒットする ○ ⽇本語以外でも⼤丈夫 が 味 い 近 ● 意味的な検索が可能になった 意 ● 意図表現の増加に⻭⽌めがかかる ○ ライターは本質的な⾔い換えだけに 集中できる ● ベクトル化するテキストが良質 ○ Helpfeelならではの強み が 味 じ 同 ⾼品質な意図表現を使える 意 ○ 46
ベクトル検索 : 嬉しさ ● ⾃然⽂で検索できるということは ○ ● ⻑いクエリでも⼤丈夫 問い合わせフォームでも使える ○ 従来はTF-IDF的なアプローチで⽂章 の話題の推移を頑張って捉えようと していた ○ ⽂章全体の意味を理解することで、 正確にキートピックを特定可能 47
ベクトル検索 : 課題 ● 検索時間 ○ リクエスト往復+ベクトル化の時間 が発⽣(100ms〜) ● オウム返しされないケース ○ 意味が近ければOKという扱い ○ ユーザーに寄り添いきれていない 48
ベクトル検索 : 課題と解決策 ● ● キーワード検索とのハイブリッド ○ 従来の検索を⾏って即時に表⽰ ○ 同時にベクトル検索のリクエストを発⾏ ○ 両者の結果をマージして完成 インクリメンタルサーチのスピード感を 保ちつつ、セマンティック検索を融合 ○ 前世代までとのハイブリッドが基本⽅針 となる 49
第1世代 キーワード検索 クライアントサイドでの⾼速なインクリメンタルサーチ 意図展開の支援 ベクトル検索 情報の構造化 スニペット生成 意図表現の生成 エージェンティック検索 50
LLM以前: 地道な自然言語処理 ● オウム返し ○ ユーザーの⾔葉で回答を提⽰ ○ → ⽬grep負荷の軽減 51
LLM以前: 地道な自然言語処理 ● ● ● オウム返し ○ ユーザーの⾔葉で回答を提⽰ ○ → ⽬grep負荷の軽減 動詞の処理 ○ 活⽤語尾の変化 ○ 受動態、能動態 ○ → 丁寧なハイライト 読み仮名の処理 ○ → 漢字に変換する前にヒット などなど 52
初のLLM適用: 意図表現の執筆支援ツール ● テクニカルライターやFAQ執筆者向け のツール ○ 記事本⽂から意図表現を提案 ○ 受け⼊れるかどうかは⼈間が判断 意図展開の支援 53
初のLLM適用: 意図表現の執筆支援ツール ● テクニカルライターやFAQ執筆者向け のツール ● ○ 記事本⽂から意図表現を提案 ○ 受け⼊れるかどうかは⼈間が判断 裏⽅に徹した利⽤ ○ ⽣成結果の精度 ○ ハルシネーションのリスク ○ ⽣成時間の問題 意図展開の支援 54
(再掲)意図予測検索アルゴリズム 半⾃動⽣成が可能に! 意図表現 ユーザー 思いついた⾔葉 商品が壊れています 商品が不良品でした 不良品 ▪ ▪ 意図を選択 ▪ 意図表現 (中間) 記事 異なる商品が届いた 異なる 別の商品が届いた 別の物が来た 思っていたのと違う お⾦を返して 不具合があります 違う商品が届いた 返⾦⽅法 のご案内 返⾦してほしい 商品が届いた ▪ ▪ ▪ お⾦を返して欲しい 55
クライアントサイド検索の嬉しさと課題 ● 嬉しさ ○ 超⾼速(〜10ms) ○ 検索結果をコントロール可能(意図表現 を書けば必ずヒットする) ● 課題 ○ 字⾯でマッチするかどうかの勝負 ○ 展開後の意図表現が増加傾向 ■ → ベクトル検索チャンス! 56