← 노드 한 장 전체#54 · Simple Vector Store
Simple Vector Store
노트북 받은 뒤 할 일, 가상 정책에서 찾기
이 글은 이런 분께소량의 가상 문서를 등록하고 표현이 다른 질문으로 내용을 검색해 보고 싶은 분

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
노트북을 받았는데 온라인 업무 전에 뭘 해야 할까요?
직접 쓴 가상 정책 세 개(휴가·재택 장비·비용 정산)를 저장하고, 정책과 표현이 다른 질문으로 검색했어요. 실제 회사 규정이나 개인정보가 아닌 교육용 샘플입니다.
먼저 결과부터
직접 쓴 가상 정책 세 개를 JSON 파일 하나로 준비해 실제 로더 문서 3개·저장 청크 3개를 만들었습니다. 등록과 검색의 pageContent는 모두 서로 다른 원본 샘플과 일치해 첫 항목 복제가 아님을 검증했어요. text-embedding-3-small로 표현이 다른 질문을 검색하니 재택 장비가 1위(0.4438), 휴가 0.2455, 비용 정산 0.1739였습니다(소수 4자리 반올림). 검색 232ms이며 채팅 LLM은 쓰지 않았습니다. 유사도는 확률·정확도 보장이 아니고, 인메모리 데이터는 재시작·메모리 부족으로 사라질 수 있습니다. 같은 인스턴스 사용자들이 접근 가능하므로 실제 민감 문서 대신 샘플만 사용하세요. (실제 실행 #74855)
우리가 실제로 돌린 기록 · 실행 #74855 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #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 Mode | Insert Documents |
| Memory Key | TEST_VECTOR_STORE_KEY |
| Clear Store | 꺼짐 |
| Embedding Batch Size | 200 |
Step 4. Embeddings OpenAI 노드 추가이름: Embeddings OpenAI
| Model | text-embedding-3-small |
Step 5. Default Data Loader 노드 추가이름: Default Data Loader
| Type of Data | Binary |
| Mode | Load Specific Data |
| Input Data Field Name | data |
| Data Format | JSON |
| Text Splitting | Simple |
| Options › JSON Pointers | /policy |
Step 6. Code 노드 추가이름: Prepare one search
| JavaScript | return [{json:{sample:true,query:"집에서 업무 볼 노트북을 받았는데 인터넷 연결 전에 뭘 해야 하죠?",insertOutputItems:$input.all().length}}]; |
Step 7. Simple Vector Store 노드 추가이름: Search same memory
| Operation Mode | Get Many |
| Memory Key | TEST_VECTOR_STORE_KEY |
| Prompt | {{ $json.query }} |
| Limit | 3 |
| 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}}]; |
가져와서 쓸 때 확인할 것
- 등록 전 본인의 새로운 고유 키를 두 Vector Store 노드에 같은 값으로 설정하세요. TEST_VECTOR_STORE_KEY는 공개용 자리표시자입니다.
- 서브노드 표현식은 첫 입력 항목을 참조할 수 있습니다. 이번에는 1개 바이너리 JSON 파일에 세 정책을 모두 담고 /policy로 추출했으며 실제로 서로 다른 문서·청크 3개가 나왔음을 검증했습니다.
- 유사도 점수는 확률이나 정확도 보장이 아닙니다. 화면 점수는 소수 4자리 반올림입니다.
- 인메모리 데이터는 영구 보존되지 않고 같은 인스턴스의 다른 사용자도 접근할 수 있으므로 민감 문서는 넣지 마세요.
- 추가 채팅 LLM은 쓰지 않았지만 임베딩 API는 과금 대상입니다.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.