アノテーションUIにArgillaが良い感じ
こちらはGaudiyアドベントカレンダー20248日目の記事です。せっかくのアドカレなので普段とまったく違う路線の話をする予定だったのですが間に合わなかったので、LLM周りで最近触って有望そうに感じた技術について紹介していきます。
弊社ではLLMを活用したアプリケーションを構築しており、その中でよりユーザの理解を深めるためでや、"精度の高い"出力が何かを判断するために、単純なGood/Badだけではなくちょっと複雑なアノテーションフォームを作りたくなりました。
そんな折に尊敬するHamel氏という方のツイートを見かけ、Argillaというサービスを知りました。
なんでもこちらのArgillaはOSSのアノテーションプラットフォームで、今年6月にHugging Faceに買収されたんだとか。正にこのHugging Faceとの連携が試す魅力となりまして、ワンクリックでポチッと押したらHugging Face上のスペースにデプロイできることがセットアップでつまづいていた私には輝いて見えたのです。
という訳でこの記事ではArgillaの使い方と魅力について述べていきます。
欲しいもの
まず最初に我々が欲しいなぁと感じていた要求は次のとおりです。
- ちょっと複雑なフォームが作れる
- 複数の質問
- スコアリング/テキスト/good or bad
- 外部の人が使える
- ドメインエキスパートが社内にいない(正確には少ない)ので社外の人に協力してもらうため
- サクッと作れる
- 継続的にデータが足せる
選択肢としては色々ありまして、最初はLabel Studioというライブラリを試しました。が、我がインフラ力の低さから色々つまづきまして、そこで試したのがArgillaです。
下図は一例ですが、Argillaではアノテーション対象のデータが次々に表示され、右ペインにそれなりにカスタマイズの効くアノテーションフォームが表示されます。
また、アノテーターのためのユーザID + パスワードもプログラマブルに発行でき、Hugging Faceアカウントを作らずとも外部の方にご協力いただけるようになっています。
そして重要なことにサクッと作れます、マジで数分で作れるので次にその立ち上げ方をご紹介していきます。
とりあえずデプロイ
とりあえずはHugging Face上にデプロイするのが簡単です。Hugging Faceアカウントにログインした状態で、次のQuick Start上のDeploy on HF Spacesを押して、スペースの名前などをぽちぽち入力していきます。
この時注意点としてPublicにしていないと後の手順でSDK経由で操作しようとした時にNot Foundになってしまいます。その場合はHugging Faceのトークンを付与すれば使えるようになるそうです。
コンテナのビルド&デプロイが終了すると次のようなページが開かれます。
Sign in with Hugging Faceをクリック -> Authorize してみましょう。
すると次のようなまっさらなページに遷移します。左にデータセット、要するにアノテーション対象のデータ集が表示されていきます。
注意点として、上にチラッとWarningが出ている通り、無料の場合ストレージがパーシステントじゃありません。作ったスペースが不意に切れたりすると入れたデータ(アノテーション用の設定、アノテーションのデータ)などが切れます。
永続化されたストレージを使う場合には少しお支払いする必要があります。一番小さいので20GBまでで、月$7.2ほどなのでそこまでは高くありません。
それでは、次に今はまだデータセットも何もない状態なので次にそれらを追加していきましょう。
データとアノテーションフォームの作成
次にアノテーション用のデータとフォームを作ります。これはSDK経由で行うのが簡単です。GUI経由ではなんか新規作成ができませんでした。
とりあえず初めてみるには"Import from Python"からコードをコピるのが良いです。API Keyなどもこちらで確認できます。
手頃なColabでも開いて試してみましょう。動かすにはまずargillaのパッケージをインストールします。
!pip install argilla
次に先ほどのコードをコピペします。
import argilla as rg
client = rg.Argilla(
api_url="https://kazuyaseki-zenn-test.hf.space",
api_key="",
)
settings = rg.Settings(
guidelines="These are some guidelines.",
fields=[
rg.TextField(
name="text",
),
],
questions=[
rg.LabelQuestion(
name="label",
labels=["yes", "no"]
),
],
)
dataset = rg.Dataset(
name="my_dataset",
settings=settings,
)
dataset.create()
records = [
{
"text": "Do you need oxygen to breathe?",
"label": "yes",
}
]
dataset.records.log(records)
settings
の部分でどんなアノテーション対象のデータを持つか、どんなアノテーションの質問を持つかを定義します。これを用いてデータセットを作ります。
records
が実際のアノテーション用のデータです。
実行すると上記を反映した設定とRecordsのデータセットが作られアノテーションができるようになります。
ユーザにアノテートしてもらう
次にアノテータに実際にアノテーションしてもらいましょう!
ログイン用のユーザアカウントを作ってワークスペースに追加すると、先ほど作ったデータセットに対してアノテーションができるようになります。
データセットはデフォルトで"argilla"という名前のワークスペースに入ってます。
user = rg.User(
username="test_user",
first_name="test",
last_name="testtest",
role="annotator",
password="password",
client=client
)
retrieved_workspace = client.workspaces("argilla")
user.add_to_workspace(retrieved_workspace)
これで作ったusernameとpasswordをリンクと共にお伝えし、Sign in with usernameから進んでいただいて入力していただければアノテーションの画面に辿り着きます。
また、一つ重要な概念がdistributionです。
デフォルトでは一つのデータに対して一回アノテーションされたら、そのデータはアノテーション済みとしてアノテーションUIに表示されなくなります。つまり、一人のユーザがあるデータをアノテートしたら他のユーザからアノテーションする機会がなくなる訳です。
同じデータに対しても何度かアノテーションして欲しい場合はdistrubutionという値を大きくすれば実現できます。例えば次のコードでは4を指定していますが、この場合は1レコード辺り4回はアノテーションされます。
dataset = client.datasets("dataset_name")
dataset.settings.distribution.min_submitted = 4
dataset.update()
データの収集
集めたデータを見るためにはエクスポートする必要があります。
できればそのまま結果が見られる画面があったりすればベストだったのですが、そこは少し残念(あったら教えてください)。
エクスポートはjsonとしてディスクに書き出す方式とHugging Faceのデータセットに書き出す方式があります。
せっかくHugging Faceとの連携が魅力のサービスなので今回は後者で試してみます。
Datasetオブジェクトから to_hub
メソッドを実行します。引数にはデータセットの名前を指定します。その名前のデータセットが既にある場合はアップデートを行い、そうでない場合は新規作成をしてくれます。おそらくデフォルトでpublicなので、privateにしたい場合は手動でprivateで作ってから実行しましょう。
dataset.to_hub("zenn-test")
すると結果がHugging Faceのデータセットに保存されました。やったね!
おわりに
以上、アノテーションプラットフォームとしてスッと立ち上げて便利に使えそうなArgillaをご紹介してまいりました。
次の9日目のGaudiyアドベントカレンダーは、チキタカこと高野さんです。
入社初日にメイド服で会場を沸かせ今もコミュニティマネージャーとしてコミュニティを沸かせている方なので面白い記事を書くに違いありません。お楽しみに〜!
Web3スタートアップ「Gaudiy(ガウディ)」所属エンジニアの個人発信をまとめたPublicationです。公式Tech Blog:techblog.gaudiy.com/
Discussion