LangSmith、評価機能にPytestとVitestの統合を追加
本文の状態
日本語全文を表示中
詳細モードで約10分の本文を読めます。
同じ出来事の情報源
この情報源を基点に整理
LangChain Blog
LangChain は LangSmith の評価機能に Pytest と Vitest の統合を導入し、ソフトウェアエンジニアが既存のテスト慣習で LLM アプリケーションの品質を継続的に検証できる環境を整えた。
AI深層分析を開く2026年8月26日 06:44
AI深層分析
キーポイント
主要な新機能の発表
LangSmith が Pytest および Vitest/Jest との統合機能をベータ版としてリリースし、LLM アプリケーションの評価(evals)をこれらのテストフレームワークを通じて実行可能にした。
既存開発ワークフローとの親和性
ソフトウェアエンジニアリングの背景を持つ開発者が既に慣れ親しんでいるテストインターフェースを拡張することで、LLM アプリケーションの品質維持プロセスをよりスムーズに統合する。
SDK バージョンと対応言語
この機能は LangSmith の Python および Typescript SDK の v0.3.0 で利用可能となり、ベータ版として現在提供されている。
LLM アプリのデバッグとメトリクス追跡
LangSmith は非確定的な LLM アプリのデバッグを支援し、入力・出力やスタックトレースを保存して原因特定を容易にする。従来のパス/フェイルだけでなく、フィードバックログを通じて時間経過による改善状況を追跡できる。
チーム間での結果共有と評価関数
LangSmith を利用すれば実験結果をチーム全体で共有でき、プロンプト作成や評価設計に関わる専門家の協力を促進する。Python では文字列距離などを計算する組み込み評価関数が用意されており、LLM の出力チェックを簡素化する。
重要な引用
Evaluations (evals) are an essential part of building reliable and high-quality LLM applications.
To extend this familiar interface, we’re excited to introduce a new way to run evals using LangSmith’s Pytest and Vitest/Jest integrations.
LangSmith saves inputs/outputs and stack traces from your test cases to help you pinpoint the root cause of issues.
Typically, testing frameworks focus only on pass/fail results, but testing LLM applications often requires a more nuanced approach.
編集コメントを表示
編集コメント
LLM アプリケーションの品質管理において、従来のソフトウェア開発プロセスとの統合を深める動きは不可欠である。今回の LangSmith の対応は、専門的な評価ツールへの学習コストを下げつつ、堅牢な品質保証を実現する重要なステップとなる。
Source Article
元記事を日本語で読む
本文に関係しない購読案内、埋め込み通知、サイト内プロモーションは除いています。

評価(evals)は、信頼性の高い高品質な LLM アプリケーションを構築する上で不可欠な要素です。これにより、アプリケーションのパフォーマンスを評価し、アップデートを行っても品質が一定に保たれるように確認できます。ソフトウェアエンジニアリングの背景をお持ちの方であれば、この目的のためにテストを利用していることに慣れているはずです。
その親しみやすいインターフェースを活かすため、LangSmith の Pytest および Vitest/Jest 統合を利用して評価を実行する新しい方法をぜひご活用ください。
これらの新機能は、LangSmith の Python および Typescript SDK v0.3.0 でベータ版として現在利用可能です。

LLM 評価にテストフレームワークを使う理由
すでに Pytest や Vitest/Jest をアプリケーションのテストに活用している場合、新しい LangSmith の統合機能を使えば、Pytest や Vitest が持つ柔軟性や親しみやすさ、実行時の挙動をそのままに、LangSmith の観測機能や共有機能を組み合わせることができます。これらの統合では、これまで慣れ親しんだ開発者体験(DX)をそのまま利用でき、以下のようなメリットがあります。
LangSmith でテストのデバッグを行う
LLM を活用するアプリケーションは非確定的な性質を持つため、デバッグには通常以上の複雑さが伴います。LangSmith では、テストケースからの入力・出力やスタックトレースを保存するため、問題の根本原因を特定しやすくなります。
LangSmith で指標(合格/不合格以外のデータ)をログに記録し、経時的な進捗を追跡する
従来のテストフレームワークは「合格か不合格か」の結果に焦点を当てがちですが、LLM アプリケーションのテストではよりニュアンスのあるアプローチが必要です。明確な合格・不合格の基準が存在しない場合でも、結果をログとして記録し、アプリケーションが時間とともにどのように改善されているかを把握したいケースがあります。LangSmith を使えばフィードバックを記録して経時的に比較できるため、性能低下を防ぎつつ、常に最適なバージョンのアプリケーションをデプロイできます。

チームと結果を共有する
LLM を活用した開発は、多くの場合チームでの協業が必要です。プロンプト作成や評価指標(evals)の策定プロセスには、分野の専門家が関与することが一般的です。LangSmith を使えば、実験結果をチーム全体で共有できるため、協働がよりスムーズになります。
組み込みの評価関数
Python を利用している場合、LangSmith には LLM の出力を検証するための組み込み評価関数が用意されています。例えば、expect.edit_distance() は、テスト結果と参照出力との間の文字列距離を計算するために使用されます。組み込み評価関数に関する詳細は、API リファレンスをご覧ください。
始め方
SQL クエリを生成するアプリケーションの評価方法を説明するためのシンプルなテストケースをご紹介します。このテストでは、アプリケーションがトピックから外れたユーザー入力を正しく識別できるかを確認し、その結果を LangSmith にログ出力します。テストスイートを実行すると、LangSmith 上にデータセットが作成または更新され、新しい実験(experiment)も生成されます。
Pytest の使い方
LangSmith でテストを追跡するには、@pytest.mark.langsmith デコレータを追加してください。
# tests/test_sql.py
import openai
import pytest
from langsmith import wrappers
from langsmith import testing as t
oai_client = wrappers.wrap_openai(openai.OpenAI())
# Define your app logic elsewhere:
# @traceable
# def generate_sql(user_query: str) -> str: ...
@pytest.mark.langsmith
def test_offtopic_input() -> None:
# Log the test case inputs and reference outputs.
user_query = "whats up"
t.log_inputs({"user_query": user_query})
expected = "Sorry that is not a valid question."
t.log_reference_outputs({"response": expected})
actual = generate_sql(user_query)
t.log_outputs({"response": actual})
# Use this context manager to trace any steps used for
# generating evaluation feedback separately from the
# main application logic.
with t.trace_feedback():
instructions = (
"Return 1 if the ACTUAL and EXPECTED answers are semantically equivalent, "
"otherwise return 0. Return only 0 or 1 and nothing else."
)
grade = oai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": instructions},
{"role": "user", "content": f"ACTUAL: {actual}\nEXPECTED: {expected}"},
],
)
score = float(grade.choices[0].message.content)
t.log_feedback(key="correctness", score=score)
assert actual
assert score通常通りテストを実行します:
pytest tests
この機能は、通常の pytest テスト実行と同様に動作し、すべてのテストケースの結果、アプリケーションのトレース、フィードバックのトレースを LangSmith にログ出力します。

*左から右、上から下へ:1. 特定のテストスイートの実行履歴一覧、2. テストスイート実行の結果、3. テストケースのトレース、4. テストケースフィードバックのトレース。



完全な例については、Pytest の活用ガイドをご覧ください。
Vitest での始め方
LangSmith でテストを追跡するには、テストケースを ls.describe() ブロックで囲んでください。
import * as ls from "langsmith/vitest";
import OpenAI from "openai";
import { traceable } from "langsmith/traceable";
import { wrapOpenAI } from "langsmith/wrappers/openai";
//Set OPENAI_API_KEY as an environment variable
const tracedClient = wrapOpenAI(new OpenAI());
const myEvaluator = async (params: {
outputs: { sql: string };
referenceOutputs: { sql: string };
}) => {
const { outputs, referenceOutputs } = params;
const instructions = [
"Return 1 if the ACTUAL and EXPECTED answers are semantically equivalent, ",
"otherwise return 0. Return only 0 or 1 and nothing else.",
].join("\n");
const grade = await tracedClient.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{
role: "system",
content: instructions,
},
{
role: "user",
content: `ACTUAL: ${outputs.sql}\nEXPECTED: ${referenceOutputs.sql}`,
},
],
});
const score = parseInt(grade.choices[0].message.content ?? "");
return { key: "correctness", score };
};
ls.describe("generate sql demo", () => {
ls.test(
"offtopic input",
{
inputs: { userQuery: "whats up" },
referenceOutputs: { sql: "sorry that is not a valid query" },
},
async ({ inputs, referenceOutputs }) => {
const sql = await generateSql(inputs.userQuery); //generateSql is a function that given user input, generates an SQL query given
ls.logOutputs({ sql });
const wrappedEvaluator = ls.wrapEvaluator(myEvaluator);
// Will automatically log "correctness" as feedback
await wrappedEvaluator({
outputs: { sql },
referenceOutputs,
});
}
);
});完全な例については、Vitest/Jest の活用ガイドをご覧ください。
テストフレームワークと evaluate() の違い
OpenAI Evals、Hugging Face’s Evaluate、LangSmith’s evaluate() など、主要な評価ライブラリはすべて似たような仕組みを採用しています。まずデータセットを事前に作成し、次に生成関数と評価器のセットを定義して、そのデータセットに対して実行します。
このアプローチは、エージェントの入出力をブラックボックステストするなど、同じ評価セットをデータセット全体で繰り返し実行するユースケースでは非常に有効です。しかし、私たちはいくつかのケースでこの手法が不十分だと感じています。
そこで、私たちが構築した多くのアプリケーション(動画解説も近日公開予定)に、新しい Pytest および Vitest/Jest の統合機能を導入しました。これにより、以下の 3 つの主要なメリットが得られることが確認されています:
各テストケースごとに特化した評価ロジックの実装。
アプリケーションの特定の部分を評価したい場合、evaluate() を使うよりも、例と評価ロジックをテストケースとして定義する方が柔軟で直感的です。例えば、複数のツールにアクセスできるエージェントをテストする場合、各ツールの呼び出し能力を検証したいはずです。しかし、2 つのツールに対する評価方法は全く異なることが多く、グローバルな評価関数を定義するのは手間がかかります。
新しいテスト統合を使えば、それぞれのカスタム評価ロジックを持つ個別のテストケースを用意できます。その様子を確認するには、チュートリアル をご覧ください。
ローカル環境でのリアルタイムフィードバック
テストフレームワークはテストステータスに対してリアルタイムのフィードバックを提供します。これにより、アプリケーションをローカルで反復開発する際や、一部をモック化して評価ロジックを素早く検証する際に、問題点を早期に発見・修正しやすくなります。
CI パイプラインとの統合
CI パイプラインの一部として評価を実行すれば、回帰問題を早期に検出できます。テストフレームワークは、パス/フェイルの基準定義や CI ワークフロー内でのアサーションエラー発生を自然にサポートしています。
今後数週間で、この設定をさらに容易にする GitHub Action をリリース予定です。
試してみましょう!
Pytest や Vitest/Jest を活用した評価(evals)の実行方法について、新しいアプローチをご紹介できることを嬉しく思います。まずは開発者向けチュートリアルやハウツーガイドをご覧ください。
また、Python と TypeScript 向けの動画解説も用意しています。
フィードバックや機能リクエストがありましたら、LangChain Slack コミュニティを通じてお気軽にお知らせください。GitHub で Issue を作成 していただくことも可能です。
まだ Slack コミュニティに参加されていない方は、こちらから登録 してください。
関連コンテンツ

LangSmith
LangSmith Engine の新機能:課題検出精度が 2 倍以上に向上


T. Saltzgaber
B. Tannyhill
2026 年 8 月 25 日
5 分

LangSmith
観測性と評価
LangSmith 調整済み評価器の導入:まずは「知覚エラー」から



J. Broekhuizen,
S. Karkhanis,
V. Trivedy
2026 年 8 月 18 日
5 分

パートナー
スケールするエージェント型コマース:LangChain エージェントが安全に取引を行う




S. Tangedipalli,
K. Singh,
N. Okoroafor,
M. Samhitha Vangara,
C. Shriyan
2026 年 8 月 17 日
10 分
エージェントの真の動作を確認する
エージェントエンジニアリングプラットフォーム「LangSmith」を使えば、開発者はすべてのエージェントの判断をデバッグし、評価の変更を検証し、ワンクリックでデプロイすることが可能です。
今日のまとめ
AIデイリーブリーフで今日の重要ニュースをまとめ読み