Devinを使ってみた所感

## はじめに
　[AI駆動開発勉強会](https://aid.connpass.com/event/344773/)でDevinの発表を聞くまで、私はDevinが他のAIエージェントcopilot, cline, cursorなどと同列の存在だと思ってました。しかし、それらとは少し違った方向性のエージェントだとわかったので、現時点の私の知り得ている情報を共有していきます。

#### リファラル（招待コード）
　Devinは最近20ドルから始められるcoreプランというものができたので、以前までの500ドルプランより始めやすいかと思います。ただ、20ドルプランでは9ACUしか付与されないため、かなり少ないです。
　始めたい方はこちらのリファラルからどうぞ→https://app.devin.ai/invite/ecrGhUCj0bpdhFxc
ここから始めると、登録者と私の双方に10ACUが付与されます。よって9ACUの2倍の19ACUから始められるのでお得です。（私にも10ACU付与されるので嬉しいです！） 
 
## Devinの概要
　Devinの概要は多数の記事で書かれてるので詳しい説明は省きますが、copilotやclineなどと比較すると
 ・リモートのサーバーでDevinは作業するので、自分のpcには全く負荷をかけず完全に並走が可能
 ・新人エンジニアがメンバーに一人加わった感覚
 ・朝slackでタスク指示しといて、昼休憩時に確認したら出来上がってるという具合の使い方を想定されてる（スピードは保証されてない）
というように、方向性は違うものの格上の存在ではないといった感じです。

 　ただ、勉強会で私が衝撃を受けた図がありました。
  ![スクリーンショット (1677).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/703e7e8b-5599-4d07-bf20-1aa0bf8f486e.png)
https://speakerdeck.com/tomoki10/devin-can-become-a-cloud-engineer-ai-practical-guardrail-design?slide=6
から引用
　この図では、今までcopilotやclineは人間一人の作業スピードを上げるという次元だったのに対して、これからは複数体のDevinがタスクを行うので
「 Devinの数n体 × 1体あたりの作業量」で爆発的に作業量が増える可能性が示されています。（実際の発表ではそこまで言及されてません、あくまで私が感じ取った所感です）
　現状の使われ方は基本的にDevin１体に対してだけですが、今後は少なくともこの図に示されてるようにタスクB,C分は速くタスクをこなせるようになるというような開発風景が想定されます。

## 環境セットアップ
　基本的にはこちらの記事を参考にしました→[注目のAIエンジニア「Devin」を入れてみた！購入から初期設定まで](https://dev.classmethod.jp/articles/devin-init/)
 今回は20ドルプランで始めたのでこちらも参考にしてます→[Devinの$20プランがきたぞぉおお！iOS開発で使ってみたぞぉおお！](https://qiita.com/dokozon0/items/01601d65b16feaf37f77#%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AE%E9%81%B8%E6%8A%9E)

　これらの記事により、購入→github,slackのセットアップは順調に進んだのですが、リポジトリのセットアップで私は少し詰まってしまいました。
 私はtypescriptを触ったことがなく、pythonでやったので詳しく説明したいと思います。

 #### pythonでの環境セットアップ
 　公式ドキュメントはこちらです：https://docs.devin.ai/learn-about-devin/workflows#repo-setup
私はpythonでやったので、ここから8ステップ詳しく説明します。

 　まず、ものすごく簡単なstreamlit環境を用意しました：https://github.com/tikutaku69/streamlit_component_for_Devin
　これを使って、ステップ１のgit pullはそのまま流して、ステップ２はシークレットキーの設定なので.envファイルを作ってOPENAI_API_KEYを記載しました。
 ![スクリーンショット (1589).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/2b050a21-824b-436b-b56f-1a4c9463ebca.png)
ステップ３では依存関係をインストールします。
```ruby:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
ステップ４では、永続的にDevinが環境を維持するために、それらをまとめたコマンドを左側に登録してverifyで検証して次に進みます。
![スクリーンショット (1593).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/580f3ba9-e8af-438e-aade-3a4e39feff49.png)
ステップ５,６でlintとtestの設定があるのですが、今回は飛ばしちゃってます。（ローカルでruffとpytestを用意したのですがDevinに反映し忘れました）
![スクリーンショット (1610).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/d0ddf2f8-4f9d-4372-9eab-a5444c6abfb6.png)
ステップ７では、Devinにrunのさせ方を記載します。
ここでは、「streamlit runコマンドを打って、ブラウザでlocalhost8501を確認しろ」と記載してます。
![スクリーンショット (1617).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/1cf1607f-988b-4c10-b67a-7f3612211641.png)
ステップ８では、Devinにさせたい動きを記載します。日本語訳は以下です
```ruby:
依存関係
- ワークスペースの依存関係を全てインストールするには：pip install -r requirements.txt

正確性の検証
- streamlit run gpt4v.pyと打ち込み、ブラウザのhttp://localhost:8501でstreamlit画面の起動を確認する
- その後、画面下のチャットボックスで例えば「LangGraphとは何ですか？」のような質問をし、回答が表示されるのを確認する
- ここまでできれば、正確性が損なわれてないと判断してよい

プルリクエスト作成時
- 正確性の検証を行い、今回の変更により正確性が損なわれてないことを確認する
- 正確性の検証を行った証拠写真を１枚、該当issueに記載する
```
　これにて環境セットアップ完了です。特に重要なのはステップ８で、ここがチューニングのしがいがある場所だと思われます。

## 実際に使ってみる
　早速slackから以下のようにDevinにタスクを依頼しました。Devinにメンションを飛ばして以下のようにタスク指示すれば、後は自律的にタスクをやってくれます。
 ![スクリーンショット (1679).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/cd7deb61-9a22-4921-ad3f-fad8b3a22708.png)
 
そして、作業状況をスレッドで返信してくれて...
![スクリーンショット (1680).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/20298541-f18d-4773-957b-f39dd4d2d135.png)
　プルリクのリンク先に飛ぶと変更内容をまとめてくれています↓
変更内容のスクリーンショットがあるのは、環境セットアップのステップ８で「正確性の検証を行った証拠写真を１枚、該当issueに記載する」というルールを書いたためです。
![スクリーンショット (1681).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/7533f943-75fa-45d8-b696-fc925ab2c7f7.png)

このような流れで、Devinに機能追加をさせてさらにその正確性を検証した結果を、スクショを含めてプルリクにまとめさせることができました。
スクショを適宜撮らせることで、人間が実際に動作確認をしなくてもDevinに自動でやらせ、人間はそのまとまった結果だけを見るというサイクルができました。人間は注意深く確認したい時のみ手動で動作確認すればいいという開発の進め方になりそうです。

## Knowledge機能
　DevinにはKnowledgeという機能があり、学びや気づきを保存して学習します。効率よくKnowledgeを貯めさせることでDevinを成長させられるようです。
おそらくこのKnowledge機能こそが、Devinを運用する上でのコアに思えたので、優先的に試してみました。

　Knowledgeはトリガーとコンテンツという構成になってるようです。トリガーにそのKnowledgeを参照させる条件を記載し、コンテンツにその場合の内容を書くといった感じです。
今回は、トリガー「タスクをissueで指示された場合は」、コンテンツ「プルリクエスト作成時にそのissueのリンクを紐づけてください」といったKnowledgeを書いてみてます。
![スクリーンショット (1686).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/e81f45ae-9ac8-4a56-a394-07d3aa61caa4.png)

#### Knowledgeの登録方法
　調べたところKnowledgeには３種類の登録法がありました。
①Devinがオンボーディングなどの情報を自動で登録するもの
![スクリーンショット (1684).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/865584f4-91e8-411e-af1d-d01db9045c07.png)
②ユーザーが手動で登録する方法
このように、フォルダやKnowledgeを手動で追加できます。
![スクリーンショット (1685).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/e50db179-9225-44e3-a2ba-c6f194a70b98.png)
③タスク振り返り時に、得られた学びをDevinにKnowledge追加させる方法
しかし、この③の方法は私の環境では上手く行きませんでした。
![スクリーンショット (1687).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680875/15a6004e-6bb3-4207-bce6-b4cc21f6be61.png)
調べたところ、タスク振り返り時にreadmeなどに学びを記載させ、後でDevinが自動的にKnowledgeに取り込むという流れであって、タスク振り返り時に直接Knowledge追加させることはできないようです。
なおかつ、.mdファイルでは自動的に取り込まれず、.mdcや.rulesなどでなければならないようです→[公式ドキュメント](https://docs.devin.ai/onboard-devin/knowledge-onboarding)

　というわけで、③タスク振り返り時に.mdcなどのファイルに学びをまとめさせる、と②手動追加を併用する形が良さそうです。

## 所感
　Devinに可能性は感じますが、今実際にプロジェクトに導入したとしたらプラマイゼロ～マイナスのほうが少し大きいぐらいの感触です。というのも、Knowledge整備などDevinの振る舞いを制御するためのメンテナンス時間のマイナス分が、雑用タスクをDevinに割り振れるというプラス分よりも大きいからです。
　ですが、Devinのアップグレードも頻繁にされてる＋Knowledge整備の知見を得るほどDevinを成長させられるという面で、現時点の一時はマイナスであったとしても、今後の飛躍を考えると投資対象に思えます。

　さて、今回はDevinのセットアップ→実際に少し使ってみる→Knowledgeを試してみるというところまでできました。Devinには可能性を感じるので、引き続き検証していきたいと思います。