Integre AgentCore la memoria con LangChain o LangGraph
LangChain y LangGraph
LangGraph Existen dos conceptos principales de memoria en lo que respecta a la persistencia de la
-
AgentCoreMemorySaver- se utiliza para guardar y cargar objetos de puntos de control que incluyen mensajes de los usuarios y de la IA, el estado de ejecución de los gráficos y metadatos adicionales -
AgentCoreMemoryStore- se utiliza para guardar mensajes de conversación, dejando el servicio de AgentCore memoria para extraer información, resúmenes y preferencias del usuario en segundo plano y, a continuación, dejar que el agente busque en esos recuerdos inteligentes en futuras conversaciones
Estas integraciones son fáciles de configurar y solo requieren especificar el ID de memoria de una memoria. AgentCore Como se guardan en un almacenamiento persistente dentro del servicio, no hay necesidad de preocuparse por perder estas interacciones a causa de la salida de los contenedores, las soluciones en memoria poco fiables o los bloqueos de las aplicaciones de los agentes.
Temas
Requisitos previos
Requisitos que necesita antes de integrar la AgentCore memoria con y. LangChain LangGraph
-
AWS cuenta con acceso a Bedrock Amazon Bedrock AgentCore
-
AWS Credenciales configuradas (boto3)
-
¿Una memoria AgentCore
-
Permisos de IAM necesarios:
-
bedrock-agentcore:CreateEvent -
bedrock-agentcore:ListEvents -
bedrock-agentcore:RetrieveMemories
-
Configuración para la persistencia de la memoria a corto plazo
La entrada AgentCoreMemorySaver LangGraph gestiona todo el almacenamiento y la carga de las variables de estado de la conversación, el contexto de ejecución y el estado de forma clandestina mediante tipos de blob de AgentCore memoria. Esto significa que la única configuración necesaria es especificar el punto de control al compilar el gráfico del agente y, a continuación, proporcionar una actor_id y thread_id en el al invocar RunnableConfig
# Import LangGraph and LangChain components from langchain.chat_models import init_chat_model from langgraph.prebuilt import create_react_agent # Import the AgentCore Memory integrations from langgraph_checkpoint_aws import AgentCoreMemorySaver REGION = "us-west-2" MEMORY_ID = "YOUR_MEMORY_ID" MODEL_ID = "us.anthropic.claude-3-7-sonnet-20250219-v1:0" # Initialize checkpointer for state persistence. No additional setup required. # Sessions will be saved and persisted for actor_id/session_id combinations checkpointer = AgentCoreMemorySaver(MEMORY_ID, region_name=REGION)
Configuración para la búsqueda inteligente de memoria a largo plazo
En el caso de las memorias almacenadas a largo plazo LangGraph, dispondrá de más flexibilidad a la hora de procesar los mensajes. Por ejemplo, si la aplicación solo se ocupa de las preferencias del usuario, solo necesitará almacenar los HumanMessage objetos de la conversación. Para los resúmenes, de todos los tipos HumanMessageAIMessage, y ToolMessage sería relevante. Existen numerosas formas de hacerlo, pero un patrón de implementación común es usar ganchos anteriores y posteriores al modelo, como se muestra en el siguiente ejemplo. Para recuperar recuerdos, puede añadir una store.search(query) llamada en el enlace anterior al modelo y añadirla al mensaje del usuario para que el agente tenga todo el contexto. Como alternativa, se le podría proporcionar al agente una herramienta para buscar información según sea necesario. Se admiten todos estos patrones de implementación y la implementación variará en función de la aplicación.
from langgraph_checkpoint_aws import ( AgentCoreMemoryStore ) # Initialize store for saving and searching over long term memories # such as preferences and facts across sessions store = AgentCoreMemoryStore(MEMORY_ID, region_name=REGION) # Pre-model hook runs and saves messages of your choosing to AgentCore Memory # for async processing and extraction def pre_model_hook(state, config: RunnableConfig, *, store: BaseStore): """Hook that runs pre-LLM invocation to save the latest human message""" actor_id = config["configurable"]["actor_id"] thread_id = config["configurable"]["thread_id"] # Saving the message to the actor and session combination that we get at runtime namespace = (actor_id, thread_id) messages = state.get("messages", []) # Save the last human message we see before LLM invocation for msg in reversed(messages): if isinstance(msg, HumanMessage): store.put(namespace, str(uuid.uuid4()), {"message": msg}) break # OPTIONAL: Retrieve user preferences based on the last message and append to state # user_preferences_namespace = ("preferences", actor_id) # preferences = store.search(user_preferences_namespace, query=msg.content, limit=5) # # Add to input messages as needed return {"llm_input_messages": messages}
Cree el agente con las configuraciones
Inicialice el LLM y cree un LangGraph agente con una configuración de memoria.
# Initialize LLM llm = init_chat_model(MODEL_ID, model_provider="bedrock_converse", region_name=REGION) # Create a pre-built langgraph agent (configurations work for custom agents too) graph = create_react_agent( model=llm, tools=tools, checkpointer=checkpointer, # AgentCoreMemorySaver we created above store=store, # AgentCoreMemoryStore we created above pre_model_hook=pre_model_hook, # OPTIONAL: Function we defined to save user messages # post_model_hook=post_model_hook # OPTIONAL: Can save AI messages to memory if needed )
Invoca al agente
Invoca al agente.
# Specify config at runtime for ACTOR and SESSION config = { "configurable": { "thread_id": "session-1", # REQUIRED: This maps to Bedrock AgentCore session_id under the hood "actor_id": "react-agent-1", # REQUIRED: This maps to Bedrock AgentCore actor_id under the hood } } # Invoke the agent response = graph.invoke( {"messages": [("human", "I like sushi with tuna. In general seafood is great.")]}, config=config ) # ... agent will answer # Agent will have the conversation and state persisted on the next message # Because the session ID is the same in the runtime config response = graph.invoke( {"messages": [("human", "What did I just say?")]}, config=config ) # Define a new session in the runtime config to test long term retrieval config = { "configurable": { "thread_id": "session-2", # New session ID "actor_id": "react-agent-1", # Same actor ID } } # Invoke the agent (it will retrieve long term memories from other session) response = graph.invoke( {"messages": [("human", "Lets make a meal tonight, what should I cook?")]}, config=config )