← 노드 한 장 전체#75 · Chat Memory Manager

Chat Memory Manager

대화 메모리, 마지막 한 개만 지워보기

이 글은 이런 분께대화 메모리를 넣고 읽은 뒤 내 테스트의 마지막 메시지만 안전하게 삭제하고 싶은 n8n 입문자
Chat Memory Manager 영상 표지

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요

JSON 받기

대화 메모리를 지울 땐 “내 테스트가 맞는지”부터 확인해야 해요.

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

따라 하기

실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. 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 ModeInsert Messages
Insert ModeInsert Messages
Message 1 › Type Name or IDUser
Message 1 › Message{{ $('Create own fixture').first().json.userText }}
Message 1 › Hide Message in Chat꺼짐
Message 2 › Type Name or IDAI
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 IDDefine below
Key{{ $('Create own fixture').first().json.sessionKey }}
Context Window Length5

Step 5. Chat Memory Manager 노드 추가이름: Get own messages before delete

Operation ModeGet 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 ModeDelete Messages
Delete ModeLast N
Messages Count1

Step 8. Chat Memory Manager 노드 추가이름: Get own messages after delete

Operation ModeGet 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'}}];

가져와서 쓸 때 확인할 것

노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.