HuggingFace Transformers 4.29 : Notebook : Transformers can do anything

HuggingFace Transformers 4.29 : Notebook : Transformers can do anything (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/04/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 : Notebook : Transformers can do anything

Transformers バージョン v4.29 は新しい API : ツールとエージェントの API を導入します 🤩

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

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

添付のドキュメントは Transformers エージェントカスタムツール です。

 

セットアップ

#@title Setup
transformers_version = "v4.29.0" #@param ["main", "v4.29.0"] {allow-input: true}

print(f"Setting up everything with transformers version {transformers_version}")

!pip install huggingface_hub>=0.14.1 git+https://github.com/huggingface/transformers@$transformers_version -q diffusers accelerate datasets torch soundfile sentencepiece opencv-python openai

import IPython
import soundfile as sf

def play_audio(audio):
    sf.write("speech_converted.wav", audio.numpy(), samplerate=16000)
    return IPython.display.Audio("speech_converted.wav")

from huggingface_hub import notebook_login
notebook_login()

 

Do anything with Transformers

大規模言語モデルである (LLM)、エージェント をインスタンス化することから始めます。

ベストな結果のためには OpenAI の使用を勧めますが、StarCoder や OpenAssistant のような完全にオープンソースなモデルも利用可能です。

 

エージェントの初期化

#@title Agent init
agent_name = "OpenAI (API Key)" #@param ["StarCoder (HF Token)", "OpenAssistant (HF Token)", "OpenAI (API Key)"]

import getpass

if agent_name == "StarCoder (HF Token)":
    from transformers.tools import HfAgent
    agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder")
    print("StarCoder is initialized 💪")
elif agent_name == "OpenAssistant (HF Token)":
    from transformers.tools import HfAgent
    agent = HfAgent(url_endpoint="https://api-inference.huggingface.co/models/OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5")
    print("OpenAssistant is initialized 💪")
if agent_name == "OpenAI (API Key)":
    from transformers.tools import OpenAiAgent
    pswd = getpass.getpass('OpenAI API key:')
    agent = OpenAiAgent(model="text-davinci-003", api_key=pswd)
    print("OpenAI is initialized 💪")

 

エージェントの使用

エージェントは初期化されました!それがアクセスできるツールのフルパワーへのアクセスを持つようになりました。

Let’s use it 😎

boat = agent.run("Generate an image of a boat in the water")
boat
==Explanation from the agent==
I will use the following  tool: `image_generator` to generate an image according to the prompt.


==Code generated by the agent==
image = image_generator(prompt="A boat in the water")


==Result==

オブジェクト (or 前の結果!) をエージェントに渡したい場合には、変数を直接渡して渡される変数の名前をバッククォート間に記述する (バッククォートで囲む) ことでそれを行うことができます。例えば、私が前の boat 生成を再利用したい場合 :

caption = agent.run("Can you caption the `boat_image`?", boat_image=boat)
caption
==Explanation from the agent==
I will use the following  tool: `image_captioner` to generate a caption for the image.

==Code generated by the agent==
caption = image_captioner(boat_image)

==Result==
a boat floating in the ocean with a small island in the background

エージェントの能力は多様で、複数の指示を一度に処理する能力があります ; けれどもそれらの (OpenAI のもののような) 最も強力なものは以下の 3 部構成の指示のような複雑な指示を処理できることです :

audio = agent.run("Can you generate an image of a boat? Please read out loud the contents of the image afterwards")
play_audio(audio)

これが素晴らしく動作する点はクエリーが (貴方が直接には記述していない) ツールの使用を暗示している場合です。これの例は以下のクエリーです : “Read out loud the summary of hf.co”

ここではモデルに 3 つのステップを一度に実行するように要求しています :

audio = agent.run("Read out loud the summary of http://hf.co")
play_audio(audio)
==Explanation from the agent==
I will use the following  tools: `text_downloader` to download the text from the website, `summarizer` to create a summary of the text, and `text_reader` to read it out loud.

==Code generated by the agent==
text = text_downloader("https://hf.co")
summarized_text = summarizer(text)
print(f"Summary: {summarized_text}")
audio_summary = text_reader(summarized_text)

==Result==
Summary: Hugging Face is an AI community building the future. More than 5,000 organizations are using Hugging Face's AI chat models. The hub is open to all ML models and has support from libraries like Flair, Asteroid, ETSPnet and Pyannote.

Using the best agents works well 🎉

 

チャットモード

ここまで、エージェントをその .run コマンドを使用することで利用してきました。しかしそれがアクセスを持つ唯一のコマンドではありません ; それがアクセスを持つ 2 番目のコマンドは .chat で、これはチャットモードで利用することを可能にします。

2 つの間の違いはそれらのメモリに関連します :

  • .run は実行間でメモリを保持しませんが、(与えられた指示から 2 つ、または 3 つのツールを順番に実行するような) 複数の演算を一度により良く実行します。

  • .chat は実行間でメモリを保持しますが、単一の指示でより良く実行します。

Let’s use it in chat mode!

agent.chat("Show me an an image of a capybara")
==Explanation from the agent==
I will use the tool `image_generator` to generate an image of a capybara.

==Code generated by the agent==
image = image_generator(prompt="A picture of a capybara")

==Result==

画像の何かを変えたいならばどうでしょう?例えば、カピバラを雪の環境に移します。

agent.chat("Transform the image so that it snows")
==Explanation from the agent==
I will use the tool `image_transformer` to transform the image so that it snows.

==Code generated by the agent==
transformed_image = image_transformer(image, prompt="Snowy")

==Result==

他の何かのためにカピバラを削除したい場合はどうでしょう?画像のカピバラのマスクを表示するように要求できるでしょう :

agent.chat("Show me a mask of the snowy capybaras")
==Explanation from the agent==
I will use the tool `image_segmenter` to create a segmentation mask of the snowy capybaras.

==Code generated by the agent==
mask = image_segmenter(image, prompt="Snowy capybaras")

==Result==

過去の履歴へのアクセスを持つことは与えられたプロンプトで繰り返し反復するためには素晴らしいです。けれども、それは制限を持ち、時にはクリーンな履歴を持ちたいでしょう。そのためには、以下のメソッドを使用できます :

agent.prepare_for_new_chat()

 

ツール

ここまでエージェントがアクセスを持つツールを使用してきました。これらのツールは以下のようなものです :

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

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

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

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

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

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

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

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

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

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

私たちはまた以下のコミュニティ・ベースのツールもサポートしています :

  • テキスト downloader : web URL からテキストをダウンロードする。

  • テキスト-to-画像変換 : stable diffusion を利用して、プロンプトに従って画像を生成する。

  • 画像変換 : 画像を変換する。

従って私たちがしたいことを自然言語で說明することにより様々なツールを組み合わせて利用できます。

しかし新しいツールの追加についてはどうでしょう?それを行う方法を見てみましょう。

 

ツールの追加

デモが単純なままであるように非常に単純なツールを追加します : 各実行でランダムに猫を取得する素晴らしい cataas (Cat-As-A-Service) API を利用します。

以下のコードでランダムに猫を取得できます :

import requests
from PIL import Image

image = Image.open(requests.get('https://cataas.com/cat', stream=True).raw)
image

私たちのシステムで使用できるツールを作成しましょう!

すべてのツールは必要な主要な属性を保持するスーパークラス Tool に依存しています。それから継承したクラスを作成します :

from transformers import Tool

class CatImageFetcher(Tool):
    pass

このクラスは幾つかの要件を持ちます :

  • 属性名、これはツール自体の名前に対応します。遂行的な名前を持つ他のツールに合わせて、それを text-download-counter と命名します。

  • 属性の說明、これはエージェントのプロンプトを populate するために使用されます。

  • 入力と出力の属性。これを定義することで python インタープリタが型について知識に基づいて選択するのに役立ち、ツールを Hub にプッシュするとき gradio-demo が spawn されることを可能にします。それらは両方とも想定される値のリストで、テキスト、画像や音声でありえます。

  • call メソッド、これは推論コードを含みます。これが上記で遊んだコードです!

Here’s what our class looks like now:

from transformers import Tool
from huggingface_hub import list_models


class CatImageFetcher(Tool):
    name = "cat_fetcher"
    description = ("This is a tool that fetches an actual image of a cat online. It takes no input, and returns the image of a cat.")

    inputs = []
    outputs = ["text"]

    def __call__(self):
        return Image.open(requests.get('https://cataas.com/cat', stream=True).raw).resize((256, 256))

We can simply use and test the tool directly:

tool = CatImageFetcher()
tool()

ツールをエージェントに渡すためには、エージェントをツールと共に直接インスタンス化することを勧めます :

from transformers.tools import HfAgent

agent = HfAgent("https://api-inference.huggingface.co/models/bigcode/starcoder", additional_tools=[tool])

Let’s try to have the agent use it with other tools!

agent.run("Fetch an image of a cat online and caption it for me")
==Explanation from the agent==
I will use the following  tools: `cat_fetcher` to fetch an image of a cat, then `image_captioner` to caption it.

==Code generated by the agent==
cat = cat_fetcher()
caption = image_captioner(cat)

==Result==
/usr/local/lib/python3.10/dist-packages/transformers/generation/utils.py:1344: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.
  warnings.warn(
a cat is sitting in a tree

Success 🎉

このツールが猫の画像を取得するために使用され、同じ画像にキャプションを付けるために画像キャプショニングツールがすぐ後で使用されます。

最後に、他の人がツールから恩恵を受けるためにそれをハブにプッシュすることを勧めます。それを行うための詳細を含むドキュメントがここにあります : Adding a new tool

Thanks for following through with the notebook! We’re looking forward to the tools you’ll push, which will help empower all agents.

 

以上