見出し画像

RAG 周りの工夫の仕方について考える

1. 序章:プロンプトエンジニアリングを超えてみたい…!

こんにちは、12月16日のアドベントカレンダーを担当します、nouuでインターンをしております、大学生のヤマダです。普段はアメリカの大学で情報科学(データサイエンス)や言語学を学んでおります。リサーチが好きで今回はLLMProgram という論文をきっかけにプロンプト以外の手法を用いてLLMの性能を引き出せないか…というチャレンジをしてみました。数百もの論文を全て網羅できているわけではないのでGoogle Geminiを用いて今後大規模リサーチかけていきたいところです。
前提として、大規模言語モデル(LLM)は、複雑なデータ処理と問題解決の手段として注目されています。しかし、これらのモデルは依然としてプロンプト依存の限界を持ち、これを克服するための新しい技術が求められています。この記事では、プロンプトエンジニアリングの進化とその応用に焦点を当てます。

<この記事を読んで欲しい人>

  • LLMを活用したいけど、ChatGPTなどのチャット型からなかなか離れられない

  • LLMの精度を高める手法の論文気になるけれどどんな論文を読めばいいかわからない

  • Langchain, LlamaIndexを活用したいけど何から試してみたらいいかわからない(近日中にアップデートします…!)

<この記事を読むとわかること>

  • プロンプト以外の手法でLLMの性能を向上させる方法

  • SELF-RAGとか推論プロセスについての理解が深まる

  • LLMの向上させるための私がピックアップした論文についてわかる

2. RAGの強化

そもそもRAGってなんだ…?と思っている方へ、一文で説明させていただきます(無謀)

  • Retrieval-Augmented Generation (RAG)は、関連する情報をデータベースから検索し、それを基に新しいテキストを生成する手法です。

  • 単語単位で見ていくと…→「検索」(Retrieval)+「生成」(Generation)になりますね

RAGについてさらに詳しく、体系的に学びたい方は、こちらのスライドがおすすめです。私もRAGについて理解する際にとても役に立ちました。ありがとうございます。

これから紹介する手法は2つの論文に注目してRAGと長尺コンテンツの情報検索と活用に焦点を当ててみました。LangChain やLlamaIndexの活用リストは追ってアップデートしていきます!

RAGを活用あるいは、使用した方の中には、「いまいち上手く動かないな…」と なった方もいらっしゃると思います。

ここで紹介したいのは、実はRAGというかRAG内部のベクトル検索部分はそのまま安直に実行しようとするとうまく動かないことがあります。一つの理由はクエリーと検索対象のベクトルでは、質問と回答という意味的なズレがあるからです。この溝を埋めるための一つの方法としてHyDEがあります。HyDEでは質問から仮想回答を作り、仮想回答と類似度の高いドキュメントを検索することで、回答空間での検索を試みます。

例えば、
「東京の観光スポットを教えてください」という質問から想定される仮想回答 「浅草の浅草寺では…」 「スカイツリーは日本一高い電波塔で…」 「渋谷のスクランブル交差点は…」 などをLLMに生成させ、これらの仮想回答に類似する文書を検索させる方法です。これにより「回答の空間」での検索を可能にしています。
元のクエリーに加えてこの仮想文章もクエリーにして文章のベクトル検索を行い、その結果を統合します。仮想ドキュメントと類似度の高いドキュメントは、検索結果の上位に表示されやすくなります。つまり、HyDEを利用することで、ユーザーの検索意図に沿ったより精度の高い検索結果を表示することができます。

RAGからさにもう一歩進んだRAGを内包したフレームワークとして、SELF-RAGが提案されています。SELF-RAGは、RAG自体がコンポーネントになっている生成方法として紹介します。

生成と検索・批判の組み合わせ
ここ一年で世間を賑わせている(人間の働き方すら根本から変化させている)大規模言語モデル(LLMs)はテキスト生成において顕著な進歩を遂げています。しかし、事実的に正確ではないレスポンスを生成する問題が残っています。これを「Hallucination」とも言います。この問題に対処するために新たに登場したのが、「SELF-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection」という研究です。

SELF-RAGは「Self-Reflective Retrieval-Augmented Generation」と呼ばれるフレームワークです。目的は単純で、LLMsの品質と事実性を向上させることです。このフレームワークの特徴は、生成と批判の組み合わせによる”自己評価”機能です。モデルは基準をもとに分類された4つのトークンをもとに、情報検索をすべきかどうか、モデルが自己判断をして検索された場合には得られた情報の信頼性も自己評価し、回答を生成します。必要に応じて情報を検索し、生成したレスポンスの品質を自己評価します。つまり、取得された情報が役に立つかどうかを既存のLLMに問い合わせるだけでなく、生成に加えて検索・評価も適切にできるようにLLM自体を追加学習していることもポイントになってきます。なんだか自己評価と言われると「反省・復習」のようでまるで人間みたいですよね。
人間の学習プロセスを応用しているのではないかと私は推測しています。

  • 実用性と効果 SELF-RAGは、公開ドメインの質問応答、事実検証、長文生成など、多岐にわたるタスクで既存の最先端モデルを上回る性能を示しています。研究チームによる実験では、複数の評価指標を用いてSELF-RAGの有効性が確認されています。

  • 結論 この研究は、LLMsの性能向上において新しいアプローチを提案し、その有効性を実証しています。SELF-RAGの登場により、より高品質で信頼性のある自動テキスト生成への道が開かれたと言えます。

3. プロンプトチューニングとその活用法

この章では、プロンプトチューニング(追加学習の一種)について紹介していきます。元来の方法では、Prompt Engineering やModel Fine Tuning などが主流であり(もちろん今も主流です)
ここでは、プロンプト自体をパラメータと見てチューニングするという発想で、モデルをチューニングするかわりにプロンプトをチューニングする『プロンプトチューニング』を紹介していきます。特に以下に紹介する論文内では、LLM自身でプロンプトをチューニングしていることから、「エージェント」に近い感覚を持つかもしれません。ということで、早速論文解説に入っていきます。

プロンプトチューニングのパラメータ効率とその限界

  • 概要
    プロンプトチューニングは、大規模な言語モデルを特定のタスクに適応させるための新しい手法であり、従来のモデルチューニング(ファインチューニング)に比べてパラメータ効率が高いとされています。しかし、この手法にはいくつかの限界が存在します。

  • パラメータ効率の高さ
    プロンプトチューニングは、モデル全体を再訓練するのではなく、言語モデルに「ソフトプロンプト」と呼ばれる小さな学習可能なパラメータセットを追加して、特定のタスクに適応させます。このソフトプロンプトのサイズは、元のモデルのサイズに比べて非常に小さいため、追加の学習に必要な計算資源と時間が大幅に削減されます。特に、大規模モデルにおいて、この方法は従来のファインチューニングと比較して、同等またはそれ以上の性能を達成することが可能です。

  • 限界
    一方で、プロンプトチューニングの効率性はモデルのサイズや構造、タスクの性質に依存するため、すべての状況で最適な解決策とは言えません。特に、小規模モデルや特定のタイプのタスクでは、ファインチューニングの方がより良い結果をもたらす場合があります。また、プロンプトチューニングは、モデルがすでに持っている知識を最大限に活用する手法であるため、モデルが元々持っていない知識を学習させるのには限界があります。

  • 結論
    プロンプトチューニングは、特に大規模モデルにおいて、パラメータ効率の良いタスク適応手法として有効です。しかし、この手法の適用可能性と効果は、モデルの特性やタスクの種類によって異なり、すべてのケースにおいて最適な方法とは限りません。そのため、特定の状況に最適な手法を選択する際には、モデルのサイズやタスクの特性を考慮する必要があります。

  • 参考記事
    https://ai-scholar.tech/articles/prompting-method/eff-prompt-tuning

プロンプトエンジニアリングの進化と新たな挑戦 
プロンプトチューニングもプロンプトエンジニアリングもまだやはり限界がある、ということがなんとなく見えてきたかもしれません。以下のツイート見てふむふむ🤨ってなりました。僕たちは、未完成のものを完成に近づけているためにプロンプトを改善したり、階層化したり、外部との関わり合いでLLMをなるべく正確に挙動させようとしているんだなと。これを前提に考えると、発展途上の素晴らしいテクノロジーと関われているということになりますよね。(綺麗なまとめかたすぎるかな…)

以下は、今回の小規模の論文リサーチにおいて参考文献です。(全てではありません。)LLMの全体像を俯瞰できるほどの整理はできておらず、論文の分類分けも難しい状況ではありますが、数ある論文からデータベースをGoogle Spreadsheets で作成し、ピックアップしたもののリストになります。

4. 論文紹介メモ

以下は私が気になったけれども、本文中には入りきらなかった論文を6つほどピックアップして内容を簡単にまとめてみました。『落合フォーマット』というフォーマットを用いており、論文サーベイを定量的に内容を要約するGPTsを作成してまとめ作成を行なっています。論文精査の観点では、プロンプトエンジニアリングの限界を超越するためにさまざまな角度からLLMの精度を向上させる技術に着目しました。それらの先端技術は、LLMの潜在能力を引き出し、より複雑な問題解決への道を開いていくと考えられます。(すでに開かれているかもしれません…)以下に簡単な論文まとめを掲載します。

こちらが今回論文サーベイに使用したGPTsです。

ちなみに僕のTwitterの投稿はこちらです。(もしよろしければフォローしてください🙌)

a. Reasoning via Planning (RAP)
RAPは、LLMを世界モデルとして活用することで、複雑な推論タスクに取り組む新しい枠組みです。このフレームワークは、従来の連鎖型推論に依存せず、Monte Carlo Tree Search(MCTS)アルゴリズムを用いて、複数の推論経路を模索し、最適な結果を導き出します。この技術は特に、戦略的な意思決定やシナリオベースの問題解決が求められる場面で有効です。

b. LLMプログラム
LLMプログラムのアプローチは、LLMを既存のアルゴリズムやプログラムに組み込むことにより、LLMの機能を大幅に拡張します。これにより、LLMは単なる言語処理ツールから脱却し、より複雑な分析や意思決定タスクをこなすことが可能になります。この技術は、データ駆動型の意思決定や自動化されたプロセス管理に特に役立ちます。

c. Deep Language Networks (DLN)
DLNは、LLMを異なる言語レイヤーとして捉え、それぞれのレイヤーを最適化することで、より高度なタスクを効率的に解決します。このスタック型アーキテクチャは、各レイヤーが前のレイヤーの出力を入力として受け取り、逐次的に問題を解決していきます。この手法は、特に複雑な自然言語処理タスクや多段階のデータ分析に適しています。

d. Directional Stimulus Prompting (DSP)
DSPは、LLMの出力を特定の方向に導くための新しい手法です。これは、小規模なポリシーモデルを用いて、インスタンスごとにカスタマイズされたプロンプトを生成し、LLMが望ましい結果を生み出す手がかりを提供します。この技術は、カスタマイズされたコンテンツ生成や精緻なユーザーインタラクションに有用です。

e. Tree of Thoughts (ToT)
ToTは、LLMの推論プロセスを、単一の線形経路から多様な推論の木へと展開するフレームワークです。これにより、LLMはさまざまな解決策を探索し、それぞれの選択肢を評価する能力を持ちます。このアプローチは、特にクリエイティブな問題解決や教育的アプリケーションに適しています。

f. PromptAgent
PromptAgentは、モンテカルロ木探索を基にした戦略的計画アルゴリズムを用いて、専門家レベルのプロンプト最適化を実現します。これにより、複雑なプロンプト空間を効率的にナビゲートし、精緻なプロンプトを生成することが可能になります。この技術は、特に複雑なシナリオでの高度な意思決定や、専門家レベルの分析に役立ちます。

g. Retrieval meets Long Context Models
この研究は、大規模言語モデル(LLM)の文脈窓を拡張する新しい方法として、情報検索(リトリーバル)の応用を提案し、その効果を検証しています。43B GPTとLLaMA2-70Bという2つの先進的なLLMを使用し、LLMのサポートする文脈長を増やすこととRAGによる入力文脈のコンパクト化が、LLMのパフォーマンス向上にどのように寄与するかを分析しました。

Auto Gen: LLMを複数使用して動かしていく
GitHub - microsoft/autogen: Enable Next-Gen Large Language Model
Applications. Join our Discord: https://discord.gg/pAbnFJrkgZ

5. 結論:まとめ

ここまでお読みいただきありがとうございました。この論文サーベイには約1ヶ月ほどの時間をかけてLLMを使用することに関する論文の大海原を航海してきました。正直、現時点ではLLMの地平を描くことはできません。ただ、僕自身の感覚として、LLMの付き合い方やこれから向かっている方向だったりを共有することができればなと思います。
僕が考えるLLMを使用することに関する論文・研究の未来的なところについてです。ここ一年で加速度的に多くなったLLMを使用することに関する論文は、どの方向に向かっているか感覚とサーベイから予測すると主に5つの方向性があるのではないかなと考えています。
<玉ねぎみたいな分類方法→コアから拡張してく>
以下の5段階の分類は、玉ねぎの皮を剥いてくイメージで分類しました。1が中心(コア)にあたります、そこから5の外郭に向かって変化していきます。ここでいう、1と5の関係性は、ただの内包、外包というシンプルな関係性ではなく、1の進化により、構造自体が変化することも考えられます。

  1. LLM自体の性能改善をする(学習方法とかモデルのアーキテクチャ)

  2. LLMの性能をプロンプトで向上させる方法

  3. LLMをLLMで制御してなるべく人間がプロセスに関わることの無くする方法 (LLMをコンポーネントとしたアルゴリズムを構築する方法)

  4. LLMアプリケーション(サービス)

  5. LLMの倫理・哲学・世界観・思想・ビジョンを議論を展開する方向

上記の5つに主に方向性が分けられるのではないかと考えています。
特に、LLMの精度を高める手法に関しては今回のサーベイでも注目していた点であり、尚且つ活用可能範囲が広域のため、多角的な視点から議論が展開されていくのではないかと思っています。一つ前に共有したツイートにもあるように、LLMがバグっているシステムであると定義するならば尚更これらの研究は必要不可欠であり、今後もさまざまなアイディアが創出されると考えています。現在のあるLLMが向上し、正確にタスクをこなすことができるようになりはじめて、LLMのみでLLMを運用・管理するというレベルに突入してくるのではないかと考えています。もちろん、バグのある状態(正確性があまり高くない状態)でも活用し、LLMのみでコンピュータを操作したりすることは可能であり、実装されている環境もありますが、それ以上に高いレベルの制御となると「正確性・信頼性」というものが鍵となってくると思います。
また、人間がユーザーであるという点において、サービスやアプリケーション研究の重要性も高まってくるでしょう。そのため、それらに付随する研究が行われることはもちろんのこと、生成AI時代のUXとして新たな概念が提案される、もしくは現在のデザイン設計を覆す日がやってくることもそう遠くはないかもしれません。
最後に、倫理的な観点についてです。正直、僕はこのカテゴリについて一番興味を抱いています。サムアルトマンが緊急解雇された時に『倫理観』/ 『進化か』での対立のようなものが起きました。個人的な意見として、人間の倫理観は、急変するものでなく且つ組織の中では多数決の原理(最大公約数)のような形で、全体指針として決断されていくことが多くなるでしょう。それは何を意味するかというと、組織(小さな組織から巨大な組織まで)の倫理観はある程度固定されたものであり、変化をもたらすことは非常に難題であるということです。今は組織のサイズ感を会社として捉えてきましたが、国家・宗教などより巨大なコミュニティにおいては難しさをますでしょう。サムアルトマンの目指すAIがある程度の仕事をしてベーシックインカムで生きていくということは、世界的な価値観・倫理観の定義を根本的に覆す必要があるといえるでしょう。だからこそ、生成AI・LLMが社会で活用される時代において、倫理学や哲学はより重要な意味を成し、思考のフレームワークをビジネスとして活用できる日もそう遠くないかもしれないと考えています。
この度は、この文章を読むためにお時間を投資していただき心から感謝申し上げます。

6. 参考文献

以下にこの記事で使用した参考文献と技術まとめリストを記します。気になって内容がありましたら是非、ご一読、ご実装ください!
(追って、サーベイで使用したスプレッドシートを共有します!)


この記事が気に入ったらサポートをしてみませんか?