AIチャットボット開発の気づき(5)
RAG のリランキング その1
LLM と RAG を利用した Slackボット OssansNavi の開発・運用で得た気づきの記録です
今回は 2024年3月頃の開発内容を紹介します
前の記事: (4) LLM へ渡す形式はヒューマンリーダブルとする
次の記事: (6) RAGのリランキング その2
RAG のリランキングは一般に入力順番を調整することで応答精度を改善する目的で利用されますが、OssansNavi ではヒットしたメッセージの枝刈りに利用しています。
OssansNavi はユーザーの「休暇制度を教えて」という質問から「育児休暇」「夏季休暇」「有給休暇」「福利厚生」などの検索キーワードを考えて Slackグループ内を検索します。
しかしヒットしたメッセージ全てを RAG 入力すると LLM の利用コストと時間で非効率のため、入力する情報を荒く選別します。
あえて様々な切り口から考えて検索キーワードを作ってもらう仕様のため、どの検索キーワードがユーザーの質問に対して有用かを機械的に判断できません。そこで 1つの検索キーワードの結果に偏らないように各検索キーワードから均等に LLM へ入力する候補を採用します。
次に各検索キーワードでヒットしたメッセージから入力する情報を選別するために次の2点を利用します。
- Slack検索APIの結果で取得できるスコア値
- メッセージが投稿されたチャネルの重要度
チャネルの重要度は単純に参加者が多いほど重要であるという指標としました。
例えば今回の質問のような休暇制度の情報は一部メンバーに届けるのではなく全体チャネルに投稿されているはず、という考え方です。
「メッセージが投稿されたチャネルの重要度」は、以下のように log2(チャネルの参加人数) + 1.0
の数値を利用しています。
math.log2(チャネルの参加人数) + 1.0
それら2つの数値をかけて求めた値の降順で並べて、設定したトークン数に達するまでのメッセージを RAG 入力として利用します。
Slack検索APIの結果で取得できるスコア値 * メッセージが投稿されたチャネルの重要度
正直なところ精度はそれほど高くないのですが、RAG 入力には無駄な情報が混じっても LLM が選別してくれるので、ある程度の精度があば十分です。
さらにもう一ステップ、別の方法で RAG 入力を選別しますが、それは次回解説します
Discussion