AIエージェントを実装するには? 6 枚の写真 4090 Magic Llama2: タスクを分割して 1 つのコマンドで関数を呼び出す

AIエージェントを実装するには? 6 枚の写真 4090 Magic Llama2: タスクを分割して 1 つのコマンドで関数を呼び出す

AIエージェントは今話題になっています。OpenAIの応用研究ディレクターであるLilian Weng氏が書いた10,000語の記事[1]では、エージェント = LLM + メモリ + 計画スキル + ツールの使用が提案されています。


図1 LLMを利用した自律エージェントシステムの概要

簡単に言えば、エージェントは LLM の強力な言語理解機能と論理的推論機能を使用して、人間がタスクを完了するのに役立つツールを呼び出します。ただし、課題もいくつかあります。たとえば、基本モデルの能力によって、ツールを呼び出すエージェントの効率が決まりますが、基本モデル自体には、大規模なモデルの幻覚などの問題があります。

この記事では、「コマンドを入力して複雑なタスク分割と関数呼び出しを自動的に実現する」というシナリオを例に、基本的なエージェントプロセスを構築し、「基本モデルの選択」と「プロンプトの設計」を通じて「タスク分割」と「関数呼び出し」のモジュールを正常に構築する方法を説明することに重点を置いています。

プロジェクトアドレス:

https://sota.jiqizhixin.com/project/smart_agent

GitHub リポジトリ:

https://github.com/zzlgreat/smart_agent

タスク分割と関数呼び出しエージェントプロセス

「コマンドを入力すると、複雑なタスクが自動的に分割され、関数が呼び出される」ことを実現するために、プロジェクトで構築されたエージェント プロセスは次のとおりです。

  • プランナー:ユーザーが入力した指示に従ってタスクを分割します。所有しているツールキットを決定し、ビッグ モデル プランナーに所有しているツールと完了する必要があるタスクを伝えると、プランナーはタスクをプラン 1、2、3 などに分割します。
  • ディストリビューター:計画を実行するために適切なツールを選択する責任を負います。関数呼び出しモデルでは、さまざまな計画に応じて対応するツールを選択する必要があります。
  • ワーカー: ツールボックス内のタスクを呼び出し、タスク呼び出しの結果を返す役割を担います。
  • ソルバー: ソートされた配布計画と対応する結果が長いストーリーに結合され、ソルバーによって要約されます。

図 1. ReWOO: 効率的な拡張言語モデルのための推論と観察の分離

上記のプロセスを実装するために、プロジェクトでは、「タスク分割」モジュールと「関数呼び出し」モジュールにそれぞれ 2 つの微調整モデルを設計し、複雑なタスクを分割し、オンデマンドでカスタム関数を呼び出す機能を実現しました。帰納的要約モデルのソルバーは、分割タスク モデルと同じにすることができます。

タスク分割と関数呼び出しモデルを微調整する

2.1 微調整の経験のまとめ

「タスク分割」モジュールでは、大規模なモデルに複雑なタスクを単純なタスクに分解する機能が必要です。 「タスク分割」の成功は、主に次の 2 つの点に依存します。

  • ベースモデルの選択:複雑なタスクを分割するには、微調整用に選択されたベースモデル自体に優れた理解力と一般化能力、つまりプロンプトの指示に従ってトレーニング セットに表示されないタスクを分割する能力が必要です。現時点では、高いパラメータを持つ大規模なモデルを選択することで、これを実行するのが簡単になります。
  • プロンプト設計: プロンプトはモデルの思考チェーンを正常に呼び出し、タスクをサブタスクに分割できますか?

同時に、与えられたプロンプト テンプレートの下でのタスク分割モデルの出力形式は、可能な限り比較的固定されることを期待しますが、過剰適合してモデルの本来の推論機能と一般化機能を失わないようにする必要があります。ここでは、lora を使用して qv レイヤーを微調整し、元のモデルへの構造的変更を可能な限り小さくします。

「関数呼び出し」モジュールでは、大規模なモデルは、処理タスクの要件を満たすためにツールを安定して呼び出す機能を備えている必要があります。

  • 損失関数の調整:選択した基本モデルの一般化能力とプロンプト設計に加えて、モデルの出力をできるだけ固定化し、出力に基づいて必要な関数を安定的に呼び出すために、「プロンプト損失マスク」法[2]をQloraトレーニングに使用しました(詳細は下記を参照)。また、Qloraの微調整でEOSトークンを挿入するというトリックを使用して、アテンションマスクを変更することでモデルの出力を安定させました。

さらに、計算能力の使用量の観点から、lora/qlora ファインチューニングは、低い計算能力の条件下での大規模言語モデルのファインチューニングと推論を実現するために使用され、定量的展開は推論のしきい値をさらに下げるために使用されます。

2.2 基本的なモデルの選択

「タスク分割」モデルを選択する際には、そのモデルが強力な一般化能力と一定の思考連鎖能力の両方を備えていることを期待します。 HuggingFace の Open LLM リーダーボードを参照してモデルを選択し、テキスト モデルのマルチタスク精度を測定するテスト MMLU と総合スコアの平均に重点を置くことができます。

図 2 HuggingFace Open LLM リーダーボード (0921)


このプロジェクトに選択されたタスク分割モデルは次のとおりです。

  • AIDC-ai-business/Marcoroni-70B: このモデルは Llama2 70B に基づいて微調整されており、分割タスクを担当します。 HuggingFaceのOpen LLMリーダーボードによると、このモデルのMMLUと平均は比較的高いです。また、このモデルのトレーニングプロセス中に大量のOrcaスタイルのデータが追加され、複数ラウンドの会話に適しています。計画-配布-作業-計画-作業...要約プロセスでパフォーマンスが向上します。

「関数呼び出し」モデルの選択に関しては、メタオープンソースLlama2コードプログラミングモデルCodeLlamaの元のトレーニングデータには大量のコードデータが含まれているため、カスタムスクリプトのQloraを微調整してみることができます。関数呼び出しモデルには、CodeLlama モデル (34b/13b/7b) をベースとして選択します。

このプロジェクトに選択された関数呼び出しモデルは次のとおりです。

  • Codellama 34b/7b: 関数呼び出しを担当するモデル。このモデルは、関数を説明する大量の自然言語を含む大量のコード データを使用してトレーニングされます。特定の関数を説明する優れたゼロ ショット機能を備えています。

「関数呼び出し」モデルを微調整するために、プロジェクトではプロンプト損失マスクを使用して QLORA トレーニングを実行し、モデル出力を安定させます。損失関数は次のように調整されます。

  • 損失マスク (loss_mask):
  1. loss_mask は、入力シーケンス input_ids と同じ形状のテンソルです。各要素は 0 または 1 のいずれかで、1 は対応する位置のラベルを損失計算で考慮することを示し、0 は考慮しないことを示します。
  2. たとえば、ラベルの一部がパディングされている場合 (通常はバッチ内のシーケンスの長さが異なるため)、損失の計算ではこれらのパディングされたラベルを考慮しません。この場合、 loss_mask はこれらの位置に 0 を提供し、これらの位置での損失をマスクします。
  • 損失計算:
  1. まず、CrossEntropyLoss を使用してマスクされていない損失を計算します。
    reductinotallow='none' を設定すると、合計や平均ではなく、シーケンス内の各位置に対して単一の損失値が返されるようになります。
  2. 次に、 loss_mask を使用して損失をマスクします。 loss_mask と loss を掛け合わせると、 masked_loss が得られます。このように、loss_mask が 0 の位置は、masked_loss でも損失値が 0 になります。
  • 損失の集計:
  1. すべての masked_loss を合計し、loss_mask.sum() で正規化します。これにより、1 にマスクされたラベルの損失のみが考慮されるようになります。ゼロ除算を防ぐには、非常に小さな数 1e-9 を追加します。
  2. loss_mask のすべての値が 0 の場合 (つまり loss_mask.sum() == 0)、損失値 0 が直接返されます。

2.3 ハードウェア要件:

  • Marcoroni-70Bの16ビットローラの場合は6*4090
  • codellama 34b の qlora の場合は 2*4090 / codellama 13/7b の qlora の場合は 1*4090

2.4 プロンプト形式の設計

タスク分割には、大規模言語モデルの効率的な推論のためのフレームワークであるReWOO(Reasoning WithOut Observation)[2]のプランナーによって設計されたプロンプト形式を採用しました。ここでは、「Wikipedia[input]」などの関数を関数と説明に置き換えるだけです。プロンプトの例は次のとおりです。

 For the following tasks, make plans that can solve the problem step-by-step. For each plan, indicate which external tool together with tool input to retrieve evidence. You can store the evidence into a variable #E that can be called by later tools. (Plan, #E1, Plan, #E2, Plan, ...) Tools can be one of the following: Wikipedia[input]: Worker that search for similar page contents from Wikipedia. Useful when you need to get holistic knowledge about people, places, companies, historical events, or other subjects. The response are long and might contain some irrelevant information. Input should be a search query. LLM[input]: A pretrained LLM like yourself. Useful when you need to act with general world knowledge and common sense. Prioritize it when you are confident in solving the problem yourself. Input can be any instruction.

関数呼び出しについては、Qloraの微調整は後で行われるため、huggingface [3]のオープンソース関数呼び出しデータセットのプロンプトスタイルをそのまま採用します。以下を参照してください。

指示データセットの準備

3.1 データソース

  • 解体ミッションモデル: Marcoroni-70B はアルパカプロンプトテンプレートを使用します。モデルは Llama2 70B で微調整されています。元のモデルのテンプレートに合わせるには、アルパカ形式のデータセットが必要です。ここでは rewoo のプランナー データセット形式を使用しますが、元のデータセットには wiki と独自のものを呼び出すオプションしかないため、このテンプレートを適用し、gpt4 のインターフェースを使用してこのスタイルのデータセットを作成できます。
  • 関数呼び出しモデル: 使用される HuggingFace オープンソース関数呼び出しデータセットはサイズが小さい (55 行) ですが、qlora は非常に効果的で、コード トレーニング テンプレートが付属しています。

3.2 データセットの形式

  • タスク分割モデルのデータ形式: alpaca
 ### Instruction: <prompt> (without the <>) ### Response:如: ### Instruction: For the following tasks, make plans that can solve the problem step-by-step. For each plan, indicate which external tool together with tool input to retrieve evidence. You can store the evidence into a variable #E that can be called by later tools. (Plan, #E1, Plan, #E2, Plan, ...) Tools can be one of the following:get_current_time[input]: Get the current time for now. search_bing[input]: Search the web for content on Bing, and return the top 10 results. Remember, the results may not as good as Wikipedia. If you think the result will not exist in wikipedia, use it. search_wiki[input]: Search the web for content on Wikipedia, and return the top 3 results. If you think the result can exist in wikipedia, use it. search_bilibili[input]: Search for videos on Bilibili, which is a website full of ACG. It can return top 10 search results. save_file[input]: save a file in the target dir which contains the data. query_mysql[input]: Execute the sql in the local mysql database. And return the result. What movies did the director of 'Oppenheim' direct? List the top 10 best. ### Response: Step 1: Identify the director of "Oppenheimer" movie. #E1 = search_wiki("Director of Oppenheimer") Step 2: Retrieve information about the director's other works. If the retrieved name exists in Wikipedia, proceed with searching their filmography using search_wiki. Otherwise, try searching through Bing or another source like IMDb. For example, if Christopher Nolan is found as the director of "Oppenheimer": #E2 = search_bing("Filmography of Christopher Nolan") Step 3: Extract the list of films directed by this person from the retrieved information. From the returned results, extract the titles of the top 10 best movies according to critics/audience ratings or personal preference.


  • 関数呼び出しモデルのデータ形式:

ここでは、Trelis データセットの形式を使用します。データセットは 55 行のみで、それほど大きくありません。構造は実際にはアルパカ形式です。これは、systemPrompt、userPrompt、assistantResponse に分かれており、それぞれアルパカの Instruction、prompt、Response に対応します。次に例を示します。

図3. オープンソースデータセットを呼び出すHuggingFace関数の例

微調整プロセスの説明

4.1 環境の微調整

Ubuntu 22.04 システム、cuda 11.8、Pytorch 2.0.1、LLaMA-Efficient-Tuning フレームワークを使用。ディープスピード 0.10.4

4.2 微調整の手順

1) Marcoroni-70BのLora微調整

  1. LLaMA-Efficient-Tuning フレームワークは、deepspeed 統合をサポートしています。トレーニングを開始する前に、accelerate config を入力して設定します。プロンプトに従って deepspeed zero stage 3 を選択します。lora の微調整用に合計 144G VRAM を備えたカードが 6 枚あるため、オフロード オプティマイザー ステートに none を選択できます。これにより、オプティマイザー ステートがメモリにアンロードされません。
  2. オフロード パラメータを CPU に設定して、パラメータ量をメモリにオフロードする必要があります。これにより、ピーク時のメモリ使用量が約 240G まで達する可能性があります。勾配累積値はトレーニング スクリプトと一致している必要があります。ここでは 4 が選択されています。勾配クリッピングは、エラー勾配ベクトルを正規化するために使用されます。これを 1 に設定すると、勾配爆発を防ぐことができます。
  3. zero.init は分割して半精度に変換できるため、モデルの初期化が高速化され、高パラメータ モデルを CPU メモリに完全に割り当てることができます。ここで「はい」を選択することもできます。

すべての選択が完了したら、次の内容の新しいトレーニング bash スクリプトを作成します。

 accelerate launch src/train_bash.py \ --stage sft \ --model_name_or_path your_model_path \ --do_train \ --dataset rewoo \ --template alpaca \ --finetuning_type lora \ --lora_target q_proj,v_proj \ --output_dir your_output_path \ --overwrite_cache \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 1000 \ --learning_rate 5e-6 \ --num_train_epochs 4.0 \ --plot_loss \ --flash_attn \ --bf16

このような設定では最大 240G のピーク メモリが必要になりますが、それでも 6 枚の 4090 カードをトレーニングに使用できるようになります。 deepspeed はモデルを初期化する必要があるため、最初は時間がかかる場合があります。そしてトレーニングが始まりました。

図4 6カード4090トレーニング帯域幅速度

合計時間は8時間56分でした。このトレーニングでは、マザーボード上の NVME スロットが OCULINK と PCIE4.0 x16 帯域幅を共有します。したがって、6 つのイメージのうち 2 つは PCIE4.0 X4 で実行されています。上の図から、RX と TX の両方が PCIE4.0 X4 の帯域幅速度のみであることがわかります。これは、今回のトレーニングにおける最大のコミュニケーションのボトルネックにもなりました。すべてのカードが PCIE 4.0 x16 で動作していれば、速度は現在よりもはるかに速くなります。

図5. LLaMA-Efficient-Tuningによって生成された損失曲線

上記は、LLaMA-Efficient-Tuning によって自動生成された損失曲線です。4 エポック後も収束効果が良好であることがわかります。

2) Codellama 向けの Qlora の微調整

トレーナー クラスは、上記のプロンプト損失マスク メソッドに従ってリファクタリングされました (プロジェクト コード リポジトリの func_caller_train.py を参照)。データセット自体が比較的小さい(55 行)ためです。したがって、4 エポックを実行するのに 2 分しかかからず、モデルはすぐに収束に達しました。

4.3 微調整後のテスト結果

プロジェクト リポジトリには、短い実用的なツールキットの例が提供されています。機能には以下が含まれます。

  1. Bing検索
  2. ウィキ検索
  3. ビリビリ検索
  4. 現在の時刻を取得する
  5. ファイルを保存する
  6. ...

現在、70B モデルと 34B モデルがあります。実際の使用では、6 つの 4090 を使用して、これら 2 つのモデルを同時に bf16 精度で実行することは現実的ではありません。ただし、量子化によってモデルのサイズを圧縮し、モデルの推論速度を向上させることができます。ここでは、高性能 LLM 推論ライブラリ exllamav2 を使用して、flash_attention 機能を使用してモデルを量子化および推論します。著者はプロジェクトページで独自の定量化方法を紹介していますが、この記事では詳しく説明しません。変換メカニズムによれば、70b モデルは 2.5 ビットに従って 22G のサイズに量子化できるため、グラフィック カードで簡単に読み込むことができます。

1) 試験方法

トレーニング セットに含まれていない複雑なタスクの説明が与えられた場合、トレーニング セットに含まれていない関数と対応する説明をツールキットに追加します。プランナーがタスクの分割を完了できれば、ディストリビューターは関数を呼び出すことができ、ソルバーはプロセス全体に基づいて結果を要約できます。

2) テスト結果

タスク分割: まず、図に示すように、text-generation-webui を使用して、タスク分割モデルの効果をすばやくテストします。

図6 タスク分割テストの結果

ここでは、エージェント テスト環境での呼び出しを容易にするためのシンプルな restful_api インターフェイスを記述できます (プロジェクト コード fllama_api.py を参照)。

関数呼び出し: プロジェクトには、シンプルなプランナー、ディストリビューター、ワーカー、ソルバーのロジックが記述されています。次に、このタスクをテストしてみましょう。コマンドを入力してください: 「Kill​​ers of the Flower Moon」の監督はどの映画を監督しましたか?そのうちの1つをリストし、bilibiliで検索します。

「bilibili を検索」機能は、プロジェクトの関数呼び出しトレーニング セットに含まれていません。同時に、このムービーはまだ公開されていない新しいムービーであり、モデル自体のトレーニングデータが含まれているかどうかは定かではありません。モデルが入力命令を非常にうまく分割していることがわかります。

  • 映画の監督をWikipediaで検索
  • 1 件の結果に基づき、Bing での映画「グッドフェローズ」の検索結果
  • bilibiliで映画「グッドフェローズ」を検索

同時に関数を呼び出すと、次の結果が得られました。クリック結果は Goodfellas で、映画の監督と一致しました。

要約する

このプロジェクトでは、「コマンドを入力して複雑なタスクを自動的に分割し、関数を呼び出す」というシナリオを例に、ツールキット-計画-分散-ワーカー-ソルバーという基本的なエージェントプロセスを設計し、1 つのステップでは完了できない主要な複雑なタスクを実行できるエージェントを実装します。基本モデルを選択し、Lora を微調整することで、低い計算能力の条件下でも大規模モデルの微調整と推論を完了できます。そして、推論の閾値をさらに下げるために定量的な展開アプローチを採用します。最後に、このパイプラインを通じて映画監督の他の作品を検索する例が実装され、基本的な複雑なタスクが完了しました。

制限事項: この記事では、検索と基本操作のツールキットに基づいて関数呼び出しとタスク分割のみを設計します。使用されるツールセットは非常にシンプルで、あまり設計されていません。フォールト トレランス メカニズムについてはあまり考慮されていません。このプロジェクトを通じて、RPA の適用を継続的に検討し、エージェント プロセスをさらに改善し、より高度なインテリジェント自動化を実現して、プロセスの管理性を向上させることもできます。

<<:  ChatGPT Plus の一部加入者は、他のユーザーを無料トライアルに招待できますが、招待できるのは 1 回のみです。

>>:  彼らはAIを使って時の塵を拭い去り、半世紀前のアジア競技大会で中国が初めて金メダルを獲得した時の記憶を再現した。

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

Sitechiは新たなブルーオーシャンを開拓し、中小企業市場に注力

Sitechi は、通信業界に特化したソフトウェア開発およびサービス プロバイダーです。業界で最も早...

海底撈のIPOは1000億元規模:将来、厨房に必要なのはエンジニア2人だけ

[[245580]] 2018年9月26日、海底撈国際ホールディングス株式会社(06862.HK)が...

1つのGPUで数千の環境と800万ステップのシミュレーションをわずか3秒で実行。スタンフォード大学が強力なゲームエンジンを開発

この段階では、AI エージェントは万能であるように見え、ゲームをプレイしたり、人間を模倣してさまざま...

大きな AI 問題の解決: AI 操作のエネルギー消費を削減するにはどうすればよいでしょうか?

現在、AI分野で画期的な進歩を遂げているディープラーニングモデルの規模が大きくなるほど、エネルギー消...

顔認識セキュリティの脆弱性が再び明らかに、19のAndroidスマートフォンは15分でロック解除可能、必要なのはプリンター、A4用紙、メガネフレームだけ

最新の顔認識の脆弱性が明らかになり、テストされたすべての Android スマートフォンが脆弱である...

3Dマップナビゲーションに頼らず、自動運転技術が新たな分野に進出

今日の自動運転車の技術は、ナビゲーションに極めて詳細な 3D マップに大きく依存していますが、そのほ...

...

Verdict、2020年第1四半期のTwitterにおけるIoTトレンドトップ5を発表

私たちは、企業や専門家が IoT についてどう考えているかを知りたいと思っていますが、一般の人々はど...

...

...

今回はホーキングの言うことを聞かなかった!人工知能が人間に取って代わる、これが科学が進む道だ

科学の分野では、人類の科学技術の発展のスピードは実に速く、人工知能と比較すると、すでに基本的に活用で...

AI が生活に統合されると、能力が高ければ高いほど、管理が難しくなります。

2019 年、OpenAI は、特定の「安全制約」に準拠した AI モデルを開発するためのツール ...

...

AIと自動化を活用して機密データを大規模に識別する方法

AIベースの機密情報検出サービスプロバイダーであるText IQのCEO、Apoorv Agarwa...

人工知能がサイバー防御を強化

ビッグデータと高性能コンピューティング リソースにアクセスすることで、企業は新しい人工知能ツールと機...