부제: 이미 아는 건 다시 추출하지 않게 — 프로필을 미리 알려주기

대화에서 장기기억을 뽑아내는 단계가 있다. 대화를 읽고 "사용자에 대해 새로 알게 된 것"을 추려 저장하는 LLM 한 패스다. 여기서 사용자 이름 같은 게 자꾸 중복으로 들어왔다.
배경 — 기억에도 종류가 있다
저장하는 기억을 둘로 나눠 뒀다.
- 정체성(identity): 천천히 변하는 특성 (직업, 알레르기 같은)
- 에피소드(episodic): 시점에 묶인 경험 (어제 10km 뛴 것, 오늘 기분)
이 구분은 인지심리학의 의미기억/일화기억 구분(Tulving (1972), Episodic and Semantic Memory — 일화기억과 의미기억의 구분.)에서 가져왔다. 그런데 이름·생일·성별 같은 건 둘 중 어디일까. 이건 "경험"이 아니라 프로필이 관리하는 메타데이터다. 사용자가 직접 편집하는 프로필 화면이 이미 단일 출처(single source of truth)다.
증상
문제는 추출 LLM이 이걸 몰랐다는 거다. 대화에서 이름이 다시 언급되면, 모델은 그걸 "새로 알게 된 정체성"으로 보고 또 뽑아 저장했다. 사용자가 프로필에서 이름을 바꿔도, 옛 이름이 정체성 기억에 남아 계속 따라다녔다. 결국 프로필과 기억이 서로 다른 이름을 들고 있는, 출처 이원화 상태가 됐다.
정리한 방식
추출 LLM에게 이미 아는 프로필을 미리 보여주고, 그건 뽑지 말라고 했다.
<user_profile>
{ "name": "...", "birth_date": "...", "gender": "...", "language": "..." }
</user_profile>
규칙: <user_profile>에 이미 있는 필드(이름·생일·성별·언어 등)는
편집형 프로필이 단일 출처다. 정체성이나 에피소드로 복사하지 말 것.
핵심은 "추출하지 마라"는 금지보다, 이미 알고 있다는 사실 자체를 입력으로 준 것이다. 모델은 자기가 아는 걸 다시 알려주지 않는다. 중복 추출의 동기가 사라진다.
여기서 한 가지 구분이 중요했다. 중복을 막는 데 임베딩 유사도를 쓰지 않았다. 임베딩은 에피소드 기억을 검색할 때(비슷한 과거 기억을 찾아 LLM에 같이 보여줄 때) 쓰는 거고, 프로필 중복 차단은 그냥 "이건 이미 안다"는 텍스트 한 조각으로 충분했다. 문제마다 도구가 다르다.
정리
- 추출형 파이프라인은 "이미 아는 것"을 입력으로 주지 않으면, 아는 걸 또 뽑는다
- 금지 규칙보다, 이미 안다는 사실을 보여주는 편이 더 잘 통했다
- 어떤 데이터의 단일 출처가 따로 있으면, 추출 대상에서 명시적으로 빼야 출처 이원화를 막는다
- 모든 중복을 임베딩으로 풀 필요는 없다 — 검색용 도구와 중복 차단용 신호는 별개다
기억을 잘 뽑게 만드는 일의 절반은, 이미 아는 걸 다시 묻지 않게 하는 것이었다.
'개발 > AI' 카테고리의 다른 글
| [에이전트] ReAct 도구 순서 가드 read 후 write 강제 (0) | 2026.06.25 |
|---|---|
| [프롬프트] persona drift 대응 생성 지점 context 재주입 (0) | 2026.06.25 |
| [메모리] 문맥 전환 감지 임베딩 유사도 한계 매턴 검색 회귀 (0) | 2026.06.25 |
| [Gemini] thought signature 보존 환각 도구 호출 방지 (0) | 2026.06.25 |
| [디버깅] google-genai SDK TypeError 마스킹 APIError 노출 (0) | 2026.06.25 |