「AIエージェントキャッチアップ #70 - tree-sitter」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #70 - tree-sitter」という勉強会を開催しました。

https://generative-agents.connpass.com/event/387534/generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

tree-sitter

今回は、AIエージェントの実装でよく使われるパーサージェネレーター「tree-sitter」をキャッチアップしました。

tree-sitterのGitHubリポジトリはこちらです。

github.com

今回のポイント

tree-sitterとは

tree-sitterはパーサージェネレーターであり、ソースコードの編集時に効率的に構文木を構築するようになっているそうです。

tree-sitterは、各種プログラミング言語から使用するためのバインディングが提供されています。

また、パースする対象としても任意のプログラミング言語を指定可能で、多くのプログラミング言語のパーサーが提供されています。

tree-sitterのコーディングエージェントでの活用

tree-sitterはAIエージェントのために作られたものではありませんが、コーディングエージェントの実装でよく使われています。

Aider、Codex、Cline、OpenCodeなど、多くのコーディングエージェントがtree-sitterを使用しています。

コーディングエージェントにおけるtree-sitterの主な使い方として、以下の2つが挙げられます。

  • リポジトリマップ・シンボル抽出
  • リント

リポジトリマップ・シンボル抽出

AiderやClineでは、tree-sitterをリポジトリマップの作成やシンボルの抽出に使用しています。

たとえばAiderでは、以下のようなリポジトリマップがコンテキストとして提供されるようになっています。

aider/coders/base_coder.py:
⋮...
│class Coder:
│    abs_fnames = None
⋮...
│    @classmethod
│    def create(
│        self,
│        main_model,
│        edit_format,
│        io,
│        skip_model_availabily_check=False,
│        **kwargs,
⋮...
│    def abs_root_path(self, path):
⋮...
│    def run(self, with_message=None):
⋮...

aider/commands.py:
⋮...
│class Commands:
│    voice = None
│
⋮...
│    def get_commands(self):
⋮...
│    def get_command_completions(self, cmd_name, partial):
⋮...
│    def run(self, inp):
⋮...

引用元:https://aider.chat/docs/repomap.html

リポジトリマップの作成のためのクラス名・関数名などの抽出にtree-sitterが使われています。

シェルコマンドの安全判定

Codexでは、tree-sitterを使ってBashのシェルコマンドを構文解析し、コマンドの実行可否を判定しています。 単なる前方一致や正規表現での判定よりも、構文解析して判定したほうが詳細な判定が可能となります。

仮想的なシェルコマンドの提供

面白い実装として、Codexのapply_patchコマンドがあります。 Codexはapply_patchというコマンドが使える想定で動作しますが、実際にapply_patchというコマンドが存在しない環境でも動きます。

apply_patchコマンドが存在しなくても動作するのは、tree-sitterでシェルコマンドを構文解析してapply_patchコマンドが呼び出されたことを確認して、apply_patchコマンドが呼び出されている場合はRustの関数を実行する実装になっているためです。 この実装のため、apply_patchコマンドはシェルの|などとは組み合わせられないといった制約があります。

AIエージェントに実際には存在しないコマンドを提供するのは、おもしろい発想ですね。

その他の用途

コーディングエージェントでのtree-sitterのその他の用途としては、構文バリデーションやセマンティックチャンキングが挙げられます。

  • 構文バリデーション:コーディングエージェントが出力したコードが構文的に正しいかチェック
  • セマンティックチャンキング:コードをクラスや関数で分割して検索可能にする

また、UI上でのシンタックスハイライトなどに使われる例もあるようです。

次回のご案内

以上、今回は「tree-sitter」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #71 - OpenShell」ということで、NVIDIAが公開したAIエージェントのためのランタイム「OpenShell」がテーマです!

https://generative-agents.connpass.com/event/388576/generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!