Hugging FaceのAI Agents CourseのUnit4の課題をクリアした
Hugging Faceにさまざまな学習コンテンツがあり、その中に開発しているAgentフレームワークのsmolagentsでAgentの仕組みを学習するAI Agents Courseがあります。
簡単なハンズオンから始まり、Unit4が実際のLLMエージェントの評価にも使われているGAIAベンチマークのLeve1を解くアセスメントになっています。
エージェント開発は初めてでしたが、楽しみながら勉強にもなったので、今回はsmolagentsとUnit4のアセスメントの取り組みを紹介したいと思います。
smolagents
群雄割拠なAgentフレームワークですが、その中でもsmolagentsはシンプルさをコンセプトとしています。
Key Advantages of smolagents
- Simplicity: Minimal code complexity and abstractions, to make the framework easy to understand, adopt and extend
- Flexible LLM Support: Works with any LLM through integration with Hugging Face tools and external APIs
- Code-First Approach: First-class support for Code Agents that write their actions directly in code, removing the need for parsing and simplifying tool calling
- HF Hub Integration: Seamless integration with the Hugging Face Hub, allowing the use of Gradio Spaces as tools
実際に、exampleにあるコードベースを読むだけで簡単な拡張ができるくらいにはシンプルでした。
Agentの動作は、ReActフレームワークとCodeAgentの組み合わせがベースになっています。
https://huggingface.co/learn/agents-course/unit1/actions#code-agents
LLMが与えらたタスクに対するソリューションをプランニング、そのタスクを解くためのコードを出力、pythonインタプリタがコードを実行して結果を標準出力、その結果を受け取り、次のアクションを実行する。というのが一連の流れです。
これとは別の考え方にToolCallingがありますが、CodeAgentの方がループ処理などより複雑なタスクも安定してこなせることが報告されてるようです。詳しい説明は実際のCourseに受けてみてください。
Unit4アセスメント
GAIAベンチマーク検証セットのLevel1の20問を解く課題です。正答とのExact Matchで30%の正答率でアセスメントはパスで、CertificateをGETできます。
GAIAベンチマークはLevel1からLevel3までのタスクがあり、Level1は5回くらいのstepを踏めば回答に辿り着く目安の難易度で構成されています。
Level1といっても中のタスクもさまざまで、画像や音声からのQAや、エクセルファイルが与えられるものまでバラエティーに富んでいます。
https://huggingface.co/learn/agents-course/unit4/what-is-gaia#difficulty-levels
検証セットの回答は公開されてるので本質的には意味はないのですが、専用のLeaderBoardも設定されてます。コードも添付されているので、どんなことをすればどのくらいの点数がとれるかは参考になります。
上位をみるとほぼChatGPTやGeminiで構成されているのですが、本体のLLMが強いとAgentやToolの設定にこだわらなくてもある程度回答できそうだったので、勉強がてらローカルで動くことを意識して32B構成で頑張ることにしました。
エージェントの構成
単体のエージェントにツールを持たせる構成でも問題ありませんが、ロングコンテキストの能力に不安があったので、プランニングを行うマネージャーと、ツール実行を行いマネージャーに結果を伝える、マルチエージェント構成にしました。
マネージャーエージェント
planningを行うのでThinkingが上手いモデルが良いかと思い、qwen/qwq-32b
を使いました。
出力が複雑にならないツールはこのエージェントに持たせました。
ツールエージェント
画像を扱えるVisionモデル(qwen/qwen2.5-vl-32b-instruct
)と、コンテキストが長くなりがちなWikiとWebを扱う場合で、専用のエージェント(qwen/qwen-2.5-coder-32b-instruct
)を作成しました。
これらのエージェントは実行結果をsummaryしてマネージャーに伝えるので、マネージャーのコンテキストを消費せずに済みます。実行結果がいまいちであれば、マネージャーが再度プランニングして、どのようにツールを実行するかを再度判断します。
CodeAgentの苦労ポイント
一番最初が「あるwiki記事にあるtable情報から回答を行う」というタスクになっています。それだけ?と思うかもしれませんが、これが意外と難しくエージェント開発のきついところ体験できました。
当たり前ですがLLMにコードを実行する能力はないので、実行はpythonインタプリタで行われます。なので、Agentは変数にアクセスできず、実行時に標準出力された文字列の出力から情報をハンドリングして次のStepの入力などに利用します。
これがどういうことかと言うと、Wiki記事内にtableが見つかり、そのtableを使って何かしようとする場合、一旦printしてその結果に対してパース処理をするstepが入ります。
# コード実行のイメージ
html_content = get_wiki_content(query="hogehoge")
print(html_content)
>>> <html>...</html> # ここからtable情報をGETするために、次のstepではこのHTMLパースするコードを実行する
スクレイピングした結果に対して、そのままパース処理しても大体失敗することは想像に難しくないでしょう。
なので、一旦wiki記事からGETしたtableはcsvとして保存して、「tableが必要だったら対応するcsvのpathを与えればdataframeを取得するツールがあるからそれを使え」という指示で回避しました。pathを与えるのは簡単です。この辺りも拡張性もシンプルさもあって比較的容易でした。
# この段階で取得したtableは別途csvとして保存
html_content = get_wiki_content(query="hogehoge")
# 次のステップでtableを扱いたい場合はファイルからloadさせる
dataframe = get_table_dataframe(path="path/to/csv")
# dataframeでtable操作できる
もしかしたら、jupyterみたいに変数を保持していて、インタラクティブに変数にアクセスできるサンドボックス環境もあるかもしれません。
加えて、別の問題としてLangchain他既存のWikiを扱うツールはTable情報を含めてくれないというエージェント動作に関わらない根本的な問題もあったりしました。むしろこっちの方がエージェントとは関係ない部分で辛かったです。
最終結果
20問中9問正解で45%の正答率となり、アセスメントはパスできました。
手元では成功するタスクも、Submit時には失敗することもあり悲しかったです。この辺りの出力のブレはLLMを扱う上では仕方ないことでしょう。60%くらいは行けたらいいなと思ってのでちょっと悔しいです。余裕があれば改善してきたいですね。
コードは以下に挙げてるので、よかったら参考にしてみてください。
(もっといい点数GETした方はぜひ解法を教えてください!)
さいごに
実践的なタスクに加えて、LeaderBoardで客観的に精度もわかるので、チュートリアルだけよりも楽しく手を動かしながら学べました。オープンウェイトなモデルならOpenrouter経由で20問全部実行しても$2もかからないでしょう。
LeaderBoardにSubmitするにはHuggingfaceのSpaceが必要だったりで最初はとっつきにくいですが、discodeとかのコミュニティサポートも充実しているようなので、気になる方はコース受講&アセスメントに挑戦してみてください。おわり。
Discussion