19차시. Node 이해
4. RAG를 어떻게 나눌까?
출처: 원본 PDF 19차시_Node이해.pdf 9쪽 · 쪽 그림 9쪽
15차시 ask() 함수를 뜯어보며 경계선을 찾습니다.
4-1) 역할 표시하기
def ask(question):
# ─────── 검색 구간 ───────
pairs = store.similarity_search_with_relevance_scores(
question, k=config.TOP_K)
docs = []
for d, s in pairs:
if s >= config.MIN_SCORE:
docs.append(d)
# ─────── 판단 구간 ───────
if not docs:
return {"answer": config.MSG_NO_DOC}
# ─────── 생성 구간 ───────
answer = _chain.invoke({"context": _build_context(docs),
"question": question})
# ─────── 검증 구간 ───────
nums = re.findall(r"\[(\d+)\]", answer)
cited = bool(nums)
for n in nums:
if not (1 <= int(n) <= len(docs)):
cited = False
return {"answer": answer, "cited": cited, ...}4-2) 구간별로 노드 만들기
| 노드 | 읽는 키 | 쓰는 키 |
|---|---|---|
| retrieve | query, top_k | documents, scores, retrieval_ok |
| generate | documents, question | answer, insufficient, has_citation |
| verify | answer, documents | grade, reason |
| fallback | question | answer |
🎯 "판단 구간"이 노드가 아닌 이유
if not docs: 부분은 노드가 아니라
조건부 Edge가 됩니다. (20차시에서 배웁니다)
노드 = 일을 하는 곳
Edge = 어디로 갈지 정하는 곳
이 구분을 지키면 그래프가 훨씬 읽기 쉬워집니다.