grep が LSP に勝つ?コーディングエージェントが高機能ツールを無視する理由
Grep beats LSP? Why coding agents ignore your fancier tools
コーディングエージェントは、より正確な結果を返すLSPベースのセマンティックナビゲーションよりも、grepを使うことが多い。その理由を探る小規模な調査では、タスクによってツールの選択が変わり、単純なコード位置特定ではgrepがほぼ常に選ばれる一方、参照完全性タスクではLSPが約半数のケースで選ばれた。また、LSPの結果にソースコードのコンテキストを含めると、エージェントの成功率が向上し、ファイル読み取り回数が減少した。この結果は、ツールの精度だけでなく、モデルが使いやすいインターフェースと出力形式が重要であることを示している。
ツールは、結果が正確だからといってモデルにとって使いやすいわけではない。次のステップに十分なコンテキストを返し、モデルが直接利用できるインターフェースと出力形式で提示しなければならない。
HNでの議論
63- tonyarkles
最近、Claude Code を使っていて興味深い共進化を経験している。タスクを頼むと、その作業内容(多くの場合、find や grep、ripgrep を多用している)を眺め、タスク完了後に「この作業を楽にするツールはあったか?」と尋ねるようにしている。その結果、fzf やその他のツール(例えばメールのインデックス作成用の notmuch など)を知ることができた。そして、それらのツールを自分のワークフロー(CLI と Emacs の両方)に取り入れる方法を学んだ。また、一緒に Python ツールも開発した。それは、よく処理・分析するかなり遅いデータ形式を扱うもので、コーパス全体にインデックスを付け、分析時には(私自身または Claude Code が)Parquet への単一パス変換を行い、それを DuckDB でクエリできるようにするものだ。このツールにより、一回限りの分析タスクのターンアラウンドタイムが劇的に改善された。また、Typer を使用した Python CLI ツールとして、インターフェースも LLM ハーネスが扱いやすいように見つけやすくなっている。
- nomilk
少し脱線するが、私の LSP 設定は数ヶ月ごとに壊れる。もう直そうとも思わず、~/dotfiles で LLM を開いて、動くまで文句を言う。通常は数分で直る。興味深いのは、これにどれだけの労力がかかるかを観察することだ。(これにより、過去の自分に対してずっと共感できるようになった。不器用な人間が、こんなことをどうやって知り、推論できたのか?特に、数ヶ月前に触って以来、設定をほとんど忘れていた場合には。)多くの場合、10〜20 個の非常に小さなプログラムが連携して、望ましい体験を提供している。「LSP が動かない」といった一見単純な問題を解決するのに必要な分数とトークン数は、予想以上に大きくなることがある。
- the_duke
私は、コードのスパースな AST を出力できる自作ツールで大きな成功を収めている。https://github.com/theduke/smartedit このスキルをインストールすると、GPT 5.6 は通常自動的にそれを使用し、コード探索時間とトークン使用量を大幅に削減できる。例えば、ファイル内の型と関数を本体なしで出力し、必要なときだけ展開する。 (注:編集機能もあるが、それはあまりうまく機能しない。モデルがポストトレーニングで一般的な編集ツールに強く偏っているためだ。)
- x-complexity
LSP のセットアップが適切に機能するには、2 つの要件がある。(a) LSP のツールが有能に構築され、一貫性があること、(b) それを使用する LLM が LSP を一般的に使用するように適切にトレーニングされていること。grep のようなネイティブツールを使用する場合も同じ 2 つの仮定があるが、(a) は grep のコア機能の固定化(良いことだ)によって満たされ、(b) は、LLM が「LSP の背後にある grep の 20 番目の変種で、カーブボールを投げるほど十分に異なる」ものではなく、grep 自体を適切に使用するようにトレーニングできるため、さらに満たされる。さらに、grep はデフォルトの Linux 環境にほぼ常に存在するため、その存在は想定され、必要なときに頼りにできる。
- brunoborges
私にとってうまく機能しているのは、LSP を頻繁に使用するように指示する SKILL を持つことだ。LSP は、すでにローカルでコンパイルされた依存関係を使用する場合に最適に機能するが、すべてのソースが利用可能な場合は、うーん... どちらが最適かについて確固たる答えはまだない。しかし、繰り返すが、すでにコンパイルされた依存関係(Java バイトコードを考えてみてほしい)の場合、LSP 設定がないと、エージェントは JAR ファイルからバイナリを抽出し、grep と javap を使用し、.class ファイルの逆コンパイルを試みる可能性が高い。