Evaluating Skills
LangChain は、コーディングエージェントの性能を最適化するための「スキル」評価パイプラインとベストプラクティスを共有し、動的なツール提供によるパフォーマンス向上の重要性を説いている。
キーポイント
スキルの定義と動的ロードの仕組み
スキルはエージェントのパフォーマンスを向上させるためのキュレーションされた指示やスクリプトであり、タスクに関連する際にのみ動的に読み込まれる(プログレッシブ・ディスクロージャー)ことで、ツール過多による性能低下を防ぐ。
評価パイプラインの標準化
Claude Code などのエージェントに対して、スキルなしとありでタスクを実行し、パフォーマンスを比較する定型的なテスト手順(定義→実行→比較→反復)が提案されている。
クリーンなテスト環境の重要性
スキルの効果を正確に測定するためには、外部要因を排除したクリーンなテスト環境を設定し、エージェントがスキル情報をどのように利用しているかを厳密に検証する必要がある。
影響分析・編集コメントを表示
影響分析
この記事は、生成 AI エージェントの実用化におけるボトルネックである「ツール過多による性能劣化」に対する解決策として、動的なスキル管理と評価フレームワークの重要性を浮き彫りにしています。開発者がエージェントのパフォーマンスを最大化するための具体的なプラクティスを提示することで、業界全体でのコーディングエージェントの信頼性と実用性を高める基盤となる内容です。
編集コメント
コーディングエージェントの実用化において、単にツールを追加するだけでなく、いかにして必要な情報を適切なタイミングで提供するかという「評価」の視点が欠けていたが、この記事はその重要な指針を示している。

*By Robert Xu*
最近、LangChain では、Codex や Claude Code、Deep Agents CLI といったコーディングエージェントが、当社のエコシステムである LangChain および LangSmith と連携して動作できるよう、「スキル(Skills)」の構築に取り組んでいます。これは当社独自の取り組みではなく、ほとんどの企業(いや、すべての企業が)が、コーディングエージェントに付与するスキルの作成方法を模索している状況です。これらのスキルを構築する際の重要な要素の一つは、実際に機能することを確認することです。本ブログでは、スキルを作成する際にどのように評価すべきかについて、得られた知見とベストプラクティスをご紹介します。
スキルとは何か?
スキルとは、専門分野におけるエージェントのパフォーマンスを向上させるために厳選された指示、スクリプト、リソースのことです。重要な点として、スキルは段階的な開示(progressive disclosure)を通じて動的に読み込まれます。つまり、エージェントは現在の実行タスクに関連する必要がある場合にのみ、該当するスキルを取得します。これにより、エージェントのパフォーマンスをスケールさせることが可能になります。歴史的に見て、エージェントに対してツールを与えすぎると、そのパフォーマンスが低下することが知られています。
実際には、スキルはエージェントが必要になったときに動的に読み込まれるプロンプトと考えることができます。あらゆるプロンプトと同様に、それらは予期せぬ方法でエージェントの行動に影響を与える可能性があります。したがって、スキルも LLM プロンプト(Large Language Model prompts)をテストするのと同じようにテストする必要があります。どのスキルがコーディングエージェントのパフォーマンスを向上させるのでしょうか?また、どのようなコンテンツの変更が最も大きな改善をもたらしたのでしょうか?
基本的な評価パイプライン
スキルをテストするための私たちの基本的なアプローチは以下の通りです。
- クロードコード(Claude Code)に成功してほしいタスクを定義する
- そのタスクを支援するスキルを定義する
- スキルなしでクロードコードにタスクを実行させる
- スキルありでクロードコードにタスクを実行させる
- パフォーマンスを比較し、スキルについて反復的に改善する
以下では、独自の評価パイプラインを作成する際の経験から得たベストプラクティスをいくつか共有します。
ステップ 1: クリーンなテスト環境のセットアップ
スキルは、コーディングエージェントであるクロードコードや、Deep Agents などのハーンネス(harnesses)と併用されることが一般的です。スキルをテストする際、実際にはこれらの強力なエージェントがスキル情報を効果的に活用できるかどうかを検証しています。つまり、エージェントのパフォーマンスが向上するかどうかが焦点であり、実務的にはコーディングエージェント自体をテストしていることになります。
コーディングエージェントやハルネスは、操作可能な広大なアクション空間を持っています。また、開始条件にも敏感です:Claude Code は作業を開始する前にディレクトリを探索することが多く、そこで発見された内容がそのアプローチを形作ります。これはつまり、スキルをテストする際には、エージェントが使用するスキルのために一貫性がありクリーンな環境を整えることが極めて重要であることを意味します。これにより、テストの再現性を最大化できます。
私たちのテストでは、Claude Code を実行するために軽量な Docker スキャフォールドを使用しました。他の選択肢としては Harbor や、お好みのサンドボックスがあります。
def run_claude_in_docker(
test_dir: Path, prompt: str, timeout: int = 300, model: str = None
) -> subprocess.CompletedProcess:
"""Docker で Claude CLI を実行します。CompletedProcess を返します。"""
if not check_docker_available():
raise RuntimeError("Docker が利用できません")
cmd = ["run-claude", str(test_dir), prompt, "--timeout", str(timeout)]
if model:
cmd.extend(["--model", model])
try:
return run_shell("docker.sh", *cmd, timeout=timeout + 30, check=False)
except subprocess.TimeoutExpired:
return subprocess.CompletedProcess(cmd, 124, "", f"{timeout}s 後にタイムアウト")
ステップ 2:タスクの定義
コーディングエージェントがスキルによって改善しているかどうかを「雰囲気」で感じ取ろうとするのは魅力的ですが、パフォーマンスは異なるタスク間で変動する可能性があります。明確に定義されたタスクは、回帰(regression)を検出するための体系的なベンチマークを提供します。タスク構築から得た教訓には以下が含まれます:
制約のあるタスクを作成する
- 自由な出力は評価が難しく、特にコーディングエージェントにおいては顕著です。Claude Code に LangChain エージェントを作成させて研究を行わせるよう指示した場合、そのアプローチは多岐にわたる可能性があります。Claude Code が生成したエージェントの品質を評価するのは困難であり、エージェント設計に対して過度に厳格な要件を課すと、有効な研究成果を生み出す既存の解決策が不当にペナルティを受けることになります。
- 私たちが有用だと見出した戦略の一つは、バグのあるコードを Claude Code に修正させることです。これにより設計空間が制約され、正しさの検証が容易になります。もし結果として生成されたエージェントが事前定義されたテストで依然としてバグのある動作を示す場合、Claude の解決策を安全に不合格と判定できます。また、設計チェックもより堅牢(brittle)になりませんでした。なぜなら Claude は既存のアプローチを使用するよう事前に準備されていたからです。
明確な指標とタスクを組み合わせる
- スキルがコードエージェントの改善に寄与しているかを定量化するには、明確な指標が不可欠です。私たちが追跡した指標の一部は以下の通りです:スキルが呼び出されたか?逆に、関連性がない場合にスキルが呼び出されなかったか?
- エージェントがタスクを完了できたか?一つのタスクには複数の異なるステップが含まれる場合があり、完了したステップ数を追跡することで、「完全な失敗」と「ほぼ成功」を区別できました。
- Claude Code がタスクを完了するために何ターン必要だったか?スキルなしでも Claude Code がタスクを完了できる場合であっても、スキルを含めることで効率性が向上する可能性があります。
- Claude Code がタスクを実際に完了するのに要したリアルタイムの時間はどのくらいか?効率性を測定する際、すべてのターンが等価ではありません。
- これらの指標と、各実行ごとにそれらがどのように変化するかを LangSmith の評価機能で追跡しました。これにより、実験結果を理解するための単一の統合ビュー(シングル・パイン・オブ・グラス)が得られました。
難易度への過度な依存は避ける
- スキルを評価する際、あなたはコーディングエージェントまたはハネスを通じてそれを行います。コーディングエージェントはすでに非常に優れた問題解決者です。もしタスクを過度に敵対的あるいは複雑にしすぎると、スキルそのものではなく、コーディングエージェントの問題解決能力を試すリスクが生じます。
- 実際のコーディングエージェントで観察した失敗に基づいてタスクを設定するのは有用です。ヒューリスティックとして、失敗につながる最も単純なテストケースを作成することを目標とすべきです。例えば、Claude Codeが評価子をLangSmithに効果的にアップロードすることに苦労していることに気づきました。私たちのテストケースでは、Claude に「このデータセットを用いて、トラジェクトリ評価子を作成し、それを LangSmith にアップロードしてください」と尋ねました。
例題タスク
内部テストにおいて、私たちは Claude を基本的な LangChain および LangSmith のタスクで評価しました。これが例のタスクの姿です:
// TASK
LangSmith プロジェクト内の最新の 5 つのトレースから 5 つの例を含むトラジェクトリデータセットを作成し、ツール呼び出しの一致率を測定する評価子を作成してください。
出力: trajectory_dataset.json および trajectory_evaluator.py
(両方を「bench-{run_id}」として LangSmith にアップロード)
作成したコードは直接実行してください。
この一部として、trajectory_dataset.json の作成が期待されます。以下のような指標を用いて出力をスコアリングできます:
必ず JSON 形式で返してください:
サンプルメトリクス、Claude が生成するデータセットを確認
def check_accuracy(runner: TestRunner):
"""軌跡が正解と一致しているか。""" # Claude の出力が正解と一致したか
dataset_file = runner.artifacts[0] # Claude の出力:trajectory_dataset.json
test_dir = Path(".")
p, f = check_trajectory_accuracy(
test_dir=test_dir,
outputs=runner.context,
filename=dataset_file,
expected_filename="expected_dataset.json", # 正解データ、expected_dataset.json
data_dir=test_dir / "data", # 正解データを保存するタスク内のフォルダ
)
for msg in p:
runner.passed(msg)
for msg in f:
runner.failed(msg)
最終的に作成したすべてのテストを確認するには、こちらのベンチマークリポジトリをご覧ください。
ステップ 3: スキルの定義
スキルを作成・反復する際、主な考慮事項は「何をコンテンツとして含めるか」および「そのコンテンツをどこに配置するか」です。スキルには通常、常にコンテキストに読み込まれる AGENTS.md または CLAUDE.md ファイルが伴います。答えるべき質問としては以下のようなものがあります。
- コンテンツは AGENTS.md(事前ロード済み)に置くべきか、それともスキル内に置くべきか?
- コンテンツは 1 つの大きなスキルにまとめるべきか、複数の小さなスキルに分割すべきか?
- パフォーマンスの差分に影響を与えずにコンテンツを削除できるか?
私たちが従った有益なガイドラインは以下の通りです。
スキルをモジュール化する
- スキルのコンテンツの異なるセクションを区切るために XML タグ(XML tags)を使用します。これによりエージェントに構造が追加されるだけでなく、A/B テストのためにセクションを置換または削除するための便利な手段も提供されます。
- 私たちは一般的に、大規模なスキル(300〜500行程度)においては、小さな書式変更や言葉遣いの変更には限定的な影響しかないと発見しました。例えば、「これを行え」という肯定的なガイダンスと「これを行うな」という否定的なガイダンス、あるいはマークダウン記法と XML タグの使用は、記録されたタスクにおいて同様のパフォーマンスを示しました。
- 反復処理(イテレーション)においては、より細粒度レベルでの最適化を行うのではなく、テストのために1つまたは複数のセクションに対して変更を加えることが一般的です。
AGENTS.md と CLAUDE.md を活用する
- 実際には、スキルが常に確実に呼び出されるわけではありません。LangChain エージェントを作成するあるタスクにおいて、Claude Code は「langchain agents」スキルを一度も呼び出しませんでした。スキルを呼び出すようプロンプトを含めても、呼び出し率は70%にしか向上しませんでした。
- AGENTS.md と CLAUDE.md はコンテキストに確実に読み込まれるため、Claude がスキルをどのように、いつ使用するかを指示する適切な場所となります。これにより、一貫したスキルの呼び出しを実現できました。
- AGENTS.md と CLAUDE.md は、複数のスキルを組み合わせて使用する方法に関するガイダンスを含めるのに適しています。LangSmith スキルを使用したタスクでは、より一貫したパス率と、必要なターン数の減少が確認されました。
スキル間でコンテンツをバランスよく配分する
- スキルの名称と説明は、Claude Code がどのスキルを呼び出すべきかを判断する上で極めて重要です。約 20 の類似した LangGraph スキルでテストを行った際、Claude Code は時として誤ったスキルを呼び出してしまいました。しかし、スキル数を 12 に減らすことで、Claude Code は一貫して正しいスキルを呼び出せるようになりました。
- スキル内容を少数のスキルに統合することで、コンテキスト(文脈)に内容がより確実に反映されるようになります。ただし同時に、一度に読み込むデータ量が大きくなり、不要なコンテンツも参照してしまう可能性があります。最適なバランスを見つけるにはテストが必要です。
ステップ 4:実行とパフォーマンス比較
スキルの検証のため、異なるスキル組み合わせで Claude Code にタスクを実行させました。テストケースには以下が含まれます:
- スキルを一切使用しない対照群(コントロールケース)
- タスクに対してすべてのスキルを使用するケース
- スキルを少数の大規模なスキルに統合して実行するケース
- スキルを複数の小規模なスキルに分割して実行するケース
各シナリオにおけるタスクの完了率を比較しました LangSmith の pytest 統合機能を使用して。スキルを含めることはほぼ常に有益であり、コンテンツの分割方法によって異なるタスクでより良いパフォーマンスを示す結果となりました。全体として、スキルを使用した場合の Claude Code はタスクを 82% の確率で完了しましたが、スキルなしの場合は 9% にまで低下しました。しかし、単にタスク完了率を比較するだけでなく、Claude がなぜ失敗したのかを理解し、スキルの改善につなげる必要がありました。
- スキル名と説明は、Claude Code がどのスキルを呼び出すべきかを判断する上で極めて重要です。約 20 の類似した LangGraph スキルでテストを行った際、Claude Code は時として誤ったスキルを呼び出してしまいました。しかし、スキル数を 12 に減らすことで、Claude Code は一貫して正しいスキルを呼び出せるようになりました。
- スキル内容を少数のスキルに統合することで、コンテキスト(文脈)に内容がより確実に反映されるようになります。ただし同時に、一度に読み込むデータ量が大きくなり、不要なコンテンツも参照してしまう可能性があります。最適なバランスを見つけるにはテストが必要です。
ステップ 4:実行とパフォーマンス比較
スキルの検証のため、異なるスキル組み合わせで Claude Code にタスクを実行させました。テストケースには以下が含まれます:
- スキルを一切使用しない対照群(コントロールケース)
- タスクに対してすべてのスキルを使用するケース
- スキルを少数の大規模なスキルに統合して実行するケース
- スキルを複数の小規模なスキルに分割して実行するケース
各シナリオにおけるタスクの完了率を比較しました LangSmith の pytest 統合機能を使用して。スキルを含めることはほぼ常に有益であり、コンテンツの分割方法によって異なるタスクでより良いパフォーマンスを示す結果となりました。全体として、スキルを使用した場合の Claude Code はタスクを 82% の確率で完了しましたが、スキルなしの場合は 9% にまで低下しました。しかし、単にタスク完了率を比較するだけでなく、Claude がなぜ失敗したのかを理解し、スキルの改善につなげる必要がありました
Docker 内で Claude Code が何をしているのか、そしてなぜそうしているのかを理解するのは容易ではありませんでした。私たちは Claude Code の軌跡を可視化する必要性がありました。テストでは LangSmith と統合し、Claude Code が行ったすべてのアクションを記録しました。これにより、どのファイルを読み込んだか、どのようなスクリプトを作成したか、またどのスキル(またはどのスキルを実行しなかったか)を呼び出したかを把握することができました。

特に重要なのは、Claude Code に自身のトレーシングスキル(tracing skill)を使用してトレースを検査し、何が起こったかを要約させることです。これにより、スキルの内容に関する反復作業が大幅に高速化されました。Claude Code はトレースを LangSmith へ送信し、それらのトレースを取得して人間が検査できる問題点を要約します。その後、人間は修正策を提案し、テストを再実行し、LangSmith の実験ポータルでパフォーマンスの変化を確認できます。

独自のスキル評価パイプラインを構築する際、優れた観測性(observability)と評価機能は不可欠です。特に Claude Code のようなエージェントが非常に強力であるため、その重要性はさらに高まります。
結論
スキルは、Claude Code、Codex、Deep Agents CLI などのコーディングエージェントの能力を強化するための有用な手段です。LLM やエージェントに関わる他のコンポーネントと同様に、スキルも有用であるためには評価が必要です。
これらを実際に確認するには、こちらのベンチマークリポジトリをご覧ください。
これらの知見が、皆様ご自身でスキルを構築する際の有用な評価ヒューリスティック(評価の指針)となることを願っています。スキル評価を始められる方は、LangSmith の評価プラットフォームもぜひご覧ください!
関連コンテンツ
image.png)
エージェントアーキテクチャ
LangSmith
オープンソース
LangSmith と LangChain OSS が EU AI 法(EU Artificial Intelligence Act)の要件達成をどのように支援するか


J. Talbot,
B. Weng
2026 年 4 月 27 日
7 分
image.png)
エージェントアーキテクチャ
パートナー
エージェントエンジニアリング:AI エージェントの群れがソフトウェアエンジニアリングをどのように再定義しているか


R. Kumar,
P. Ramagopal
2026 年 4 月 17 日
6 分

エージェントアーキテクチャ (Agent Architecture)
ディープエージェント (Deep Agents)
オープンソース (Open Source)
バックグラウンドでサブエージェントを実行する


H. Lovell,
C. Francis
2026 年 4 月 16 日
4 分
エージェントが実際に何をしているかを確認する
エージェントエンジニアリングプラットフォームである LangSmith は、開発者がすべてのエージェントの意思決定をデバッグし、変更の評価を行い、ワンクリックでデプロイできるように支援します。
原文を表示

*By Robert Xu*
Recently at LangChain we’ve been building skills to help coding agents like Codex, Claude Code, and Deep Agents CLI work with our ecosystem: namely, LangChain and LangSmith. This is not an effort unique to us - most (if not all) companies are exploring how to create skills to give to coding agents. A key part of building these skills is making sure they actually work. In this blog, we cover some learnings and best practices for how to evaluate skills as you create them.
What are Skills?
Skills are curated instructions, scripts, and resources that improve agent performance in specialized domains. Importantly, skills are dynamically loaded through progressive disclosure — the agent only retrieves a skill when it’s relevant to the task at hand. This helps agents scale their performance; historically, giving too many tools to an agent would cause its performance to degrade.
In practice, skills can be thought of as prompts that are dynamically loaded when the agent needs them. Like any prompt, they can impact agent behavior in unexpected ways. Consequently, skills need to be tested, just like you would your LLM prompts. Which skills improve coding agent performance? Which content changes resulted in the most improvement?
The Basic Evaluation Pipeline
Our basic approach for testing skills:
- Define tasks you want Claude Code to successfully complete
- Define skills that help with the tasks
- Run Claude Code on the tasks without skills
- Run Claude Code on the tasks with skills
- Compare performance and iterate on your skill
Below, we share some best practices from our experiences on creating your own evaluation pipeline.
Step 1: Set Up a Clean Testing Environment
Skills are commonly used with coding agents like Claude Code, or harnesses like Deep Agents. When you’re testing a skill, you’re really testing if these powerful agents can use the skill information effectively. You’re testing if the agent’s performance improves — so in practice, you’re testing the coding agent itself.
Coding agents and harnesses have a large action space they can operate over. They are also sensitive to starting conditions: Claude Code will often explore your directory before it starts working, and what it finds will shape its approach. This means when testing skills, it’s critical to prepare a consistent and clean environment for the agent using your skills. It ensures you maximize the reproducibility of your tests.
In our testing, we used a lightweight Docker scaffold to run Claude Code in. Other alternatives include Harbor or your choice of sandbox.
def run_claude_in_docker(
test_dir: Path, prompt: str, timeout: int = 300, model: str = None
) -> subprocess.CompletedProcess:
"""Run Claude CLI in Docker. Returns CompletedProcess."""
if not check_docker_available():
raise RuntimeError("Docker not available")
cmd = ["run-claude", str(test_dir), prompt, "--timeout", str(timeout)]
if model:
cmd.extend(["--model", model])
try:
return run_shell("docker.sh", *cmd, timeout=timeout + 30, check=False)
except subprocess.TimeoutExpired:
return subprocess.CompletedProcess(cmd, 124, "", f"Timeout after {timeout}s"Step 2: Define the Tasks
While it’s tempting to rely on vibes to feel whether your coding agent improves with skills, performance can and will vary over different tasks. Clearly defined tasks provide a systematic benchmark to catch regressions. Lessons we learned from building tasks include:
Create Constrained Tasks
- Open-ended output is difficult to grade, especially with coding agents. If we asked Claude Code to create a LangChain agent to do research, it could take a variety of approaches. Grading the quality of the agent Claude Code produced is difficult, and being too prescriptive on the agent design penalizes working solutions that produce valid research.
- One strategy we found helpful was to have Claude Code fix buggy code. This constrained its design space, and made it easier to validate correctness: if the resulting agent still produced buggy behavior on predefined tests, we could safely fail Claude’s solution. Additionally, design checks were less brittle, as Claude was primed to use our existing approach.
Pair Tasks with Clear Metrics
- Clear metrics are critical to quantifying whether your skill improves the coding agent. Some metrics we tracked were:Was the skill invoked? And vice versa, was the skill not invoked when it wasn’t relevant?
- Did the agent accomplish the task? One task might involve several different steps, and tracking the number of completed steps helped separate ‘total failure’ from ‘almost worked’.
- How many turns did Claude Code take to complete the task? Even if Claude Code could complete the task without skills, including skills might improve efficiency.
- How long did Claude Code take in real time to complete the task? Not every turn is equal when it comes to measuring efficiency.
- We tracked these metrics, as well as how they change each run, with LangSmith evaluations. This gave us a single pane of glass for understanding experiment results.
Don’t Overindex on Difficulty
- When you evaluate a skill, you’re doing it through a coding agent or harness. Coding agents are already very good problem solvers. If you make your tasks too adversarial or convoluted, you risk testing the coding agent’s problem solving capability rather than your skill.
- It’s useful to base tasks on real failures you’ve observed in your coding agent. As a heuristic, you should aim to create the most straightforward test case that leads to the failure. For example, we noticed Claude Code struggled to effectively upload evaluators to LangSmith. Our test case asked Claude, “given this dataset, create a trajectory evaluator and upload it to LangSmith”.
Example Task
In our internal tests, we evaluated Claude on basic LangChain and LangSmith tasks. This is what an example task might look like:
// TASK
Create a trajectory dataset with 5 examples from the 5 most recent traces
in our LangSmith project, plus an evaluator measuring tool call match percentage.
Output: trajectory_dataset.json and trajectory_evaluator.py
(upload both as "bench-{run_id}" to LangSmith)
Run any code you write directly.As part of this, we would expect it to create a trajectory_dataset.json. We can score the output with a metric like the below:
# SAMPLE METRIC, checks the dataset Claude generates
def check_accuracy(runner: TestRunner):
"""Trajectories match ground truth.""" # Did Claude's output match ground truth
dataset_file = runner.artifacts[0] # Claude's output: trajectory_dataset.json
test_dir = Path(".")
p, f = check_trajectory_accuracy(
test_dir=test_dir,
outputs=runner.context,
filename=dataset_file,
expected_filename="expected_dataset.json", # Ground Truth, expected_dataset.json
data_dir=test_dir / "data", # folder in task where we store ground truth
)
for msg in p:
runner.passed(msg)
for msg in f:
runner.failed(msg)To see all the tests we ended up writing, see our benchmarking repo here.
Step 3: Define the Skills
In creating and iterating on skills, the primary considerations are what content to include, and where to put that content. Skills often come with AGENTS.md or CLAUDE.md files that are always loaded into context. Some questions to answer are:
- Should content be in AGENTS.md (pre-loaded) or in a skill?
- Should content be in one large skill or split across multiple smaller skills?
- Can content be removed without impacting performance deltas?
Helpful guidelines we followed were:
Make Skills Modular
- We use XML tags to delineate different sections of a skill’s content. This not only adds structure for the agent, it provides a convenient way to substitute or remove sections to A/B test skills.
- We generally found that for larger skills (300-500 lines), small formatting or wording changes had limited impact. For example, positive (“do this”) vs. negative (“don’t do this”) guidance, and markdown vs. XML tags had similar performance on recorded tasks.
- When iterating, we generally make changes to one or more sections for testing, rather than optimizing at a more granular level.
Leverage AGENTS.md and CLAUDE.md
- In practice, skills are not always invoked reliably. On one task to create a LangChain agent, Claude Code never invoked the “langchain agents” skill. Even including a prompt to invoke skills only brought invocation rate up to 70%.
- Because AGENTS.md and CLAUDE.md are loaded into context reliably, it’s a good place to tell Claude how and when to use skills. This allowed us to achieve consistent skill invocation.
- AGENTS.md and CLAUDE.md are good places to include guidance on using multiple skills together. We saw more consistent pass rates with fewer turns taken in tasks using LangSmith skills.
Balance Content Across Skills
- Skill names and descriptions are critical for Claude Code to determine which skill to call. In tests where we ran with ~20 similar LangGraph skills, Claude Code would sometimes call the wrong skills. At 12 skills, Claude consistently called the correct skills.
- Consolidating skill content in a small number of skills means that content will make it into context more consistently — however, it also means Claude Code is loading in larger chunks at a time, and potentially sees content it doesn’t need. Finding the right balance takes testing!
Step 4: Run and Compare Performance
To test our skills, we ran Claude Code on our tasks, with different combinations of skills. Some test cases included:
- Control case where we ran Claude Code with no skills
- Running Claude Code with all skills on the task
- Running Claude Code with skills consolidated into a few large skills
- Running Claude Code with skills split across smaller skills
We compared the completion rate of tasks under each scenario using LangSmith’s pytest integration. Including the skills was almost always beneficial, and different splits of content performed better on different tasks. Overall, Claude Code with skills completed tasks 82% of the time, but performance dropped to 9% without skills. However, more than just comparing task completion rate, we needed to understand *why* Claude failed so we could iterate on the skill.
It was non-trivial to understand what Claude Code was doing within Docker, and why — we needed observability into Claude Code’s trajectory. In our tests, we integrated with LangSmith to capture every action Claude Code took. We could understand what files it read, which scripts it created, and which skills it did (or did not) invoke.

Critically, we had Claude Code use its own tracing skill to inspect the traces and summarize what happened. This made iterating on skill content much faster. Claude Code would send traces to LangSmith, pull down those traces, and summarize issues for a human to inspect. The human could then propose fixes, rerun tests, and see how performance changed in LangSmith’s experiment portal.

When setting up your own skill evaluation pipeline, having good observability and good evaluation is critical — particularly because agents like Claude Code are so powerful.
Conclusion
Skills are a useful way to enhance the capabilities of coding agents, including Claude Code, Codex, or Deep Agents CLI. Just like other components involving LLMs and agents, skills need to be evaluated to be useful.
To see all of this in action - see our benchmarking repo here.
We hope these learnings provide good evaluation heuristics when you build your own skills. For those of you getting started with evaluating skills, check out LangSmith’s evaluation platform!
Related content
.png)
Agent Architecture
LangSmith
Open Source
How LangSmith and LangChain OSS Help You Meet EU AI Act Requirements


J. Talbot,
B. Weng
April 27, 2026
7
min
.png)
Agent Architecture
Partner
Agentic Engineering: How Swarms of AI Agents Are Redefining Software Engineering


R. Kumar,
P. Ramagopal
April 17, 2026
6
min

Agent Architecture
Deep Agents
Open Source
Running Subagents in the Background


H. Lovell,
C. Francis
April 16, 2026
4
min
See what your agent is really doing
LangSmith, our agent engineering platform, helps developers debug every agent decision, eval changes, and deploy in one click.
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み