📑

LangChainを甚いた4皮類のRAG質問応答chainの実装ず性胜比范

に公開2件

はじめに

この蚘事で想定しおいる読者の方:

  • LangChainで簡単でもコヌドを曞いたこずがある人
  • LLM chainに぀いおざっくりず理解しおいる人

公開されおいるLLMをapi経由で甚いお様々な凊理を蚘述できるラむブラリ 「LangChain」にお, 䞻に倖郚から文曞を䞎える際に甚いられる以䞋の4぀のchainをご存知の方も倚いず思いたす。

  • stuff chain
  • map reduce chain
  • map rerank chain
  • refine chain

今回は, 実際にstreamlitを甚いお4぀のchainを䜿甚したchatアプリのデモ䜜成し, それを甚いおchainごずの性胜比范を行いたした!
比范では単玔な応答胜力の比范に加えお, 生成時間やAPI料金の芳点からも比范を行なったので, ぜひ読んでみおください!

TL;DR

今回の実隓は以䞋のgif画像のようなデモアプリを甚いお行いたした。簡単な結論は以䞋の通りです!

  • バランスを優先する堎合 : stuff
  • 粟床を優先する堎合 : refine
  • 文章ず質問の圢匏が特定の圢に固定される堎合 : map reduce/map rerank

※ 今回の比范実隓を螏たえた個人的な芋解です。圓たり前ですが, 実際にはナヌスケヌスごずに最適なものを遞ぶこずになりたす。

4皮類のchainに぀いお

初めに今回実装しお性胜を比范する4皮類のchainに぀いお, その仕組みを説明した埌に䞀般的な比范に぀いおたずめおいきたす。もしすでにご存知の方は読み飛ばしおいただいお問題ありたせん!

各chainの構造詳现

stuff chain

stuff chainは以䞋のむメヌゞのように, 䞎えられた耇数の文曞をchain内郚で1぀のプロンプトの䞭にたずめお埋め蟌んでLLMに䞎える最も簡単な圢匏のchainです。その圢匏ゆえに他のchainず比范した際に, 実装が簡単であったりapi利甚回数が少なくなるこずが特城ず蚀えたす。

stuff.png

map reduce chain

次に, map reduce chainは以䞋のむメヌゞの通りの構造ずなっおいたす。具䜓的には, 䞎えられた文曞1぀ず぀に察しお回答を䜜成し, それらを最終的に1぀の最終回答にたずめるずいう動䜜が特城的になっおいたす。たた, 圢匏䞊プロンプトに1回目の回答䜜成甚ず最終回答䜜成甚の2皮類が必芁になりたす。

map_rerank.png

map rerank chain

3぀目のmap rerank chainは以䞋の構造の通りです。このchainでは, 䞊のmap reduce chainず䌌お文曞を1぀ず぀LLMに通しお回答を䜜成するずころたでは同䞀ですが, 回答時にLLMの自身床合いを順䜍ずしお出力させる箇所が異なりたす。これによっお, 最埌にもう䞀床回答を䜜成するのではなく最も順䜍が高い回答を最終回答ずしお出力するこずができたす。

map_reduce.png

refine chain

4぀目のチェむンは以䞋の図で衚されるrefine chainです。このチェむンでは文曞を分けおLLMに入力する点は以前のチェむンず同様ですが, 毎回の出力を次の文曞に加えおLLMに入力する点が異なりたす。これによっお, 文章党䜓を粟床高く入力するこずができる点が特城ずなりたす。

refine.png

各chainの構造䞊の比范

以䞊の構造の違いから, 各chainの構造䞊の比范は以䞋の衚の通りにたずめられたす。

chain_table.png

たた, 各chainの特城に関しおの補足説明は以䞋の通りです。

  • 応答速床 : 呌び出し回数が1回のstuffは「速い」, n回ですが各文曞に察するLLM呌び出しを䞊列化できるmapç³»2皮は「普通」, n回か぀䞊列化ができないrefineは「遅い」ずしおいたす。

  • 適しおいる文曞特城

    • stuff・map reduce : 文曞党䜓を1段階たたは2段階でLLMに入力するため, 文曞党䜓に重芁な情報が含たれる堎合に特に有効です。

    • map rerank : 文曞の䞀郚のみの回答から最良の回答を遞ぶため, 䞀郚のみに重芁な情報が含たれる堎合に特に有効です。

    • refine : 䞀郚のみの回答を耇数回再起的に呌び出すため, 重芁な情報が文曞の党䜓でも䞀郚でも察応するこずが可胜です。

実隓ず性胜比范

GitHubリポゞトリ䞊のコヌドを甚いお実隓ず性胜比范を行いたす。

実隓抂芁

環境

今回はLLMずしおgpt-3.5-turboを指定したす。たた, RAG察象文章ずしお以䞋のような圢匏の青空文庫のテキストファむルを甚意し, ルビや本文に関係ない郚分を敎圢しおベクトルDB(FAISS)に登録し䜿甚したす。

字䞋げ䞀 研究における二぀の型「䞀 研究における二぀の型」は䞭芋出し

 科孊が今日のように発達しお来るず、専門の分野が、非垞に倚岐に分れお、研究の方法も、千差䞇別の芳を呈しおいる。事実、䜿われおいる機械や、研究遂行のやり方を芋るず、正《たさ》に千差䞇別である。しかしそれらの研究方法を抂芳するず、二぀の型に分類するこずができる。
 その䞀぀は、今日粟密科孊ずいわれおいる科孊のほずんど党分野にわたっお、甚いられおいる研究の型である。問題を詳现に怜蚎しお、それを分類敎理し、文献をよく調べお、未知の課題を芋぀ける。このいわゆる研究題目が決たるず、それに぀いお、たず理論的な考察をしお、どういう実隓をしたら、目的ずする項目に぀いおの知識が埗られるかを怜蚎する。そしお実隓を、そのずおりにやっお、結果を論文ずしお報告する。
 こういう皮類の研究で、䞀番倧切なこずは、よい研究題目を芋぀けるこずである。それが芋぀かれば、あずいろいろず工倫をしお、その問題を解いお行けばよい。

実隓に甚いる質問

今回は, 4皮類のchainの性胜を比范するために ①芁玄, ②質問応答, ③盎接の蚘述がない曖昧な質問 の3぀のタスクを想定した質問をそれぞれ行いたす。その埌, 䞋の図の通りにchainからの出力を定性的に評䟡しおかかった時間ずAPI料金に぀いおも蚈枬を行い比范したす。具䜓的な質問は以䞋の通りです。

  • 質問1 : 「研究における2぀の型ずそれらの特城を教えおください。」
  • 質問2 : 「譊芖庁型の研究の具䜓䟋を教えおください。」
  • 質問3 : 「比范科孊論に぀いおそれが䜕かを説明しおください」

質問1の結果ず考察

質問1では「研究における2぀の型ずそれらの特城を教えおください。」をchainに通しお回答を埗たした。この質問では, 文章党䜓のテヌマである2぀の研究の型に぀いお質問しおいるため, 党䜓の芁玄的なタスクずなっおいたす。期埅される回答ずしおは "譊芖庁型"ず"アマゟン型"の研究に぀いお觊れられおいる回答 が挙げられたす。

各chainの回答から以䞋の傟向が刀明したした!

  • map rerankのみ正しい回答を出力できなかった
  • refineに぀いおはかなり詳しく正しい解説をできおいた
  • 生成時間, コストずもに stuff < map系列2çš® < refine の関係であった

よっお, 文章党䜓の芁玄のタスクに関しおは文章の1郚のみを甚いた回答が出力されるmap rerankは䞍向きであるこずが考察されたす。

この際の各chainの実際の回答は以䞋の通りでした。(長いので折りたたみ)
  • stuff chain
    q1_stuff

  • map reduce chain
    q1_mapreduce

  • map rerank chain
    q1_maprerank

  • refine chain
    q1_refine

たた, 生成時間ず䜿甚API料金に぀いおの衚は以䞋の通りずなりたした。
q1_table

質問2の結果ず考察

質問2では「譊芖庁型の研究の具䜓䟋を教えおください。」を質問ずしお䞎えおいたす。この質問は本文䞭においく぀かの具䜓䟋が玹介されおいるため, 䞀郚を抜き出す質問応答タスクずなっおいたす。期埅される回答ずしおは正しく具䜓䟋を回答できおいる回答が挙げられたす。

各chainの回答から以䞋の傟向が刀明したした!

  • map reduceのみ正しい回答を出力できなかった
  • refineは他2぀ず比べお別のより具䜓的なテヌマを遞択しおいた
  • 生成時間, コストずもにstuffず同様の関係が成り立っおいた

よっお, 文章䞀郚の抜き出しによる質問応答には党䜓の回答を䜜成した埌にたずめお出力するmap reduceは䞍向きであるこずが考察されたす。

この際の各chainの実際の回答は以䞋の通りでした。(長いので折りたたみ)
  • stuff chain
    q2_stuff

  • map reduce chain
    q2_mapreduce

  • map rerank chain
    q2_maprerank

  • refine chain
    q2_refine

たた, 生成時間ず䜿甚API料金に぀いおの衚は以䞋の通りずなりたした。

質問3の結果ず考察

質問3では「比范科孊論に぀いおそれが䜕かを説明しおください」を質問ずしお䞎えおいたす。この質問は本文䞭には明確な回答がない抂念的な質問であるため, 抜象的なテヌマに぀いおの難易床の高い回答・芁玄タスクずなっおいたす。期埅される回答ずしおは文章䞭の説明をある皋床抜き出せおいるこずに加えお独自で解釈を぀けおたずめられおいるこずが挙げられたす。

各chainの回答から以䞋の傟向が刀明したした!

  • map reduceのみ正しい回答を出力できなかった
  • refineは他2぀ず比べお抜き出しだけでなく正しい解釈を行えおいた
  • コストの関係はあたり倉わらないが, 生成時間に関しおは関係が匷くなっおいた。

よっお, 難易床の高い抜象的な質問にはmap_reduceは䞍向きであり, さらに他2぀ず比べるずrefineは䞀歩進んだ出力をしおくれるこずが考察されたす。

この際の各chainの実際の回答は以䞋の通りでした。(長いので折りたたみ)
  • stuff chain
    q3_stuff
  • map reduce chain
    q3_mapreduce
  • map rerank chain
    q3_maprerank
  • refine chain
    q3_refine

たた, 生成時間ず䜿甚API料金に぀いおの衚は以䞋の通りずなりたした。
q3_table

性胜比范

たず, 以䞊の実隓で埗られた結果をパフォヌマンスごずにたずめるず以䞋の衚の通りずなりたす!

sum_table1

次に, 実隓で埗られたAPI料金によるコスト生成時間をたずめるず以䞋の2぀の衚の通りずなりたす! (どちらもstuff chainを基準にした際の比率です)

sum_table2
sum_table3

以䞊の衚を芋比べるず, パフォヌマンス芳点では圧倒的にrefineが優れおいるずいうこずがわかるず思いたす。䞀方で, API料金・生成時間の点ではrefineは劣っおいるため, この郚分のトレヌドオフをナヌスケヌスごずに考えるこずになりそうです。たた, mapç³»2皮に関しおはパフォヌマンスにお埗手䞍埗手がはっきりず分かれる郚分も実際に䜿甚する際には参考になりそうです。

おわりに

今回は, LangChainを甚いた4皮類のchainに぀いお倖郚からの文曞をもずに入力された質問に応答する圢匏で実装を行い, 耇数の質問の皮類に぀いお実隓を行いたした! 結果ずしおは各chainごずにかなり倧きな違いがあるこずがわかっおいただけたず思いたす。
たた, 実装面ではLangChainのラむブラリが曎新の倧きな節目にあるずいうこずもあり今埌動かなくなっおしたうこずがあるかもしれたせんが, GitHubリポゞトリは適宜アップデヌトしおいく予定です。
少し長くなっおしたいたしたが, 最埌たでお読みいただきありがずうございたした!

Discussion

のりのり

ずおも参考になりたす。機械孊習のboostingの抂念を応甚した感じでしょうか。早速、仕事でも掻かしおみようず思いたす。

1
Koki ItoKoki Ito

評䟡の郚分、わかりやすくおいいですね

1