← 노드 한 장 전체#55 · Question and Answer Chain
Question and Answer Chain
규칙 문서를 찾아서 답하게 하기
이 글은 이런 분께AI가 직접 제공한 문서를 검색하고 그 근거로 답하게 하는 흐름을 실제 입력·검색·답변으로 확인하고 싶은 분

1분 영상은 @workflow.hanjang 에 순서대로 공개돼요
규칙 문서를 찾아서 답하게 하기.
노드 한 장 #55 · Question and Answer Chain
먼저 결과부터
RAG는 문서를 검색해 그 내용을 모델에게 주고 답하게 하는 방식이에요. 직접 쓴 가상 환불 규칙 1문서를 독립 벡터 키에 넣었고, 실제 lookup은 1문서·각 질문의 검색도 1문서였어요. 두 모델 입력 모두 검색 원문을 포함했고 환불 질문에는 샘플 규칙의 ‘3영업일’, 회원 적립률 질문에는 문서에서 확인 불가라고 답했어요. 두 번째도 문서는 검색됐지만 그 안에 답이 없었어요. 샘플 문서·실제 AI 출력이며 정답 보장이나 영구 보존 검증은 아니에요. 실행 #74857.
우리가 실제로 돌린 기록 · 실행 #74857 · 2026-10-30
우리가 실제로 돌린 기록 · 실행 #74857 · 2026-10-30
- 샘플 규칙: 환불 접수는 상품 수령일로부터 3영업일 안에 해야 함
- 삽입 결과 1 item, 직접 lookup 결과 1문서
- Retriever가 각 질문에 반환한 문서도 각각 1개
- 실제 모델 입력 2건 모두 검색된 원문이 들어 있었음
따라 하기
실제로 실행한 워크플로우를 바탕으로 정리했어요. 계정·식별자는 공개용 값으로 치환했고, 그 밖의 차이는 아래 주의사항에 표시했어요. n8n 캔버스에서 +를 눌러 노드를 순서대로 추가하고 같은 값을 넣으면 돼요. 빨간 제목이 이번 편의 주인공 노드예요. 표 왼쪽은 n8n 편집기에 보이는 칸 이름, 오른쪽은 다운로드 JSON의 설정값이에요. 직접 입력하기 번거로우면 JSON을 받아 ⋯ → Import from File로 가져오세요.
Step 1. Manual Trigger 노드 추가이름: Run manually
설정 없이 그대로 추가해요.
Step 2. Code 노드 추가이름: Self-written sample policy
| JavaScript | return [{json:{sample:true,source:"SELF_WRITTEN_SAMPLE_RULES",policy:"가상 별빛상점 실습용 규칙입니다. 이 문서는 직접 작성한 샘플이며 실제 회사나 고객 정책이 아닙니다.\n환불 접수는 상품 수령일로부터 3영업일 안에 해야 합니다.\n포장 파손 문의에는 사진 한 장과 샘플 주문 코드가 필요합니다."}}]; |
Step 3. Simple Vector Store 노드 추가이름: Insert only own sample vector
| Operation Mode | Insert Documents |
| Memory Key | TEST_QA_VECTOR_KEY |
| Clear Store | 켜짐 |
Step 4. Embeddings OpenAI 노드 추가이름: Embeddings OpenAI
| Model | text-embedding-3-small |
Step 5. Default Data Loader 노드 추가이름: Default Data Loader
| Type of Data | JSON |
| Mode | Load Specific Data |
| Data | {{ $json.policy }} |
| Text Splitting | Simple |
| Options › Metadata › Fields to Set › Name | source |
| Options › Metadata › Fields to Set › Value | SELF_WRITTEN_SAMPLE_RULES |
Step 6. Simple Vector Store 노드 추가이름: Direct lookup evidence
| Operation Mode | Get Many |
| Memory Key | TEST_QA_VECTOR_KEY |
| Prompt | 환불 접수 기한 |
| Limit | 5 |
| Include Metadata | 켜짐 |
Step 7. Code 노드 추가이름: Prepare sample questions
| JavaScript | return [{json:{sample:true,case:"document_answer",question:"물건을 받은 뒤 며칠 안에 환불 신청을 넣어야 하나요?"}},{json:{sample:true,case:"not_in_document",question:"회원 등급별 적립률은 몇 퍼센트인가요?"}}]; |
Step 8. Question and Answer Chain 노드 추가이름: Question and Answer Chain
| Source for Prompt (User Message) | Define below |
| Prompt (User Message) | {{ $json.question }} |
| Options › System Prompt Template | 당신은 가상 규칙 문서 실습의 질의응답 도우미입니다. 다음 검색된 문서 내용만 근거로 질문에 한국어로 답하세요. 문서에 답이 없으면 추측하거나 상식으로 보충하지 말고 "제공된 샘플 문서에서는 확인할 수 없습니다."라고만 답하세요. 답에 근거가 있으면 짧게 설명하고 샘플 문서 기준이라고 명시하세요.
검색된 문서:
{context} |
| Options › Batch Processing › Batch Size | 1 |
Step 9. OpenAI Chat Model 노드 추가이름: OpenAI Chat Model
| Model | gpt-4.1-mini |
| Use Responses API | 꺼짐 |
| Options › Sampling Temperature | 0 |
| Options › Maximum Number of Tokens | 200 |
Step 10. Vector Store Retriever 노드 추가이름: Vector Store Retriever
| Limit | 1 |
Step 11. Code 노드 추가이름: Show sample AI answers
| JavaScript | return $input.all().map((i,n)=>({json:{sample:true,question:$('Prepare sample questions').all()[n].json.question,answer:i.json.response??i.json.text??i.json.output??JSON.stringify(i.json),note:'직접 쓴 가상 규칙 · 실제 AI 출력'}})); |
Step 12. Simple Vector Store 노드 추가이름: Retrieve own sample vector
| Operation Mode | Retrieve Documents (As Vector Store for Chain/Tool) |
| Memory Key | TEST_QA_VECTOR_KEY |
가져와서 쓸 때 확인할 것
- 문서는 직접 작성한 가상 실습 규칙이며 실제 회사·고객 정책이 아니다.
- 실제 삽입은 1 item, 직접 lookup은 1문서, 두 질문의 Retriever 검색 결과는 각 1문서였다.
- Retrieve own sample vector의 검색 문서와 실제 OpenAI model inputOverride messages에 샘플 원문 전체가 포함된 것을 대조했다.
- 문서 밖 적립률 질문도 1문서를 검색했지만 답이 그 안에 없었다. 문서 0개였다고 설명하지 않는다.
- 실제 AI 출력은 그대로 보존했으며 RAG도 정답 보장이나 오답 방지 보증은 아니다.
- 공개 TEST_QA_VECTOR_KEY를 본인만의 고유 테스트 키로 모두 바꾼 뒤 사용한다. v1.3 키는 워크플로우 간 공유되며 clearStore=true는 해당 키를 지우므로 다른 사람·54편 키를 재사용하지 않는다.
- 실제 키와 자격 증명은 공개하지 않으며 publicworkflow.json에는 credentials가 없다.
- 인메모리 실습으로 영구 보존·운영 확장·큐 모드 안전성은 검증하지 않았다.
- 직접 lookup score를 정답 확률로 해석하지 않는다. Chain의 aggregate tracing 토큰은 전체 모델 호출 합계를 보장하지 않아 실제 두 model subrun 합계를 따로 계산했다.
- YOUR_… 표시를 내 값으로 바꾸고, 계정이 필요한 서비스 노드만 자격 증명을 연결하세요. 그런 칸이나 노드가 없는 예제는 추가 계정 없이 실행할 수 있어요.
노드의 모든 옵션은 n8n 공식 문서에서 볼 수 있어요.