こんにちは、スクーティー代表のかけやと申します。
弊社は生成AIを強みとするベトナムオフショア開発・ラボ型開発や、生成AIコンサルティングなどのサービスを提供しており、最近はありがたいことに生成AIと連携したシステム開発のご依頼を数多く頂いています。 Reflexionという手法が注目されています。LLMの出力の精度を上げる有効な手法のようです。 簡単に言うとLLMの出力を別のLLMが評価し、その評価結果を元に改善点をLLMが言語化し、その改善点に従って生成したコンテンツを修正するというものです。 Reflexionは仕組みとしてはシンプルなので、Difyのワークフローで再現し、出力を検証してみました! Reflexionとは
Reflexionは、従来の強化学習(RL)とは異なり、エージェントの重みやパラメータを調整するのではなく、言語によるフィードバックを用いて自己改善を行う新しい学習フレームワークです。
具体的には、エージェントがタスクを実行する際に得られるフィードバック(成功・失敗など)を言語的に反映し、その内容をメモリに保存します。これにより、次回以降の試行でより良い意思決定が可能になります。この仕組みは、人間が失敗から学んで行動を改善するプロセスに類似しています。 論文はこちらです。 技術的な仕組み
Reflexionは、主に3つのモデルを組み合わせて実現されます。
Actorモデル: これはエージェントとして動作する言語モデル(LLM)であり、タスクを実行します。エージェントは、環境からの状態(観測結果)に基づいて、テキストやアクションを生成します。例えば、コードの生成や、ゲーム内での行動選択などが含まれます。このモデルは従来のRLと同様に、ポリシー(πθ)に基づいて行動選択を行います。 Evaluatorモデル: Actorが生成した結果(コードや行動など)を評価します。この評価は、例えば、プログラミングタスクであれば、生成されたコードが正しく動作するかどうかをテストします。これにより、エージェントの行動に対する報酬(成功/失敗)が与えられます。 Self-Reflectionモデル: このモデルがReflexionの中心となる部分で、フィードバックをもとにエージェントが次の行動に向けた改善点を文章化します。例えば、「前回の試行ではコードが正しく動作しなかったが、その原因は関数の入力を誤って処理していたためである」といった具体的な反省文を生成し、それを次回の試行時の参考としてメモリに保存します。これにより、エージェントは自分自身の失敗や成功を理解し、それに基づいて自己改善を行うことが可能です。 実現方法
エージェントの学習ループ: Reflexionは、タスクが成功するまで複数の試行を行い、その都度フィードバックを反映します。例えば、コード生成タスクでは、エージェントはまず関数を生成し、その後Evaluatorがその関数を評価します。評価結果に基づき、Self-Reflectionモデルがフィードバックを生成し、エージェントが次回の試行で行動を改善します。このループは、エージェントが正しい解を見つけるまで繰り返されます。
短期・長期メモリの使用: Reflexionでは、エージェントが「短期メモリ」と「長期メモリ」の2つのメモリを利用します。短期メモリには直近の試行のフィードバックが保存され、長期メモリにはエージェントの全体的な学習履歴が蓄積されます。これにより、エージェントは過去の試行結果に基づいてより洗練された行動選択ができるようになります。 フィードバックの言語化: Reflexionの特長は、数値的な報酬ではなく、自然言語でのフィードバックを用いる点です。エージェントが行った具体的なミスや改善すべき点を自然言語で記録するため、より柔軟で具体的な自己改善が可能となります。これにより、単なる「成功/失敗」といった二値の評価だけでなく、詳細な行動修正が可能です。 DifyでReflexionを再現するDifyとは
Difyを使えばプログラムを書かずに簡単にフィードバックの仕組みを作れるため、DifyでReflexionっぽいものを再現し、動作を見てみようと思います。
Difyについては以下の記事をご覧ください!
Difyの環境構築方法やバージョンアップ方法は本家のレポジトリを参照することをおすすめします。特にバージョンアップ方法はバージョンごとに微妙に方法が変わってきているため、最新版を確認する必要があります。 本記事の検証は、MacOSのローカルPC上に、Dify v0.7.3で検証しましたが、特にこのバージョンでないと使用できない機能を使用しているわけではありません。 Reflexionを検証するワークフローを作成する
今回Dify上に作成したワークフローは以下のようなものです。あまり特別なことはしておらず、上記のActor(コンテンツ生成)、Evaluator(生成されたコンテンツを評価)、Self-reflection(評価に基づいて改善点を言語化する)に相当するステップをLLMで作成し、それらを数珠つなぎにして3セット作成しました。
本来は、Evaluatorで評価した結果、〇〇の項目が△△点以上になるまで生成→評価→改善点を言語化という処理のセットを繰り返すのが望ましいですが、DifyではプログラムのWhile構文のようなものが作れないため、今回はとりあえず3回繰り返すという風にしています。
やってることはわかるけど、ワークフロー作るの面倒そう、、、という方、Difyの構築、初期設定、Agentやワークフロー構築、運用保守などをまるっとお任せいただけますので、ぜひお気軽にご連絡ください!
今回の検証は、あるキーワードに関連する小噺をLLMに作成させ、通常のLLMの出力と、Reflexionの場合とで出力がどのように変わるかを比較しました。
ポイントだけ以下に詳細を記載します。 Step.1 質問を入力
ここではキーワードを入力し、タイプを選択するようにしています。
タイプと言うのは、LLM単体かReflexionかを選択するものです。検証しやすいようにしただけのもので、特に重要なものではありません。 Step.2 条件分岐
Step.1で入力されたタイプによって、LLM単体の処理にするか、Reflexionの処理にするかを分岐しています。
Step.3-a Actorの処理(初回のコンテンツ生成)
ここで入力しているプロンプトは上記のスクリーンショットのとおりですが、キーワードをテーマにした小噺をオチを付けて作成してもらっているだけです。モデルは速く処理を終わらせられるようにGPT-4o miniにしています。
Step.4 Evaluatorの処理(生成したコンテンツの評価)
Step.3-aで出力された小噺バージョン1をこのStepの入力にし、その小噺をある評価基準に基づいて10段階評価で評価してもらい、フィードバックをしてもらうようなプロンプトを実行しています。
Step.5 Self-reflectionの処理(評価を元に改善点を言語化)
Step.3-aで生成された小噺と、Step.4で生成された評価結果を入力にし、小噺をどのように修正すべきかを出力してもらいます。
Step.6 Actor(改善点に従ってコンテンツを修正)
Step.3-aで生成した小噺と、Step.5で出力した改善点を入力にし、小噺を改善点に従って改善してもらいます。
以降は、Evaluator→Self-reflection→Actorの繰り返しです。この一連の流れを3回繰り返した後にワークフローの出力とします。 Step.3-b Actorの処理(初回のコンテンツ生成)
ここはLLM単体での処理の場合のActor部になりますが、Step.3-aと全く同じ処理です。ただし、このStepの処理をそのままワークフローの出力とします。
設定方法はわかったけど、これを業務に活用できる場面がよくわからないし、設定が面倒そう、、、と感じましたか?確かに、実際私が上記の設定をする際も色々動作確認しながらだったので、結構たいへんでした。。。
もし、Difyの環境構築、設定、諸々まるっと任せてしまいたいというご要望ございましたら、お気軽にご連絡ください! LLM単体とReflexionの出力を比較する
上記に説明した通りの処理を実行し、LLM単体の場合とReflexionの場合で、生成された小噺がどのように変わるかを比較しました。
処理時間に関して
当然ですが、処理時間はReflexionのほうが長くかかります。
上記のスクリーンショットに表示されていますが、GPT-4o miniの場合、1ステップあたりだいたい10秒程度かかっており、全部で2分弱かかりました。 1回検証する目的であればこの長さはさほど気になりませんが、繰り返しやる業務にReflexionを使用するのであれば、もっと処理速度は速いほうがいいでしょう。 そのために私はGroq(Llama3.1)を使用してみたのですが、何度実行してもRate limitに引っ掛かり(恐らく1分あたりのトークン数)最後まで実行を完了することができませんでした。 GroqのRate limitを拡大するには、APIのプランをDeveloperプランなるものにすれば良さそうなのですが、Developerプランは「Coming soon」になっていて使えませんでした。 仕方なく今回はGPT-4o miniでやってしまいました。 結果の比較
私の経験上、GPT-4oはお笑いのセンスがないので、我ながらなぜ小噺というテーマを選んでしまったのか謎なのですが、今回もこのテーマのせいで微妙な結果になりました。
▼Reflexionの結果
ある日、友人の太郎と次郎が公園のベンチでおしゃべりをしていた。 ある日のこと、友人のタケシとサトシが公園のベンチに座り、昼下がりの陽射しを浴びながら話をしていた。
ちなみにキーワードは「ツンデレの猫」で、Evaluatorでの評価項目は下記です。
さて、小噺の出来栄えの比較なのですが、、、Reflexionのほうが若干いいんですかね・・・? まず、両者とも長すぎ(800〜1000文字で指定したのに1500文字くらいある)、オチがなく、笑いどころがさっぱりわかりません。 しかし、後者はただ2人の会話が繰り返されるだけの、これ以上ない退屈な文章ですが、前者(Reflexion)のほうは、ほのかなストーリーめいたものと、オチを作ろうとした形跡のようなものが見て取れます(まさか、猫が喋ったというオチではないと思います)。 ・・・というかなり苦しい理由でReflexionのほうが出力の精度はいいと感じますが、もう少しちゃんと評価項目を選んだり、フィードバックのやり方を工夫すれば、LLMの出力の精度を上げられそうな体感は得られました。 生成AIを使用したシステム開発のご要望はこちらから
最後までお読みいただき、ありがとうございます!
弊社では、LLM(大規模言語モデル)やアーキテクチャの選定、技術検証、生成AIを使用したプロトタイピングやシステム開発、お客様社内での啓蒙活動等を対応させていただく「生成AIコンサルティング」サービスを提供しています。 また、業務利用できるChatGPTのような仕組みである「セキュアGAI」も提供しています。 もちろん、Difyの構築のお手伝いも可能です。 もし本記事で生成AIに興味が湧き、生成AIとのシステム連携などのニーズがございましたら、ぜひ下記フォームからお気軽にお問い合わせください! その他の生成AI関連サービス
|
ベトナムオフショア開発/ラボ型開発
生成AIコンサルティングサービス
安全な環境でChatGPT「セキュアGAI for enterprise」
AIが接客「バーチャルアシスタント」
オフショア開発や生成AIに関する資料はこちらから無料でDLいただけます
アーカイブ
10月 2024
カテゴリー
すべて
最新記事の購読 |
リンクプロダクトブログ株式会社スクーティー生成AIに強みを持つベトナムのオフショア開発サービスを提供しています。優秀なベトナム人エンジニアでチームを組み、安価で高速な開発体制を作りましょう。
|
9/13/2024