/ 학습 / 안내서 / LLM·프롬프트
L3 심화 · 4분 읽기

소방 법령·SOP, RAG로 근거 있게 답하기

예방안전팀 2026.06.29 갱신 법령·SOP 질의응답에 AI를 쓰려는 담당자·연구자
#RAG#법령#청킹#Ragas

"근거 법령을 확인했습니다"라고 쓰기 전에, LLM이 조문 번호와 내용을 그럴듯하게 지어내는 환각이 법령·SOP 영역에서 가장 위험합니다. RAG(검색 증강 생성)는 답을 만들기 전에 먼저 공식 문서에서 근거를 검색해 고정하고, 그 근거로만 답하며, 답이 근거에 충실한지 평가로 검증하는 방식입니다.

이 안내서를 끝내면 문서를 검색 가능한 형태로 정리하고, 법령에 맞는 조문 단위 청킹을 적용하고, 답변에 근거 링크를 강제하고, 충실도를 Ragas로 검증할 수 있습니다.

RAG 4단

단계무엇을핵심 원칙
1 정리문서 → 텍스트출처·확인일을 메타로 보존
2 청킹텍스트 → 검색 조각임의 분할 금지, 조/항 경계
3 생성근거 → 답변검색된 근거에만 기반, 링크 강제
4 검증답변 → 점수충실도·맥락정밀도 + 골든셋 회귀

1. 문서 정리

PDF 법령·매뉴얼을 검색 가능한 텍스트로 바꿉니다.

안전한 AI 운영 도구의 MarkItDown·Unstructured를 쓰고, 어떤 문서를 모을지는 소방 공공데이터·API 지도의 공식 법령 출처를 따르세요. 공개 법령·SOP만 쓰고, 내부 비공개 문서는 권한·보안을 따로 설계합니다.

2. 청킹 — 법령은 조문 경계로

일반 RAG는 텍스트를 일정 토큰으로 자르지만, 법령을 토큰 수로 자르면 한 조문이 두 조각으로 쪼개져 근거가 깨집니다. 법령은 조/항 경계로 나누고, 조문번호·출처·확인일을 메타로 같이 저장합니다.

PYTHON
import re

# '제3조', '제3조의2' 경계로 분할 — 조문이 잘리지 않게
ARTICLE = re.compile(r"(제\s?\d+조(?:의\s?\d+)?)")
parts = ARTICLE.split(law_text)
chunks = []
for i in range(1, len(parts), 2):
    no = parts[i].strip()
    body = parts[i + 1].strip() if i + 1 < len(parts) else ""
    chunks.append({
        "text": f"{no} {body}",
        "article": no,
        "source": source_url,          # 공식 원문 링크
        "checked_on": "2026-06-29",     # 확인일(법령은 개정된다)
    })

3. 근거 강제 생성

검색된 근거 조각만 컨텍스트로 주고, 답에 조문·출처를 붙이게 강제하며, 근거가 없으면 답하지 말고 "확인 필요"로 두게 합니다.

TEXT
아래 [근거]는 공식 문서에서 검색된 조문입니다.
[근거]에 있는 내용만으로 답하세요. 근거에 없으면 지어내지 말고 "확인 필요"라고 답하세요.
답의 각 문장 끝에 근거가 된 조문번호와 출처 링크를 붙이세요.
처분·과태료·의무 여부를 단정하지 말고, 해당 조문을 가리키며 "원문 확인 필요"로 안내하세요.

→ 이 단계의 출력은 법령 근거 확인 브리프의 입력이 됩니다. RAG는 조문 후보를 빠르게 모아 줄 뿐, 처분·해석의 최종 판단은 사람이 원문을 보고 합니다.

4. 검증 — 충실도와 맥락 정밀도

답이 정말 근거에 충실한지(faithfulness), 검색이 관련 조문을 잘 가져왔는지(context precision)를 Ragas로 점수화합니다. 자주 묻는 질문으로 골든셋을 만들어, 프롬프트·청킹을 바꿀 때마다 회귀로 돌립니다.

PYTHON
from ragas import evaluate
from ragas.metrics import faithfulness, context_precision

# eval_dataset: question / answer / contexts(검색된 근거) / ground_truth(정답 근거)
result = evaluate(dataset=eval_dataset, metrics=[faithfulness, context_precision])
print(result)                 # 평균 점수
df = result.to_pandas()       # 항목별 점수 — 낮은 질문부터 사람이 원인을 본다
▸ 소방 활용 포인트
근거 링크가 달린 질의응답 초안을 빠르게 만들어 검토 시간을 줄입니다. 단 처분·과태료·의무 여부 단정은 절대 자동화하지 말고, RAG가 가리킨 조문을 사람이 공식 원문으로 확인한 뒤 확정합니다.

사람 검토 체크리스트

TEXT
- [ ] 공개 법령·SOP만 사용했고, 비공개 문서는 권한·보안을 따로 설계했습니다.
- [ ] 청크에 조문번호·출처 링크·확인일이 보존돼 있습니다.
- [ ] 답변마다 근거 조문·출처가 붙어 있고, 근거 없는 답은 "확인 필요"입니다.
- [ ] faithfulness·context precision이 낮은 질문을 사람이 원인 분석했습니다.
- [ ] 처분·과태료 같은 단정 표현이 사람 검토 없이 나가지 않습니다.
⚠️ 흔한 실수
RAG도 검색이 빗나가면 환각합니다 — 근거를 못 찾으면 답하지 않게 하세요. 법령은 개정되므로 확인일이 지난 근거는 다시 받아야 하고, 최종 법적 판단은 언제나 사람이 공식 원문으로 합니다.