📔

AIにAIを実装してもらう

に公開

はじめに

はじめまして、スマサテ株式会社のAIエンジニアのkoyanoです。
弊社は主要なプロダクトとして賃料査定システムを開発しており、私はその査定ロジックの改善を担当しています。
また、それ以外にも新規事業として、直近では内装のリフォームをAIでシミュレーションできる機能を開発しています。例えば、室内画像をアップロードすると、壁をセグメンテーションして簡単にクロスの張り替えができる機能などです。

記事の背景

後者のように何らかAI機能を開発するとき、過去にわたって機械学習界隈の巨人たちが研究・開発してきた様々なモデル/アーキテクチャの中から、適切なものを選び、組み合わせるといったことが必要になってきます。
幸いにも、Awesome Listと呼ばれる、画像認識や音声認識などの機械学習タスクに応じて論文やその実装がまとめられたGitHubリポジトリがあったり、Paper With Codeなどのタスクごとのモデルのランキングサイトがあったりと(最近Hugging Faceに統合され、サ終😭)、古いものから新しいものまで容易に網羅的に探すことは可能になっており、私も学生時代からかなりお世話になってきました。今では、比較的最近の研究であれば、主要なものは基本的にHugging Face上にあり、非常に使いやすく便利になりました。

ただ、実は目的とするAI機能の開発には古い研究にそのヒントがあったり、性能も良かったり、ということが少なからずあります。実際、内装シミュレーションの機能はその典型例でした。

古い研究も含めて網羅的に探したもの全てを試せればいいですが、如何せん数が多く、また古いものはPythonやライブラリのバージョンを合わせるのに一苦労します。
そこで、AI Agentに古い研究のGitHubリポジトリのリストを渡して、全てJupyter Notebook上に再現して、一目でその性能の確認・他の研究との比較ができるようにしたらいいのではと思い、AI Agentの実装に取り掛かりました。

この記事では、その途中経過を紹介します。
コードは以下のリポジトリに公開しています。

https://github.com/sk1010k/notebook-agent

システム概要

まず、Awesome ListなどからNotebookとして再現したい機械学習実装のGitHubリポジトリをピックアップし、そのURL一覧を書いたYAMLファイルを用意します。

そのYAMLファイルをAIエージェントに読み込ませ、一つひとつJupyter Notebookとして実装してもらいます。一度の指示で完璧なコードを書くことは難しいので、一度出来上がったらNotebookを実行し、エラーが出たら修正し再度実行する、というループを繰り返し行ってもらいます。

AIエージェントの実装には、Claude Agent SDK for Pythonを使い、Claude Code経由でClaudeがNotebookを作成するようにしました。

まとめると、以下のステップでAIエージェントが動作します:

  1. Notebook生成: YAMLファイルに記載されたGitHubリポジトリをJupyter Notebookとして実装
  2. 自動修正: Notebookを実行してエラーが出たら、Claudeが自動で修正(最大で指定した回数まで試行)

使い方

# repos.yaml
- https://github.com/nv-tlabs/gscnn
- https://github.com/dong-x16/PortraitNet
- https://github.com/wuhuikai/FastFCN

このようにYAMLファイルを用意し、

uv run notebook_agent.py repos.yaml --max-attempts 3

と実行するだけで、GSCNN、PortraitNet、FastFCNのJupyter Notebookがnotebooks/フォルダ以下に自動生成されます🎉🎉🎉

notebooks
├── FastFCN.ipynb
├── gscnn.ipynb
└── PortraitNet.ipynb

、、、めでたしめでたし、と言いたいところですが、出来上がったNotebookを見ると、ところどころ問題があります。

例えば、FastFCN.ipynbを見てみると、
FastFCN.ipynbのセグメンテーション結果
このようなセグメンテーションの画像が出力されており、一見うまくいってるのかなと思いきや、
学習済みモデルをロードしているセルの出力を見てみると、、、

FastFCN学習済みモデルのロードを試みます...
注意: FastFCNの公式モデルホストが利用できないため、
PyTorchの公式学習済みセグメンテーションモデル (DeepLabV3) を代わりに使用します。
DeepLabV3-ResNet50モデルをロード中...

✓ モデルのロードが完了しました

モデル情報:

  • アーキテクチャ: DeepLabV3 + ResNet50
  • データセット: COCO (21クラス)
  • フレームワーク: PyTorch公式

注: これはFastFCNではありませんが、同等のセマティックセグメンテーション機能を提供します

と書かれており、ClaudeがFastFCNの学習済みモデルを探すのを諦め、別の同等のの学習済みモデルを探してきてそれを使っています。実際には、元のリポジトリを見てみると、著者らがGoogle Driveに学習済みモデルを用意してくれているのですが、ClaudeがGoogle Driveからのダウンロードを気づかなかったか、失敗したことが伺えます。

これでは、古い研究を再現する、という本来の目的に反します。

これ以外にも、実装しながらいくつか課題が見えてきました。

課題と今後の方向性

1. Notebookの完成度の問題

これは先ほどのように、学習済みモデルやサンプル画像のダウンロードに失敗していたり、内容に誤りがあったり、というケースです。あとは、matplotlibのプロットが文字化けしていたり、といったこともあります。

2. 実行環境の問題

現状全てのリポジトリを1つの環境で実行しているので、各リポジトリの実装間でライブラリのバージョンなどに不整合があると一方が動作しなくなります。
リポジトリごとに専用のDockerfileをエージェントに用意させ、コンテナ上でNotebookを動作するようにする必要があります。

3. 指示追従の限界

プロンプトに意図しないファイルを作成・編集しないように指示しても、どうしても指示に従わない時があります。
例えば、このエージェント自身のリポジトリのファイルを編集したり、Notebookのエラーを修正するたびに新しいNotebookを作成したりしてしまいます。

4. ストレージの問題

Deep Learningのフレームワークやモデルの重みは結構ストレージを食うので、いくつも実装すると逼迫してきます。
理想的にはNotebookの実行は毎回Google Colabで行うようにできないかなと考えています。

まとめ

Claude Agent SDKを使うことで、以下を実現できました:

  • YAMLファイルで指定した機械学習のGitHubリポジトリをJupyter Notebookとして自動実装
  • エラー検出→修正のフィードバックループによる自動デバッグ

ただ、いろいろと課題があり、まだ業務での実運用には至りません。少しずつ改善していこうと思います。IssueやPRも大歓迎です!

おわりに

Claude Agent SDKを使うには、Claude APIを使うか、Claude Pro/Maxプランに課金する必要があります。弊社ではClaude Maxプランを希望者に全員付与するなど、新しい技術を積極的に導入しています。
今後もどんどんAIを活用して、プロダクトをより良くしていきたいと思っていますので、ご興味のある方はぜひWantedlyをご覧ください!

https://www.wantedly.com/projects/2099580

参考リンク

スマサテ Tech Blog

Discussion