Roo Code + OpenRouter + Deepseek r1を試す
実行するプロジェクト
私が個人開発しているOSSの自動化工業ゲーム「moorestech」のリポジトリ
1つのリポジトリ内でサーバーとクライアントで実装が別れており、ライブラリを除いたmoorestech関連のコード行数は3.2万行と、それなりの大きさ
Roo Code
Clineをフォークして作られた改良版Cline
プロンプトを調整したり、いろいろ改善が入ってるらしい(詳しいことはよくしらない
OpenRouter
いろんなモデルを一つのAPIキーで使えるAI代行サービス
これだけに課金したらいろんなAIサービスのキーを管理しなくて良くなる
Deepseek r1
最近話題の中国製OSS LLM
o1と同程度の性能でありながら破格の値段で使うことができる
入力プロンプト
入力プロンプトはそれなりのエンジニアだったら周囲のコードからなんとなくやりたいことを察してくれるかな、、?というレベルで記述しました。
詳しく書いて微妙な結果になっても嫌なので、自分の思考の整理がてら書いた程度です。
本文
私はMapObjectを採掘するGeaerMapObjectMinerの実装を行っています。
MapObjectMinerMiningTestのテストをパスできるように、必要な実装を行ってください。必要な実装はざっくり以下の通りです。
なお、マスターデータに関するコードはSourceGeneratorで生成されているため、必要な部分は抜粋して下に記述しています
-
GearMapObjectMinerコンポーネントを実装する。ここにMapObjectを採掘する処理を記述する。
- VanillaChestComponentを使用してインベントリを実装する
- 設置されたら周囲のMapObjectを取得する
- 歯車エネルギーの供給を受けて機械が稼働するかどうかを判定する
- 特定の時間アップデートしたら周囲のMapObjectにダメージを与え、取得したアイテムを自分のインベントリに入れる
- MapObjectが破壊されたら、ダメージを与えるリストからそのMapObjectを削除する
-
GearMapObjectMinerのIBlocktemplateを作成し、VanillaIBlockTemplatesに追加する
GearMapObjectMinerBlockParamの内容
public int TeethCount { get; }
public float RequireTorque { get; }
public float RequiredRpm { get; }
public int OutputItemSlotCount { get; }
public global::UnityEngine.Vector3Int MiningAreaRange { get; }
public global::UnityEngine.Vector3Int MiningAreaOffset { get; }
public Mooresmaster.Model.MapObjectMineSettingsModule.MapObjectMineSettings MapObjectMineSettings { get; }
public Mooresmaster.Model.InventoryConnectsModule.InventoryConnects InventoryConnectors { get; }
public Mooresmaster.Model.GearModule.Gear Gear { get; }
MapObjectMineSettingsの内容
public Mooresmaster.Model.MapObjectMineSettingsModule.MapObjecetMineSettingsMasterElement[] items { get; }
MapObjectMineSettingsMasterElementの内容
public global::System.Guid MapObjectGuid { get; }
public float MiningTime { get; }
public int AttackHp { get; }
実際にAIが書いたコード
書かれたコードの実物はこちらです。
13万トークンのインプットと4千トークンのアウトプットで0.8ドルという結果でした。Deepseekは流石の低コストですね。
コードの評価
実際にコードがどうだったかで言えば、はっきりってゴミした。
VanillaGearMapObjectMinerTemplate
VanillaGearMapObjectMinerTemplate.csはusingが足りないのは良いとして、他のテンプレートやIBlockTemplateで実装が求められているNew、Loadメソッドを全く実装する気配がありませんでした。インプットしたコードの問題かもしれませんが、ちょっとRAGの性能が低いように感じました。おそらく、IBlockTemplate(画像2枚目)がインプットされたトークンの中にあればこのようなミスは起きなかったと思います。
GearMapObjectMinerComponent
こちらが本命でしたが、こちらも微妙な出来でした
実装してほしかった歯車関係の実装がすっ飛ばされてたり
パラメーターが定数になってたり
_mapObjectFactoryに存在しないメソッドを使おうとしたり
所感
全体的に、すべてわかっているフリをして全然的はずれなことをする人、みたいな印象を受けました。
あるInterfaceを使うときもそのInterfaceにどんなメソッドがあるかを確認せずに堂々と存在しなメソッドを書いたり、存在しないAttributeを勝手に使ったり。
Transfomerの特性というのもあり、人間では絶対にしないようなミスを多数していました。
これは現状のAIエージェントにフィードバックの過程がないことも一つの要因であると感じます。
コンパイル結果のエラーコードを取得したり、実行したテスト結果を取得できるようになれば、自身で間違いに気づき、より良い結果を得らるようになるのかなと思いました。
とりあえず、それなりの規模のPJTで、それなりのエンジニアが半日くらいかけたらできるようなタスクはまだAIには厳しそうという感想です。