Uso de DynamoDB como almacén de puntos de control para los agentes de LangGraph
LangGraph
El paquete de langgraph-checkpoint-aws proporciona una clase de DynamoDBSaver que implementa la interfaz de puntos de control de LangGraph, lo que le permite conservar el estado del agente en DynamoDB con la descarga opcional de Amazon Simple Storage Service para puntos de control grandes.
Características principales de
- Persistencia del estado
-
Guarda automáticamente el estado del agente tras cada paso, lo que permite a los agentes reanudar su actividad tras una interrupción y recuperarse de los errores.
- Limpieza basada en el periodo de vida
-
Elimine automáticamente los puntos de control antiguos utilizando el periodo de vida de DynamoDB para administrar los costos de almacenamiento.
- Compresión
-
Si lo desea, comprima los datos de los puntos de control con gzip para reducir los costos de almacenamiento y mejorar el rendimiento.
- Descarga de Amazon S3
-
Descargue automáticamente los puntos de control de gran tamaño (superiores a 350 KB) a Amazon Simple Storage Service para cumplir con los límites de tamaño de los elementos de DynamoDB.
- Compatibilidad con sincronización y asincronización
-
API sincrónicas y asincrónicas para ofrecer flexibilidad en diferentes arquitecturas de aplicaciones.
Requisitos previos
-
Python 3.10 o posterior
-
Una Cuenta de AWS con permisos para crear tablas de DynamoDB (y, opcionalmente, buckets de Amazon S3)
-
Credenciales de AWS configuradas (consulte la documentación de AWS para ver las opciones de configuración de credenciales)
importante
Esta guía crea recursos de AWS que pueden conllevar gastos. DynamoDB utiliza, de forma predeterminada, un modelo de facturación por solicitud, y se aplicarán las tarifas de Amazon S3 si activa la descarga de puntos de control de gran tamaño. Siga las instrucciones de la sección Limpieza para eliminar los recursos cuando haya terminado.
Instalación
Instale el paquete de puntos de control desde PyPI:
pip install langgraph-checkpoint-aws
Uso básico
En el siguiente ejemplo se muestra cómo configurar DynamoDB como almacén de puntos de control para un agente de LangGraph:
from langgraph.graph import StateGraph from langgraph_checkpoint_aws import DynamoDBSaver from typing import TypedDict # Define your state schema class State(TypedDict): input: str result: str # Initialize the DynamoDB checkpoint saver checkpointer = DynamoDBSaver( table_name="langgraph-checkpoints", region_name="us-east-1" ) # Build your LangGraph workflow builder = StateGraph(State) builder.add_node("process", lambda state: {"result": "processed"}) builder.set_entry_point("process") builder.set_finish_point("process") # Compile the graph with the DynamoDB checkpointer graph = builder.compile(checkpointer=checkpointer) # Invoke the graph with a thread ID to enable state persistence config = {"configurable": {"thread_id": "session-123"}} result = graph.invoke({"input": "data"}, config)
El thread_id en la configuración actúa como clave de partición en DynamoDB, lo que le permite mantener hilos de conversación independientes y recuperar estados históricos de cualquier hilo.
Configuración de producción
En las implementaciones de producción, puede habilitar el Periodo de vida, la compresión y la descarga a Amazon S3. También puede utilizar el parámetro endpoint_url para indicar una instancia local de DynamoDB con fines de prueba:
import boto3 from botocore.config import Config from langgraph_checkpoint_aws import DynamoDBSaver # Production configuration session = boto3.Session( profile_name="production", region_name="us-east-1" ) checkpointer = DynamoDBSaver( table_name="langgraph-checkpoints", session=session, ttl_seconds=86400 * 7, # Expire checkpoints after 7 days enable_checkpoint_compression=True, # Enable gzip compression boto_config=Config( retries={"mode": "adaptive", "max_attempts": 6}, max_pool_connections=50 ), s3_offload_config={ "bucket_name": "my-checkpoint-bucket" } ) # Local testing with DynamoDB Local local_checkpointer = DynamoDBSaver( table_name="langgraph-checkpoints", region_name="us-east-1", endpoint_url="http://localhost:8000" )
Configuración de la tabla de DynamoDB
El protector de puntos de control requiere una tabla de DynamoDB con una clave primaria compuesta. Puede crear la tabla con la siguiente plantilla de AWS CloudFormation.
AWSTemplateFormatVersion: '2010-09-09' Description: 'DynamoDB table for LangGraph checkpoint storage' Parameters: TableName: Type: String Default: langgraph-checkpoints Resources: CheckpointTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain UpdateReplacePolicy: Retain Properties: TableName: !Ref TableName BillingMode: PAY_PER_REQUEST AttributeDefinitions: - AttributeName: PK AttributeType: S - AttributeName: SK AttributeType: S KeySchema: - AttributeName: PK KeyType: HASH - AttributeName: SK KeyType: RANGE TimeToLiveSpecification: AttributeName: ttl Enabled: true PointInTimeRecoverySpecification: PointInTimeRecoveryEnabled: true SSESpecification: SSEEnabled: true
Implemente la plantilla con la AWS CLI:
aws cloudformation deploy \ --template-file template.yaml \ --stack-name langgraph-checkpoint \ --parameter-overrides TableName=langgraph-checkpoints
Permisos de IAM necesarios
La siguiente política de IAM proporciona los permisos mínimos necesarios para el protector de puntos de control de DynamoDB. Sustituya 111122223333 por su ID de Cuenta de AWS y actualice la región para que coincida con su entorno.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:BatchWriteItem" ], "Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/langgraph-checkpoints" } ] }
Si habilita la descarga de Amazon S3, añada la siguiente instrucción a la política:
{ "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:PutObjectTagging" ], "Resource": "arn:aws:s3:::my-checkpoint-bucket/*" }, { "Effect": "Allow", "Action": [ "s3:GetBucketLifecycleConfiguration", "s3:PutBucketLifecycleConfiguration" ], "Resource": "arn:aws:s3:::my-checkpoint-bucket" }
Uso asíncrono
Para aplicaciones asíncronas, utilice los métodos asíncronos proporcionados por el protector de puntos de control:
import asyncio from langgraph.graph import StateGraph from langgraph_checkpoint_aws import DynamoDBSaver from typing import TypedDict class State(TypedDict): input: str result: str async def main(): checkpointer = DynamoDBSaver( table_name="langgraph-checkpoints", region_name="us-east-1" ) builder = StateGraph(State) builder.add_node("process", lambda state: {"result": "processed"}) builder.set_entry_point("process") builder.set_finish_point("process") graph = builder.compile(checkpointer=checkpointer) config = {"configurable": {"thread_id": "async-session-123"}} result = await graph.ainvoke({"input": "data"}, config) return result asyncio.run(main())
Limpieza
Para evitar que se sigan cobrando cargos, elimine los recursos que ha creado:
# Delete the DynamoDB table aws dynamodb delete-table --table-name langgraph-checkpoints # Delete the CloudFormation stack (if you used the template above) aws cloudformation delete-stack --stack-name langgraph-checkpoint # If you created an S3 bucket for large checkpoint offloading, empty and delete it aws s3 rm s3://my-checkpoint-bucket --recursive aws s3 rb s3://my-checkpoint-bucket
Gestión de errores
Situaciones de error comunes:
-
No se encontró la tabla: compruebe que el
table_namey elregion_namecoincide con su tabla de DynamoDB. -
Limitación: si ve
ProvisionedThroughputExceededException, considere cambiar al modo de facturación bajo demanda o aumentar la capacidad asignada. -
Tamaño de elemento excedido: si los puntos de control superan los 350 KB, habilite la descarga de Amazon S3 (consulte Configuración de producción).
-
Errores de credenciales: compruebe que sus credenciales de AWS sean válidas y que disponga de los permisos necesarios.