LLMエージェントで開発ワークフロー自動化を支援する「Patchwork」を試す
GitHubレポジトリ
Patchwork
Patchworkは、セルフホストのCLIエージェントと好みのLLMを使用して、PRレビュー、バグ修正、セキュリティパッチ適用などの開発タスクを自動化します。
主なコンポーネント
- ステップ: PRの作成、変更のコミット、LLMの呼び出しなど、再利用可能な最小単位のアクション。
- プロンプトテンプレート: ライブラリの更新、コード生成、問題分析、脆弱性修復などの作業に最適化されたカスタマイズ可能なLLMプロンプト。
- パッチフロー: LLMが支援する自動化機能(PRレビュー、コード修正、ドキュメント作成など)は、ステップとプロンプトを組み合わせて構築されます。
Patchflowsは、CLIやIDEでローカルに実行することも、CI/CDパイプラインの一部として実行することもできます。すぐに使えるパッチフローがいくつか用意されており、いつでも独自のパッチフローを作成することができます。
公式ドキュメント
ドキュメントを見てると、上のGitHubレポジトリはCLIのみで、GUIで操作可能なマネージドサービスとしてpatchedというのがある様子
referred from https://docs.patched.codes/overview
今回はCLIの方を試してみる。なお、AGPL-3.0ライセンス。
Quickstartに従って進める。
なお、今回はローカルのMac上で進めることとする。
パッケージインストール。なお、いくつかのextrasが用意されているようだが、今回はall
で。あと、適宜仮想環境を用意しておくこと。
$ pip install 'patchwork-cli[all]' --upgrade
次に、PatchworkでPRなどを行わせたいレポジトリを用意する。実際には自分が開発を行っているレポジトリを使うのだけども、今回は例として以下のレポジトリを使用する。
Damn Small Vulnerable Web(クソ小さい脆弱なウェブ)
Damn Small Vulnerable Web (DSVW) は、教育目的で作成された、100行未満のコードで書かれた意図的に脆弱なウェブアプリケーションです。 最も一般的なウェブアプリケーションの脆弱性の大半を、適切な攻撃方法とともにサポートしています。
脆弱性が含まれたWebアプリケーションのサンプルになっているので、これをPatchworkでいろいろ修正していくという流れ。
ではこれをフォークする。
フォークした自分のレポジトリからクローンする。
$ git clone https://github.com/kun432/DSVW && DSVW
このレポジトリが必要とするパッケージもインストールしておく。
$ pip install -r requirements.txt
試しに起動してみる。
$ python dsvw.py
Webサーバが起動するのでブラウザでアクセス
[i] running HTTP server at 'http://127.0.0.1:65412'...
こんな感じで、実装されている脆弱性がリストアップされており、exploit
をクリックすると、実際に試すことができてしまうらしい。
ではPatchworkを実行してみる。OpenAIのAPIキーと、GitHubのパーソナルアクセストークンが必要になる模様。
$ patchwork AutoFix openai_api_key=********** github_api_key=**********
╭───────────────────────────────────────────── Initializing Patchwork CLI ─────────────────────────────────────────────╮
│ Patchflow AutoFix loaded from patchwork.patchflows │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────────────────────── Patchflow AutoFix logs ───────────────────────────────────────────────╮
│ Run started ScanSemgrep │
│ Run completed ScanSemgrep │
│ Run started ExtractCode │
│ Found 10 results from SARIF data │
│ Run completed ExtractCode │
│ Run started LLM │
│ Run started PreparePrompt │
│ Run completed PreparePrompt │
│ Run started CallLLM │
│ Run completed CallLLM │
│ Run started ExtractModelResponse │
│ Run completed ExtractModelResponse │
│ Run completed LLM │
│ Run started ModifyCode │
│ Run completed ModifyCode │
│ Run started PR │
│ Run started CommitChanges │
│ Creating new branch "autofix-master". │
│ Run completed CommitChanges │
│ Run started PreparePR │
│ Run completed PreparePR │
│ Run started CreatePR │
│ Creating PR from master to autofix-master │
│ PR created at https://github.com/kun432/DSVW/pull/1 │
│ Run completed CreatePR │
│ Run completed PR │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Finished AutoFix ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:29
GitHubでみてみるとPRが作成されている。
あとちゃんとブランチが切られていて、そちらで修正+PRが行われている様子。
$ git branch
autofix-master
* master
$ git log --first-parent autofix-master
commit f5826765e90577a70c4b2c3943ba29296b919337 (origin/autofix-master, autofix-master)
Author: patched.codes[bot] <298395+patched.codes[bot]@users.noreply.github.com>
Date: Wed Sep 18 17:56:08 2024 +0900
Patched /Users/kun432/repository/patchwork-test/DSVW/dsvw.py
commit bb89c8c39e69aa8678d0803ff337dc0a74983dc2 (HEAD -> master, origin/master, origin/HEAD)
Merge: d8b1d4d 29b0daf
(snip)
で、先ほどはpatchwork AutoFix
を実行したのだけども、このAutoFix
というのが「パッチフロー」にあたり、行いたい処理のワークフローを定義したものになる。デフォルトだと以下のようなものが定義されている。
- GenerateDocstring: コード内のメソッドのドキュメント文字列を生成します。
- AutoFix: リポジトリ内のコードの脆弱性に対する修正を生成し、適用します。
- PRReview: プルリクエストが作成された際に、コードの差分を抽出し、変更点を要約し、プルリクエストにコメントを追加します。
- GenerateREADME: 指定したフォルダにREADMEマークダウンファイルを作成し、リポジトリにドキュメントを追加します。
- DependencyUpgrade: 脆弱性のある依存関係を修正済みのバージョンに更新します。
- ResolveIssue: 問題(またはバグ)を解決するために更新が必要なリポジトリ内のファイルを特定し、修正するためのPRを作成します。
これらのワークフローは自分でカスタムなものを定義することもできるみたい。
続けて、PRのレビューをさせてみる。パッチフローによっては引数が別途必要になるものもある。
$ patchwork PRReview pr_url=https://github.com/kun432/DSVW/pull/1 openai_api_key=********** github_api_key=**********
╭───────────────────────────────────────────── Initializing Patchwork CLI ─────────────────────────────────────────────╮
│ Patchflow PRReview loaded from patchwork.patchflows │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭────────────────────────────────────────────── Patchflow PRReview logs ───────────────────────────────────────────────╮
│ Run started ReadPRDiffs │
│ Run completed ReadPRDiffs │
│ Run started LLM │
│ Run started PreparePrompt │
│ Run completed PreparePrompt │
│ Run started CallLLM │
│ Run completed CallLLM │
│ Run started ExtractModelResponse │
│ No partitions specified for model response, will default to using the entire response. │
│ Run completed ExtractModelResponse │
│ Run completed LLM │
│ Run started PreparePrompt │
│ Run completed PreparePrompt │
│ Run started CallLLM │
│ Run completed CallLLM │
│ Run started PreparePR │
│ Run completed PreparePR │
│ Run started CreatePRComment │
│ Comment created for PR: https://github.com/kun432/DSVW/pull/1 │
│ Run completed CreatePRComment │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Finished PRReview ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:10
こんな感じでPRにコメントが追加される。
なお、自分でカスタムなパッチフローを作成することもできる。
また、ここまでの例ではAPIキー等をいちいちコマンドラインから入力していたが、設定ファイルを用意して、それを使うようにもできる。プロンプトやモデル等の設定もここでできるし、Googleのモデルやローカルモデルなども使用できる様子。
まとめ
Patchworkを調べたきっかけは、実は以下を試したくて、そのなかで使用されているとあったため、一応軽く押さえておくかというのが目的。
ただ、Patchworkを触ってみて感じたのは、ワークフロー的なフレームワークは他にもいろいろあるけれど、これまでは汎用用途だったものが、徐々に具体的な用途特化になってきている印象。このあたりはエージェント用フレームワークなんかも同じような流れを感じていて、今後は具体的な業務プロセスでの活用を目指したものが増えていくのではないかなと感じている。