← 노드 한 장 전체#54 · Simple Vector Store

Simple Vector Store

노트북 받은 뒤 할 일, 가상 정책에서 찾기

이 글은 이런 분께소량의 가상 문서를 등록하고 표현이 다른 질문으로 내용을 검색해 보고 싶은 분
Simple Vector Store 영상 표지

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

JSON 받기

노트북을 받았는데 온라인 업무 전에 뭘 해야 할까요?

직접 쓴 가상 정책 세 개(휴가·재택 장비·비용 정산)를 저장하고, 정책과 표현이 다른 질문으로 검색했어요. 실제 회사 규정이나 개인정보가 아닌 교육용 샘플입니다.

먼저 결과부터

직접 쓴 가상 정책 세 개를 JSON 파일 하나로 준비해 실제 로더 문서 3개·저장 청크 3개를 만들었습니다. 등록과 검색의 pageContent는 모두 서로 다른 원본 샘플과 일치해 첫 항목 복제가 아님을 검증했어요. text-embedding-3-small로 표현이 다른 질문을 검색하니 재택 장비가 1위(0.4438), 휴가 0.2455, 비용 정산 0.1739였습니다(소수 4자리 반올림). 검색 232ms이며 채팅 LLM은 쓰지 않았습니다. 유사도는 확률·정확도 보장이 아니고, 인메모리 데이터는 재시작·메모리 부족으로 사라질 수 있습니다. 같은 인스턴스 사용자들이 접근 가능하므로 실제 민감 문서 대신 샘플만 사용하세요. (실제 실행 #74855)
우리가 실제로 돌린 기록 · 실행 #74855 · 2026-10-30
Simple Vector Store 실제 n8n 화면 1
우리가 실제로 돌린 n8n 화면 (실행 #74855, 2026-10-30)

따라 하기

실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.

Step 1. Manual Trigger 노드 추가이름: Run manually

설정 없이 그대로 추가해요.

Step 2. Code 노드 추가이름: Prepare three sample policies

JavaScript
// 교육용 가상 정책만. 실제 회사 문서/개인정보 없음
const policies=["[교육용 가상 정책: 휴가] 실제 회사 규정이 아닙니다. 연차는 예정일 사흘 전에 신청합니다. 갑자기 병원에 가야 하는 긴급 사유는 당일 신청도 가능합니다.","[교육용 가상 정책: 재택 장비] 실제 회사 규정이 아닙니다. 재택근무 장비를 지급받으면 처음 온라인 업무를 시작하기 전에 운영체제 보안 업데이트를 설치하고 VPN 접속 시험을 마칩니다.","[교육용 가상 정책: 비용 정산] 실제 회사 규정이 아닙니다. 출장 교통비는 택시 영수증과 사용 사유를 붙여 다음 주 월요일까지 제출합니다. 증빙 없는 비용은 승인하지 않습니다."];const data=await this.helpers.prepareBinaryData(Buffer.from(JSON.stringify(policies.map(policy=>({policy}))),"utf8"),"sample-policies.json","application/json");return [{json:{sample:true,policyCount:3},binary:{data}}];

Step 3. Simple Vector Store 노드 추가이름: Insert sample policies

Operation ModeInsert Documents
Memory KeyTEST_VECTOR_STORE_KEY
Clear Store꺼짐
Embedding Batch Size200

Step 4. Embeddings OpenAI 노드 추가이름: Embeddings OpenAI

Modeltext-embedding-3-small

Step 5. Default Data Loader 노드 추가이름: Default Data Loader

Type of DataBinary
ModeLoad Specific Data
Input Data Field Namedata
Data FormatJSON
Text SplittingSimple
Options › JSON Pointers/policy

Step 6. Code 노드 추가이름: Prepare one search

JavaScriptreturn [{json:{sample:true,query:"집에서 업무 볼 노트북을 받았는데 인터넷 연결 전에 뭘 해야 하죠?",insertOutputItems:$input.all().length}}];

Step 7. Simple Vector Store 노드 추가이름: Search same memory

Operation ModeGet Many
Memory KeyTEST_VECTOR_STORE_KEY
Prompt{{ $json.query }}
Limit3
Include Metadata켜짐

Step 8. Code 노드 추가이름: Verify retrieved content

JavaScript
const expected=["[교육용 가상 정책: 휴가] 실제 회사 규정이 아닙니다. 연차는 예정일 사흘 전에 신청합니다. 갑자기 병원에 가야 하는 긴급 사유는 당일 신청도 가능합니다.","[교육용 가상 정책: 재택 장비] 실제 회사 규정이 아닙니다. 재택근무 장비를 지급받으면 처음 온라인 업무를 시작하기 전에 운영체제 보안 업데이트를 설치하고 VPN 접속 시험을 마칩니다.","[교육용 가상 정책: 비용 정산] 실제 회사 규정이 아닙니다. 출장 교통비는 택시 영수증과 사용 사유를 붙여 다음 주 월요일까지 제출합니다. 증빙 없는 비용은 승인하지 않습니다."];const rows=$input.all().map(i=>i.json);const docs=rows.map(r=>r.document?.pageContent??r.pageContent);return [{json:{sample:true,retrievedItems:rows.length,uniqueContents:new Set(docs).size,allMatchSamples:docs.every(c=>expected.includes(c)),allPoliciesPresent:expected.every(c=>docs.includes(c)),results:rows}}];

가져와서 쓸 때 확인할 것

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