🌐

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コマンドから Dockerfiledocker-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_URIPOSTGRES_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キーを設定しています。

実際のコードは以下になります。

https://github.com/neka-nat/langgraph-google-cloud-tf-deploy

まとめ

様々なAIエージェントのフレームワークが登場していますが、その中でもLangGraphは比較的長い間使われており、そのおかげかいろいろなツールとの連携機能が揃っているのが便利なところかなと思います。
LangGraph自体がホスティング環境を用意してくれていたり、Vertex AIなど便利なものもありますが、今回のようにCloud Runでもデプロイできればいろいろと利用シーンの幅が広がるかなと思ってます。

最後までお読みいただきありがとうございました。
最後に宣伝ですが、株式会社ファースト・オートメーションは一緒に働いて下さる仲間を絶賛募集中です!

  • AIエージェントを使ったLLMのプロダクトに興味がある
  • 生成AIの社会実装に貢献したい
  • 製造業をより良くしたい

といったことに少しでも興味がある方、ぜひ下記応募リンクからご連絡下さい!
https://www.wantedly.com/projects/1856170

株式会社ファースト・オートメーション

Discussion