環境
OCI GenerativeAI
Python
ChatGpt4o
こんな人にいい話
・RAGで精度が出ない。
・もっと細かい説明をRAGにさせたい。
・LLMに与える文章で極力余計な情報を紛れさせたくない。
LLMを利用するうえでの前提条件
そもそものお約束として以下の3点があげられる。
1.LLMは最初と最後に与えられた情報を覚えて、中盤ほど忘れっぽい。
2.余計な情報を与えるとハルシネーションが起きやすくなる。
3.API連携時には、入力時と出力時の両方を合わせたトークン数で計算されている為、入力しすぎると出力する情報が少なくなる。
RAGでやるべきこと
この前提条件を抑えると、やるべき対処は、
与える情報を最小限に抑える。
という有識者に貼り倒されそうな結論となります。
出来たらやっとるわ!と突っ込まれそうです。
基本的に、ベクトル検索は数字の距離感によって与える情報を決定している為、いくつ以下なら大丈夫みたいな数値がありません。(限りなく近いものは決められるかもしれませんが)
その為、今回私が取った対応は2段階に分けてChat機能を利用するというものでした。
1段階目のChat
1段階目のChatでまずやるべきは、ベクトル検索で抽出した文章の要約・トピック抽出を行わせることです。
重要なポイントやトピックを抽出することで不要な情報を弾いて、選別することが出来ます。
これによって、与える文章が少なくなり、必要な文章のみを2段階目のChatで与えることが可能です。
要約・トピック抽出に関する指示
あなたは、与えられた情報から主要な要点やトピックを抽出するアシスタントです。次の指示に従って、要約・トピック抽出を行ってください。
## 前提条件
- この情報は、RAG (Retrieval-Augmented Generation) プロセスの第1段階として、質問に対する回答を生成するための前段の情報整理に用いられます。
- 抽出した要約やトピックは、次段階で詳細な回答生成に活用されるため、必要な範囲で具体的な内容を含むようにしてください。
- 日本語で返答は記載してください。
## 抽出の条件
- 与えられたテキストから以下の項目に基づいて情報を抽出してください:
1. 質問に直接関係する主要なポイント
2. 質問に対する答えを導くための重要なキーワードやフレーズ
3. 関連するトピックやセクション(例:「法律」「プロセス」「手順」など)
- 抽出結果は次の形式で示してください:
- **要点の要約**:情報の主要なポイントを簡潔にまとめたもの。
- **キーワード**:質問に対する回答を導くための重要なキーワードのリスト。
- **関連トピック**:特定の回答に関係するトピックやセクション名。
## 出力例
出力する内容は次の形式で記述してください:
1. **要点の要約**
- (要約内容)
2. **キーワード**
- (キーワードリスト)
3. **関連トピック**
- (関連トピックのリスト)
## 注意点
- 抽出する内容は簡潔にまとめつつ、重要な要点を網羅するようにしてください。
- 情報の見落としを防ぐため、関連性が不明確な情報については「関連トピック」に含めてください。
- 抽出内容が正確かつ要点を損なわないようにし、冗長な情報は省略してください。
- 分からない部分や不確実な情報は、「不明」と明記して抽出結果に反映してください。
"""
2段階目のChat
このChatでは、1段階目のChatの情報を与えつつ、自然言語での回答生成をさせます。
その際は、極力要約をさせないように指示を行い、詳細に回答を生成するように伝えて、最大限与えた情報を活用するように前提条件を指定します。
これにより、与える情報は最低限でありながらも求めた情報に近いものを作ることが出来ます。
この2段階目でも、要約文章を活用した抽出方法で質問した内容に近い情報が抽出されるように情報を与えていますが、その話はまたの機会に致します。
終わりに
通常1回で自然言語を生成するだけで行うChat機能を2段階に分けようというお話でした。
サービスとして運用する場合は、コストを考えて1回目のChatはGpt3を利用することをお勧めします。
Gpt4oの10分の1ほどの金額の為、安く済ませることが出来ます。
API連携の場合、情報を与えれば与えるほど正確な情報を返してくれるというのが、幻想であることを検証する中で気づきました。
与える情報と受け取る情報のバランスを考えながら、システムを構築してみてください。
それでは、また次回の記事で。