🩹

LLMの弱点を補完するagent-lisp-paren-aid

に公開

はじめに

前回の記事(LLMはなぜLispが苦手なのか)で、LLMがLispの括弧を正しく生成できない問題について考察しました。今回は、この問題を実用的に解決するためのツール「agent-lisp-paren-aid」を開発したので、その紹介をします。

コーディングエージェントでLispプログラミングをしている皆さんにとって、このツールは必須のアイテムになるかもしれません。

問題の再確認

まず、LLMが抱える問題を簡潔に整理しておきます:

  1. 括弧の数が合わない:開き括弧と閉じ括弧の総数が一致しない
  2. インデントは正しい:Pythonのようにインデントで構造を表現する感覚では正しい
  3. 修正が困難:LLMが自分で括弧を数えて修正するのは苦手

これらの問題により、生成されたLispコードは構文エラーで実行できない状態になります。
更に、LLMは自分で括弧を数えるのが苦手なので、一度括弧が狂ったLispコードを生成してしまうと延々と試行錯誤して復帰できなくなります。

agent-lisp-paren-aidとは

agent-lisp-paren-aid」は、LLMが生成するLispコードの括弧対応を自動でチェックし、問題があれば正確な行番号を報告するツールです。

paren_fix1.png

基本的な使い方

# 基本的な使い方
$ 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機能を活用している点です。

問題箇所の特定アルゴリズム

  1. トークナイザーによる基本解析

    • コメント行と文字列リテラル内の括弧を無視
    • 括弧の総数をチェック
  2. Emacsを使った差分検出

    • 問題のあるファイルを/tmpにコピー
    • Emacsのindent-regionで再インデント
    • 元ファイルとの差分を検出
    • 最初に差分が現れた行番号を問題箇所として特定
  3. 問題の種類判定

    • インデントが深くなった場合:括弧不足
    • インデントが浅くなった場合:括弧過剰

この手法により、「インデントは正しいが括弧の数がおかしい」という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コードを生成または修正した際:

  1. コードを保存
  2. agent-lisp-paren-aid-linuxを実行
  3. 問題が検出された場合は、指定された行番号のみを修正
  4. 再度チェックを実行
  5. okが出るまで繰り返し

このワークフローにより、LLMは自分で括弧を数える必要がなくなり、確実に正しいLispコードを生成できます。

特殊ケースへの対応

構造的不整合の検出

括弧の総数が一致していても、構造的に不整合な場合も検出できます:

(defun test ()
  (let ((a 1))
    (+ a 2)))  ; 括弧が1つ多い
  (message "done"))  ; この行がずれる

このような場合でも、Emacsの再インデント機能により正確な問題箇所を特定できます。

段階的な修正

複数の不整合があっても、最初の1件のみを報告します。これにより、エージェントが混乱することなく、段階的に修正を進められます。

配布とインストール

シングルバイナリ版は依存関係なしでインストールできるため、コーディングエージェントの環境に導入しやすくなっています。

最後に

いかがでしたでしょうか。

このツールは、LLMの性能が向上すれば将来的には不要になる可能性のある「一時的なソリューション」かもしれません。しかし現在のところ、Lispを扱うコーディングエージェントには必須のツールです。

LLMの弱点を理解し、適切な補完ツールを提供することで、人間とAIの協働をより効率的にできるのではないでしょうか。Lispでコーディングエージェントを活用している方は、ぜひお試しください。

Discussion