LangSmithで生成AI管理を効率化

## はじめに
生成AI、特にLangChainのAgent等の利用を進める中で、その管理の手間や煩雑さに悩む場面が増えてきました。生成AIの効果的な運用には実行結果の評価が不可欠ですが、これをExcelなどの従来のツールで行うには限界があり、データ量や管理の手間が増えるにつれて効率的な管理が難しくなります。

そこで調査を進めた結果、LangSmithというツールにたどり着きました。このツールを利用することで、生成AIの実行結果を一元的に管理し、評価作業を効率化できることがわかりました。この記事では、LangSmithの基本的な使い方や具体的な活用方法について、実際に学習した内容を基に詳しく解説します。生成AIの運用効率を高めたい方や評価管理に課題を感じている方にとって、この記事が役立つ情報源となれば幸いです。

## LangSmithとは

LangSmithは、プロトタイプから製品版への移行をスムーズにするためのプラットフォームです。簡単に言うと、「LangChainを本番環境で運用する際の便利ツール」です。このツールを使うことで、以下のような3つの機能を活用できます。

1. **LLMの実行ログの収集**
   - **モニター機能**: モデルの動作状況をリアルタイムで監視可能。  
   - **デバッグ機能**: 問題発生時に原因を特定しやすく、迅速な対応が可能。

2. **LLMの出力結果のデータセット化**
   - **データ収集機能**: 生成された出力結果を効率的に収集し、データセットとして体系化。  
   - **再利用可能**: 必要に応じて過去のデータを活用可能。

3. **モデルの評価**
   - **検証機能**: 登録したデータセットを使用して、モデルの出力結果を評価。  
   - **品質向上**: 継続的な評価により、モデルの精度やパフォーマンスを改善。

LangSmithは、生成AIを本番環境で運用する際に欠かせないツールとして、開発者やデータサイエンティストにとって強力なサポートを提供します。
## 使い方
本章では、LangSmithのAgent機能を活用して、以下の問いに対する回答を得た場合について詳しく解説します。今回利用するAgentは、Web検索と計算を組み合わせることで、複雑な質問にも柔軟に対応できるよう設定されています。
```
日本で2番目に高い山の名前と標高と世界で2番目に高い山の名前と標高、またそれらの標高を足すと何メートルになるかをそれぞれ教えてください。
```

### LangSmithのアカウント登録
LangSmithを利用するためには、まず[公式ページ](https://smith.langchain.com/)にアクセスしてアカウントを作成し、ログインする必要があります。アカウント登録は簡単で、必要な情報を入力するだけで手続きが完了します。

利用プランは複数用意されていますが、個人利用の場合は「Developer」プランを選択するのが適しているでしょう。このプランは無料で利用できるため、初めてLangSmithを試すユーザーにおすすめです。ただし、業務利用やチームでの活用を考える場合は、提供されている有料プランも検討して、自分のニーズに最も合ったものを選ぶと良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/16d04e4c-43b6-17ac-70d5-ba091b6cd50d.png)

### API keyの発行
LangSmith（LangChain）のAPI Keyを発行する手順について説明します。まず、アカウントにログインした後、画面の左下にある「Settings」項目をクリックします。これにより、API Key発行専用の画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/de8087be-e2a8-f2c0-d583-c5430fd25736.png)

API Keyの発行画面では、Keyに関する説明を自由に入力できるフィールドがあります。ここにはAPI Keyの利用目的や用途を簡潔に記載しておくと、後で管理がしやすくなります。説明を入力したら、「Create API Key」ボタンを押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/d0fbf674-0cc4-254e-533f-43f51e0f2443.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/e6114904-e329-bdae-3788-5fac3f0d11b4.png)

次に、生成されたAPI Keyが表示されます。このKeyはセキュリティ上の理由から、初回発行時にしか表示されません。そのため、必ず表示されたKeyを安全な場所にメモしておいてください。Keyを紛失すると再発行が必要となり、手間がかかるため注意しましょう。

### 環境変数の設定
LangSmithを使用する際には、以下の3種類の環境変数を適切に設定する必要があります。これにより、各種機能が正常に動作し、スムーズな運用が可能になります。

1. **LangSmith用の環境変数**  
    LangSmith関連の設定には以下が含まれます：  
    - **トレースの有無**（`LANGCHAIN_TRACING_V2`）：トレース機能を有効にするかどうかを指定します。  
    - **API Key**（`LANGCHAIN_API_KEY`）：LangSmithの認証に必要なキーです。  
    - **プロジェクト名**（`LANGCHAIN_PROJECT`）：プロジェクトを特定するために使用されます。  
2. **OpenAIのAPI Key**  （`OPENAI_API_KEY`）  
    LangSmithでOpenAIのサービスを利用する場合に必要です。ChatGPTなどを活用する際に設定します。
3. **検索用APIのAPI Key**  （`SERPAPI_API_KEY`）  
    Web検索を行う際に利用します。ただし、検索を使用しない場合は設定不要です。

```python
import os

# Langsmith用の環境変数
os.environ['LANGCHAIN_TRACING_V2'] = "true"
os.environ['LANGCHAIN_API_KEY'] = '<your-api-key>'
os.environ["LANGCHAIN_PROJECT"] = "LangSmith_test_project"

# OpenAI用のAPI Keyの設定
os.environ['OPENAI_API_KEY'] = '<your-openai-api-key>'

# 検索APIのAPI Key設定
os.environ["SERPAPI_API_KEY"] =  '<your-serp-api-key>'
```

### Agent処理実行
今回の設定では、LLM（大規模言語モデル）として`gpt-4o`を使用します。このモデルは高度な言語処理能力を持ち、複雑な質問にも対応できるため、優れた応答を提供します。また、Agentのtoolには`"serpapi"`と`"llm-math"`を選択しています。  

- **`"serpapi"`**は、Web検索を通じて最新情報を取得するのに適しており、リアルタイムのデータが必要なタスクで役立ちます。  
- **`"llm-math"`**は、数学的な計算やデータの数値処理を行うために利用されます。  

さらに、AgentTypeには`ZERO_SHOT_REACT_DESCRIPTION`を指定しています。この設定は、あらかじめ詳細な指示を与えなくても、各ツールの機能を自動的に理解して適切に活用することが可能です。

これらの設定は用途に応じてカスタマイズする必要がありますが、正しく選択することで効率的なタスク遂行が実現します。
```python
from langchain.chat_models import ChatOpenAI
from langchain.agents import AgentType, initialize_agent, load_tools


llm = ChatOpenAI(temperature=0, model="gpt-4o")
tools = load_tools(["serpapi","llm-math"], llm=llm)
agent = initialize_agent(
    tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=False
)

input_message="日本で2番目に高い山の名前と標高と世界で2番目に高い山の名前と標高、またそれらの標高を足すと何メートルになるかをそれぞれ教えてください。"

# 処理の実行
agent.run(input_message)
```

実行が完了すると、コンソール上に詳細な回答が表示されるでしょう。
```
日本で2番目に高い山は北岳で、標高は3,193メートルです。世界で2番目に高い山はK2で、標高は8,611メートルです。それらの標高を足すと11,804メートルになります。
```

### 結果確認 - LLMの実行ログの収集
Agentの実行が完了すると、LangSmithのダッシュボード上で結果を確認できます。結果は、ダッシュボード内の**Tracing projects**タブで管理され、ここでは環境変数`LANGCHAIN_PROJECT`で指定したプロジェクト名ごとに実行データが整理されています。プロジェクト一覧画面では、各プロジェクトに関連する実行の情報として、使用したトークン数（および推定価格）、実行時間、使用したツールの詳細などが表示されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/676261af-a27a-ed7e-2ddf-3da2d422d391.png)

プロジェクト名をクリックすると、さらに詳細な実行ごとのデータにアクセスできます。ここでは、各実行における入出力の内容、トークン数（および推定価格）、実行時間、使用されたAgentTypeなどの情報がリスト化されており、一目で実行結果を確認することが可能です。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/f2cb8510-df03-9b1f-0ef9-8b78e6ca5eda.png)

さらに、特定の実行結果をクリックすると、処理の詳細が表示される画面が開きます。この画面では、実行中に発生した中間結果やプロセスの流れが可視化され、具体的にどのような処理が行われたかを把握できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/9d879738-7108-affa-498f-9f5a5329e592.png)

たとえば、今回のケースでは以下の流れで処理が行われていることが確認できます：  
1. **ChatOpenAI**で処理の方針を決定。  
2. 必要な情報を**検索**（`serpapi`ツールを使用）。  
3. 取得した情報を基に**計算**（`llm-math`ツールを使用）。  

このようにLangSmithのダッシュボードは、実行プロセスを詳細に把握し、プロジェクトを効率的に管理するための強力なツールとなっています。

### 結果保存 - LLMの出力結果のデータセット化
上記で確認した実行結果をデータセットとして登録する手順について説明します。LangSmithでは、トレースしたデータを効果的に管理・分析するために、データセットを簡単に作成し、結果を登録することができます。  

まず、ダッシュボードで対象となる実行結果を確認した後、該当データの**Add to**ボタンをクリックし、メニューから**Add to Dataset**を選択します。この操作により、データセットに追加するための設定画面が表示されます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/9e802834-c40c-1694-e690-ae1082f88624.png)
次に、新しいデータセットを作成します。この際、データセット名を入力し、必要に応じて説明を加えると、後で管理が容易になります。作成したデータセットに今回の実行データを登録することで、他のデータと区別しながら整理することが可能です。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/57777cc2-8678-77c8-af42-f369a2be39a7.png)
登録が完了すると、LangSmithのダッシュボード内にある**Datasets & Experiments**タブから、作成したデータセットを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/564feb6d-03b9-048a-74f9-515b3ea8878b.png)
このタブでは、各データセットの内容や関連する実行結果を一覧で閲覧することができるほか、必要に応じてデータセットの**ダウンロード**を行うことも可能です。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/267a4449-752c-5109-bd9b-b15f38fad7cd.png)
この機能を活用することで、実行データの再利用や分析をスムーズに行うことができ、LangSmithをさらに効率的に活用することができます。
### モデルの評価
LangSmithでは、作成したデータセットを評価することで、モデルのパフォーマンスを検証し、改善の方向性を見極めることができます。今回は、簡単な例として`EvaluatorType`に`qa`を指定し、質問に対する回答が妥当かどうかをLLMを用いて評価する手順を紹介します。  

#### 評価の準備  
`qa`タイプの評価では、データセット内の質問に対してモデルが生成した回答と、正解データの比較を行います。ただし、運用環境では、事前に用意したデータセットを用いて評価を行うことが一般的です。この場合、評価の要件に応じて適切な`EvaluatorType`を選択する必要があります。LangSmithが提供する多様な評価タイプについては、以下の公式ドキュメントを参考にしてください：  
[EvaluatorType一覧](https://api.python.langchain.com/en/latest/langchain/evaluation/langchain.evaluation.schema.EvaluatorType.html#langchain.evaluation.schema.EvaluatorType)  

#### 評価の実行  
以下のコードを用いて評価を実行します：  
```python
from langsmith import Client
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.smith import RunEvalConfig, run_on_dataset

def construct_chain():
    llm = ChatOpenAI(temperature=0, model="gpt-4o")
    return LLMChain.from_string(llm, "What's the answer to {input}")

client = Client()
eval_config = RunEvalConfig(
    evaluators=[
        "qa"
    ],
)
chain_results = run_on_dataset(
    client,
    dataset_name="test-dataset",
    llm_or_chain_factory=construct_chain,
    evaluation=eval_config,
)
```

評価の実行が完了すると、LangSmithのダッシュボード内の**Datasets**画面に結果が反映されます。たとえば、今回の例では評価結果が**Correct**と表示されており、モデルの出力が期待通りであることを示しています。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/85b5c1ea-d3ba-13ef-171a-c92568798bba.png)

#### 詳細な実行結果の確認  
評価結果をクリックすると、より詳細な情報を確認できます。この画面では、事前に登録したデータセットとモデルの出力との類似度が可視化され、どのような基準で「妥当」と判定されたのかを確認することが可能です。今回の例では、登録済みの正解データと生成された回答との一致率が高く、問題ないと判断されています。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504436/f0e98e29-f1cc-c013-f88b-537c87e99da3.png)

#### 運用における注意点  
運用環境では、評価の精度を高めるため、以下のポイントに注意することが重要です：  
1. **適切なEvaluatorTypeの選択**：タスクの種類に応じて最適な評価手法を選ぶ。
2. **データセットの充実**：網羅的なデータセットを用意し、幅広いケースでモデルを検証する。  
3. **評価結果のフィードバック**：評価結果を基にモデルを改善するサイクルを確立する。  

このように、LangSmithの評価機能を活用することで、モデルのパフォーマンスを継続的に向上させ、より信頼性の高いAIアプリケーションを構築することが可能です。

## 最後に
以上のように、LangSmithを活用することで、LLMモデルの入出力の記録、管理、評価を一元的に行うことができます。特に、業務でAgentを頻繁に利用する場合、その効果を実感しやすいツールです。私がLangSmithの最大の利点だと感じるのは、入出力の記録が非常に見やすく、特に中間結果を直感的に把握できる点です。中間結果が視覚的に整理されていることで、トラブルシューティングやプロセスの最適化が容易になります。  

LangSmithのダッシュボードは操作が簡単で、プロジェクトの進捗状況やモデルのパフォーマンスをリアルタイムで追跡することが可能です。また、評価機能を活用すれば、生成した出力の品質やタスク適合性を効率的に検証できるため、業務の効率化にも繋がります。  

LLMの入出力管理や評価に悩んでいる方、特にトレース機能が必要な方には、LangSmithをぜひ試してみることをお勧めします。その使いやすさと多機能性が、日々の業務を大きくサポートしてくれるはずです。