← 노드 한 장 전체#59 · Vector Store Retriever
Vector Store Retriever
회의실 취소·교통비, AI가 받은 근거는?
이 글은 이런 분께AI에 넘기는 검색 근거 문서 수가 실제로 어떻게 달라지는지 확인하고 싶은 분

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
회의실을 못 쓰게 되면 언제 취소하고, 외근 교통비 서류는 언제 내야 할까요?
직접 쓴 가상 문서 3개를 새 고유 메모리 저장소에 넣고, 같은 질문에 Retriever의 Limit만 1과 2로 나눠 비교했습니다. 실제 회사 규정이나 개인정보가 아닌 교육용 샘플입니다.
먼저 결과부터
새 고유 메모리 저장소에 직접 쓴 서로 다른 샘플 문서 3개를 등록하고, 같은 질문을 Vector Store Retriever Limit 1·2로 실행했습니다. 실제 벡터 조회 k=1의 response는 교통비 E2 1개, k=2는 교통비 E2+회의실 M1 2개였어요. 모델에 전달된 실제 context도 각각 1개·2개로 원본 전체와 일치했습니다. Retriever는 문서를 찾아 AI에 넘기는 역할이며 답변 생성 자체는 Q&A Chain과 Chat Model이 했습니다. 최대 개수가 늘면 항상 더 정확하다는 뜻은 아닙니다. 두 설정 확인에 모델 노드 2회(417토큰), 임베딩 노드 3회가 기록됐습니다. 실제 회사 정보가 아닌 교육용 샘플입니다. (실제 실행 #74873)
우리가 실제로 돌린 기록 · 실행 #74873 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #74873 · 2026-10-30
따라 하기
실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.
Step 1. Manual Trigger 노드 추가이름: Run manually
설정 없이 그대로 추가해요.
Step 2. Code 노드 추가이름: Three new sample policies
| JavaScript | const policies=["[샘플정책 M1: 회의실] 실제 회사 규정이 아닌 교육용 가상 문서입니다. 회의실 예약 취소는 이용 시작 60분 전까지 신청합니다. 그 이후에는 시설 담당 역할에게 알려야 합니다.","[샘플정책 E2: 교통비] 실제 회사 규정이 아닌 교육용 가상 문서입니다. 외근 교통비는 영수증과 목적을 적어 다음 영업일까지 제출합니다. 영수증이 없으면 검토가 보류됩니다.","[샘플정책 D3: 공용 장비] 실제 회사 규정이 아닌 교육용 가상 문서입니다. 공용 태블릿은 사용 전 배터리를 확인합니다. 돌려줄 때는 전원을 끄고 보관함 충전 선을 연결합니다."];const data=await this.helpers.prepareBinaryData(Buffer.from(JSON.stringify(policies.map(policy=>({policy}))),"utf8"),"retriever-samples.json","application/json");return [{json:{sample:true,policyCount:3},binary:{data}}]; |
Step 3. Simple Vector Store 노드 추가이름: Insert own new store
| Operation Mode | Insert Documents |
| Memory Key | TEST_RETRIEVER_STORE |
| Clear Store | 꺼짐 |
Step 4. 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 5. Embeddings OpenAI 노드 추가이름: Embeddings OpenAI
| Model | text-embedding-3-small |
Step 6. Code 노드 추가이름: One identical question
| JavaScript | return [{json:{sample:true,question:"회의실을 못 쓰게 되면 언제 취소하고, 외근 교통비 서류는 언제 내야 하죠?"}}]; |
Step 7. Question and Answer Chain 노드 추가이름: QA Limit 1
| Source for Prompt (User Message) | Define below |
| Prompt (User Message) | {{ $json.question }} |
| Options › System Prompt Template | 교육용 가상 정책의 근거만 사용하세요. 질문 중 근거가 없는 부분은 근거 없다고 쓰세요. 한국어 80자 이내 한 문장으로 답하세요. 실제 회사 규정으로 표현하지 마세요.
근거 문서:
{context} |
Step 8. OpenAI Chat Model 노드 추가이름: OpenAI Chat Model
| Model | gpt-4.1-mini |
| Use Responses API | 꺼짐 |
| Options › Sampling Temperature | 0 |
Step 9. Vector Store Retriever 노드 추가이름: Retriever Limit 1
| Limit | 1 |
Step 10. Question and Answer Chain 노드 추가이름: QA Limit 2
| Source for Prompt (User Message) | Define below |
| Prompt (User Message) | {{ $json.question }} |
| Options › System Prompt Template | 교육용 가상 정책의 근거만 사용하세요. 질문 중 근거가 없는 부분은 근거 없다고 쓰세요. 한국어 80자 이내 한 문장으로 답하세요. 실제 회사 규정으로 표현하지 마세요.
근거 문서:
{context} |
Step 11. Vector Store Retriever 노드 추가이름: Retriever Limit 2
| Limit | 2 |
Step 12. Simple Vector Store 노드 추가이름: Own store provider
| Operation Mode | Retrieve Documents (As Vector Store for Chain/Tool) |
| Memory Key | TEST_RETRIEVER_STORE |
가져와서 쓸 때 확인할 것
- Limit은 최대 반환 개수입니다. 항상 정확한 검색 결과나 답변 품질을 보장하지 않습니다.
- 숫자 설정만 보고 반환 수를 주장하지 마세요. 실제 벡터 조회의 k·response와 모델 context에서 각각 1개·2개를 대조했습니다.
- 이 환경의 Q&A Chain은 Model 연결이 필수여서 두 조건 검증에 모델 2회를 사용했습니다. Retriever 자체가 답변을 생성하는 것은 아닙니다.
- 문서 3개를 단일 JSON 바이너리 파일로 읽고 등록된 전체 pageContent가 서로 다른 원본 3개와 일치함을 검증했습니다.
- 공개 TEST_RETRIEVER_STORE는 새 본인 고유 키로 교체하세요. 다른 키를 재사용·삭제하지 말고 민감 문서를 넣지 마세요.
- 이번 Retriever 편집기 Output은 표시되지 않아 실제 부모 벡터 조회 응답과 모델 입력 로그로 문서 수를 검증했습니다.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.