Appearance
第4章 AWS上でのLangChain / LangGraphの構築と連携
4.1 LangChain / LangGraphとBedrockの接続方法
LangChainおよびLangGraphは、AWSとの連携をサポートするための専用パッケージ langchain-aws を提供しています。これを使用することで、前章で解説したAmazon Bedrock上の各種AIモデルを、他のLangChainコンポーネントと同じ方法で簡単に組み込むことができます。
以下は、ChatBedrock クラスを初期化し、LangGraphのグラフ構成ノード内で呼び出すためのPythonコード例です。
python
from typing import Annotated, Sequence, TypedDict
from langchain_aws import ChatBedrock
from langchain_core.messages import BaseMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
# 1. 状態(State)の定義
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], add_messages]
# 2. Bedrockを呼び出すLLMオブジェクトを初期化します
# langchain-awsで提供されている ChatBedrock クラスを使用します
llm = ChatBedrock(
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0", # 利用するモデルID
model_kwargs={"temperature": 0.5}, # パラメータ設定
region_name="us-east-1" # リージョン
)
# 3. ノード関数の定義
def call_agent(state: AgentState):
# ChatBedrockオブジェクトにメッセージ履歴を渡して呼び出します
response = llm.invoke(state["messages"])
return {"messages": [response]}
# 4. グラフの構築
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_agent)
workflow.add_edge(START, "agent")
workflow.add_edge("agent", END)
app = workflow.compile()Ollama(ローカル)からBedrock(クラウド)へのスムーズな移行
開発中は自分のPC(ローカル環境)で Ollama を使ってテストを行い、本番運用時にクラウド上の Amazon Bedrock へ切り替える、という運用は極めて簡単に行えます。
LangChainでは、Ollama接続用の ChatOllama クラス(langchain-community パッケージ)と、Bedrock接続用の ChatBedrock クラスは、どちらも BaseChatModel という共通のインターフェース(仕様)を継承しています。そのため、初期化するクラスのみを環境に応じて切り替えれば、プロンプトの連結処理やLangGraphのグラフ構造といったアプリ本体のプログラムコードは1文字も変更する必要がありません。
以下は、環境変数 ENV の値に基づいて、接続先のAIモデルを動的に切り替える実装コード例です。
python
import os
from langchain_aws import ChatBedrock
from langchain_community.chat_models import ChatOllama
# 環境変数が "production"(本番)かどうかで切り替えます
IS_CLOUD = os.getenv("ENV") == "production"
if IS_CLOUD:
# クラウド環境(AWS BedrockのClaude 3.5 Sonnetを使用)
llm = ChatBedrock(
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
region_name="us-east-1"
)
else:
# ローカル開発環境(OllamaのLlama 3を使用)
llm = ChatOllama(
model="llama3",
base_url="http://localhost:11434"
)
# ーーー これ以降の処理はローカル・クラウドで共通です ーーー
# どちらのLLMであっても、全く同じ記述で呼び出せます
response = llm.invoke("こんにちは")移行時の注意点
- AIの「賢さ」による動作の差: ローカルで動作する軽量モデル(Ollama)と、クラウドの高性能モデル(BedrockのClaude等)では、指示に従う能力に大きな差があります。特にLangGraphでツールの呼び出し判断をAIに任せる場合は、ローカル環境でも比較的性能の高いモデル(
llama3.1:8bやqwen2.5:14bなど)を選択することが推奨されます。 - パッケージのインストール: ローカル開発とAWSデプロイの双方に備え、
langchain-communityとlangchain-awsの両方のライブラリをプロジェクトにインストールしておきます。
4.2 AWS環境(ECS / Lambda)におけるエージェントアプリケーションの配備構成
作成したLangGraphのAIエージェントを実際に本番のAWS上で稼働させるための、代表的な配備構成を2パターン紹介します。
パターンA: ECS + FargateによるAPIサーバー構成(推奨)
ユーザーからのリクエストを受けて自律的に思考し、複数のツールを何度も呼び出すエージェントの場合、全体の処理が完了するまでに数十秒〜数分かかることがあります。この場合は、ECSとFargateを組み合わせてWeb APIサーバー(例: FastAPI)をコンテナとして常時起動させる構成が適しています。
- 状態(State)の永続化: コンテナの再起動などで会話データが消えないよう、チェックポインタの保存先にはメモリ(MemorySaver)ではなく、AWSの高速なNoSQLデータベースサービスである「Amazon DynamoDB」などを指定して保存します。
- セキュリティと認証: ECSのタスクに対して「IAMロール」を付与することで、プログラムコードの中にAWSのアクセスキーやAPIキーを直接書き込むことなく、安全にBedrockのAPIを呼び出せます。
以下は、一般的なECS + Fargateによる構成イメージです。
パターンB: AWS Lambdaによるサーバーレス構成
処理時間が15分以内に確実に収まるような、小規模な定型タスクを実行するエージェントの場合は、AWS Lambda(ラムダ)にDockerコンテナイメージをデプロイして動かす「サーバーレス構成」が費用を最も低く抑えられます。
- メリット: リクエストが来た瞬間だけコンテナが立ち上がって処理を実行し、実行が終われば自動で停止するため、無駄な待機費用(基本料金)が一切発生しません。完全に使った分だけの従量課金になります。
以下は、一般的なAWS Lambdaによる構成イメージです。
4.3 FastAPIの代替としてのASP.NET Coreとの連携構成
Python製のWebフレームワークである FastAPI の代わりに、C#製の ASP.NET Core をWeb APIサーバーとして採用する場合、LangChain / LangGraph(Python製)とどのように連携させるかによって、2パターンの設計構成が考えられます。
パターン1: マルチリンガル(APIとAI処理の分離)構成
既存のC#による業務システム、データベースアクセス、認証基盤などを ASP.NET Core で構築し、AIエージェント(LangGraph)のみを別の独立したPythonコンテナとして動作させ、VPC(プライベートネットワーク)内でgRPCまたはREST APIを用いて通信・連携させます。
- メリット: LangGraphなどPythonでしか提供されていない最新のAIライブラリ資産を100%活用しつつ、既存の.NETエコシステムに統合できます。
- 配備構成: ECSとFargate上に、ASP.NET Core用のコンテナとPythonエージェント用のコンテナの2つを配置します。
以下は、一般的なマルチリンガル連携の構成イメージです。
パターン2: 完全.NET(C#によるAI構築)構成
Python環境をインフラ内に一切用意せず、C#のコードだけでAPIサーバーとAI処理のすべてを完結させる構成です。この場合、Microsoftがオープンソースで提供しているAIオーケストレーションフレームワークである「Semantic Kernel(セマンティック・カーネル)」を ASP.NET Core のアプリケーション内部に組み込んで使用します。
- メリット: 起動するコンテナイメージがC#の1つだけで済むため、インフラのデプロイや保守管理が極めてシンプルになります。
- 配備構成: 従来の .NET アプリケーションと同様に、ECS/FargateまたはAWS App Runnerなどにコンテナをデプロイして動かします。
以下は、完全.NET構成のイメージです。