LangGraph API serverをCloud Runでデプロイする
はじめに
株式会社ファースト・オートメーションCTOの田中(しろくま)です!
LangGraph API serverのデプロイ方法を色々調べていて、Cloud Runでデプロイしたかったので、その方法をご紹介できればと思います。
そもそもLangGraphはデプロイ周りの仕組みがかなり整備されており、以下のような環境を使用することで、簡単にデプロイが可能です。
ただ、私も上記2つを試してみたのですが、LangSmithは設定がDev用の環境だと1CPU、メモリ1GBで、もう少しリソースを拡張したかったのと、Vertex AIの方はパッケージの依存関係が解決できずに途中で諦めたというのがあり、Cloud Runでデプロイしてみることにしました。
必要なリソース
LangGraph API serverはチャットの履歴も管理しているため、デプロイ時には外部記憶周りの設定も必要になります。
最低、以下の3つが実行に必要なリソースになります。
- APIサーバ実行用の計算環境
- PostgreSQLのデータベース
- Redisサーバ
これらをGoogle Cloudでデプロイする上で、PostgreSQLはCloud SQL、RedisはMemorystoreを使用するようにしました。
MemorystoreのVPCネットワークにCloud RunからアクセスするためにServerless VPC accsssを構築し、そこにCloud Runからアクセスするようにします。
それなりに構築するリソースがあるので、今回はterraformを用いて、デプロイコードを作成することにしました。
サンプルLangGraphアプリ
今回デプロイするサンプルのLangGraphアプリを作りました。
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(temperature=0, model_name="gpt-4o-mini")
class State(TypedDict):
messages: Annotated[list, add_messages]
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
ノードが一つだけのミニマムグラフで、以下のコマンドでローカル実行することができます。
langgraph dev
立ち上げて http://127.0.0.1:2024/docs
にアクセスするとAPIのドキュメントを見ることができます。
このアプリをDocker Image化して、Artifact Registryに登録しようと思うのですが、langgraphコマンドから Dockerfile
と docker-compose.yml
を自動で生成することができます。
langgraph dockerfile Dockerfile --add-docker-compose
ここで、生成された docker-compose.yml
ファイルの中身を見てみます。
volumes:
langgraph-data:
driver: local
services:
langgraph-redis:
image: redis:6
healthcheck:
test: redis-cli ping
interval: 5s
timeout: 1s
retries: 5
langgraph-postgres:
image: pgvector/pgvector:pg16
ports:
- "5433:5432"
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
command:
- postgres
- -c
- shared_preload_libraries=vector
volumes:
- langgraph-data:/var/lib/postgresql/data
healthcheck:
test: pg_isready -U postgres
start_period: 10s
timeout: 1s
retries: 5
interval: 60s
start_interval: 1s
langgraph-api:
ports:
- "8123:8000"
depends_on:
langgraph-redis:
condition: service_healthy
langgraph-postgres:
condition: service_healthy
environment:
REDIS_URI: redis://langgraph-redis:6379
POSTGRES_URI: postgres://postgres:postgres@langgraph-postgres:5432/postgres?sslmode=disable
healthcheck:
test: python /api/healthcheck.py
interval: 60s
start_interval: 1s
start_period: 10s
env_file:
- .env
build:
context: .
dockerfile: Dockerfile
ファイルの中身を見ると、Langgraph API server内で、 REDIS_URI
と POSTGRES_URI
の環境変数を設定することで、PostgreSQLとRedisに接続できることが分かります。
なので、後ほどterraform内でこの2つの環境変数を設定するようにします。
アーキテクチャ
使用したGoogle Cloudのリソースは以下になります。
- Cloud Run
- Cloud SQL
- Memorystore
- Serverless VPC access
- Secrets Manager
- Artifact Registry
そして、以下が実際にGoogle Cloud内に構築したアーキテクチャ図です。
今回、シークレットにOpenAIのAPIキーとLangSmithのAPIキーを設定しています。
実際のコードは以下になります。
まとめ
様々なAIエージェントのフレームワークが登場していますが、その中でもLangGraphは比較的長い間使われており、そのおかげかいろいろなツールとの連携機能が揃っているのが便利なところかなと思います。
LangGraph自体がホスティング環境を用意してくれていたり、Vertex AIなど便利なものもありますが、今回のようにCloud Runでもデプロイできればいろいろと利用シーンの幅が広がるかなと思ってます。
最後までお読みいただきありがとうございました。
最後に宣伝ですが、株式会社ファースト・オートメーションは一緒に働いて下さる仲間を絶賛募集中です!
- AIエージェントを使ったLLMのプロダクトに興味がある
- 生成AIの社会実装に貢献したい
- 製造業をより良くしたい
といったことに少しでも興味がある方、ぜひ下記応募リンクからご連絡下さい!
Discussion