14장 · 근거 기반 답변왜 근거 기반 답변이 필요한가 — 찾은 것을 그냥 붙이면 안 되는 이유Retriever — 검색을 부품으로 만든다컨텍스트 주입과 출처 꼬리표 — 발췌를 어떻게 넣을 것인가세 가지 규칙과 기권 — 없으면 없다고 말하게 한다따라하기 — 출처를 밝히며 답하기정리와 체크리스트실습문제와 해답
14장. 근거 기반 답변
정리와 체크리스트
14장에서 배운 것
- RAG의 세 단계 — 검색(Retrieval) → 증강(Augmented) → 생성(Generation).
- Retriever —
invoke(질문)→Document목록. 검색 방법을 갈아 끼울 수 있게 감싼 부품입니다. - 컨텍스트 주입 — 찾은 청크를 번호와 출처 꼬리표를 붙여 프롬프트에 넣는 일입니다.
- 그라운딩 — 모델의 답을 주어진 근거 자료에 묶어 두는 것입니다.
- 출처 표기 — 모델이 근거 발췌를 선택하면 코드가
(근거: doc_title · article)로 표시합니다. - 기권 — 근거가 없으면 정해진 문장으로 물러나는 것. 환각을 막는 마지막 장치입니다.
한눈에 보는 핵심
docs = retriever.invoke(question) # ① 검색: 임베딩 모델 + Chroma
context = "\n\n".join(f"[발췌 {i+1}] (문서 · 조항)\n본문" ...) # ② 주입: 우리 코드
prompt = f"[정책 발췌]\n{context}\n\n[고객 문의]\n{question}"
response = client.models.generate_content( # ③ 생성: LLM
model=MODEL, contents=prompt,
config=types.GenerateContentConfig(
system_instruction=RAG_SYSTEM, temperature=1.0,
response_mime_type="application/json", response_schema=PolicyAnswer),
)
| 누가 한 일인가 | 내용 |
|---|---|
| 임베딩 모델 + Chroma | 질문과 가까운 청크 4개를 골랐습니다. 관련이 없어도 4개를 줍니다 |
| 우리(개발자) | k=4, 꼬리표의 모양, 세 가지 규칙, 기권 문구를 정했습니다 |
| 우리 코드 | 청크에 꼬리표를 붙이고 응답을 검증한 뒤 메타데이터로 출처를 표시했습니다 |
| LLM | 발췌를 읽고 답과 근거 번호를 선택했습니다. 근거가 없으면 빈 목록을 반환했습니다 |
| 답이 이상할 때 | 먼저 볼 곳 |
|---|---|
[준비 필요] chroma_db/ … 안내가 나오고 멈춘다 |
13장의 파일을 먼저 실행합니다 |
| 문서에 있는 내용인데 기권했다 | [검색] 목록에 정답 청크가 있는지 봅니다. 없으면 검색의 문제입니다 (15장) |
| 금액·기간이 정책과 다르다 | 발췌에 그 숫자가 있는지 봅니다. 없으면 모델이 발췌 밖에서 가져온 것입니다 |
| 출처를 확인하고 싶다 | [검색] 목록의 꼬리표에 그 이름이 있는지 보고, 정책 문서 원문과 대조합니다 |
체크리스트
- [ ] RAG의 세 단계를 말하고, 각 단계를 누가 하는지 설명할 수 있다.
- [ ]
Chroma.from_documents(...)와Chroma(...)의 차이를 설명할 수 있다. - [ ] 저장소를 열기 전에 폴더가 있는지, 연 뒤에 청크가 있는지 확인하는 이유를 설명할 수 있다.
- [ ] Retriever로 한 번 감싸는 이유를 설명할 수 있다.
- [ ] 청크를 그냥 이어 붙이면 출처를 표기할 수 없는 이유를 설명할 수 있다.
- [ ] 출처 꼬리표가 12장, 13장, 14장을 거쳐 어떻게 답변에 닿는지 말할 수 있다.
- [ ] 기권할 때 쓸 문장까지 정해 주는 이유를 두 가지 말할 수 있다.
- [ ] "해외 배송도 반품 되나요?"에 검색 결과가 4개 나왔는데도 기권이 옳은 이유를 설명할 수 있다.
- [ ]
article에 조항이 여럿일 때 전체가 표시되는 이유를 설명할 수 있다. - [ ] 빈 근거 목록이나 유효하지 않은 응답에 출처를 붙이지 않는 이유를 설명할 수 있다.
한 줄 핵심
근거를 넣어 주면 모델은 정확해집니다. 다만 무엇을 넣을지, 어떤 이름표를 붙일지, 없을 때 뭐라고 할지는 모두 우리가 정합니다.