LangGraph 에이전트의 시맨틱 캐싱을 위한 TTL 결정 방식
How I'm handling TTL decisions for semantic caching in my LangGraph agent
핵심 요약
LangGraph 에이전트에서 호출하는 도구 유형에 따라 캐싱 TTL을 동적으로 설정하는 전략을 공유합니다.
- 캐싱 전략 — 도구 유형별로 TTL을 다르게 설정하여 효율성 극대화
- 동적 TTL 결정 — 사용된 도구 목록을 기반으로 캐시 유효 기간 자동 계산
- LangGraph 구현 — 에이전트 노드 이후 캐시 확인 및 결과 노드를 파이프라인에 통합
지연 시간 단축과 토큰 비용 절감을 위해 LangGraph 기반 쇼핑 에이전트에 시맨틱 캐싱을 추가하는 작업을 하고 있습니다. 가장 오래 걸린 부분은 캐싱 자체가 아니라, 무엇을 얼마나 오랫동안 캐싱할지 결정하는 것이었습니다.
고정된 TTL은 금방 부적절하게 느껴졌습니다. 에이전트는 "MacBook Pro 사양이 뭐야?"(답변이 몇 달간 변하지 않음)와 "내 장바구니에 뭐가 있지?"(사용자마다, 세션마다 다르므로 절대 캐싱하면 안 됨)와 같은 쿼리를 같은 파이프라인에서 처리하기 때문입니다. 그래서 이 둘을 똑같이 취급하는 것은 나쁜 생각처럼 보였습니다.
제가 최종적으로 한 방식은 에이전트가 실제로 호출한 도구를 기반으로 TTL을 결정하는 것이었습니다. 에이전트 노드가 실행된 후, state["tools_used"]를 검사하여 거기서 TTL을 할당합니다:
def determine_tool_based_cache_ttl(tools_used: list[str]) -> int:
personal_tools = {
'add_to_cart', 'remove_from_cart',
'get_user_orders', 'update_user_profile',
'process_payment', 'get_cart_contents'
}
time_sensitive_tools = {
'get_current_deals', 'check_flash_sale',
'get_limited_stock_items'
}
static_tools = {
'get_product_details', 'search_products',
'get_product_reviews', 'get_category_list'
}
tools_set = set(tools_used)
if tools_set & personal_tools:
return 0 # Never cache
if tools_set & time_sensitive_tools:
return 300 # 5 minutes
if tools_set & static_tools:
return 86400 # 24 hours
return 3600 # Default: 1 hour
그래프는 이를 에이전트 이후에 항상 실행되는 노드로 연결합니다:
from langgraph.graph import StateGraph, START, END
from typing import TypedDict, List
graph = StateGraph(AgentState)
graph.add_node("cache_check", query_cache_check)
graph.add_node("agent", agent_node)
graph.add_node("cache_result", cache_result_node)
graph.add_edge(START, "cache_check")
(이하 생략)


