LLMの弱点を補完するagent-lisp-paren-aid
はじめに
前回の記事(LLMはなぜLispが苦手なのか)で、LLMがLispの括弧を正しく生成できない問題について考察しました。今回は、この問題を実用的に解決するためのツール「agent-lisp-paren-aid」を開発したので、その紹介をします。
コーディングエージェントでLispプログラミングをしている皆さんにとって、このツールは必須のアイテムになるかもしれません。
問題の再確認
まず、LLMが抱える問題を簡潔に整理しておきます:
- 括弧の数が合わない:開き括弧と閉じ括弧の総数が一致しない
- インデントは正しい:Pythonのようにインデントで構造を表現する感覚では正しい
- 修正が困難:LLMが自分で括弧を数えて修正するのは苦手
これらの問題により、生成されたLispコードは構文エラーで実行できない状態になります。
更に、LLMは自分で括弧を数えるのが苦手なので、一度括弧が狂ったLispコードを生成してしまうと延々と試行錯誤して復帰できなくなります。
agent-lisp-paren-aidとは
「agent-lisp-paren-aid」は、LLMが生成するLispコードの括弧対応を自動でチェックし、問題があれば正確な行番号を報告するツールです。
基本的な使い方
# 基本的な使い方
$ agent-lisp-paren-aid-linux mycode.el
# 正常な場合
ok
# 括弧が多い場合
Error: line 8: There are extra 1 closing parentheses.
# 括弧が少ない場合
Error: line 9: Missing 1 closing parentheses.
シンプルな出力で、修正すべき箇所を正確に教えてくれます。
技術的な工夫
このツールの最大の特徴は、単純な括弧カウントではなく、Emacsのindent-region
機能を活用している点です。
問題箇所の特定アルゴリズム
-
トークナイザーによる基本解析
- コメント行と文字列リテラル内の括弧を無視
- 括弧の総数をチェック
-
Emacsを使った差分検出
- 問題のあるファイルを
/tmp
にコピー - Emacsの
indent-region
で再インデント - 元ファイルとの差分を検出
- 最初に差分が現れた行番号を問題箇所として特定
- 問題のあるファイルを
-
問題の種類判定
- インデントが深くなった場合:括弧不足
- インデントが浅くなった場合:括弧過剰
この手法により、「インデントは正しいが括弧の数がおかしい」というLLMの特性を逆手に取って、正確な問題箇所を特定できます。
コーディングエージェントとの統合
このツールの真価は、コーディングエージェントと組み合わせることで発揮されます。
エージェントへの指示例
AGENTS.mdやCLAUDE.mdに以下の記載を追加することで、エージェントがツールを積極的に利用するようになります:
## 編集プロセス
- Lispプログラムを編集した後は、必ず agent-lisp-paren-aid-linux を実行して、
閉じ括弧が合っているか確認してください。
もし括弧が整合していない場合は、修正すべき行番号を教えてくれます。
agent-lisp-paren-aid-linux your-lisp-program.el
もし不整合が検出されたら他の編集作業はせず、一旦指摘された行番号に括弧を補う修正のみを行って、
再度 agent-lisp-paren-aid-linux を実行するようにしてください。
LLMはLisp括弧を数えるのが苦手なため、自分で数えたり考えたりせず、必ずこのツールを使うようにしてください。
実際の動作
エージェントがLispコードを生成または修正した際:
- コードを保存
-
agent-lisp-paren-aid-linux
を実行 - 問題が検出された場合は、指定された行番号のみを修正
- 再度チェックを実行
-
ok
が出るまで繰り返し
このワークフローにより、LLMは自分で括弧を数える必要がなくなり、確実に正しいLispコードを生成できます。
特殊ケースへの対応
構造的不整合の検出
括弧の総数が一致していても、構造的に不整合な場合も検出できます:
(defun test ()
(let ((a 1))
(+ a 2))) ; 括弧が1つ多い
(message "done")) ; この行がずれる
このような場合でも、Emacsの再インデント機能により正確な問題箇所を特定できます。
段階的な修正
複数の不整合があっても、最初の1件のみを報告します。これにより、エージェントが混乱することなく、段階的に修正を進められます。
配布とインストール
- Deno版:シングルバイナリとして配布(Linux版のみ)
- GitHub:agent-lisp-paren-aid
シングルバイナリ版は依存関係なしでインストールできるため、コーディングエージェントの環境に導入しやすくなっています。
最後に
いかがでしたでしょうか。
このツールは、LLMの性能が向上すれば将来的には不要になる可能性のある「一時的なソリューション」かもしれません。しかし現在のところ、Lispを扱うコーディングエージェントには必須のツールです。
LLMの弱点を理解し、適切な補完ツールを提供することで、人間とAIの協働をより効率的にできるのではないでしょうか。Lispでコーディングエージェントを活用している方は、ぜひお試しください。
Discussion