AI

ADK(Agent Development Kit) 스터디 2주차 (5) ADK Session에 대해서 (에이전트 끼리 맥락 기억 및 관리)

25G 2025. 7. 18. 20:32

ADK에서 Session 이란?

에이전트끼리 맥락을 기억하게 하는데 ADK에서 이런 개별 대화 스래드를 추적하고 관리하기 위해 설계된 객체

Session 객체

사용자가 에이전트와 상호작용을 시작하면 SessionService는 Session객체를 생성한다. 이 객체는 하나의 특정 채팅 스레드와 관련된 모든 것을 담는 컨테이너 역할을 함.

Session 객체의 주요 속성은 다음과 같습니다:

  • 식별 정보 (id, app_name, user_id): 대화를 고유하게 식별하는 레이블입니다.
    • id: 이 특정 대화 스레드의 고유 식별자
    • app_name: 이 대화가 속한 에이전트 애플리케이션의 이름
    • user_id: 대화를 특정 사용자와 연결 (중요)
  • 대화 기록 (events): 해당 스레드 내에서 발생한 모든 상호작용(Event 객체 - 사용자 메시지, 에이전트 응답, 도구 사용 등)의 시간순 목록이다.
  • 세션 상태 (state): 오직 이 대화에만 관련된 임시 데이터를 저장하는 공간입니다. 에이전트가 대화 중에 사용하는 스크래치패드(메모장)와 같습니다. (다음 포스팅때 다를 예정)
  • 활동 추적 (last_update_time): 이 대화에서 마지막 이벤트가 발생한 시간을 기록한 타임스탬프입니다
from google.adk.sessions import InMemorySessionService, Session

# 속성을 확인하기 위해 간단한 세션을 생성합니다.
temp_service = InMemorySessionService()
example_session = await temp_service.create_session(
    app_name="my_app",
    user_id="example_user",
    state={"initial_key": "initial_value"} # state는 생성 시 초기화할 수 있습니다.
)

print("--- Session 속성 확인하기 ---")
print(f"ID (`id`):                {example_session.id}")
print(f"애플리케이션 이름 (`app_name`): {example_session.app_name}")
print(f"사용자 ID (`user_id`):         {example_session.user_id}")
print(f"상태 (`state`):           {example_session.state}") # 여기서는 초기 상태만 보입니다.
print(f"이벤트 (`events`):         {example_session.events}") # 처음에는 비어 있습니다.
print(f"마지막 업데이트 (`last_update_time`): {example_session.last_update_time}")
print("----------------------------")

SessionService 세션 관리

개발자가 직접 Session객체를 생성하거나 관리하지않는다. SessionService를 통해 대화 세션의 전체 생명주기를 관리할 수 있다.

역할

  • 새 대화 시작: create_session으로 새로운 Session 객체를 생성
  • 기존 대화 이어가기: get_session으로 특정 Session을 ID로 가져옴
  • 진행 상황 저장: append_event로 새로운 상호작용(Event)을 세션 기록에 추가한다. (세션 state도 이 메커니즘을 통해 업데이트된다.)
  • 대화 목록 조회: 특정 사용자의 활성 세션 목록을 찾는다..
  • 정리: delete_session으로 대화가 끝난 Session 객체와 데이터를 삭제한다.

SessionService 구현체

  • InMemorySessionService
    • 메모리 활용방식 (휘발됨)
    • 빠른 개발, 로컬 테스트, 예제 실행등에 용이
from google.adk.sessions import InMemorySessionService
session_service = InMemorySessionService()
  • VertexAiSessionService
    • 구글 VertexAI 인프라를 사용해서 세션을 관리한다.
    • 영속적임
    • Google Cloud에 배포된 확장가능한 프로덕션에 용이
# 필요: pip install google-adk[vertexai] 및 GCP 프로젝트 설정
from google.adk.sessions import VertexAiSessionService

PROJECT_ID = "your-gcp-project-id"
LOCATION = "us-central1"
REASONING_ENGINE_APP_NAME = "reasoning-engine-id"

session_service = VertexAiSessionService(project=PROJECT_ID, location=LOCATION)
# 서비스 메서드 호출 시 app_name으로 REASONING_ENGINE_APP_NAME 사용
  • DatabaseSessionService
    • RDB 연결로 세션 영구 저장
    • 영속적
    • 직접 관리하는 안정적인 영구 저장소가 필요할때 용이

세션의 생명 주기 (문서 복붙)

세션 생명 주기

  1. 시작 또는 재개: Runner가 SessionService를 사용해 create_session (새 대화) 또는 get_session (기존 대화)을 호출합니다.
  2. 컨텍스트 제공: Runner가 적절한 Session 객체를 받아 에이전트에게 state와 events 기록을 제공합니다.
  3. 에이전트 처리: 사용자가 메시지를 보내면, 에이전트는 이 메시지와 세션의 state, events를 분석하여 응답을 결정합니다.
  4. 응답 및 상태 업데이트: 에이전트가 응답을 생성하면, Runner는 이를 Event 객체로 포장합니다.
  5. 상호작용 저장: Runner가 sessionService.append_event(session, event)를 호출합니다. 서비스는 Event를 기록에 추가하고, 이벤트 내 정보를 바탕으로 state를 저장소에 업데이트합니다.
  6. 다음 준비: 에이전트의 응답이 사용자에게 전달되고, 업데이트된 Session은 SessionService에 의해 저장되어 다음 턴을 준비합니다.
  7. 대화 종료: 대화가 끝나면 sessionService.delete_session()을 호출하여 저장된 세션 데이터를 정리할 수 있습니다.

이제 러너와 세션을 활용해서 adk api_server를 활용해서 api서버로 띄워서 내 애플리케이션에 내가 설계한 에이전트들을 붙여볼 수 있을 것 같다.