AI

[LangGraph] Redis 로 이전 대화 관리

dev_minpark 2024. 12. 31. 22:27

최근 사내 서비스를 활용하는 AI Agent 구현중에 이전 대화 내용을 관리하기 위해 Redis 를 활용한 예제를 공유한다.

기본적으로 대화 맥락은 동일 스레드 환경에서 토큰 길이에 따라 약 10~30개 정도 메모리로 저장하는 것으로 알고 있는데 (chatGPT)

설계한 AI Agent 는 FastAPI 로 동일 스레드를 보장할 수 없었다.

 

단순 Redis 서버를 연동하여 사용자의 요청 필드와, AI Agent 의 응답 필드, 저장 시간을 특정 유저 아이디로 키를 만들어 매번 조회하고, 리스트에 추가하여 갱신해주어 해결

 

redis = redis_client()

context_key = redis.generate_key(user_id, 'test')
# 이전 대화 조회
saved_content = redis.get_key(context_key)
# 사용자 현재 요청 텍스트 추출
req = state.get("input_text")

# 이전 대화 내용이 있을 시 현재 상태에 추가하고 상태 갱신
if saved_content:
	state["messages"] = list(state["messages"]) + [HumanMessage(content=json.dumps(saved_content))]

# LLM 처리
# 현재 노드에 등록된 Tool 호출
result = await calendar_agent.ainvoke(state, config)

# Tool 호출 성공시 리턴 값 추출
tool_messages = [
	message for message in result["messages"] if isinstance(message, ToolMessage)
]

if tool_messages:
	history = [{
		"time"      : datetime.now(timezone(timedelta(hours=9))).isoformat(),
		"question"  : req,
		"answer"    : tool_messages[-1].content
	}]
	print(f"{history}")
    # 데이터 갱신
	redis.update_key(context_key, history, 900)