HuggingFace Transformers 4.29 : Tutorials : Transformers エージェント

HuggingFace Transformers 4.29 : Tutorials : Transformers エージェント (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/03/2023 (v4.29.1)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Transformers 4.29 : Tutorials : Transformers エージェント

Transformers Agent は実験的 API で、いつでも変更される可能性があります。エージェントにより返される結果は変化する可能性があります、API や基礎的なモデルが変更されがちであるためです。

Transformers version v4.29.0 はツールとエージェントのコンセプトに基づいています。この colab で遊ぶことができます。

手短に言えば、それは transformers の上に自然言語 API を提供しています : 私たちは収集されたツールのセットを定義して、自然言語を解釈してこれらのツールを使用するためにエージェントを設計します。それは設計上拡張可能です ; 私たちは幾つかの関連ツールを集めましたが、コミュニティにより開発された任意のツールを使用するためにシステムが簡単に拡張できる方法を示します。

この新しい API で何が実現できるかの幾つかのサンプルから始めましょう。マルチモーダル・タスクのときにそれは特に強力ですので、画像を生成したりテキストを大きな声で読み上がるためにそれを少し試してみましょう。

agent.run("Caption the following image", image=image)
Input Output
A beaver is swimming in the water
agent.run("Read the following text out loud", text=text)
Input Output
A beaver is swimming in the water
agent.run(
    "In the following `document`, where will the TRRF Scientific Advisory Council Meeting take place?",
    document=document,
)
Input Output
ballroom foyer

 

クイックスタート

agent.run を使用できるようになる前に、agent をインスタンス化する必要があります、これは大規模言語モデル (LLM) です。openAI モデルに加えてオープンソースの代替 BigCode と OpenAssistant のサポートも提供しています。openAI モデルがより良く遂行します (しかし openAI キーを持っていることを要求しますので、無料では利用できません) ; Hugging Face は BigCode と OpenAssistant モデル用のエンドポイントへのフリーアクセスを提供しています。

最初に、すべてのデフォルトの依存関係をインストールするために agents の extra をインストールしてください。

pip install transformers[agents]

openAI モデルを使用するには、openai の依存関係をインストールした後で OpenAiAgent をインスタンス化します :

pip install openai
from transformers import OpenAiAgent

agent = OpenAiAgent(model="text-davinci-003", api_key="")

BigCode や OpenAssistant を使用するには、Inference API にアクセスするためにログインから始めます :

from huggingface_hub import login

login("<YOUR_TOKEN>")

それからエージェントをインスタンス化します :

from transformers import HfAgent

# Starcoder
agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")
# StarcoderBase
# agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoderbase")
# OpenAssistant
# agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")

これは今のところ Hugging Face が無料で提供している推論 API を使用しています。このモデル (or 別のもの) に対する独自の推論エンドポイントを持つ場合、上記の URL を貴方の URL エンドポイントと置き換えることができます。

StarCoder と OpenAssistant は無料で使用できて単純なタスクで非常に上手く動作します。けれども、より複雑なプロンプトを処理するときチェックポイントは耐えられません (don’t hold up)。そのような問題に直面している場合、OpenAI モデルを試すことを勧めます、これは (残念なことにオープンソースではありませんが、) 現時点ではより良く動作します。

You’re now good to go! 自由に使える 2 つの API に深入りしましょう。

 

単一の実行 (run)

単一の実行メソッドはエージェントの run() メソッドを使用するときです :

agent.run("Draw me a picture of rivers and lakes.")

それは遂行を希望するタスクに適したツール (群) を自動的に選択して、それらを適切に実行します。それは同じ指示で一つまたは複数のタスクを実行できます (指示が複雑になれば、エージェントが失敗しがちになりますが)。

agent.run("Draw me a picture of the sea then transform the picture to add an island")

すべての run() 演算は独立ですので、異なるタスクで何度もそれを続けて実行することができます。

エージェントは単なる大規模言語モデルですので、プロンプトの小さなバリエーションが完全に異なる結果を生成するかもしれないことに注意してください。実行したいタスクをできる限り明確に說明することが重要です。良いプロンプトを書く方法の詳細については こちら です。

実行間で状態を保持したり、エージェントに非テキストオブジェクトを渡したい場合には、エージェントに使用して欲しい変数を指定することでそれを行うことができます。例えば、以下のように行うことで、川と湖の最初の画像を生成して、島を追加するようにその画像を更新することをモデルに要求することができるでしょう :

picture = agent.run("Generate a picture of rivers and lakes.")
updated_picture = agent.run("Transform the image in `picture` to add an island to it.", picture=picture)

 

これは、モデルがリクエストを理解できずにツールをミックスするときに有用である可能性があります。例として :

agent.run("Draw me the picture of a capybara swimming in the sea")

ここで、モデルは 2 つの方法で解釈できるでしょう :

  • テキスト-to-画像変換に海で泳ぐカピバラを生成させる。
  • あるいは、テキスト-to-画像変換にカピバラを生成させてから、それを海で泳がせるために画像変換ツールを使用します。

最初のシナリオを強制したい場合には、引数としてプロンプトを渡すことでそれを行うことができるでしょう :

agent.run("Draw me a picture of the `prompt`", prompt="a capybara swimming in the sea")

 

チャットベースの実行 (chat)

エージェントはまたチャットベースのアプローチも持ちます、chat() メソッドを使用します :

agent.chat("Generate a picture of rivers and lakes")

agent.chat("Generate a picture of rivers and lakes")

これは指示間で状態を保持したいとき興味深いアプローチです。それは実験に対しては良いですが、複雑な指示よりも単一の指示のほうが遙かに良い傾向にあるでしょう (それは run() メソッドが処理に優れています)。

このメソッドは、非テキスト型や特定のプロンプトを渡したい場合に引数を取ることもできます。

 

⚠️ リモート実行

デモ目的で、そしてこれがすべてのセットアップで利用できるように、エージェントがアクセスできる幾つかのデフォルトツールのためにリモート executor を作成しました。これらは 推論エンドポイント を使用して作成されます。貴方自身でリモート executor をセットアップする方法を見るには、カスタムツールガイド を読むことを勧めます。

リモートツールで実行するには、run() or chat() のいずれかで remote=True を指定するば十分です。

例えば、以下のコマンドは大きな RAM や GPU を必要とすることなく任意のデバイス上で効率的に実行できるでしょう :

agent.run("Draw me a picture of rivers and lakes", remote=True)

The same can be said for chat():

agent.chat("Draw me a picture of rivers and lakes", remote=True)

 

What’s happening here? What are tools, and what are agents?

 
エージェント

「エージェント」はここでは大規模言語モデルで、それがツールの特定のセットにアクセスできるようにそれにプロンプトを与えています。

LLM は小さいサンプルコードの生成に非常に優れていて、この API は LLM がツールのセットでタスクを実行する小さいサンプルコードを出力するようにプロンプトを与えることによりそれを活用しています。そしてこのプロンプトは貴方がエージェントに与えたタスクとそれに与えたツールの說明により完成されます。このようにしてそれは使用しているツールの doc、特に想定される入力と出力へのアクセスを得て、そして関連コードを生成できます。

 
ツール

ツールは非常に単純です : それらは名前と說明を持つ単一の関数です。そしてエージェントにプロンプトを与えるためにこれらのツールの說明を使用します。プロンプトを通して、クエリー内でリクエストされたものを実行するためにツールを活用する方法をエージェントに示します。

これはパイプラインではなく、まったく新しいツールを使用しています、何故ならばエージェントは非常にアトミックなツールでより良いコードを書くからです。パイプラインはよりリファクタリングされて幾つかのタスクを一つに組み合わせていることが多いです。ツールは一つの非常に単純なタスクのみにフォーカスすることを意図しています。

 

コード実行 ?!

そしてこのコードは小さい Python インタープリターによりツールと一緒に渡された入力のセット上で実行されます。後ろで貴方が “Arbitrary コード実行!” と叫ぶのが聞こえますが、何故がそうではないかを說明しましょう。

呼び出せる関数は貴方が提供したツールと print 関数だけですので、実行されるものは既に限定されています。Hugging Face ツールに限定されている場合、貴方は安全であるはずです。

それから、どのような属性検索やインポートも許可しませんので (それらは入力/出力を関数の小さいセットに渡すためにどのような方法でも必要ではないはずです)、殆どの明白な攻撃はすべて問題ではないはずです (いずれにせよ LLM に出力させるためにプロンプトを与える必要はあります)。もし貴方が非常に安全な側にいたいのであれば、追加引数 return_code=True とともに run() メソッドを実行できます、その場合にはエージェントは実行するコードを単に返しますのでそれを行うか否かを決定することができます。

不正な演算を実行しようとしたり、エージェントにより生成されたコードを使用して通常の Python エラーがある場合に、実行はその行で停止します。

 

ツールの収集されたセット

私たちはそのようなエージェントをパワーアップするツールのセットを確認します。ここに transformers に統合したツールの更新リストがあります :

  • ドキュメント質問応答 : (PDF のような) 画像形式のドキュメントが与えられたとき、このドキュメントについて質問に答えます (Donut)

  • テキスト質問応答 : 長いテキストと質問が与えられたとき、テキストの質問に答える ( Flan-T5 )

  • 条件なし画像キャプショニング : 画像にキャプションを付けます! ( BLIP )

  • 画像質問応答 : 画像が与えられたとき、この画像について質問に答える ( VILT )

  • 画像セグメンテーション : 画像とプロンプトが与えられたとき、プロンプトのセグメンテーションマスクを出力する ( CLIPSeg )

  • 発話-to-テキスト変換 : 人の話の音声記録が与えられたとき、発話をテキストに文字起こしする ( Whisper )

  • テキスト-to-発話変換 : テキストを発話に変換する ( SpeechT5 )

  • ゼロショット・テキスト分類 : テキストとラベルのリストが与えられたとき、そのテキストがどのラベルに最も対応するかを特定する ( BART )

  • テキスト要約 : 長いテキストを一つか数行のセンテンスに要約する ( BART )

  • 翻訳 : テキストを与えられた言語に翻訳する ( NLLB )

これらのツールは transformers に統合しています、そして手動でも使用できます、例えば :

from transformers import load_tool

tool = load_tool("text-to-speech")
audio = tool("This is a text to speech tool")

 

カスタムツール

私たちがツールの収集セットを特定する一方で、この実装により提供される主要な価値はカスタムツールを素早く作成して共有する能力っであると確信しています。

ツールのコードを Hugging Face Space やモデルレポジトリにプッシュすることにより、エージェントによりツールを直接活用することができるようになります。私たちは幾つかの transformers 不可知なツールを huggingface-tools organization に追加しました :

  • テキスト downloader : web URL からテキストをダウンロードする。
  • テキスト-to-画像変換 : stable diffusion を利用して、プロンプトに従って画像を生成する。
  • 画像変換 : instruct pix2pix stable diffusion を利用して、初期画像とプロンプトが与えられたとき画像を変更する。
  • テキスト-to-動画変換 : damo-vilab を利用して、プロンプトに従って小さい動画を生成する。

最初から使用してきたテキスト-to-画像変換ツールは huggingface-tools/text-to-image にあるリモートツールです!この実装を更にスーパーチャージするためにこれと他の organizations でそのようなツールを公開し続けます。

エージェントはデフォルトで huggingface-tools に存在するツールへのアクセスを持ちます。以下のガイド で貴方のツールを書いて共有できる方法と Hub にあるカスタムツールを利用する方法を說明しています。

 

コード生成

ここまでアクションを実行するためにエージェントを利用する方法を示してきました。けれども、エージェントはコードを生成するだけで、それから非常に制限された Python インタープリターを使用してそれを実行します。別の設定で生成されたコードを使用したい場合には、エージェントはツール定義と正確なインポートとともに、コードを返すようにプロンプトを与えることができます。

例えば、次の指示は :

agent.run("Draw me a picture of rivers and lakes", return_code=True)

以下のコードを返します :

from transformers import load_tool

image_generator = load_tool("huggingface-tools/text-to-image")

image = image_generator(prompt="rivers and lakes")

that you can then modify and execute yourself.

 

以上