Closed7

Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection

kun432kun432

論文のレポジトリ

https://github.com/AkariAsai/self-rag/tree/main

一旦これでやってみる。

$ git clone https://github.com/AkariAsai/self-rag && cd self-rag

仮想環境作ってJupyterLabを入れるけど割愛。これ以降はJupyterでやる。

依存パッケージをインストール。うちはcondaは使ってないので、pipで。いくつか足りないものがあるのでいれる。PyTorchはCUDAのバージョン等に合わせて適宜。(多分torchvision、torchaudioはいらないかも)

$ pip install packaging wheel torch torchvision torchaudio
$ pip install -r requirements.txt

ではテストコードを実行。モデルがダウンロードされるのでちょっと時間がかかる。

from vllm import LLM, SamplingParams

model = LLM("selfrag/selfrag_llama2_7b", download_dir="./model_cache", dtype="half")
sampling_params = SamplingParams(temperature=0.0, top_p=1.0, max_tokens=100, skip_special_tokens=False)

def format_prompt(input, paragraph=None):
  prompt = "### Instruction:\n{0}\n\n### Response:\n".format(input)
  if paragraph is not None:
    prompt += "[Retrieval]<paragraph>{0}</paragraph>".format(paragraph)
  return prompt

query_1 = "Leave odd one out: twitter, instagram, whatsapp."
query_2 = "Can you tell me the difference between llamas and alpacas?"
queries = [query_1, query_2]

preds = model.generate([format_prompt(query) for query in queries], sampling_params)

for idx, pred in enumerate(preds):
  print("\n====\n")
  print("Query: {}".format(queries[idx]))
  print("Model prediction: {0}".format(pred.outputs[0].text))

レスポンス

====

Query: Leave odd one out: twitter, instagram, whatsapp.
Model prediction: Twitter, Instagram, and WhatsApp are all social media platforms.[No Retrieval]However, WhatsApp is a messaging app, while Twitter and Instagram are both primarily used for sharing photos and videos.[No Retrieval]Therefore, WhatsApp is the odd one out in this group.[Utility:5]</s>

====

Query: Can you tell me the difference between llamas and alpacas?
Model prediction: Sure![Retrieval]<paragraph>

* Alpaca (left) and llama (right) in the Andes of southern Peru.

Alpacas and llamas are both domesticated species of South American camelids.[Continue to Use Evidence]Alpacas are a much smaller than llamas, with a shoulder height of 3 to 4 feet.[Continue to Use Evidence]They are also bred specifically for their fiber, which is used to make all sorts of textiles and clothing.

  • 最初のクエリはretrievalせずに応答する。このとき、モデルは、クエリの内容からretrievalが必要かどうかを踏まえて、応答する。
    • retrievalが必要な場合は**[Retrieve]トークン**を付与する。
    • 1つめのクエリ("Leave odd one out: twitter, instagram, whatsapp.")には[No Retrieval]が付与、つまりretrievalは不要となっている。
      • ちなみに、temperature等を変えてみると、retrievalが必要でないケースは出力されないというケースもある様子。
    • 2つめのクエリ("Can you tell me the difference between llamas and alpacas?")には[Retrieval]トークンがが付与されている。
  • retrievalが必要な場合≒根拠となる事実が必要な場合は、事実ごとに**<paragraph></paragraph>トークン**を挿入することができるらしい。
    • 上記のケースではretrievalが必要かをまず判断するはずだし、マークアップも閉じていないのでちょっとよくわからない)
    • [Continue to Use Evidence]というトークンは、出力文だけで根拠を検証できる場合に出力されるらしい。

retrievalが必要な場合は、検索を行い、その結果をクエリとともに渡す。ここでは検索したと仮定してその文章を渡している。

prompt = format_prompt("Can you tell me the difference between llamas and alpacas?", "The alpaca (Lama pacos) is a species of South American camelid mammal. It is similar to, and often confused with, the llama. Alpacas are considerably smaller than llamas, and unlike llamas, they were not bred to be working animals, but were bred specifically for their fiber.")
preds = model.generate([prompt], sampling_params)
print([pred.outputs[0].text for pred in preds])

クエリ

リャマとアルパカの違いについて教えてください。

根拠となるretrivalの結果

アルパカ(Lama pacos)は南アメリカのラクダ科哺乳類の一種。アルパカはラマに似ており、しばしば混同される。アルパカはリャマよりかなり小さく、リャマと違って労働動物として飼育されたのではなく、繊維のために特別に飼育された。

レスポンス

['[Relevant]Alpacas are considerably smaller than llamas.[Fully supported][Utility:5]</s>']
  • クエリと検索結果を踏まえて、文章を生成し、以下の観点で生成分にタグを付ける。
    • 検索結果がクエリに対して、関連するものか?([Relevant] or [Irrelevant]
    • 検索結果が生成した文を完全にサポートする根拠となっているか?([Fully supported] / [Partially supported] / [No support]
    • 生成した文がクエリに対して有用か?([Utility:n] ※n=1〜5)

あとはこれを繰り返すなり並行実行するなりして、評価の高いretrieval結果を踏まえて、最終回等を生成するって感じかな?

kun432kun432

あと、retrieval・critique用にチューニングしたモデル作ってやってるんだよね。ここをOpenAIとかでやる場合は、論文に載ってるプロンプトを使ってやる感じになりそう。

kun432kun432

論文にあるプロンプトを少し訳してGPT-4で試してみた。

クエリ単体からRetrievalが必要かどうかを判断する

## Instructions

指示(Instruction)が与えられたとき、ウェブ(例えばウィキペディア)からいくつかの外部文書を見つけることが、より良い回答を生み出すのに役立つかどうかを判断してください。回答(Need retrieval?)は [Yes] か [No] で答えて、その説明(Explanation)も書いてください。

Instruction:  健康でいるための秘訣を3つ挙げてください。
Need retrieval?: [Yes]
Explanation: 健康でいるための3つの秘訣を挙げたオンライン情報源や、さまざまな行動が健康に及ぼす影響について説明した信頼できる情報源があるかもしれません。そのため、このクエリに対する回答を向上させるためには、文書を検索することが役立ちます。

Instruction: 難しい決断を迫られたときのことを話してください。
Need retrieval?: [No]
Explanation: この指示は個人的な経験について尋ねているので、外部の文書を検索する必要はありません。

Instruction: 重要なキャリア上の決断を迫られた主人公について、三人称のナレーションで短編を書きなさい。
Need retrieval?: [No]
Explanation: この指示は短編小説を書かせるもので、検証するための外部証拠は必要ありません。

Instruction: フランスの首都はどこですか。
Need retrieval?: [Yes]
Explanation: この指示は単にフランスの首都を答えるよう求めています。これは広く知られている事実ですが、それでもこの質問に対してウェブ文書を検索することは役立ちます。

Instruction: 半径から円の面積を求めよ。半径 = 4
Need retrieval?: [No]
Explanation: これは数学の問題であり、公式を記述した文書を見つけることはできても、答えを正確に記述した文書を見つけることは不可能です。

Instruction: 文法的に正しい文になるように、与えられた文の単語を並べなさい。
Need retrieval?: [No]
Explanation: この課題は単純な文法問題なので、外部の証拠は必要ありません。

Instruction: 植物の細胞呼吸の過程を説明しなさい。
Need retrieval?: [Yes]
Explanation: この指示は科学的概念の詳細な説明を求めるもので、回答をサポートする信頼できる有用な文書が見つかる可能性が高い。

GPT-4での例

Instruction: 日本プロ野球所属の野球選手の平均年俸はいくらですか?
Need retrieval?: [Yes]
Explanation: これは特定の統計情報を求めており、最新のデータや情報を提供するためには、外部の信頼できる情報源を検索する必要があります。また、平均年俸は時間とともに変動するため、最新の情報を得るためにはウェブ検索が役立ちます。
Instruction: 野球が好きです。
Need retrieval?: [No]
Explanation: この指示は個人の趣味や好みに関するもので、外部の文書を検索する必要はありません。これは主観的な表現であり、ユーザー自身の感情や意見を反映しています。

先行する文章、生成文、検索結果などがすでに存在する状態で、Retrievalが必要かどうかを判断する

## Instructions

指示(Instruction)、証拠(Evidence)、出力文(Output)、先行文(Preceding sentences ※オプション)が与えられる。先行文が与えられている場合、出力文はそれらの先行文に続く文でなければならない。あなたの課題は、出力文の情報が証拠によって完全に検証できるのか、それともさらに外部からの検証が必要なのかを判断することです。

3つのケースがあります。

- 出力された文章が証拠のみで検証できる場合は、[Continue to Use Evidence] で応答してください。
- その文章が事実の検証を必要としない場合(主観的な文章や常識に関する文章など)は、[No Retrieval] で応答してください。
- 出力文を検証するために追加情報が必要な場合は、[Retrieval]で応答してください。

あなたの判断の根拠となる説明をお願いします。

Instruction: 自然言語処理における単語の埋め込みについて説明しなさい。
Preceding sentences: 単語埋め込みは、自然言語処理(NLP)で利用可能な最も強力なツールの1つである。これはベクトル空間における単語や語句の数学的表現であり、単語とそれが使われる文脈との類似性を測定することを可能にする。
Evidence: 単語埋め込み
単語埋め込みは、自然言語処理(NLP)における一連の言語モデリングと特徴学習技術の総称で、語彙の単語やフレーズを実数のベクトルにマッピングする。概念的には、単語1つにつき1次元の空間から、より低次元の連続ベクトル空間への数学的埋め込みが含まれる。
Output: 単語埋め込みは、感情分析、テキスト分類、シーケンス内の次の単語の予測、同義語や類義語の理解などのタスクに役立ちます。
Rating: [Retrieval]
Explanation: 単語埋め込みのアプリケーションについて議論していますが、証拠は、単語埋め込みの定義と、それらがどのように機能するかについて議論しているだけです。したがって、出力が正しいかどうかを検証するために、他の証拠を検索する必要があります。

GPT-4での例

Instruction: 競走馬の脚質について説明しなさい。
Preceding sentences: 競馬における脚質とは、競走馬ごとの得意とするレース戦術をいう。
Evidence: 競走馬の脚質には以下の4種類がある。
- 逃げ -  競走開始直後から先頭に立ち、そのままゴールインすることを目指す。他の馬より前に出ようとする闘争心の強い馬]や、気が弱く馬群の中でレースをするのを嫌う馬が多い。
- 先行 - 逃げ馬の直後の位置でレースを進める。レースの要所で反応よく前方へ進出する気性と、後方からの追撃を凌ぐ脚力が要求される。最も競走中の不利を受けにくく、それ故に最も実力を反映しやすい戦法と言われる。
- 差し -  レース前半は馬群の中団あるいは後方を進み、第4コーナー付近で前方への進出を開始し、ゴール手前で前を進む馬を交わそうとする走行方法。瞬発力を武器とする競走馬がとる戦法である。
- 追い込み - レース前半は馬群の最後方に控え、最後の直線で一気にトップスピードへと至り、他馬をまとめて抜き去る。レース展開によって受ける有利不利の度合いが激しく、勝つときは豪快だが勝ちきれないことも多い。
Output: 競走馬にもいろんな性格があります。
Rating: [Retrieval]
Explanation: 出力文は競走馬の「性格」について触れていますが、証拠は「脚質」についてのみ述べており、性格に関する具体的な情報は提供していません。競走馬の性格と脚質は関連しているかもしれませんが、性格についての具体的な情報や詳細を得るには追加の情報源を参照する必要があります。したがって、この出力文の検証には外部からの検証が必要です。
Instruction: 競走馬の脚質について説明しなさい。
(snip)
Output: 競走馬の脚質は、競走馬の気性に依る要素が強く、これがレース展開に影響します。
Rating: [Continue to Use Evidence]
Explanation: 出力文は証拠文で提供された情報に基づいています。証拠文によると、各脚質(逃げ、先行、差し、追い込み)は、馬の気性や戦術に関連しており、レースの戦術や展開に大きな影響を与えます。例えば、「逃げ」は闘争心の強い馬や気が弱く馬群の中でレースをするのを嫌う馬が選ぶ脚質です。したがって、脚質が競走馬の気性に依存し、レース展開に影響を与えるという出力文は、証拠文によって完全に検証されます。

検索結果の関連性(IsRel)の判断

## Instructions

指示(Instruction)、証拠(Evidence)が与えられる。場合によっては先行文(Preceding sentences)も与えられる。先行文が与えられている場合、出力文はそれらの先行文に続く文でなければならない。あなたの課題は、その証拠が最初の指示と先行する文脈に関連し、指示に記述されたタスクを完了するために有用な情報を提供しているかどうかを判断することです。証拠がこの要件を満たしている場合は、[Relevant] と答え、そうでない場合は [Irrelevant] と答えます。あなたの判断の根拠となる説明もお願いします。

Instruction: A、B、C、Dの4つの選択肢から、最も良い答えを選びなさい。
Input: 地球の自転が引き起こすものは?
A: 午前と午後の循環
B: 火山噴火の発生
C: 潮汐の循環
D: 重力の発生
Evidence: 自転は昼夜のサイクルを引き起こし、それに対応する温度と湿度のサイクルも作り出す。地球の自転に伴い、海面は1日に2回上下する。
Rating: [Relevant]
Explanation: 選択肢Aで述べられているように、自転が昼夜のサイクルを引き起こすことを明確に述べている。

Instruction: 米国下院議員に立候補できる年齢は、
Evidence: 憲法は米国上院議員になるための3つの資格を定めている:年齢(少なくとも30歳)、米国市民権(少なくとも9年)、選挙時に上院議員が代表する州に居住していること。
Rating: [Irrelevant]
Explanation: 根拠は上院議員に立候補できる年齢についてのみ述べており、下院議員については触れていない。

GPT-4での例

Instruction: 成年になれば、喫煙や飲酒は可能ですか?
Evidence: 民法上の成年年齢は18歳に改正されましたが、喫煙や飲酒は20歳以上のままです。
Rating: [Relevant]
Explanation: この証拠は指示された質問に直接関連しています。成年に達すると喫煙や飲酒が可能かという質問に対して、民法上の成年年齢が18歳に改正されたものの、喫煙と飲酒は20歳以上でなければならないと明確に回答しています。これにより、成年になっても、すぐに喫煙や飲酒が可能になるわけではないことが示されています。
Instruction: 民法はいつ改正されましたか?
Evidence: 民法上の成年年齢は18歳に改正されましたが、喫煙や飲酒は20歳以上のままです。
Rating: [Irrelevant]
Explanation: この証拠は民法上の成年年齢が18歳に改正されたことを述べていますが、改正された具体的な日付や年については触れていません。したがって、民法がいつ改正されたかについての情報は提供していないため、指示された質問には関連しない情報です。

検索結果の根拠のサポート判断(IsSup)

## Instructions

指示(Instruction)、証拠(Evidence)、出力文(Output)が与えられる。場合によっては先行文(Preceding sentences)も与えられる。先行文が与えられている場合、出力文はそれらの先行文に続く文でなければならない。あなたの課題は、出力が証拠で提供された情報によって完全にサポートされているかどうかを評価することです。

スコアを生成するために以下の含意尺度を使用していください:

- [Fully supported] - 出力文のすべての情報は、証拠、または証拠からの抜粋によってサポートされている。これは、出力文と証拠の一部がほぼ同一である場合にのみ適用される。
- [Partially supported] - 出力文はある程度証拠によってサポートされているが、証拠で議論されていない主要な情報が出力文にある。例えば、ある指示が2つの概念について尋ねており、証拠がそのどちらか一方しか論じていない場合、それは[Partially supported]と見なされるべき。
- [No support / Contradictory] - 出力が証拠を完全に無視している、証拠と無関係である、または証拠と矛盾している。これは、証拠が指示と無関係な場合にも起こりえる。

出力が正しいかどうかを判断するために、外部の情報/知識を使用しないようにしてください。出力文が証拠によって裏付けられているかどうかだけをチェックし、出力文が指示に沿っているかどうかはチェックしないでください。

Instruction: 自然言語処理における単語の埋め込みについて説明しなさい。
Preceding sentences: 単語埋め込みは、自然言語処理(NLP)で利用可能な最も強力なツールの1つである。これはベクトル空間における単語や語句の数学的表現であり、単語とそれが使われる文脈との類似性を測定することを可能にする。
Output: 単語埋め込みは、感情分析、テキスト分類、シーケンス内の次の単語の予測、同義語や類義語の理解などのタスクに役立ちます。
Evidence: 単語埋め込みは、自然言語処理(NLP)における一連の言語モデリングと特徴学習技術の総称で、語彙から単語やフレーズを実数のベクトルにマッピングします。概念的には、単語ごとに1次元の空間から、より低次元の連続ベクトル空間への数学的埋め込みを行う。このマッピングを生成する方法には、ニューラルネットワーク、単語共起行列の次元削減、確率モデル、説明可能な知識ベース法、単語が現れる文脈の観点からの明示的表現などがある。単語とフレーズの埋め込みは、基礎となる入力表現として使用された場合、構文解析、感情分析、次のトークン予測、類推検出などのNLPタスクのパフォーマンスを向上させることが示されている。
Score: [Fully supported]
Explanation: 出力文は、単語埋込みの応用について議論しており、エビデンスは、応用として、構文解析、感情分析、ネクストトークン予測、類推検出のすべてに言及している。したがって、スコアは[Fully supported]とすべきです。

GPT-4の例

Instruction: 競走馬の脚質について説明しなさい。
Preceding sentences: 競馬における脚質とは、競走馬ごとの得意とするレース戦術をいう。
Output: 競走馬にはいろんな性格があります。
Evidence: 競走馬の脚質には以下の4種類がある。
- 逃げ -  競走開始直後から先頭に立ち、そのままゴールインすることを目指す。他の馬より前に出ようとする闘争心の強い馬]や、気が弱く馬群の中でレースをするのを嫌う馬が多い。
- 先行 - 逃げ馬の直後の位置でレースを進める。レースの要所で反応よく前方へ進出する気性と、後方からの追撃を凌ぐ脚力が要求される。最も競走中の不利を受けにくく、それ故に最も実力を反映しやすい戦法と言われる。
- 差し -  レース前半は馬群の中団あるいは後方を進み、第4コーナー付近で前方への進出を開始し、ゴール手前で前を進む馬を交わそうとする走行方法。瞬発力を武器とする競走馬がとる戦法である。
- 追い込み - レース前半は馬群の最後方に控え、最後の直線で一気にトップスピードへと至り、他馬をまとめて抜き去る。レース展開によって受ける有利不利の度合いが激しく、勝つときは豪快だが勝ちきれないことも多い。
Score: [No support / Contradictory]
Explanation: 出力文は競走馬の「性格」について言及していますが、証拠文は脚質(逃げ、先行、差し、追い込み)というレース戦術に関する具体的な説明を提供しており、性格については言及していません。したがって、出力文は証拠と無関係であるため、スコアは[No support / Contradictory]とすべきです。
Instruction: 競走馬の脚質について説明しなさい。
Preceding sentences: 競馬における脚質とは、競走馬ごとの得意とするレース戦術をいう。
Output: 競走馬にはいろんな脚質があり、競走馬の性格に依ります。
Evidence: 競走馬の脚質には以下の4種類がある。
- 逃げ -  競走開始直後から先頭に立ち、そのままゴールインすることを目指す。他の馬より前に出ようとする闘争心の強い馬]や、気が弱く馬群の中でレースをするのを嫌う馬が多い。
- 先行 - 逃げ馬の直後の位置でレースを進める。レースの要所で反応よく前方へ進出する気性と、後方からの追撃を凌ぐ脚力が要求される。最も競走中の不利を受けにくく、それ故に最も実力を反映しやすい戦法と言われる。
- 差し -  レース前半は馬群の中団あるいは後方を進み、第4コーナー付近で前方への進出を開始し、ゴール手前で前を進む馬を交わそうとする走行方法。瞬発力を武器とする競走馬がとる戦法である。
- 追い込み - レース前半は馬群の最後方に控え、最後の直線で一気にトップスピードへと至り、他馬をまとめて抜き去る。レース展開によって受ける有利不利の度合いが激しく、勝つときは豪快だが勝ちきれないことも多い。
Score: [Partially supported]
Explanation: 出力文は脚質が競走馬の「性格に依る」と述べていますが、証拠文では脚質の種類とその特徴について説明しており、「逃げ」や「先行」などの脚質が特定の性質や気性を持つ馬に適していることを示唆しています。出力文が脚質が性格に「依る」という部分は証拠文の「他の馬より前に出ようとする闘争心の強い馬や、気が弱く馬群の中でレースをするのを嫌う馬が多い」といった記述からある程度サポートされています。ただし、証拠は脚質の具体的な説明を提供しており、出力文がこれらの詳細を網羅していないため、情報のサポートは部分的です。

生成分のクエリに対する有用性の判断(IsUse)

## Instructions

与えられた指示(Instruction)と出力(Output)から、その回答がクエリに役立つ有益なものに見えるかどうかを1(最低)~5(最高)で評価してください。このスコアを知覚的効用(perceived utility)と呼びます。詳細な基準は以下のとおりです:
 5: 問い合わせに対する回答が完全かつ詳細で有益であり、情報ニーズを完全に満たしている。
 4: 回答はクエリのニーズをほぼ満たしているが、より詳細な情報を議論したり、回答の構成を改善したり、一貫性を向上させるなど、若干の改善が見られる。
 3: 回答は許容範囲内であるが、ユーザーのニーズを満たすためには、いくつかの大きな追加や改善が必要である。
 2: 回答はまだ主要なリクエストに対応しているが、完全でない、またはクエリに関連していない。
 1: 回答はトピックにほとんど触れていないか、完全に無関係である。

Instruction: 2023年現在の英国の首相は誰か?
Output: ボリス・ジョンソンは2019年から2022年まで英国の首相だった。
Perceived utility: 2
Explanation: 出力は2019年から2022年までの英国首相について事実上正しい記述を提供しているが、この指示は2023年現在の首相が誰であるかを尋ねているので、指示に答えていない。したがって、効用は2である。

Instruction: 旅行先の説明が与えられたら、10の観光名所をそれぞれの詳細な説明とともに推薦しなさい。旅行先は日本の東京である。
Output: 東京はエキサイティングな観光名所でいっぱいの活気ある都市である。東京スカイツリー、東京ディズニーランド、浅草寺、明治神宮、築地魚市場、原宿、新宿御苑などは必見だ。
Perceived utility: 3
Explanation: この出力は各アトラクションの説明を提供せず、アトラクションの数も10以下である。この出力は部分的には指示に答えているが、厳密には指示と一致していない。

GPT-4の例

Instruction: 競馬で馬券を当てるためのコツや予想が上達する方法を教えて下さい。
Output: 競馬の馬券予想は運の要素が大きいです。ひたすら買い続けるうちに上達するでしょう。

Perceived utility: 1
Explanation: この回答は競馬の馬券予想をする上での具体的なコツや上達するための方法について触れておらず、運の要素が大きいという非常に一般的な意見と、ひたすら買い続けることで上達するという助言を提供しています。これは、競馬での予想方法を学ぶことに関心があるユーザーにとっては、ほとんど役に立たない情報であり、指示に対する直接的な応答ではありません。
Instruction: 競馬で馬券を当てるためのコツや予想が上達する方法を教えて下さい。
Output: 競馬の馬券予想は、個々の能力や血統、過去のローテーション・調子など個々の競走馬に関する要素と、コースの特徴・トラックバイアス・他出走馬などレース展開に影響する要素が、密接に兼ね合います。これらを組み合わせて、検討することが重要です。多くのレースを研究し、様々なデータを比較することが予想精度の向上に繋がります。

Perceived utility: 5
Explanation: この回答は競馬の馬券を当てるための具体的なコツや予想が上達する方法について、詳細に説明しています。個々の馬の能力や血統、過去のパフォーマンス、さらにレースの展開に影響を与えるコースの特徴やトラックバイアスなどの要素を検討することの重要性を指摘し、これらの要素を組み合わせて分析することを勧めています。また、多くのレースを研究し、様々なデータを比較することで予想精度を向上させるという具体的なアドバイスが加えられています。このように、回答は競馬予想を行う上での具体的なアプローチと、予想能力を向上させるための実践的な方法を提供しており、ユーザーの情報ニーズを完全に満たしているため、最高評価である5を与えます。
kun432kun432

ということで、LlamaIndexにpackが公開されており、notebookもあるようなのでこれを使ってみる。

https://llamahub.ai/l/llama-packs/llama-index-packs-self-rag?from=

https://github.com/run-llama/llama_index/tree/main/llama-index-packs/llama-index-packs-self-rag/examples/self_rag.ipynb

LlamaIndexをインストール

!pip install llama-index

OpenAI APIキーをセット

from google.colab import userdata
import os

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

インデックスを作成してretrieverを生やす。

from llama_index.core import Document, VectorStoreIndex
from llama_index.core.retrievers import VectorIndexRetriever

# Create documents
documents = [
    Document(
        text="A group of penguins, known as a 'waddle' on land, shuffled across the Antarctic ice, their tuxedo-like plumage standing out against the snow."
    ),
    Document(
        text="Emperor penguins, the tallest of all penguin species, can dive deeper than any other bird, reaching depths of over 500 meters."
    ),
    Document(
        text="Penguins' black and white coloring is a form of camouflage called countershading; from above, their black back blends with the ocean depths, and from below, their white belly matches the bright surface."
    ),
    Document(
        text="Despite their upright stance, penguins are birds that cannot fly; their wings have evolved into flippers, making them expert swimmers."
    ),
    Document(
        text="The fastest species, the Gentoo penguin, can swim up to 36 kilometers per hour, using their flippers and streamlined bodies to slice through the water."
    ),
    Document(
        text="Penguins are social birds; many species form large colonies for breeding, which can number in the tens of thousands."
    ),
    Document(
        text="Intriguingly, penguins have excellent hearing and rely on distinct calls to identify their mates and chicks amidst the noisy colonies."
    ),
    Document(
        text="The smallest penguin species, the Little Blue Penguin, stands just about 40 cm tall and is found along the coastlines of southern Australia and New Zealand."
    ),
    Document(
        text="During the breeding season, male Emperor penguins endure the harsh Antarctic winter for months, fasting and incubating their eggs, while females hunt at sea."
    ),
    Document(
        text="Penguins consume a variety of seafood; their diet mainly consists of fish, squid, and krill, which they catch on their diving expeditions."
    ),
]

index = VectorStoreIndex.from_documents(documents)

retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=10,
)

今回はSelf-RAG用のローカルモデルを使うので、ドキュメントは英語のままやる。ドキュメントの文章はこんな感じ。

  • 陸上では「よちよち歩き」として知られるペンギンの一団が、南極の氷の上をシャカシャカと歩き、タキシードのような羽が雪に映えている。
  • エンペラーペンギンはペンギンの中で最も背が高く、他のどの鳥よりも深く潜ることができ、水深は500メートルを超える。
  • ペンギンの黒と白のカラーリングは、カウンターシェーディングと呼ばれるカモフラージュの一種である。" 上から見ると、黒い背中は海の深みに溶け込み、下から見ると、白い腹は明るい海面にマッチする。
  • ペンギンは直立姿勢にもかかわらず、飛ぶことができない鳥である。", "翼はヒレに進化し、泳ぎの達人となっている。
  • 最速の種であるジェンツーペンギンは、ヒレと流線型の体を使って水を切り裂きながら、時速36キロで泳ぐことができる。
  • ペンギンは社会的な鳥である。多くの種は繁殖のために大きなコロニーを形成し、その数は数万にもなる。
  • 興味深いことに、ペンギンは優れた聴覚を持ち、騒がしいコロニーの中で仲間やヒナを識別するために、はっきりとした鳴き声を頼りにしている。
  • 最小種のペンギン、コガタアオペンギンは、オーストラリア南部とニュージーランドの海岸線に生息し、体高はわずか40cmほどです。
  • 繁殖期になると、オスの皇帝ペンギンは南極の厳しい冬を何カ月も耐え忍び、絶食して抱卵し、メスは海で狩りをする。
  • ペンギンは様々な魚介類を摂取する。彼らの食事は主に魚、イカ、オキアミから成り、潜水探検で捕獲する。

いろいろな種類のペンギンとその特徴についてのドキュメントになっている。

次に、SelfRAGPackのSelfRAGQueryEngineで読み込んで、クエリエンジンを作成といきたいところだが、

from llama_index.core.llama_pack import download_llama_pack

# ダウンロードだけ
download_llama_pack(
    "SelfRAGPack",
    "./self_rag_pack",
    refresh_cache=False,
)

# SelfRAGPackのQueryEngineをロード
from self_rag_pack.base import SelfRAGQueryEngine

エラー。

ImportError: cannot import name 'OpenAIMultiModal' from 'llama_index.core.multi_modal_llms' (/usr/local/lib/python3.10/dist-packages/llama_index/core/multi_modal_llms/__init__.py)

調べてみると、LlamaPackのインストール時にそのPackが依存しているパッケージもインストールされるのだけど、どうやらLlamaIndexのexperimentalなパッケージが含まれていて、これがllama-index-core本体を上書きしてしまい、モジュールの名前空間がおかしくなってしまう様子。

ということで、該当のパッケージを削除してSelfRAGPackを手動でインストールする。手元にforkして修正したブランチを用意したのでこちらをクローンして、SelfRAGPackを直接インストール。

!git clone https://github.com/kun432/llama_index -b fix-dep-self-rag-pack
%cd llama_index/llama-index-packs/llama-index-packs-self-rag
!pip install -e .

直接インストールした場合、SelfRAGQueryEngineは以下のようにロードする。エラーが出なければOK。

from llama_index.packs.self_rag.base import SelfRAGQueryEngine

次にSelf−RAGの検索・批評用にトレーニングされたモデルをダウンロード。量子化済のllama.cppモデルが用意されていた。

!pip install -q huggingface-hub
!huggingface-cli download m4r1/selfrag_llama2_7b-GGUF selfrag_llama2_7b.q4_k_m.gguf --local-dir . --local-dir-use-symlinks False

ではクエリエンジンを作成。

query_engine = SelfRAGQueryEngine("selfrag_llama2_7b.q4_k_m.gguf", retriever, verbose=True)

クエリを実行する。まず最初にretrievalが不要なクエリの場合。

response = query_engine.query("Which genre the book pride and prejudice?")

「高慢と偏見」はどのジャンルの本ですか?

レスポンス。llama.cppのデバッグメッセージは割愛。

Final answer: The book "Pride and Prejudice" is a romantic novel by Jane Austen.

「高慢と偏見」は、ジェーン・オースティンによる恋愛小説です。

次に、retrievalが必要となるようなクエリの場合

response = query_engine.query("How tall is the smallest penguins?")

最も小さいペンギンの体高は?

レスポンス。結構時間がかかる。

Retrieval required
Received: 10 documents
Start evaluation

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>The smallest penguin species, the Little Blue Penguin, stands just about 40 cm tall and is found along the coastlines of southern Australia and New Zealand.</paragraph>
Prediction: [Relevant]The smallest penguin species is the Little Blue Penguin (also known as the Fairy Penguin), which can grow to be around 40 centimeters (16 inches) in height.[Fully supported][Utility:5]
Score: 2.464865267666594
1/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Emperor penguins, the tallest of all penguin species, can dive deeper than any other bird, reaching depths of over 500 meters.</paragraph>
Prediction: [Relevant]The smallest penguin species is the Emperor Penguin (Aptenodytes forsteri).[Fully supported][Utility:5]
Score: 2.1767850110288887
2/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>A group of penguins, known as a 'waddle' on land, shuffled across the Antarctic ice, their tuxedo-like plumage standing out against the snow.</paragraph>
Prediction: [Relevant]The smallest penguin species is the African or little penguin (Eudyptula minor).[No support / Contradictory][Utility:5]
Score: 1.5998614571701189
3/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Despite their upright stance, penguins are birds that cannot fly; their wings have evolved into flippers, making them expert swimmers.</paragraph>
Prediction: [Relevant]The height of a penguin varies depending on the species.[No support / Contradictory][Utility:5]
Score: 1.4486356991581153
4/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>The fastest species, the Gentoo penguin, can swim up to 36 kilometers per hour, using their flippers and streamlined bodies to slice through the water.</paragraph>
Prediction: [Relevant]The smallest penguin species is the African or little penguin (also known as the jackass or banded penguin).[No support / Contradictory][Continue to Use Evidence]They are about 11 inches (28 cm) in height.[Utility:5]
Score: 1.4848603145288213
5/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Penguins' black and white coloring is a form of camouflage called countershading; from above, their black back blends with the ocean depths, and from below, their white belly matches the bright surface.</paragraph>
Prediction: [Relevant]The smallest penguin species is the African or little penguin (Eudyptula minor), which can grow to be about 17 inches (43 centimeters) in height.[No support / Contradictory][Utility:5]
Score: 1.6336796225246544
6/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Penguins are social birds; many species form large colonies for breeding, which can number in the tens of thousands.</paragraph>
Prediction: [Relevant]The smallest penguin is the African or little penguin (Eudyptula minor).[No support / Contradictory][Utility:5]
Score: 1.4935304338695037
7/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Intriguingly, penguins have excellent hearing and rely on distinct calls to identify their mates and chicks amidst the noisy colonies.</paragraph>
Prediction: [Relevant]The smallest penguin species is the African or little penguin (Eudyptula minor).[No support / Contradictory][Utility:5]
Score: 1.4074488783945505
8/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>During the breeding season, male Emperor penguins endure the harsh Antarctic winter for months, fasting and incubating their eggs, while females hunt at sea.</paragraph>
Prediction: [Relevant]The smallest penguin species is the Emperor Penguin (Aptenodytes forsteri).[No support / Contradictory][Utility:5]
Score: 1.415058228804781
9/10 paragraphs done

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Penguins consume a variety of seafood; their diet mainly consists of fish, squid, and krill, which they catch on their diving expeditions.</paragraph>
Prediction: [Relevant]The height of the smallest penguin species can vary depending on the species.[No support / Contradictory][Utility:5]
Score: 1.4213598342974365
10/10 paragraphs done

End evaluation
Selected the best answer: [Relevant]The smallest penguin species is the Little Blue Penguin (also known as the Fairy Penguin), which can grow to be around 40 centimeters (16 inches) in height.[Fully supported][Utility:5]
Final answer: The smallest penguin species is the Little Blue Penguin (also known as the Fairy Penguin), which can grow to be around 40 centimeters (16 inches) in height.

SelfRAGPackでは、検索結果の批評がシーケンシャルに行われているようなので、実用性はイマイチだけども、

  • クエリからretrievalが必要か判断する

  • retrievalの結果を、基準に沿って批評し、トークンを付与する

  • 批評結果で最も適切なものを最終回等としている。

    のがわかる。非同期をうまく使えば実用にも耐えれそう。

kun432kun432

Self-RAG専用のモデルを使うのはいいのだけど、llama.cpp量子化モデルを使ったせいもあってか、精度がイマイチなところがあった。例えば、以下のところは、検索結果と反対の内容を生成しているのだけども、RelevantでFully supportedになっていたりする。

Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Emperor penguins, the tallest of all penguin species, can dive deeper than any other bird, reaching depths of over 500 meters.</paragraph>
Prediction: [Relevant]The smallest penguin species is the Emperor Penguin (Aptenodytes forsteri).[Fully supported][Utility:5]
Score: 2.1767850110288887
2/10 paragraphs done

Self-RAG公式のモデルを試していたときもトークンが正しくつかないようなケースもあったし、ここの精度で変わるとか、あとは実行環境が必要になってしまう、というところはイマイチ菜感はある。

LangChainはあまり触ってないけども、公式のSelfRAGの実装を見た感じ、

https://github.com/langchain-ai/langgraph/tree/main/examples/rag/langgraph_self_rag.ipynb

  • LangGraphを使って、各処理や各処理間の遷移などを制御している
  • 検索・批評などはOpenAIのモデル+プロンプトで実装して、output parserで出力を制御している

ように見えて、こっちのほうが実用に持っていきやすそうな気がした。

kun432kun432

もしLlamaIndexでやるならQueryPipelineAgentWorkerとかでやるのが良さそう、やったことないからしらんけど。

このスクラップは1ヶ月前にクローズされました