RAG2026-5일19차시 · Node 이해6 / 19← 이전목차다음 →MetaContents

19차시. Node 이해

3. 좋은 노드의 4가지 조건

출처: 원본 PDF 19차시_Node이해.pdf 7~8쪽 · 쪽 그림 7쪽 8쪽

이 기준으로 나누면 나중에 고치기 쉬운 그래프가 됩니다.

3-1) 조건 ① — 한 가지 일만 한다

🎯 이름 짓기 테스트
노드에 이름을 붙여보세요.
이름에 "~하고 ~하는"이 들어가면 쪼개야 합니다.

❌ search_and_generate_node

❌ retrieve_and_verify_node

✅ retrieve_node

✅ generate_node
노드 이름은 동사 하나로 지으세요.

3-2) 조건 ② — 입력은 State에서만

❌ 나쁜 예 — 외부 변수에 의존

출력
──────────────────────────────────
current_query = "환불 규정"        # 전역 변수

def bad_node(state):
    return {"documents": search(current_query)}

→ 테스트할 때 전역 변수도 설정해야 합니다
→ 여러 요청이 동시에 오면 값이 섞입니다

✅ 좋은 예 — State에서만 읽기

출력
──────────────────────────────────
def good_node(state):
    query = state.get("query") or state["question"]
    return {"documents": search(query)}

→ state 하나만 주면 테스트됩니다
→ 동시 요청에도 안전합니다

3-3) 조건 ③ — 출력은 변경분만

출처: 원본 PDF 8쪽

자기가 만든 결과만 딕셔너리로 반환합니다.
남의 키는 건드리지 않습니다.
retrieve 노드가 answer를 반환하면
"검색 노드가 왜 답변을 만들지?" 하고 혼란이 생깁니다.

3-4) 조건 ④ — 혼자서도 실행된다

출처: 원본 PDF 8쪽

Python
if __name__ == "__main__":
    result = retrieve_node({"query": "환불 규정"})
    print(result)

실행 결과 예시 (코드를 읽고 만든 예상 화면입니다. 실제 실행 결과, 특히 모델의 답은 다를 수 있습니다)

출력
{'documents': [Document(metadata={'filename': 'manual.pdf', 'page_no': 2}, page_content='4. 환불 및 교환 규정\n환불\n상품 수령 후 7 일 이내에 환불을 신청하실 수 있습니다.\n단순 변심의 경우 왕복 배송비는 고객 부담입니다. ...'), Document(metadata={'filename': 'manual.pdf', 'page_no': 2}, page_content='교환\n상품 불량의 경우 30 일 이내에 교환이 가능합니다. ...'), Document(...)], 'scores': [0.712, 0.634, 0.481, 0.398, 0.342], 'retrieval_ok': True, 'log': ["[retrieve] '환불 규정' → 3/5건 통과"]}

파일 맨 아래에 이 블록을 두는 것을 습관으로 만드세요.
python nodes/retriever.py
한 줄로 노드 하나만 검증할 수 있습니다.

← 이전 절19차시 · 2. 왜 굳이 함수를 쪼갤까?다음 절 →19차시 · 4. RAG를 어떻게 나눌까?