50代ITエンジニアが学ぶLangChainその1 - LangChainの基礎とイントロダクション

タイトルに大きな意味はありませんが、LangChainを勉強している50代のおっさんもいるんだよということを伝えたくなりました。

# 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)と評価は、開発者が自身のアプリケーションをモニタリングし、自信を持ってこのような質問に迅速に回答する助けとなります。

[Why LangChain? \| 🦜️🔗 LangChain](https://python.langchain.com/docs/concepts/why_langchain/) | [\[翻訳\] なぜLangChainなのか？ \#langchain \- Qiita](https://qiita.com/taka_yayoi/items/b979f0b6982d95e2675f)

以降では以下のサンプルをウォークスルーします。

1. [Langchainイントロダクション](https://python.langchain.com/docs/introduction/)
1. [シンプルなLLMアプリケーションの構築](https://python.langchain.com/docs/tutorials/llm_chain/)
    - [50代ITエンジニアが学ぶLangChainその2 \- シンプルなLLMアプリケーションの構築](https://qiita.com/taka_yayoi/items/d58da20d15a2074371ec)
1. [チャットボットの構築](https://python.langchain.com/docs/tutorials/chatbot/)
    - [50代ITエンジニアが学ぶLangChainその3 \- チャットボットの構築](https://qiita.com/taka_yayoi/items/2e899f9c5e840ada8cc1)
1. [RAG](https://python.langchain.com/docs/tutorials/rag/)
    - [50代ITエンジニアが学ぶLangChainその4 \- RAG](https://qiita.com/taka_yayoi/items/7ef7e096fd9179faca7d)
1. [エージェントの構築](https://python.langchain.com/docs/tutorials/agents/)
    - [50代ITエンジニアが学ぶLangChainその5 \- エージェントの構築](https://qiita.com/taka_yayoi/items/61cec4bcbb6814d2d229)

使ったノートブックはこちらで公開しています。

https://github.com/taka-yayoi/langchain_tutorial/tree/main

# LangChainイントロダクション

[Introduction \| 🦜️🔗 LangChain](https://python.langchain.com/docs/introduction/)

**LangChain**は、大規模言語モデル（LLM）を活用したアプリケーションを開発するためのフレームワークです。

LangChainは、LLMアプリケーションのライフサイクルのあらゆる段階を簡素化します：

- **開発:** LangChainのオープンソース[コンポーネント](https://python.langchain.com/docs/concepts/)と[サードパーティ連携](https://python.langchain.com/docs/integrations/providers/)を使用してアプリケーションを構築します。[LangGraph](https://python.langchain.com/docs/concepts/architecture/#langgraph)を使用して、ストリーミングと人間のループサポートを備えたステートフルエージェントを構築します。
- **プロダクション化:** [LangSmith](https://docs.smith.langchain.com/)を使用してアプリケーションを検査、監視、評価し、継続的に最適化して自信を持ってデプロイできます。
- **デプロイメント:** [LangGraphプラットフォーム](https://langchain-ai.github.io/langgraph/cloud/)を使用して、LangGraphアプリケーションを本番対応のAPIおよびアシスタントに変換します。

![](https://python.langchain.com/svg/langchain_stack_112024.svg)

LangChainは、大規模言語モデルや埋め込みモデル、ベクトルストアなどの関連技術のための標準インターフェースを実装し、数百のプロバイダーと統合しています。詳細は[integrations](https://python.langchain.com/docs/integrations/providers/)のページをご覧ください。

以降はDatabricksでサンプルを動かしていきます。

```py
%pip install -qU langchain[openai] databricks-langchain
%restart_python
```

## OpenAI

OpenAIのAPIキーは[シークレット](https://docs.databricks.com/aws/ja/security/secrets)に格納しているものを使います。

```py
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
```

LLMの動作確認をします。

```py
from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4o-mini", model_provider="openai")
model.invoke("こんにちは、世界！")
```
```
AIMessage(content='こんにちは！どんなことについてお話ししましょうか？', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 14, 'prompt_tokens': 11, 'total_tokens': 25, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_06737a9306', 'finish_reason': 'stop', 'logprobs': None}, id='run-f28b4b9c-269f-40d0-9e4c-8112d93e2df9-0', usage_metadata={'input_tokens': 11, 'output_tokens': 14, 'total_tokens': 25, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
```

Databricksの場合は、[MLflow Tracing](https://qiita.com/taka_yayoi/items/35c96ecd401c199e617b)でトレースを確認できます。

![Screenshot 2025-03-08 at 13.26.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e84ce05a-7e78-4ce8-a8c9-3ccf936501c8.png)

## Databricks

Databricksでプログラムを実行する際は、特に設定の必要なしに[基盤モデルAPI](https://docs.databricks.com/aws/ja/machine-learning/foundation-model-apis)のモデルを呼び出すことができます。

```py
from databricks_langchain import ChatDatabricks

model = ChatDatabricks(endpoint="databricks-meta-llama-3-3-70b-instruct")
model.invoke("こんにちは、世界！")
```
```
AIMessage(content='こんにちは！あなたの日はどうですか？', additional_kwargs={}, response_metadata={'prompt_tokens': 14, 'completion_tokens': 11, 'total_tokens': 25}, id='run-ddf0ca84-b217-42d6-9801-0770ee09ab8c-0')
```

Databricksの場合は別のモジュールを使っていますが、OpenAIやAnthropic、VertexAIなどであればすべて`init_chat_model`の引数を変えるだけでアクセスすることができます。このようなフレームワークがないと、それぞれのモデルプロバイダーのAPIを理解して使い分けなくてはならない訳ですね。

## アーキテクチャ

LangChainフレームワークは複数のオープンソースライブラリで構成されています。詳細は[アーキテクチャ](https://python.langchain.com/docs/concepts/architecture/)ページをご覧ください。

- **`langchain-core`**: チャットモデルやその他のコンポーネントの基本的な抽象化。
- 統合パッケージ（例: `langchain-openai`, `langchain-anthropic`など）: 重要な統合は軽量パッケージに分割され、LangChainチームと統合開発者によって共同で管理されています。
- **`langchain`**: アプリケーションの認知アーキテクチャを構成するチェーン、エージェント、および検索戦略。
- **`langchain-community`**: コミュニティによって管理されているサードパーティの統合。
- **`langgraph`**: 永続性、ストリーミング、その他の重要な機能を備えた本番対応アプリケーションにLangChainコンポーネントを組み合わせるためのオーケストレーションフレームワーク。[LangGraphのドキュメント](https://langchain-ai.github.io/langgraph/)を参照してください。

こちらに続きます。

https://qiita.com/taka_yayoi/items/d58da20d15a2074371ec

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)