Serverless AI-агент на AWS: Claude + LangGraph + MLflow туториал | AiManual
AiManual Logo Ai / Manual.
02 Мар 2026 Инструмент

Построение serverless conversational AI-агента на AWS: Claude, LangGraph и MLflow — пошаговый туториал

Пошаговое руководство по созданию serverless разговорного AI-агента на AWS с использованием Claude, LangGraph для графов и MLflow для отслеживания экспериментов

Зачем строить ещё одного AI-агента? (Spoiler: чтобы он работал, пока вы спите)

В 2026 году каждый второй стартап клепает AI-агентов как горячие пирожки. Но 90% из них - хрупкие монолиты, которые падают от первого же сложного запроса. Мы построим агента, который выживет в продакшене: serverless архитектура, графовая логика LangGraph и полное отслеживание экспериментов в MLflow.

Цель: голосовой помощник для поддержки клиентов, который сам решает, когда переключать тему, запрашивать данные из базы или звать человека. Без серверов, без headaches с масштабированием и с подробными логами каждого диалога.

Внимание: AWS любит снимать деньги за каждый чих. Прежде чем запускать продакшен, поставьте бюджеты и алерты. Иначе счёт может удивить.

Архитектура: что куда и зачем

Вместо кучи скриптов, которые друг друга не понимают, мы используем чёткие слои. Если хотите глубже в архитектурные паттерны, посмотрите слоистую архитектуру для AI-приложений.

  • AWS Lambda - сердце, serverless функции, которые запускают агента по запросу.
  • LangGraph - мозг, описывает граф состояний агента: "слушаем вопрос" - "анализируем" - "действуем".
  • Claude API (через AWS Bedrock или прямое подключение) - языковая модель, которая понимает и генерирует текст. Можно использовать AITunnel для единого доступа к разным моделям, включая Claude.
  • MLflow - память, хранит все эксперименты, метрики и артефакты. Развернём на Amazon SageMaker.
  • Amazon DynamoDB - база для хранения истории диалогов.
  • Amazon API Gateway - входная точка, принимает запросы от клиентов.

Вся эта конструкция масштабируется автоматически и платит только за время работы. Идеально для стартапов с непредсказуемой нагрузкой.

1 Готовим AWS: роли, политики и слёзы

Сначала создадим IAM роль для Lambda. Она должна уметь вызывать Bedrock, писать в DynamoDB и в CloudWatch для логов.

# Создаём роль
aws iam create-role --role-name lambda-claude-agent \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {"Service": "lambda.amazonaws.com"},
        "Action": "sts:AssumeRole"
      }
    ]
  }'

# Цепляем политики
aws iam attach-role-policy --role-name lambda-claude-agent \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

aws iam attach-role-policy --role-name lambda-claude-agent \
  --policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess

aws iam attach-role-policy --role-name lambda-claude-agent \
  --policy-arn arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess

Совет: Не давайте полный доступ в продакшене. Ограничивайте политики только необходимыми действиями. Иначе один баг - и вашу базу удалят.

2 Ставим MLflow на SageMaker: следим за каждым чихом агента

MLflow - не просто для ML-экспериментов. В нём можно логировать каждый шаг агента: что спросил пользователь, что ответил Claude, какие инструменты использовал. Потом легко найти, где агент облажался.

# Установка MLflow в SageMaker Notebook
!pip install mlflow boto3

import mlflow
import boto3

# Создаём эксперимент
mlflow.set_tracking_uri("http://localhost:5000")  # Для локальной отладки
mlflow.set_experiment("claude-agent-support")

# В продакшене используем SageMaker Tracking Server
# mlflow.set_tracking_uri("https://your-sagemaker-tracking-server")

Развернуть MLflow на SageMaker можно через AWS Console или CloudFormation. Детали есть в статье про ИИ-лаборанта.

3 Пишем граф агента на LangGraph: от простого к сложному

LangGraph - это надстройка над LangChain для графов. Позволяет визуализировать и контролировать поток агента. Не путать с обычным LangChain - здесь есть циклы, условия, параллельные выполнения.

from langgraph.graph import StateGraph, END
from typing import TypedDict, List
import mlflow

class AgentState(TypedDict):
    question: str
    context: str
    answer: str
    tools_used: List[str]

def retrieve_context(state: AgentState):
    # Здесь мог бы быть поиск в базе знаний
    state["context"] = "Информация из базы: ..."
    mlflow.log_param("retrieved_context", True)
    return state

def call_claude(state: AgentState):
    # Используем Claude через Bedrock
    import boto3
    client = boto3.client("bedrock-runtime")
    
    prompt = f"Вопрос: {state['question']}\nКонтекст: {state['context']}"
    
    response = client.invoke_model(
        modelId="anthropic.claude-3-5-sonnet-20241022",
        body=json.dumps({"prompt": prompt, "max_tokens": 1000})
    )
    
    result = json.loads(response["body"].read())
    state["answer"] = result["completion"]
    
    mlflow.log_metric("claude_tokens", result["usage"]["total_tokens"])
    return state

def log_to_mlflow(state: AgentState):
    with mlflow.start_run(run_name="agent_interaction"):
        mlflow.log_params({
            "question": state["question"],
            "tools_used": state.get("tools_used", [])
        })
        mlflow.log_text(state["answer"], "answer.txt")
    return state

# Собираем граф
workflow = StateGraph(AgentState)
workflow.add_node("retrieve", retrieve_context)
workflow.add_node("claude", call_claude)
workflow.add_node("log", log_to_mlflow)

workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "claude")
workflow.add_edge("claude", "log")
workflow.add_edge("log", END)

agent = workflow.compile()

Это упрощённый граф. В реальном агенте будут ветвления: если пользователь спрашивает про счёт - идём в базу, если ругается - передаём человеку. LangGraph позволяет это описать чисто.

4 Упаковываем в Lambda: чтобы масштабировалось само

Теперь нужно завернуть нашего агента в Lambda функцию. Используем слои для зависимостей - иначе размер превысит лимит.

# lambda_function.py
import json
from langgraph.graph import StateGraph
import mlflow
import boto3

# Инициализация MLflow
mlflow.set_tracking_uri("http://your-mlflow-server:5000")

def lambda_handler(event, context):
    question = event.get("question", "")
    
    # Запускаем агента
    state = {"question": question, "context": "", "answer": ""}
    result = agent.invoke(state)
    
    return {
        "statusCode": 200,
        "body": json.dumps({"answer": result["answer"]})
    }

Создаём слой с зависимостями:

mkdir python
pip install langgraph mlflow boto3 -t python/
zip -r layer.zip python
aws lambda publish-layer-version --layer-name agent-deps \
  --zip-file fileb://layer.zip --compatible-runtimes python3.11

Потом создаём функцию Lambda, прикрепляем слой и настраиваем триггер от API Gateway. Если не хотите разбираться с API Gateway вручную, посмотрите гайд по AI Gateway на AWS AppSync - там более гибкая настройка.

5 Тестируем и смотрим метрики: где агент тупит

Запускаем несколько запросов, потом открываем MLflow UI. Видим все запуски, токены, время ответа. Если агент часто вызывает одну и ту же tool - может, стоит её оптимизировать? Если долго думает - уменьшаем контекст.

Пример метрики в MLflow:

with mlflow.start_run():
    mlflow.log_metric("response_time_ms", 450)
    mlflow.log_param("user_intent", "billing_issue")
    mlflow.log_artifact("conversation.json")

А что если Claude слишком дорогой? Альтернативы

Claude 3.5 Sonnet - мощно, но не дёшево. Если нужно экономить, есть два пути:

Самый радикальный вариант - собрать своего агента с нуля, как в туториале по созданию Claude Code. Но тогда теряете преимущества готовых инструментов.

Кому этот стек подойдёт, а кому - нет

Берите, если:

  • У вас уже есть инфраструктура на AWS и вы не хотите управлять серверами.
  • Нужен агент со сложной логикой (ветвления, циклы, инструменты).
  • Важно отслеживать каждый диалог для улучшения модели.
  • Готовы платить за удобство и масштабируемость.

Обойдите стороной, если:

Что будет дальше с агентами? (Спойлер: они станут самостоятельными)

К 2027 году, я предсказываю, агенты научатся не только отвечать на вопросы, но и сами инициировать диалоги. "Привет, я заметил, что вы три дня не заходили в приложение. Всё хорошо?" И для этого наш стек идеален: LangGraph для сложных сценариев, MLflow для анализа поведения, serverless - чтобы не платить за простои.

Начните с простого графа, добавьте пару инструментов, подключите MLflow. Через месяц у вас будет живой, обучаемый агент, который не уснёт под нагрузкой. Главное - следите за счётом от AWS.

Подписаться на канал