최근 사내 서비스를 활용하는 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)