요약 이후의 대화를 최근 창으로 다시 자르면 빈 구간이 생긴다

이전 대화를 요약해도 그 뒤에 이어진 대화는 아직 요약에 들어 있지 않다. 이때 다음 요청을 최근 10개 메시지로만 만들면, 요약 경계와 최근 창 사이의 메시지가 양쪽에서 빠질 수 있다. 캐시 표시를 더해도 빠진 문맥이 복구되지는 않는다.

OpenAI 요청의 날짜를 instructions 대신 입력 배열의 마지막 developer 메시지에 붙이고 이를 tail_context 슬롯으로 일반화했다. 가변 문맥을 정적 캐시 앞부분과 분리한 이 작업에 이어, 후속 변경에서는 Claude의 요약 이후 전체 이력과 블록별 캐시 표시를 함께 맞췄다.

AI Chat의 요약·캐시 구현은 Claude 요청을 최신 요약과 그 경계 이후 전체 이력으로 조립한다. 제품 통합 전의 기능 구현이다. 요약이 없으면 경계 없이 이력을 읽고, 현재 질문과 작성 중인 답변의 ID는 명시적으로 제외해 중복을 막는다.

DB 조건은 createdAt이 경계보다 크거나, 시각이 같고 _id가 경계 ID보다 큰 메시지다. 정렬도 (createdAt, _id) 오름차순이다. 시간만 비교하면 같은 시각에 저장된 메시지가 누락될 수 있으므로, 요약 범위의 마지막 메시지와 다음 메시지를 같은 순서 기준으로 나눈다.

이번 질문과 다음 턴의 과거 질문을 같은 함수로 만든다

현재 질문은 요청 인자의 텍스트·첨부로 만들고 다음 턴에는 저장된 메시지로 다시 만들면, 같은 질문인데도 첨부 순서나 미지원 파일 안내가 달라질 수 있다. 변경된 조립부는 현재 질문도 저장된 메시지를 읽어 과거 메시지와 같은 buildAnthropicUserContent()로 만든다. 저장된 내용이 없거나 블록을 만들지 못한 경우에만 params.input을 대체 입력으로 사용한다.

Claude 요청의 문맥과 캐시 표시 위치
위치내용캐시 경계
system안정적인 instructions텍스트 블록에 표시
첫 user 블록꼬리표로 감싼 이전 대화 요약요약이 있을 때 표시
messages 중간요약 이후 전체 이력메시지 순서를 유지
현재 user 메시지저장된 현재 질문과 첨부마지막 질문 블록에 표시
현재 메시지 말미날짜 등 tail_context마지막 표시 뒤에 추가

요약은 첫 user 메시지 맨 앞에 넣는다. 첫 이력이 assistant이면 요약만 담은 user 메시지를 하나 앞에 만들고, 경계 이후 이력이 없으면 현재 질문 앞에 붙인다. system의 공통 지시문을 요약마다 바꾸지 않고 대화별 문맥을 메시지 영역에 둘 수 있다.

날짜처럼 바뀌는 텍스트는 system에서 제외하고 현재 질문의 마지막 캐시 표시 뒤에 붙인다. 다음 요약이 생기면 요약 prefix는 바뀌지만, 단지 날짜가 달라졌다는 이유로 앞의 지시문까지 바뀌지 않게 하는 조립 규칙이다. 이는 Claude의 system/messages와 블록별 cache_control에 맞춘 구현이다. OpenAI의 응답 ID 연결이나 Gemini의 Content/Part 조립에 같은 배열과 표시를 그대로 적용할 수는 없다.

문맥의 누락을 막는 대신 요약 사이의 입력은 커진다

요약 이후 전체 이력을 읽으면 다음 요약 전까지 조회량과 요청 payload, 토큰 수가 늘어난다. 모델의 문맥 한도가 사라지는 것은 아니며 요약 자체는 원문 정보를 잃을 수 있다. 첨부의 만료나 제공사의 캐시 정책도 별개이므로, 조립을 일관되게 했다는 사실에서 캐시 적중률이나 비용 절감 수치를 추론할 수 없다.

조립 테스트에는 요약이 없을 때 과거 이력과 현재 질문을 합쳐 31개 메시지를 유지하는 사례, 경계와 제외 ID 전달, 빈 이력과 assistant 시작 이력의 요약 위치, 날짜가 마지막 표시 뒤에 오는 사례가 있다. 첨부가 있는 현재 질문을 다음 턴의 과거 메시지와 비교할 때는 캐시 표시를 제거하고 내용·순서·미지원 안내가 같은지 확인한다. 저장 메시지가 없을 때의 대체 입력도 다룬다.

이 테스트는 요청 조립의 조건을 확인한다. 외부 캐시의 실제 적중률, 모델이 모든 정보를 기억하는 정도, 장시간 대화의 비용은 별도 측정이 필요하다. AI Chat / Tutor에서 캐시를 평가하려면 먼저 어떤 문맥을 요청에 포함했는지와 캐시가 그중 어디까지를 가리키는지 같은 기준으로 설명할 수 있어야 한다.