[翻訳] なぜLangChainなのか？

[Why LangChain? \| 🦜️🔗 LangChain](https://python.langchain.com/docs/concepts/why_langchain/)の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Pythonパッケージの`langchain`の企業としてのLangChainのゴールは、推論を行うアプリケーションの構築を開発者にとって可能な限り簡単なものにすることです。LangChainは元々は単一のオープンソースパッケージとしてスタートしましたが、会社と全体的なエコシステムへと進化しました。このページでは、全体としてのLangChainのエコシステムに関してお話しします。LangChainのコンポーネントのほとんどは単体で使用できるので、特定のコンポーネントを活用しても構いませんし、全く問題ありません！ご自身のユースケースに最も適したコンポーネントを選択してください！

# 機能

LangChainが取り組もうとする主要な要件がいくつか存在します:

1. **標準化されたコンポーネントインタフェース:** AIアプリケーションにおけるモデルと関連コンポーネントの数は増加し続け、結果として、開発者が学び、活用する必要のあるAPIの種類は膨大なものになっています。この多様性は、開発者がアプリケーションを構築する際にプロバイダーを切り替えたり、コンポーネントを組み合わせることを困難にします。LangChainはキーとなるコンポーネントに対する標準インタフェースを公開するので、プロバイダー間での切り替えが容易となります。
1. **オーケストレーション:** アプリケーションは複雑になり、複数のコンポーネントやモデルを組み合わせることになり、[多様なタスクを達成](https://www.sequoiacap.com/article/generative-ais-act-o1/)できる[コントロールフローにこれらの要素を効率的に接続する要件が高まっています](https://lilianweng.github.io/posts/2023-06-23-agent/)。そのようなアプリケーションの構築においては[オーケストレーション](https://en.wikipedia.org/wiki/Orchestration_(computing))が重要となります。
1. **観測可能性と評価:** アプリケーションはさらに複雑になると、それらの内部で何が起きているのかを理解することが非常に困難になります。さらに、[選択のパラドクス](https://en.wikipedia.org/wiki/Paradox_of_choice)によって開発のペースが制限されることもあり得ます。例えば、多くの場合において開発者は、プロンプトをどのようにエンジアリングするのか、どのLLMが最も精度、レイテンシー、コストのバランスを取るのかに迷うことになります。[観測可能性](https://en.wikipedia.org/wiki/Observability)と評価は、開発者が自身のアプリケーションをモニタリングし、自信を持ってこのような質問に迅速に回答する助けとなります。

# 標準化されたコンポーネントインタフェース

LangChainは、多数のAIアプリケーションの中心となるコンポーネントの共通インタフェースを提供します。例としては、すべての[チャット](https://python.langchain.com/docs/concepts/chat_models/)モデルは[BaseChatModel](https://python.langchain.com/api_reference/core/language_models/langchain_core.language_models.chat_models.BaseChatModel.html)を実装しています。これによって、チャットモデルとやり取りを行うための標準化された手段を提供し、[ツール呼び出し](https://python.langchain.com/docs/concepts/tool_calling/)や[構造化アウトプット](https://python.langchain.com/docs/concepts/tool_calling/)のように重要ではありますが多くの場合にプロバイダー固有となる機能をサポートします。

## 例: チャットモデル

多くの[モデルプロバイダー](https://python.langchain.com/docs/concepts/chat_models/)では、開発者が特定のスキーマにマッチするようにモデルのレスポンスを要求できる[ツール呼び出し](https://python.langchain.com/docs/concepts/tool_calling/)のように多くのアプリケーション([エージェント](https://langchain-ai.github.io/langgraph/concepts/agentic_concepts/)など)で重要な機能をサポートしています。プロバイダーごとにAPIは異なります。LangChainの[チャットモデル](https://python.langchain.com/docs/concepts/chat_models/)インタフェースは、[ツール呼び出し](https://python.langchain.com/docs/concepts/tools/)をサポートするためにモデルに[ツール](https://python.langchain.com/docs/concepts/tools/)をバインドする共通の手段を提供します。

```py
# Tool creation
tools = [my_tool]
# Tool binding
model_with_tools = model.bind_tools(tools)
```

同様に、モデルに[構造化アウトプット](https://python.langchain.com/docs/concepts/structured_outputs/)を生成させることは非常に一般的なユースケースとなっています。プロバイダーはこれに対して、[JSONモードやツール呼び出し](https://platform.openai.com/docs/guides/structured-outputs)を含む異なるアプローチをサポートしています。LangChainの[チャットモデル](https://python.langchain.com/docs/concepts/chat_models/)インタフェースは、`with_structured_output()`を用いた構造かアウトプットを生成するための共通の手段を提供します。

```py
# Define schema
schema = ...
# Bind schema to model
model_with_structure = model.with_structured_output(schema)
```

## 例: リトリーバ

[RAG](https://python.langchain.com/docs/concepts/rag/)とLLMアプリケーションコンポーネントの文脈において、LangChainの[リトリーバ](https://python.langchain.com/docs/concepts/retrievers/)インタフェースは、様々なデータサービスやデータベース([ベクトルストア](https://python.langchain.com/docs/concepts/vectorstores/)やデータベースなど)に接続するための標準的な手段を提供します。リトリーバの背後の実装は、接続しようとするデータストアやデータベースの種類に依存しますが、すべてのリトリーバは[runnableインタフェース](https://python.langchain.com/docs/concepts/runnables/)を実装しているので、共通の方法で呼び出すことを意味します。

```py
documents = my_retriever.invoke("What is the meaning of life?")
```

# オーケストレーション

個々のコンポーネントの標準化は有用ですが、我々は開発者たちがより複雑なアプリケーションにコンポーネントを*組み合わせ*たいケースを多く目撃しました。これが[オーケストレーション](https://en.wikipedia.org/wiki/Orchestration_(computing))の要件の契機となりました。このオーケストレーションレイヤーがサポートすべきLLMアプリケーションの共通した特性がいくつか存在します:

- **複雑なコントロールフロー:** アプリケーションはサイクルのような複雑なパターンを必要とします(条件を満たすまで繰り返されるループなど)。
- [**永続化**](https://langchain-ai.github.io/langgraph/concepts/persistence/): アプリケーションは[短期あるいは長期記憶](https://langchain-ai.github.io/langgraph/concepts/memory/)を維持する必要があります。
- [**人間の介在**](https://langchain-ai.github.io/langgraph/concepts/human_in_the_loop/): アプリケーションは、停止、レビュー、編集、特定のステップの承認のように人間の介在を必要とします。

複雑なアプリケーションでコンポーネントをオーケストレートする推奨の手段が[LangGraph](https://langchain-ai.github.io/langgraph/concepts/high_level/)となります。LangGraphは一連のノードとエッジとしてアプリケーションのフローを表現することで、開発者に高いレベルのコントロールを提供するライブラリです。LangGraphは、[永続化](https://langchain-ai.github.io/langgraph/concepts/persistence/)、[人間の介在](https://langchain-ai.github.io/langgraph/concepts/human_in_the_loop/)、[記憶](https://langchain-ai.github.io/langgraph/concepts/memory/)、その他の機能に対するビルトインサポートも提供しています。[エージェント](https://langchain-ai.github.io/langgraph/concepts/agentic_concepts/)や[マルチエージェントアプリケーション](https://langchain-ai.github.io/langgraph/concepts/multi_agent/)を構築する際に特に適しています。重要なことですが、個々のLangChainのコンポーネントは、LangGraphのノードとして使用できますが、LangChainコンポーネントなしにLangGraphを使うことも可能です。

:::note info
**追加資料**
複雑なアプリケーションを構築するためのLangGraphの使い方を学ぶには無料のコースの[Introduction to LangGraph](https://academy.langchain.com/courses/intro-to-langgraph)をご覧ください。
:::

# 観測可能性と評価

AIアプリケーション開発のペースは、多くの場合において選択のパラドクスがあることから高品質の評価による制限を受けます。多くの場合、開発者は自身のプロンプトをどのようにエンジニアリングするのか、どのLLMが精度、レイテンシー、コストのバランスを取るのかに迷うことになります。高品質なトレーシングや評価は、自信を持ってこれらの質問に迅速に回答する助けとなります。[LangSmith](https://docs.smith.langchain.com/)は、AIアプリケーションの観測可能性と評価をサポートする我々のプラットフォームです。詳細については、[評価](https://docs.smith.langchain.com/concepts/evaluation)と[トレーシング](https://docs.smith.langchain.com/concepts/tracing)に関する我々のコンセプトガイドをご覧ください。

:::note info
**追加資料**
詳細については、[LangSmith tracing and evaluations](https://youtube.com/playlist?list=PLfaIDFEXuae0um8Fj0V4dHG37fGFU8Q5S&feature=shared)に関する動画リストをご覧ください。
:::

# まとめ

LangChainは、いくつかの個別の利点をもたらす、数多くのAIアプリケーションの中心となるコンポーネントに対する標準インタフェースを提供します。

- **プロバイダーの切り替えを容易に:** 背後のコードを変更する必要なしに、さまざまなコンポーネントプロバイダーを切り替えることができます。
- **高度な機能:** [ストリーミング](https://python.langchain.com/docs/concepts/streaming/)や[ツール呼び出し](https://python.langchain.com/docs/concepts/tool_calling/)のようなより高度な機能に対する共通のメソッドを提供します。

[LangGraph](https://langchain-ai.github.io/langgraph/concepts/high_level/)は、複雑なアプリケーションのオーケストレートを可能にし、[永続化](https://langchain-ai.github.io/langgraph/concepts/persistence/)、[人間の介在](https://langchain-ai.github.io/langgraph/concepts/human_in_the_loop/)、[記憶](https://langchain-ai.github.io/langgraph/concepts/memory/)のような機能を提供します。


[LangSmith](https://docs.smith.langchain.com/)は、あなたのアプリケーションをテスト、評価するためのLLM固有の観測可能性と、フレームワークを提供することで、あなたのアプリケーションに対して自信を持ってイテレーションできるようにします。