Spring AI, 대화형 AI를 위한 새로운 Session API 출시!

by DD
1개월 전
조회수 18

Spring AI Session API는 에이전트 기반 애플리케이션의 단기 메모리 관리를 위해 설계되었으며, 대화 기록을 구조화하여 컨텍스트 창(Context Window) 관리를 효율적으로 수행함

이벤트 소싱(Event Sourcing) 기반으로 모든 메시지, 도구 호출, 결과를 기록하고, 턴(Turn) 단위의 컨텍스트 압축(Context Compaction)을 통해 대화의 일관성을 유지함

Recursive Summarization 전략을 통해 LLM을 활용, 이전 대화 내용을 요약하여 컨텍스트 창 내 정보 밀도(Information Density)를 향상시킴

ChatMemory를 대체하며, 멀티 에이전트 지원, 분기 격리(Branch Isolation), 키워드 검색 가능한 리콜(Recall) 스토리지를 제공하여 기존 방식의 한계 극복

Spring AI 2.1(2026년 11월)에 정식 출시 예정이며, JDBC를 통한 영구 저장(Persistent Storage) 지원

Spring AI Session API의 핵심 아키텍처

Spring AI Session API는 이벤트 소싱(Event Sourcing)을 기반으로 설계되어, 대화 내용을 불변의 `SessionEvent` 형태로 저장한다. 각 `SessionEvent`는 UUID, 세션 ID, 타임스탬프, 멀티 에이전트 환경을 위한 분기(Branch) 정보, 프레임워크 플래그를 포함한다. `Session`은 세션 ID, 사용자 ID, TTL, 메타데이터를 담는 불변의 값 객체이며, 실제 이벤트 로그는 별도의 저장소에 보관된다. `SessionService`는 `InMemorySessionRepository` 또는 JDBC 기반 저장소를 사용하여 세션 관리 기능을 제공하며, `SessionMemoryAdvisor`를 통해 `ChatClient` 파이프라인에 통합된다. 이 아키텍처는 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 각 에이전트가 자신의 이벤트만 볼 수 있도록 지원한다.

컨텍스트 압축(Context Compaction) 전략 심층 분석

Spring AI Session API는 컨텍스트 창(Context Window) 내 정보 관리를 위해 다양한 압축 전략을 제공한다. 압축은 `TurnCountTrigger`, `TokenCountTrigger`와 같은 트리거(Trigger)에 의해 시작되며, `SlidingWindowCompactionStrategy`, `TurnWindowCompactionStrategy`, `TokenCountCompactionStrategy`, `RecursiveSummarizationCompactionStrategy` 등의 전략을 조합하여 사용한다. 특히, `RecursiveSummarizationCompactionStrategy`는 LLM을 활용하여 이전 대화 내용을 요약하고, 요약된 내용을 새로운 사용자/어시스턴트 턴으로 저장한다. 이 방식은 컨텍스트 창 내 정보 밀도(Information Density)를 극대화하고, 긴 대화에서도 일관성을 유지하도록 돕는다. 트리거와 전략은 반드시 함께 설정해야 하며, 그렇지 않으면 빌드 시 예외가 발생한다.

멀티 에이전트 환경에서의 분기 격리(Branch Isolation)

Spring AI Session API는 멀티 에이전트 환경에서 각 에이전트가 자신의 대화 내용만 볼 수 있도록 분기 격리(Branch Isolation) 기능을 제공한다. `SessionEvent.branch`는 점으로 구분된 경로를 사용하여 에이전트의 계층 구조를 나타낸다. 예를 들어, `orch.researcher`는 오케스트레이터(Orchestrator) 하위의 연구원(Researcher) 에이전트를 의미한다. `EventFilter.forBranch()`를 사용하면 특정 분기에 속한 이벤트만 필터링하여 각 에이전트가 자신의 대화 내용에 집중할 수 있도록 한다. `RecursiveSummarizationCompactionStrategy`를 통해 생성된 요약 이벤트는 `branch = null` 값을 가지므로, 모든 에이전트가 공유하는 컨텍스트로 활용된다. 이 기능은 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 에이전트 간의 간섭을 최소화하고, 각 에이전트의 독립성을 보장한다.

ChatMemory API vs Spring AI Session API 비교

Spring AI Session API는 기존 `ChatMemory` API의 단점을 보완하고, 에이전트 기반 애플리케이션 개발에 필요한 기능을 제공한다. `ChatMemory`는 단순한 메시지 리스트를 사용하고, 오래된 메시지를 무작위로 삭제하는 방식으로 컨텍스트를 관리했다. 반면, Spring AI Session API는 이벤트 소싱(Event Sourcing)을 통해 각 메시지를 식별 가능한 `SessionEvent`로 저장하고, 다양한 압축 전략을 제공하여 컨텍스트 창을 효율적으로 관리한다. 또한, 멀티 에이전트 지원, 분기 격리, 키워드 검색 가능한 리콜 스토리지를 제공하여 기존 방식의 한계를 극복했다. `ChatMemory`는 턴 안전성(Turn Safety)을 보장하지 않았지만, Spring AI Session API는 모든 압축 전략이 턴 경계를 준수하도록 설계되어 대화의 일관성을 유지한다.

JDBC를 활용한 영구 저장(Persistent Storage) 구현

Spring AI Session API는 JDBC를 통해 세션 데이터를 영구적으로 저장하는 기능을 제공한다. `spring-ai-session-jdbc` 모듈은 PostgreSQL, MySQL, MariaDB, H2 데이터베이스를 지원하며, Spring Boot 스타터를 통해 간편하게 설정할 수 있다. JDBC 기반 저장소는 `AI_SESSION` 및 `AI_SESSION_EVENT` 두 개의 테이블을 사용하며, 이벤트는 append-only 방식으로 저장된다. PostgreSQL 또는 MySQL을 사용하는 경우, 스키마 초기화를 활성화하여 데이터베이스 테이블을 자동으로 생성할 수 있다. 이 기능을 통해 개발자는 세션 데이터를 안전하게 보존하고, 애플리케이션 재시작 시에도 대화 내용을 유지할 수 있다. JDBC를 활용하면 데이터 격리 아키텍처(Data Isolation Architecture)를 구축하여 데이터의 무결성을 보장할 수 있다.

Spring AI Agentic Patterns (Part 7): Session API — Event-Sourced Short-Term Memory with Context Compaction

댓글 0

첫 번째 댓글을 남겨보세요!