애플리케이션 구조

애플리케이션 구조

LangSmith에 배포하려면 애플리케이션이 하나 이상의 그래프, 구성 파일(langgraph.json), 의존성을 지정하는 파일, 그리고 선택적으로 환경 변수를 지정하는 .env 파일로 구성되어야 해요. 이 페이지에서 LangSmith 애플리케이션이 어떻게 구성되는지, 배포에 필요한 설정 정보를 어떻게 제공하는지 설명드릴게요.

출처: 문서

본문

LangSmith에 배포하려면 애플리케이션이 하나 이상의 그래프, 구성 파일(langgraph.json), 의존성을 지정하는 파일, 그리고 선택적으로 환경 변수를 지정하는 .env 파일로 구성되어야 합니다.

이 페이지는 LangSmith 애플리케이션이 어떻게 구성되는지, 그리고 배포에 필요한 구성 세부 정보를 제공하는 방법을 설명합니다.

핵심 개념

LangSmith를 사용해 배포하려면 다음 정보를 제공하세요:

  1. 애플리케이션에 사용할 의존성, 그래프, 환경 변수를 지정하는 구성 파일(langgraph.json).
  2. 애플리케이션의 로직을 구현하는 그래프.
  3. 애플리케이션 실행에 필요한 의존성을 지정하는 파일.
  4. 애플리케이션 실행에 필요한 환경 변수.

팁: 프레임워크에 구애받지 않음

LangSmith Deployment는 LangGraph 그래프 배포를 지원합니다. 그러나 그래프의 노드 구현은 임의의 코드를 담을 수 있습니다. 즉 어떤 프레임워크든 노드 안에 구현해 LangSmith Deployment에 배포할 수 있습니다. 이렇게 하면 추가 LangGraph OSS API를 사용하지 않고도 핵심 애플리케이션 로직을 구현하면서, 배포, 스케일링, 관측성을 위해 LangSmith를 계속 사용할 수 있습니다. 자세한 내용은 LangSmith Deployment와 함께 모든 프레임워크 사용하기를 참고하세요.

파일 구조

Python 및 JavaScript 애플리케이션의 디렉터리 구조 예시는 다음과 같습니다:

Python (requirements.txt)

my-app/
├── my_agent # all project code lies within here
│   ├── utils # utilities for your graph
│   │   ├── __init__.py
│   │   ├── tools.py # tools for your graph
│   │   ├── nodes.py # node functions for your graph
│   │   └── state.py # state definition of your graph
│   ├── __init__.py
│   └── agent.py # code for constructing your graph
├── .env # environment variables
├── requirements.txt # package dependencies
└── langgraph.json # configuration file for LangGraph

Python (pyproject.toml)

my-app/
├── my_agent # all project code lies within here
│   ├── utils # utilities for your graph
│   │   ├── __init__.py
│   │   ├── tools.py # tools for your graph
│   │   ├── nodes.py # node functions for your graph
│   │   └── state.py # state definition of your graph
│   ├── __init__.py
│   └── agent.py # code for constructing your graph
├── .env # environment variables
├── langgraph.json  # configuration file for LangGraph
└── pyproject.toml # dependencies for your project

JS (package.json)

my-app/
├── src # all project code lies within here
│   ├── utils # optional utilities for your graph
│   │   ├── tools.ts # tools for your graph
│   │   ├── nodes.ts # node functions for your graph
│   │   └── state.ts # state definition of your graph
│   └── agent.ts # code for constructing your graph
├── package.json # package dependencies
├── .env # environment variables
└── langgraph.json # configuration file for LangGraph

참고: 애플리케이션의 디렉터리 구조는 프로그래밍 언어와 사용하는 패키지 관리자에 따라 달라질 수 있습니다.

구성 파일

langgraph.json 파일은 애플리케이션 배포에 필요한 의존성, 그래프, 환경 변수 및 기타 설정을 지정하는 JSON 파일입니다.

JSON 파일에서 지원되는 모든 키에 대한 자세한 내용은 LangGraph 구성 파일 레퍼런스를 참고하세요.

팁: LangGraph CLI는 기본적으로 현재 디렉터리의 langgraph.json 구성 파일을 사용합니다.

예시

Python

  • 의존성에는 커스텀 로컬 패키지와 langchain_openai 패키지가 포함됩니다.
  • ./your_package/your_file.py 파일에서 agent 변수가 있는 단일 그래프가 로드됩니다.
  • 환경 변수는 .env 파일에서 로드됩니다.
{
    "dependencies": [
        "langchain_openai",
        "./your_package"
    ],
    "graphs": {
        "my_agent": "./your_package/your_file.py:agent"
    },
    "env": "./.env"
}

JavaScript

  • 의존성은 로컬 디렉터리의 의존성 파일(예: package.json)에서 로드됩니다.
  • ./your_package/your_file.js 파일에서 agent 함수가 있는 단일 그래프가 로드됩니다.
  • OPENAI_API_KEY 환경 변수가 인라인으로 설정됩니다.
{
    "dependencies": [
        "."
    ],
    "graphs": {
        "my_agent": "./your_package/your_file.js:agent"
    },
    "env": {
        "OPENAI_API_KEY": "secret-key"
    }
}

의존성

애플리케이션은 (애플리케이션이 작성된 프로그래밍 언어에 따라) 다른 Python 패키지 또는 JavaScript 라이브러리에 의존할 수 있습니다.

의존성을 올바르게 설정하려면 일반적으로 다음 정보를 지정해야 합니다:

  1. 의존성을 지정하는 디렉터리의 파일(예: requirements.txt, pyproject.toml 또는 package.json).
  2. 애플리케이션 실행에 필요한 의존성을 지정하는 구성 파일dependencies 키.
  3. 추가 바이너리나 시스템 라이브러리는 LangGraph 구성 파일dockerfile_lines 키를 사용해 지정할 수 있습니다.

그래프

구성 파일graphs 키를 사용해 배포된 애플리케이션에서 사용 가능한 그래프를 지정합니다.

구성 파일에 하나 이상의 그래프를 지정할 수 있습니다. 각 그래프는 고유한 이름과 (1) 컴파일된 그래프 또는 (2) 그래프를 정의하는 함수 중 하나에 대한 경로로 식별됩니다.

LangSmith Deployment와 함께 모든 프레임워크 사용하기

LangSmith Deployment는 애플리케이션이 LangGraph 그래프로 구성되도록 요구하지만, 해당 그래프의 개별 노드는 임의의 코드를 담을 수 있습니다. 즉 LangSmith의 배포 인프라의 이점을 누리면서 노드 안에서 어떤 프레임워크나 라이브러리든 사용할 수 있습니다.

그래프 구조는 배포 인터페이스 역할을 하지만, 핵심 애플리케이션 로직은 필요에 가장 잘 맞는 도구와 프레임워크를 사용할 수 있습니다.

LangSmith로 배포하려면 다음이 필요합니다:

Python

  1. LangGraph 그래프 구조: StateGraphadd_nodeadd_edge로 그래프를 정의합니다.
  2. 임의 로직을 가진 노드 함수: 노드 함수는 어떤 프레임워크나 라이브러리든 호출할 수 있습니다.
  3. 컴파일된 그래프: 그래프를 컴파일해 배포 가능한 애플리케이션을 만듭니다.

다음 예시는 기존 애플리케이션 로직을 최소한의 LangGraph 구조로 감싸는 방법을 보여줍니다:

from langgraph.graph import StateGraph, START, END
from typing import TypedDict

# Your existing application logic using any framework
from app_logic import process_data
from app_logic import fetch_data

class State(TypedDict):
    input: str
    result: str

def my_app_node(state: State) -> State:
    """Node containing arbitrary framework code."""
    # Use any framework or library here
    raw_data = fetch_data(state["input"])
    processed = process_data(raw_data)
    return {"result": processed}

# Define the graph structure
graph = StateGraph(State)
graph.add_node("process", my_app_node)  # Add node with your logic
graph.add_edge(START, "process")  # Connect start to your node
graph.add_edge("process", END)  # Connect your node to end

# Compile for deployment
app = graph.compile()

JavaScript

  1. LangGraph 그래프 구조: StateGraphaddNodeaddEdge로 그래프를 정의합니다.
  2. 임의 로직을 가진 노드 함수: 노드 함수는 어떤 프레임워크나 라이브러리든 호출할 수 있습니다.
  3. 컴파일된 그래프: 그래프를 컴파일해 배포 가능한 애플리케이션을 만듭니다.

다음 예시는 기존 애플리케이션 로직을 최소한의 LangGraph 구조로 감싸는 방법을 보여줍니다:

import { StateGraph, START, END } from "@langchain/langgraph";
import { Annotation } from "@langchain/langgraph";

// Your existing application logic using any framework
import { processData } from "./app-logic";
import { fetchData } from "./app-logic";

const State = Annotation.Root({
  input: Annotation<string>,
  result: Annotation<string>
});

async function myAppNode(state: typeof State.State) {
  // Use any framework or library here
  const rawData = await fetchData(state.input);
  const processed = await processData(rawData);
  return { result: processed };
}

// Define the graph structure
const graph = new StateGraph(State)
  .addNode("process", myAppNode)  // Add node with your logic
  .addEdge(START, "process")  // Connect start to your node
  .addEdge("process", END);  // Connect your node to end

// Compile for deployment
export const app = graph.compile();

이 예시에서 노드 함수(Python의 my_app_node, JavaScript의 myAppNode)는 어떤 프레임워크나 라이브러리든 호출할 수 있는 코드를 담을 수 있습니다. LangGraph 구조는 단순히 배포 인터페이스와 오케스트레이션 계층을 제공합니다.

엔드투엔드 예시는 Google ADKClaude Agent SDK, Strands, CrewAI, 그리고 AutoGen 배포 가이드를 참고하세요. LangSmith는 deployments-wrap-sdk를 통해 Google ADK 지원을 추가했는데, 이는 에이전트 SDK를 감싸 LangSmith Deployment에서 실행할 수 있게 하는 확장 가능한 패키지입니다.

환경 변수

배포된 LangGraph 애플리케이션을 로컬에서 작업한다면, 구성 파일env 키에서 환경 변수를 구성할 수 있습니다.

프로덕션 배포에서는 일반적으로 배포 환경에서 환경 변수를 구성하고 싶을 것입니다.

더 알아보기