# 공개 사례 요약 — AI-R002

기존 연구 문서 snapshot을 제공하며 이번 탐색 구조 변경에서 실험을 재실행하지 않았습니다. 비공개 저장소 링크는 공개 다운로드에서 제외했습니다.

# AI-R002 — State·RAG·History 메모리 연구

상태: 선정·진행 중. 기록 기준일: 2026-10-06.
적용 프로젝트: Liv-ay. 출발점: UMA 후보 선정.
이 문서는 UMA 논문 재현 보고서가 아니라, 그 논의에서 구체화된 자체 메모리 경계·보존 실험 기록이다.

## 1. 연구질문과 가설

**질문:** 변경되는 현재 상태와 과거 근거를 분리하고, 제한된 컨텍스트 안에서 필요한
근거를 검색·확장하면 오래된 사실의 오적용과 근거 누락을 줄일 수 있는가?

| 가설 | 현재 증거 수준 |
|---|---|
| H1. 명시적인 최신 값 저장은 유사도 조회만으로 현재 사실을 고르는 것보다 안정적이다 | 합성 상태 조회 실험으로 확인; 실제 hybrid retrieval 대비 우위 미검증 |
| H2. 최신 상태만으로는 과거·의존 근거를 충분히 답할 수 없다 | 결정론적 정보 가용성 평가로 확인; 모델 답변 품질 미검증 |
| H3. 같은 상한 예산에서 parent 확장은 필요한 근거의 완전성을 높일 수 있다 | 명시적 합성 링크에서 확인; 추론된 graph·실제 비용/품질 미검증 |

## 2. 구현된 경계

- State Memory: 현재 시간·장소, 인물 상태·관계, 사건 단계·사건 집합의 현재 사실.
- RAG/history: 원작 장면·lore·과거 사건과 대화의 근거.
- 충돌하면 현재 State snapshot이 우선한다.
- `StateMemory.snapshot(layer2_state)`는 분리된 사본을 만들고 ContextBuilder는 이를
  `scene_chunks`와 별도 입력으로 받는다. 기존 Firestore Layer2 스키마는 변경하지 않았다.
- 컨텍스트 문자 수와 메타데이터 계측은 구현됐다. `ceil(chars/4)` 추정 토큰은 실제 과금 토큰이 아니다.

근거: 상태 권한 계약（비공개 정본의 근거）,
계측 정의（비공개 정본의 근거）.
graph의 제품 저장소·상태 버전 관리까지 도입한 것으로 해석하지 않는다.

## 3. 실험 E1 — 현재 상태 조회

100회 갱신, seed 9147, 인물 ari, 위치·감정·관계·사건 단계. append-only 사실의 lexical
cosine top-3와 최신 값 CRUD를 비교했다. lexical 동률은 오래된 사실 쪽으로 정렬한다.
이는 최신성 계약 부재를 드러내는 조건이며 강한 recency/hybrid baseline은 아니다.

| 조건 | 최신 값 정답 | 평균 lexical 단위 수 |
|---|---:|---:|
| Lexical retrieval | 28/100 | 14.85 |
| CRUD state | 100/100 | 3.00 |

단위 수는 코드의 정규식 `_tokens` 결과 길이다. 모델 tokenizer·provider 사용량·요금이 아니다.
실제 Vertex/pgvector의 정확도를 이 표로 주장할 수 없다.

## 4. 실험 E2 — 정보 가용성 분리

20개 시나리오, seed 0–19, 시나리오별 100회 갱신. 최신 사실과 과거·의존 근거를 별도
oracle로 채점했다. Summary는 LLM 요약이 아니라 필드별 최신 값 압축이며 State+RAG는
embedding이 아니라 oracle ID 조회다.

| 조건 | 최신 사실 | 과거 근거 | 의존 근거 | 평균 컨텍스트 문자 |
|---|---:|---:|---:|---:|
| Full History | 80/80 | 100/100 | 100/100 | 5687.95 |
| Window 5 | 60/80 | 0/100 | 0/100 | 286.30 |
| Summary | 80/80 | 0/100 | 0/100 | 228.00 |
| State | 80/80 | 0/100 | 0/100 | 228.00 |
| State+oracle retrieval | 80/80 | 100/100 | 22/100 | 513.40 |
| Explicit graph traversal | 80/80 | 100/100 | 100/100 | 734.40 |

graph는 더 많은 문맥을 가져온다. 이 표는 **같은 예산에서의 graph 우위**를 입증하지 않는다.
근거: 초기 계획·결과（비공개 정본의 근거）.

## 5. 실험 E3 — 동일 상한 예산 비교

20개 합성 이야기, 각 100회 갱신과 5개 checkpoint. State·lexical·1-hop graph를
600/1000/1600 **문자 상한**에서 비교한다. State와 evidence를 포함한 전체 직렬화 결과를
예산에 넣고 현재 상태를 먼저 예약한다. gold ID는 채점에서만 사용하며 미래 사건은 입력하지 않는다.
두 부모·위치 정정·현재 키 삭제·존재하지 않는 parent를 포함한다.

| 문자 상한 | Lexical 완전 근거 | Graph 완전 근거 | Lexical 평균 문자 | Graph 평균 문자 |
|---|---:|---:|---:|---:|
| 600 | 120/400 | 300/400 | 566.25 | 551.80 |
| 1000 | 180/400 | 300/400 | 864.85 | 914.75 |
| 1600 | 200/400 | 300/400 | 975.90 | 1203.75 |

각 예산의 세 조건 모두 현재 상태 400/400을 보존했다. State-only의 완전 근거는 0/400,
평균 문자는 117이다. Graph는 평균 7.5회 edge lookup을 수행한다. 조건별 100개 질의는
의도적으로 존재하지 않는 근거가 필요하므로 완전 근거의 fixture 상한은 300/400이다.
같은 예산 **상한**이지 실제 사용 문맥 길이까지 동일한 비교는 아니다.

총 3,600행에 대해 예산·checkpoint·현재 상태·정정/삭제·누락 링크·작은 예산의 명시적 실패를
검사하는 unittest 4개가 통과했다. 2026-10-06 재실행에서도 동일 결과를 확인했다.

근거: 실험 설명（비공개 정본의 근거）,
원시 요약 JSON（비공개 정본의 근거）.

## 6. 해석과 한계

확인한 것은 최신 상태의 우선권과 고정 fixture에서의 정보 보존이다. 검색 동률 규칙,
oracle 조회, 작성자가 명시한 링크, 5개 장 패턴의 반복 등 실험 조건에 결과가 의존한다.
20개 시드를 20개의 독립적인 실제 이야기로 해석하거나 신뢰구간을 새로 만들지 않는다.
모델 추론·의미 검색·캐릭터 일관성·토큰 과금·운영 지연·비용 절감은 측정하지 않았다.
키 삭제는 현재 상태에서의 제거이며 저장된 과거 근거의 개인정보 삭제가 아니다.

현재 결정은 State/RAG 역할 분리를 유지하고 graph의 제품 도입 결론은 유보하는 것이다.
운영 로그 없이 오프라인 연구를 계속하되 합성 결과로 운영 결과를 대체하지 않는다.

## 7. 다음 검증과 완료 조건

1. 모순된 lore, 인물 간 사건, 장기 의존 사슬, 정정·삭제·누락 근거가 있는 독립 시나리오를 고정한다.
2. 동일 checkpoint/query/상한 예산으로 State+실제 벡터 검색과 State+graph를 paired 비교한다.
3. 모델·prompt·decoding을 통제하고 현재 상태 오류, 과거 근거 회수, 의존 근거 완전성,
   캐릭터 일관성, 실제 provider 토큰·지연을 따로 기록한다.
4. memory 부분을 독립 반복하고 유효한 전체 시스템 trace는 재사용하되 전체 시스템에서만
   발생하는 실패를 별도로 기록한다.
5. 품질·비용 tradeoff와 stale/missing evidence 동작을 확인한 뒤 graph 도입 여부를 결정한다.

위 항목은 계획이며 완료 기록이 아니다. 실제 모델/검색 실행에는 사용 가능한 자격·환경이 필요하다.
운영 graph 적용과 비용 절감 주장은 그 검증을 마치기 전에는 완료 처리하지 않는다.

## 8. 재현과 정본

실행 위치는 `hs9147/liv_ay_backend`의 `d4b21959deb8e95e1adccef318148a0e7a541734`이다.
실험 코드를 studies로 복제하지 않아 실행 구현의 정본을 하나로 유지한다.

```sh
python -m experiments.state_memory_vs_rag
python -m experiments.memory_evaluation
python -m experiments.memory_budget_evaluation
python -m unittest discover -s tests -p 'test_memory_budget_evaluation.py' -v
```

초기 코드（비공개 정본의 근거）,
예산 비교 코드（비공개 정본의 근거）,
회귀 검사（비공개 정본의 근거）.
추가 결정·수행 날짜는 진행이력（정본 문서）, 선정 맥락은 후보 문서（정본 문서）를 참조한다.
