Slide 1

Slide 1 text

低コストで実現する社内文書RAG機能を搭載した AIチャットボット開発 Takanobu Nozawa 2024.09.27 PyCon JP 2024

Slide 2

Slide 2 text

今日話すこと 2 ● RAGを含むAIチャットボットを導入・開発する際のプロセスに おけるポイント ● OpenAI APIとLangChainを用いたRAG機能搭載のSlack AI チャットボットを開発する方法(Slack以外でも流用できる内 容です) 話さないこと ● RAGの精度検証方法・事例 ● RAGの精度改善方法・事例 ※資料は公開します

Slide 3

Slide 3 text

皆さんが一番気になっている(と思う)こと 3

Slide 4

Slide 4 text

皆さんが一番気になっている(と思う)こと 4 気になる結果は最後のお楽しみ!

Slide 5

Slide 5 text

自己紹介 5 名前:野澤 哲照(Nozawa Takanobu) 所属:コネヒト株式会社 :たかぱい@takapy0210 PdM / ML Engineer, EngineeringManagerとして データ周辺の仕事+マネジメントをしています。 猫とマンションとラーメンが好きです。 PR:友人とPodcast配信してます。 wipfm

Slide 6

Slide 6 text

6 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min) Contents

Slide 7

Slide 7 text

01 会社・サービス紹介 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min)

Slide 8

Slide 8 text

コネヒトのVISION 8 ありとあらゆる価値観が見つめ直され、 それぞれに思い描く家族の姿はどんどん変わっている。 家族の数だけ形があって、つくりたい未来がある。 私たちコネヒトは、その「家族像」というテーマに 向き合う会社です。 すべての家族が思い描く姿を実現できるように。 家族を学んで、アクションし、時にパートナーと一緒に、 「あなたの家族像」が実現できる社会を みなさんとつくってまいります。 あなたの家族像が実現できる 社会をつくる

Slide 9

Slide 9 text

VISIONが目指す先 9 KGI:希望出生数と予定出生数のギャップの解消 日本における希望出生数と予定出生数の間には 約0.24人の差分が存在します。 コネヒトはこの差分の大きな要因となる4つの 課題を事業領域に定め、両者のギャップの解消 を目指します。 希 望 2.25人 = 予定 2.01人 − 0.24人 差分 参考:国立社会保障・人口問題研究所 2022年・第16回出生動向基本調査(結婚と出産に関する全国調査) ※2022年・第16回出生動向基本調査(結婚と出産に関する全国調査)の内、夫婦調査を参考

Slide 10

Slide 10 text

コネヒトの事業 10 01 家計 の悩み 02 不妊 の悩み 03 育児 の悩み 04 社会 の意識 4つの課題を事業領域に定め、 事業開発・アライアンスなど様々な手法で解決を目指す

Slide 11

Slide 11 text

コネヒトTECH VISION コネヒトにおけるテクノロジーへの「態度」を表明した羅針盤 戦略の1つに「1to1 AI」を掲げているように、AIや機械学習を用いた ソリューション開発に意思を持ってチャレンジしていこうとしています https://tech-vision.connehito.com/

Slide 12

Slide 12 text

ママリについて 12 Q&Aコミュニティ メディア SNS ユーザーが悩みを投稿、相談しあうQ&A機能 専門家による回答も期間限定で提供 妊娠・育児などの記事を毎日配信 専門家監修の記事も多数 インスタのハッシュタグ #ママリ の投稿数が 1000万件超 #ママ(約670万件)よりも投稿されている

Slide 13

Slide 13 text

ママリにおける主なデータの種類 13 Q&Aデータ 自然言語:投稿数はQA合わせて月間約110万件 画像:QAに添付される画像 ユーザーの属性データ ユーザーの年齢、子供の年齢、住んでいる地域 … 行動ログデータ クリック、検索 ... 記事データ webとアプリで配信しているコンテンツのデータ QAイメージ 検索イメージ

Slide 14

Slide 14 text

ママリにおける機械学習の活用事例(一部) 14 コミュニティ検閲 Trust&Safetyなコミュニティを維持するための 検閲モデル カテゴリ類推 質問投稿時のカテゴリを投稿内容から自動的に サジェストすることで、質問投稿率向上に寄与 レコメンド ユーザーの行動ログから興味のあるコンテンツを 予測し優先的に表示することで、UX向上に寄与

Slide 15

Slide 15 text

02 AIチャットボットを作るその前に 目的と認識合わせを忘れずに 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min)

Slide 16

Slide 16 text

16 とある日

Slide 17

Slide 17 text

17 とある日 偉い人 AIチャットボットが流行っているらしいな!ウ チでもやりたいな〜 この「RAG」ってのを使うとAIが学習していな いことも回答できるのか!これで生産性も爆上 がりじゃ!俺くんあとは賢くていい感じの チャットボット作っておいて!

Slide 18

Slide 18 text

18 とある日 偉い人 AIチャットボットが流行っているらしいな!ウ チでもやりたいな〜 この「RAG」ってのを使うとAIが学習していな いことも回答できるのか!これで生産性も爆上 がりじゃ!俺くんあとは賢くていい感じの チャットボット作っておいて! 俺 分かりました!

Slide 19

Slide 19 text

19 とある日 〜1ヶ月後〜

Slide 20

Slide 20 text

20 とある日 〜1ヶ月後〜 AIチャットボットできました! 俺

Slide 21

Slide 21 text

21 とある日 〜1ヶ月後〜 偉い人 AIチャットボットできました! 俺 ついに!どれどれ・・・ ん〜全然良い回答来ないし、微妙だな〜 これじゃ全然使えないよ。

Slide 22

Slide 22 text

22 とある日 〜1ヶ月後〜 偉い人 AIチャットボットできました! 工エエェェ(´д`)ェェエエ工 俺 ついに!どれどれ・・・ ん〜全然良い回答来ないし、微妙だな〜 これじゃ全然使えないよ。 俺

Slide 23

Slide 23 text

23 とある日 〜1ヶ月後〜 偉い人 AIチャットボットできました! 工エエェェ(´д`)ェェエエ工 俺 ついに!どれどれ・・・ ん〜全然良い回答来ないし、微妙だな〜 これじゃ全然使えないよ。 俺 …… ( ゚д゚)ハッ!、夢だったか・・・

Slide 24

Slide 24 text

24 とある日 〜1ヶ月後〜 偉い人 AIチャットボットできました! 工エエェェ(´д`)ェェエエ工 俺 ついに!どれどれ・・・ ん〜全然良い回答来ないし、微妙だな〜 これじゃ全然使えないよ。 俺 こうならないためにも 目的と認識合わせはしっかりやろう

Slide 25

Slide 25 text

25 とある日 〜1ヶ月後〜 偉い人 AIチャットボットできました! 工エエェェ(´д`)ェェエエ工 俺 ついに!どれどれ・・・ ん〜全然良い回答来ないし、微妙だな〜 これじゃ全然使えないよ。 俺 弊社の場合

Slide 26

Slide 26 text

26 弊社の場合 ● 全社のAI活用促進 & 技術検証の2点が目的 ● RAGの実装に関しては様々なHowをPros/Cons並べて検 討した ○ 本当にやりたいことはなんなのか?を言語化し、そ こから逆算してHowを決める ● 方向性が固まったら動くものを作ってフィードバック をもらう

Slide 27

Slide 27 text

27 実際にPros/Consを言語化したドキュメント

Slide 28

Slide 28 text

28 実際にPros/Consを言語化したドキュメント 主な議論 ● 本当にベクトル検索(≒RAG)は必要か? ○ 各種サービスの検索APIで代替できない? ● 最初から複数データソース(GoogleDriveやSlack等)の ドキュメントを参照して回答する機能は必要? ● 実装・運用コストは妥当? → 目的や実現したい体験から逆算して方針を決定

Slide 29

Slide 29 text

29 実際にPros/Consを言語化したドキュメント 一例)RAGに関して、最初はSlack, Notion, Google Driveの3つのソース を検索対象にしようと提案が出た →いきなりすべての文書を対象にする必要性はあるのか?という問い 以下2点の理由から最初はNotionのみを検索対象にするよう推進 ● RAG機能を追加してもまったく使われないor使えない可能性がある。 なので、はじめは最小限の機能(= MVP)でいいからクイックに機能 を作ってユーザーの反応を見るべき ● 社内制度やMTGの議事録等、検索してまで知りたいニーズがある社内 の情報は大半のNotionに集約されている

Slide 30

Slide 30 text

30 実際にPros/Consを言語化したドキュメント 一例)RAGに関して、最初はSlack, Notion, Google Driveの3つのソース を検索対象にしようと提案が出た →いきなりすべての文書を対象にする必要性はあるのか?という問い 以下2点の理由から最初はNotionのみを検索対象にするよう推進 ● RAG機能を追加してもまったく使われないor使えない可能性がある。 なので、はじめは最小限の機能(= MVP)でいいからクイックに機能 を作ってユーザーの反応を見るべき ● 社内制度やMTGの議事録等、検索してまで知りたいニーズがある社内 の情報は大半のNotionに集約されている このようなプロセスを経ながら 推進していきました

Slide 31

Slide 31 text

31 実際にPros/Consを言語化したドキュメント 一例)RAGに関して、最初はSlack, Notion, Google Driveの3つのソース を検索対象にしようと提案が出た →いきなりすべての文書を対象にする必要性はあるのか?という問い 以下2点の理由から最初はNotionのみを検索対象にするよう推進 ● RAG機能を追加してもまったく使われないor使えない可能性がある。 なので、はじめは最小限の機能(= MVP)でいいからクイックに機能 を作ってユーザーの反応を見るべき ● 社内制度やMTGの議事録等、検索してまで知りたいニーズがある社内 の情報は大半のNotionに集約されている ここから実装部分の話をしていきます!

Slide 32

Slide 32 text

03 AIチャットボットの開発 Python × Slack Botで、まずはシンプルなチャットボットを作成する 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min)

Slide 33

Slide 33 text

33 Slack Botを利用したシンプルなチャットボット ● Slack Botを使って実現 ● Slack上で特定メンションに反応し て回答してくれる ● 回答はスレッドに送られる ● スレッド内では過去の会話を考慮 しながら会話できる

Slide 34

Slide 34 text

34 Slack Botを利用したシンプルなチャットボット アーキテクチャと構成要素も非常にシンプル

Slide 35

Slide 35 text

35 Slack Botの事前準備 事前準備で必要なもの ● OpenAI API Key ● Slack Bot tokens & App-level tokens Slack周りのtoken取得が結構面倒だが、手順は会社のブログ に載せているので、詳細はこちらを参照してください LangChainとOpenAI APIを組み合わせて、文脈を考慮して会話できるSlack Botを作った話

Slide 36

Slide 36 text

36 Slack Botの開発方法 SlackのBoltフレームワークを使えば、WebSocketの実装も 数行で可能 https://github.com/slackapi/bolt-python

Slide 37

Slide 37 text

37 LangChainについて

Slide 38

Slide 38 text

38 LangChainとは? 大規模言語モデル(LLM)を利用したアプリケーション開発 を支援してくれるフレームワーク LangChainの様々なコンポーネントを組み合わせることで、 複雑なLLMアプリケーションを作成するプロセスをいい感じ にラップし、簡易化してくれる Introduction | 🦜🔗 LangChain

Slide 39

Slide 39 text

39 LangChainの提供コンポーネント 代表的なものを紹介 ● Model I/O:共通のインターフェースを通じて各LLM API を使うことができる ● Prompt Template:モデルへの入力を組み立てることがで きる ● Memory:LLMとのやり取りを保持することができる ● Chain:各モジュールを連結し実行することができる https://python.langchain.com/docs/how_to/#components

Slide 40

Slide 40 text

40 Prompt Templateのサンプルコード https://python.langchain.com/docs/how_to/#prompt-templates ユーザー入力からプロンプトを生成するためのテンプレート

Slide 41

Slide 41 text

41 Memoryについて ● LangGraphを用いる方法とLCEL(LangChain Expression Language) と呼ばれる表現言語を使う方法がある ○ LangGraphを用いる方法 :https://python.langchain.com/docs/versions/migrating_memory/conversation_buffer_ memory/#langgraph ○ LCELを用いる方法 :https://python.langchain.com/docs/versions/migrating_chains/conversation_chain/#lcel ● 今回はLCELを用いた ○ AIとの過去のやりとりはSlackのスレッドに残っているので、そこ からデータを取得すれば履歴は追えるため、プログラム側でキャッ シュしておく必要もない

Slide 42

Slide 42 text

42 Memoryのサンプルコード https://python.langchain.com/docs/tutorials/chatbot/#message-history

Slide 43

Slide 43 text

43 Chainについて ● 基本的にはLCELのpipe operatorを使って処理を繋げるだけ で実装可能 ● pipe()メソッドもあるので、これを用いての実装もできる ※LLMChainはv0.3(2024/09/27時点の最新バージョン)ではremoveされている https://python.langchain.com/docs/versions/v0_2/deprecations/#llmchain

Slide 44

Slide 44 text

44 Chainのサンプルコード https://python.langchain.com/docs/how_to/sequence/ pipe operator

Slide 45

Slide 45 text

45 今回実際に開発したAIチャットボット

Slide 46

Slide 46 text

46 今回実装したAIチャットボット 基本的に今まで説明したコンポーネントを組み合わせて実装

Slide 47

Slide 47 text

47 今回実装したAIチャットボット 基本的に今まで説明したコンポーネントを組み合わせて実装 Memory

Slide 48

Slide 48 text

48 今回実装したAIチャットボット 基本的に今まで説明したコンポーネントを組み合わせて実装 Prompt Template

Slide 49

Slide 49 text

49 今回実装したAIチャットボット 基本的に今まで説明したコンポーネントを組み合わせて実装 Model I/O & Chain

Slide 50

Slide 50 text

50 今回実装したAIチャットボット 基本的に今まで説明したコンポーネントを組み合わせて実装 Memory Prompt Template Model I/O & Chain

Slide 51

Slide 51 text

04 RAG機能の実装 RAGとは?それをLlamaIndexで実現する方法 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min)

Slide 52

Slide 52 text

52 そもそもRAGとは ● Retrieval Augmented Generationの略称 ● プライベートデータなど、モデルの学習に使われていないデータについ て推論できるようにするために、モデルに必要な情報をLLMに渡し知識 を補う手法の1つ ● 基本的に以下2つのコンポーネントから構成される ○ インデックス作成:ソースからデータを取り込み、インデックスを 作成する処理(基本的にはオフライン処理) ○ 検索&生成:関連するデータをインデックスから検索し、LLMに投 げるプロンプトに渡し、回答を生成する処理(基本的にはオンライ ン処理)

Slide 53

Slide 53 text

53 インデックス作成のイメージ https://python.langchain.com/docs/tutorials/rag/#indexing

Slide 54

Slide 54 text

54 検索&生成のイメージ https://python.langchain.com/docs/tutorials/rag/#retrieval-and-generation

Slide 55

Slide 55 text

55 LlamaIndexとは 大規模言語モデル(LLM)と外部データを接続するための インターフェースを提供している https://www.llamaindex.ai/

Slide 56

Slide 56 text

56 今回実装したアーキテクチャについて

Slide 57

Slide 57 text

57 おさらい RAG機能実装前はこんな感じのアーキテクチャ

Slide 58

Slide 58 text

58 RAGを取り入れた全体像

Slide 59

Slide 59 text

59 RAGを取り入れた全体像 インデックス 作成処理

Slide 60

Slide 60 text

60 RAGを取り入れた全体像 検索&生成 (チャットボット部分)

Slide 61

Slide 61 text

61 今回実装したインデックス作成処理について

Slide 62

Slide 62 text

62 LlamaIndexを用いたインデックスの作成処理 1. Document Listを定義し、そこに RAGの対象としたいドキュメントの 情報を追加する 2. Embeddingモデルを使いベクトル化 し、保存する

Slide 63

Slide 63 text

63 LlamaIndexを用いたインデックスの作成処理 ● 弊社の場合は、Notion APIを用いてNotionのページ一覧を 取得しベクトル化している ● 前回実行時から更新されたドキュメントのみをEmbedding 対象とすると効率的 ○ Notionの場合は更新日時が取得できるので、それを条 件に判断している

Slide 64

Slide 64 text

64 今回実装したRAGチャットボットについて

Slide 65

Slide 65 text

65 LlamaIndexを用いたRAG(検索&生成部分) 1. API起動時にインデックスをメモリに展開 2. ユーザーのメッセージと意味が近いドキュ メントを検索(TOP K件) 3. プロンプトに取得したドキュメント内容を 追加し、LLMの回答を得る

Slide 66

Slide 66 text

66 RAGチャットボットの全体の流れ

Slide 67

Slide 67 text

67 低コストで実現させるポイント ● 商用利用可能で公開されているEmbedding Modelを用いる ○ 本当にミニマムでやるなら、モデルのサイズも小さい方がコスト的 にはお得(その分APIサーバのメモリも少なくて済むので) ○ https://huggingface.co/spaces/mteb/leaderboard でモデルの サイズや性能が分かる ● どうしても品質に納得がいかなかったら、大きいサイズのモデル or OpenAI Embedding などを検討する ○ もちろん精度の良いモデルに切り替える以外にも、精度向上のHow はいくつかあるので、本当にベクトル検索(≒RAG)じゃなきゃダ メなの?などは要議論

Slide 68

Slide 68 text

05 より使いやすくするためのTips 01 会社・サービス紹介(3min) 02 AIチャットボットを作るその前に(5min) 03 AIチャットボットの開発(10min) 04 RAG機能の実装(10min) 05 より使いやすくするためのTips(2min)

Slide 69

Slide 69 text

69 元データへのアクセスを容易にする&どのリンクが最新なのか がパッと見で判断できるように Tips①:返信に参照文献リンクと更新日を追加 Notionのリンク 最終更新日

Slide 70

Slide 70 text

Tips②:RAGを行うかどうかをLLMに判断させる 70 ● 特定の文字列に反応させてRAGを行っても良いが、その文 字列が含まれると絶対にRAGしてしまったりと、少し不便 だった ● ユーザー入力文の冒頭N文字を使って、その質問が社内情 報についての回答を求められているのかどうかをLLMに判 断させ、その結果に基づいてRAGの実行有無を判定 ○ 冒頭N文字にしている理由はコスト削減文脈が大きい

Slide 71

Slide 71 text

Tips③:会話ユーザーの投稿だけを考慮する 71 ● Slackのスレッド内で複数人+AIが会話している場合、同一 ユーザーとの会話だけをAIのメモリに入れて過去の会話と して認識させる

Slide 72

Slide 72 text

最後に

Slide 73

Slide 73 text

73 お待たせしました! チャット利用回数にもよりますが 月数千円です!(安い?ですよね?汗) 内訳: ● APIをホストするインスタンス料金(これが7〜8割) ○ メモリに展開するindexデータの量が少なければもっと 削減できる ■ 弊社の場合は3万ドキュメント弱 ● OpenAI API利用料

Slide 74

Slide 74 text

74 お待たせしました! もっと低コストでやりたいんや...! ● インスタンスの起動時間を制御する ○ 平日夜と休日は停止させる、など ● RAG対象のドキュメントを絞る ○ Garbage In, Garbage OutはRAGでも然り

Slide 75

Slide 75 text

75 We’re Hiring! コネヒトでは各種エンジニアを絶賛募集中です! ● ライフイベントの課題解決をするサービスに 興味がある方 ● MLプロダクト開発に興味のある方 機械学習への取り組み事例や、今後の展望などをまとめた資料も あるので、興味ある方はこちらもご覧いただけると嬉しいです! コネヒト 機械学習 詳しくは で検索! 採用関連 https://connehito.com/recruit/

Slide 76

Slide 76 text

76 ご清聴ありがとうございました!

Slide 77

Slide 77 text

77 お待たせしました!

Slide 78

Slide 78 text

78