← 노드 한 장 전체#75 · Chat Memory Manager
Chat Memory Manager
대화 메모리, 마지막 한 개만 지워보기
이 글은 이런 분께대화 메모리를 넣고 읽은 뒤 내 테스트의 마지막 메시지만 안전하게 삭제하고 싶은 n8n 입문자

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
대화 메모리를 지울 땐 “내 테스트가 맞는지”부터 확인해야 해요.
Chat Memory Manager로 직접 쓴 가상 User·AI 역할 문장 2개를 넣고, 내 고유 fixture 키와 본문·역할을 guard로 확인한 다음 마지막 1개만 삭제했습니다.
먼저 결과부터
실습: 매 실행 고유 fixtureID 생성 → 같은 Simple Memory 키로 가상 대화 2개 Insert → Get → 이번 실행의 키·기대 본문·역할 완전 일치 guard → Delete Last N=1 → Get. 실제 User 메시지만 남았고 messages 배열과 숫자 messagesCount를 2→1로 대조했습니다. 기존 세션 키를 쓰지 않으며 공개 JSON에도 고유 키 생성과 guard를 유지했습니다. AI 역할 문장도 직접 쓴 가상 샘플입니다.
우리가 실제로 돌린 기록 · 실행 #74956 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #74956 · 2026-10-30
따라 하기
실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.
Step 1. Manual Trigger 노드 추가이름: Run manually
설정 없이 그대로 추가해요.
Step 2. Code 노드 추가이름: Create own fixture
| JavaScript | const executionId=String($execution.id||''); if(!executionId)throw Error('Missing execution ID'); const owner='EP75_OWN_FIXTURE'; const sessionKey=`${owner}:${$workflow.id}:${executionId}:${Date.now()}:${Math.random().toString(36).slice(2)}`; return [{json:{sample:true,fictional:true,owner,executionId,sessionKey,userText:'가상 실습: 프로젝트 별칭은 달빛입니다.',aiText:'가상 AI 역할 샘플: 별칭 달빛을 기록했습니다.'}}]; |
Step 3. Chat Memory Manager 노드 추가이름: Insert own fictional messages
| Operation Mode | Insert Messages |
| Insert Mode | Insert Messages |
| Message 1 › Type Name or ID | User |
| Message 1 › Message | {{ $('Create own fixture').first().json.userText }} |
| Message 1 › Hide Message in Chat | 꺼짐 |
| Message 2 › Type Name or ID | AI |
| Message 2 › Message | {{ $('Create own fixture').first().json.aiText }} |
| Message 2 › Hide Message in Chat | 꺼짐 |
Step 4. Simple Memory 노드 추가이름: Simple Memory own runtime fixture
| Session ID | Define below |
| Key | {{ $('Create own fixture').first().json.sessionKey }} |
| Context Window Length | 5 |
Step 5. Chat Memory Manager 노드 추가이름: Get own messages before delete
| Operation Mode | Get Many Messages |
| Simplify Output | 꺼짐 |
| Options › Group Messages | 켜짐 |
Step 6. Code 노드 추가이름: Guard exact own fixture before delete
| JavaScript | const f=$('Create own fixture').first().json; const j=$input.first().json; const prefix=`EP75_OWN_FIXTURE:${$workflow.id}:${$execution.id}:`; if(f.owner!=='EP75_OWN_FIXTURE'||f.executionId!==String($execution.id)||!f.sessionKey.startsWith(prefix)||!f.fictional)throw Error('STOP: not this execution own fixture'); const m=j.messages; if(!Array.isArray(m)||j.messagesCount!==2||m.length!==2||m[0]?.kwargs?.content!==f.userText||m[1]?.kwargs?.content!==f.aiText||m[0]?.id?.at(-1)!=='HumanMessage'||m[1]?.id?.at(-1)!=='AIMessage')throw Error('STOP: expected own sample contents or roles mismatch'); return [{json:{ownFixtureGuardPassed:true,beforeCount:m.length,sessionKey:f.sessionKey,expectedDeleteCount:1,fixtureOnly:true}}]; |
Step 7. Chat Memory Manager 노드 추가이름: Delete last one own sample
| Operation Mode | Delete Messages |
| Delete Mode | Last N |
| Messages Count | 1 |
Step 8. Chat Memory Manager 노드 추가이름: Get own messages after delete
| Operation Mode | Get Many Messages |
| Simplify Output | 꺼짐 |
| Options › Group Messages | 켜짐 |
Step 9. Code 노드 추가이름: Verify exact before and after
| JavaScript | const f=$('Create own fixture').first().json,j=$input.first().json,g=$('Guard exact own fixture before delete').first().json; const m=j.messages; if(!g.ownFixtureGuardPassed||g.sessionKey!==f.sessionKey||!Array.isArray(m)||j.messagesCount!==1||m.length!==1||m[0]?.kwargs?.content!==f.userText||m[0]?.id?.at(-1)!=='HumanMessage')throw Error('After-delete mismatch');return [{json:{sample:true,fictional:true,modelCalls:0,beforeCount:g.beforeCount,deletedLast:1,afterCount:m.length,remainingRole:'HumanMessage',remainingText:m[0].kwargs.content,aiRoleSampleRemoved:true,guardPassed:true,sessionKeyMatches:true,outputType:'messages: array; messagesCount: number',note:'Directly authored fictional conversation, not a generated AI response'}}]; |
가져와서 쓸 때 확인할 것
- 모든 Simple Memory 참조는 Create own fixture의 동일한 sessionKey를 명시적으로 사용합니다. 기존 실습 key를 재사용하지 마세요.
- 삭제 직전 guard가 없거나 예상 키·본문·역할이 다르면 즉시 중단해야 합니다. 성공 표시만 보고 삭제 대상을 추정하면 안 됩니다.
- Delete Mode는 Last N이고 Messages Count는 1입니다. All Messages나 Override All Messages는 사용하지 않았습니다.
- Manager v1.1의 Insert/Delete 출력 success:true는 메시지 개수가 아닙니다. Get의 groupMessages=true, simplifyOutput=false로 messages 배열과 숫자 messagesCount를 실제 비교했습니다.
- Simplify Output ON은 역할을 묶어 출력하므로 messagesCount가 원본 메시지 개수와 달라질 수 있습니다. 이번 실습은 OFF입니다.
- AI 역할 문장은 사람이 직접 쓴 가상 샘플입니다. 모델이 생성한 실제 응답으로 소개하지 않습니다.
- Simple Memory의 프로세스 메모리는 영구 저장소가 아니며 재시작·Queue Mode·Multi-Main 등에서 공유·지속성을 보장하지 않습니다.
- 공개 JSON에도 런타임 고유 키 생성과 삭제 guard가 그대로 있습니다. 노드를 부분 실행해 guard를 건너뛰지 마세요.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.