법령 질의응답 AI는 만든 뒤에도 자주 바뀝니다. 법령이 개정돼 문서를 다시 넣고, 답이 딱딱하다고 프롬프트를 다듬고, 모델을 교체합니다. 직접 만들지 않고 도입한 챗봇이나 법령 검색 연결도 제공자가 모델을 바꿉니다. 이런 변경 뒤에는 화면에 오류가 없는데 조문 인용이 빠지는 일이 생기고, 같은 질문으로 다시 확인하지 않으면 알기 어렵습니다.
이 안내서는 골든셋·회귀 평가·가드레일로 이런 변경을 관리하는 방법을 다룹니다. 설정 파일은 코딩 에이전트에게 맡길 수 있고, 사람은 기준 질문과 근거, 합격 기준, 판정 모델의 위치를 정합니다.
- 질문·근거·기대 요점·거절 조건이 연결된 골든셋을 설계할 수 있습니다.
- 평균 품질 지표와 질문별 단언의 역할을 나눠 회귀 평가할 수 있습니다.
- 판정 모델의 위치와 결과 기록 항목을 정해 변경 전후 결과를 재현할 수 있습니다.
- 위험 응답을 중단하고 사람 검토로 보내는 가드레일을 설계할 수 있습니다.
AI에게 맡기는 프롬프트
골든셋은 있고, 회귀 평가 설정을 코드를 실행할 수 있는 AI(코딩 에이전트)에게 맡길 때 씁니다. 골든셋에는 실제 신고자·민원인 정보가 없어야 하고, 내부 SOP로 만든 골든셋이면 외부 AI가 아니라 승인된 내부 환경에서 씁니다.
[목적] 법령·SOP 질의응답 시스템(또는 도입한 AI 서비스)을 바꾸기 전후에 같은 질문으로 결과를 비교하는 회귀 평가 설정을 만듭니다. [자료] goldenset.yaml(질문·정답 근거·must_cite·확인일, 개인정보를 지운 것), 평가할 시스템을 호출하는 방법(예: rag-answer.py) [완성 기준] - 질문마다 must_cite 조문이 답에 들어 있는지, 거절해야 할 질문에서 거절했는지 통과·실패로 표시합니다. - 결과 파일에 실행 날짜, 평가한 시스템의 모델·프롬프트 판, 골든셋 판, 판정 모델을 함께 남깁니다. - 지난 결과와 비교해 통과에서 실패로 바뀐 질문 목록을 먼저 보여 주세요. - 검산으로 전체 질문 수와 통과·실패·오류 건수의 합이 같은지 출력해 주세요. [하지 말 것] - 판정 모델이 필요한 검사는 내부 서버의 모델로만 돌리고, 외부 API 키로 판정하지 마세요. 판정 모델 위치가 정해지지 않았으면 그 검사는 빼고 먼저 알려 주세요. - 점수를 올리려고 골든셋의 기대 답이나 must_cite 를 고치지 마세요. - 사용 통계 전송·결과 공유 같은 외부 전송 기능은 꺼 주세요. 자료에 없는 값은 [확인 필요]로 남겨 주세요. 확인 기준은 https://119-ai-studio.kr/rag-eval-ops.html 안내서를 따릅니다. 작업 전에 빠진 정보가 있으면 먼저 질문해 주세요.
결과를 받은 뒤 확인할 것은 다음과 같습니다.
- 판정 모델 설정이 내부 서버를 가리키는지 설정 파일에서 직접 봅니다.
- 전체 질문 수와 통과·실패·오류 건수의 합이 맞는지 봅니다.
- 실패로 바뀐 질문은 답과 검색 근거를 나란히 놓고 담당자가 원인을 봅니다.
- 골든셋 파일이 바뀌지 않았는지 변경 내역으로 확인합니다.
운영 3종
| 장치 | 무엇을 지키나 | 언제 작동하나 |
|---|---|---|
| 1 골든셋 | "정답이 무엇인지"의 기준 | 만들 때 한 번 + 문서 개정 때 갱신 |
| 2 회귀 평가 | 변경 전후의 품질 비교 | 프롬프트·문서·모델을 바꿀 때마다 |
| 3 가드레일 | 개별 답변 한 건의 사고 | 매 응답, 실시간 |
회귀 평가는 변경 전후 전체 결과를 비교하고, 가드레일은 응답 한 건을 내보내기 전에 검사합니다. 잡는 실패가 달라서 둘 다 필요합니다.
1. 골든셋 만들기
골든셋은 "이 질문에는 이 근거로 이렇게 답해야 한다"를 담당자가 검토해 정한 목록입니다. 처음부터 크게 만들 필요는 없고, 실제로 자주 들어온 질문부터 시작합니다.
- 실제 질문 기록에서 고르되, 개인정보, AI에 넣기 전에 점검하기를 거쳐 신고자·주소 등은 지웁니다.
- 질문마다 정답 근거(조문·출처) 와 기대 답의 요점을 사람이 적습니다. 범위 밖이라 거절해야 하는 질문도 넣습니다.
- 파일로 저장해 판을 관리합니다. 법령이 개정되면 골든셋도 함께 고치고 확인일을 갱신합니다.
질문 후보로는 공식 질의·회신을 쓸 수 있습니다. 소방청의 소방시설법령 질의회신집 임베딩 데이터는 질의 1건과 회신을 한 조각으로 묶고 출처 페이지·관계법령을 붙였습니다. 2021·2022년판의 조항 번호는 2022년 12월 분법 전 법령 기준이라 현행 조문과 대조합니다. 평가 자료의 형식을 처음 볼 때는 로컬 AI의 결과 비교에 있는 합성 평가 20문항(요약·항목 추출·문서 근거·범위 준수 각 5문항)을 참고합니다.
# goldenset.yaml — 질문 · 정답 근거 · 기대 요점 (법령 개정 시 함께 갱신) - q: 소화기 점검 주기는 어떻게 되나요? ground_truth: 소방시설 설치 및 관리에 관한 법률 시행령 제○조 (출처 링크) must_cite: "제○조" # 답에 반드시 인용돼야 하는 조문 checked_on: 2026-10-26 - q: 우리 서 인사 발령 알려줘 expect: refuse # 문서에 없는 질문은 거절해야 정답 checked_on: 2026-10-26
점수를 올리려고 골든셋 질문에만 답을 맞추면 골든셋은 통과하는데 그 밖의 질문에서 품질이 떨어집니다. 골든셋은 늘 대표 표본으로만 다루고 주기적으로 질문을 바꿔 줍니다.
2. 회귀 평가
회귀는 예전에는 되던 것이 변경 뒤에 다시 안 되는 현상입니다. 회귀 평가는 무언가를 바꾼 뒤 같은 골든셋을 다시 돌려 되던 것이 여전히 되는지 확인하는 절차입니다. 비교하려면 바뀌기 전 결과를 기록해 둬야 하고, 기록이 없으면 "나빠진 것 같다"는 느낌만 남습니다.
조용히 바뀐다는 게 어떤 모습인지 가상의 예로 보겠습니다.
[프롬프트 수정 전] 질문: 소화기 점검 주기는? 답변: 소방시설 설치 및 관리에 관한 법률 시행령 제○조에 따라 … (조문 인용 있음) [말투를 부드럽게 다듬은 뒤] 질문: 소화기 점검 주기는? 답변: 보통 정기적으로 점검하시면 됩니다. (조문이 사라짐)
프롬프트에 "친절하게"를 강조했더니 조문 인용이 밀려난 것입니다. 화면에는 오류가 없고 답도 그럴듯해서, 회귀 평가가 없으면 이 변화를 알아채기 어렵습니다.
겹 1 · 집계 지표
충실도(답이 검색된 근거에만 기반하는지)와 맥락 정밀도(검색이 맞는 조문을 가져왔는지) 같은 지표를 골든셋 전체에 대해 내고 지난 결과와 비교합니다. 이 지표는 LLM이 판정하므로 다음을 먼저 정합니다.
- 판정 모델의 위치: 평가 도구가 판정 모델을 따로 지정하지 않았을 때 무엇을 쓰는지는 설치한 판의 문서로 확인합니다. 내부 SOP로 만든 골든셋이면 판정 모델을 내부 서버의 모델로 명시합니다.
- 결과 기록: 결과 파일에 판정 모델과 그 판, 골든셋 판, 평가한 시스템의 설정을 함께 남깁니다. 판정 모델이 바뀌면 같은 답에도 점수가 달라질 수 있기 때문입니다.
- 하한선: 점수 하한은 자기 골든셋으로 정하고, 하한보다 낮아진 질문부터 담당자가 원문과 검색 결과를 봅니다.
평가 도구는 판마다 쓰는 법이 바뀝니다. 코드는 설치한 판의 공식 문서를 기준으로 코딩 에이전트에게 만들게 하고, 위 세 가지를 조건으로 줍니다.
겹 2 · 질문별 단언
점수는 평균이라 "이 질문에는 반드시 이 조문이 인용돼야 한다" 같은 개별 규칙을 놓칠 수 있습니다. promptfoo는 질문마다 단언(assert)을 붙여 통과·실패로 판정합니다. 아래는 설정 구조를 보여 주는 예입니다. 실행하려면 프롬프트 파일과 시스템 호출 스크립트를 직접 준비하고, 파일 경로와 내부 서버·모델 이름을 실제 값으로 바꿉니다.
# promptfooconfig.yaml — `promptfoo eval` 로 실행 prompts: - file://rag-prompt.txt providers: - file://rag-answer.py # 평가할 질의응답 시스템을 호출하는 스크립트 defaultTest: options: provider: # 판정 모델도 내부 서버로 지정합니다. 빼면 환경에 있는 외부 API 키의 모델로 판정합니다 id: openai:chat:내부-판정-모델 config: apiBaseUrl: http://내부-서버/v1 assert: - type: llm-rubric # 모든 질문 공통: 단정 금지 원칙 value: 처분·과태료·의무 여부를 단정하지 않고 조문 확인을 안내한다 tests: - vars: { query: "소화기 점검 주기는 어떻게 되나요?" } assert: - type: contains # 이 질문엔 이 조문이 반드시 나와야 한다 value: "제○조" - vars: { query: "우리 서 인사 발령 알려줘" } assert: - type: llm-rubric # 범위 밖 질문은 거절해야 정답 value: 문서에 없는 내용이라 답할 수 없다고 안내한다
promptfoo는 사용 통계 전송·결과 공유 같은 기능을 환경 변수로 끌 수 있지만, 공식 문서는 이 설정이 네트워크 방화벽이 아니라고 적습니다. 내부 SOP로 만든 골든셋은 외부 연결이 막힌 환경에서 돌립니다. 도구별 외부 전송 기본값은 안전한 AI 운영 도구에서 확인합니다.
언제 돌리나: 법령·SOP 문서를 갱신했을 때, 프롬프트를 고쳤을 때, 모델을 교체했을 때 돌립니다. 아무것도 바꾸지 않았어도 주 1회 돌려 모델 제공자 쪽 변경을 확인합니다. 모델 교체 전후 비교는 프롬프트 코스의 모델 이전 점검에서 더 다룹니다.
도입한 AI 서비스에 같은 골든셋 쓰기
직접 만든 시스템이 아니어도 같은 골든셋을 씁니다. 공급 업체의 챗봇, 법령 검색을 연결한 AI, 파일 첨부형 AI 서비스에 골든셋 질문을 넣고 결과를 기록합니다. 자동 실행이 어려우면 사람이 질문을 넣고 답과 근거 주소만 표에 적어도 됩니다. 도입 전 검수 때 한 번 돌리고, 도입 뒤에는 정기적으로 같은 질문을 다시 넣습니다.
기관이 법령·매뉴얼 챗봇 사업을 검수할 때도 이 골든셋과 필수 단언을 요구사항으로 씁니다. 소방청 AI 활용 재난대응체계 개선 TF가 마련하려는 체계에도 재난 유형별 전략·전술·매뉴얼·법령 정보를 담은 생성형 AI 챗봇이 들어 있습니다.
3. 응답 직전 가드레일
평가를 통과한 시스템도 개별 답변은 빗나갈 수 있습니다. 가드레일은 답이 사용자에게 나가기 직전 위험 신호를 기계적으로 검사해, 걸리면 답 대신 "확인 필요" 안내를 내보냅니다.
import re BLOCK_RULES = [ (re.compile(r"(과태료|처분|벌금).{0,20}(입니다|됩니다|해야 합니다)"), "단정 표현"), (re.compile(r"확인일이 지난 근거"), "낡은 근거"), ] def guardrail(answer: str, cited: list) -> tuple[bool, str]: if not cited: # 근거 없는 답은 내보내지 않는다 return False, "근거 없음" for pattern, reason in BLOCK_RULES: if pattern.search(answer): return False, reason return True, ""
cited의 실제 확인일을 읽거나 오늘 날짜와 비교하지 않습니다.- 답변 문자열에
"확인일이 지난 근거"라는 문구가 이미 들어 있을 때만 막는 표면 검사입니다. - 실제 가드레일: 출처별 확인일·개정일을 구조화 필드로 보관하고 기준일과 비교해 낡은 출처인지 판정하는 검증을 별도로 구현해야 합니다.
"단정 표현" 규칙도 어미 몇 개를 찾는 표면 검사입니다. "처분 대상이 아닙니다"·"과태료를 내야 합니다"·"부과 대상에 해당함" 같은 다른 어미의 단정은 놓칩니다. 놓친 문장은 골든셋에 "막아야 할 답" 예시로 추가합니다.
규칙 기반으로 시작해도 되고, 규칙이 늘어나면 Guardrails 같은 전용 도구로 옮깁니다. 이때도 원격 추론 같은 외부 전송 기능이 켜져 있는지 먼저 확인합니다. 개인정보가 답에 섞여 나오는 것까지 막으려면 개인정보 점검의 마스킹을 출력 쪽에도 겁니다. 공개 전에는 프롬프트 주입 같은 공격 상황도 점검합니다(AI 보안 레드티밍 가이드).
운영 루틴
| 언제 | 무엇을 | 통과 기준 |
|---|---|---|
| 문서·프롬프트·모델 변경 시 | 집계 지표 + 질문별 단언 전체 회귀 | 하한선 이상 + 단언 전부 통과 |
| 주 1회 정기 | 동일 회귀 (변경 없어도) | 지난주 대비 하락 질문 0건 |
| 매 응답 | 가드레일 | 근거 있음 + 차단 규칙 미해당 |
| 분기 1회 | 골든셋 자체 점검 | 개정 법령 반영·낡은 질문 교체 |
설계 판단
평가 장치는 하나의 점수로 합치기보다 서로 다른 실패를 잡는 겹으로 나눕니다. 어떤 실패를 언제 막아야 하는지가 선택 기준입니다.
| 방식 | 잡는 문제 | 트레이드오프 | 사람이 확인할 것 |
|---|---|---|---|
| 집계 품질 지표 | 전체 응답의 넓은 하락 추세 | 소수의 중요 질문 실패가 평균 안에 숨을 수 있음 | 하락 항목의 원문·검색 결과 |
| 질문별 단언 | 필수 출처·거절·형식 조건 위반 | 조건을 갱신하지 않으면 낡은 시험이 됨 | 각 단언이 지키려는 업무 위험 |
| 실시간 가드레일 | 사용자에게 나가기 직전의 개별 위험 응답 | 과도 차단과 검토 대기 지연을 관리해야 함 | 차단 이유와 원문 대조 |
평가 자료는 출처 스냅샷, 질문 유형, 기대 근거, 필수·거절 조건을 한 항목으로 묶어야 재현됩니다. 실패는 검색·생성·가드레일·평가 자료 가운데 어느 단계에서 시작했는지 나눕니다. 회귀 판정은 같은 출처 스냅샷과 설정을 다시 쓰며, 필수 단언이 하나라도 깨지면 평균과 관계없이 변경 후보를 멈추고 담당자가 근거를 확인합니다.
운영 시나리오
다음은 실제 법령·사건을 사용하지 않은 가상 평가 상황입니다. 점수보다는 실패한 질문과 차단 이유를 재현하는 과정을 중심으로 봅니다.
가상 시나리오 1: 평균은 유지됐지만 필수 근거가 빠진 경우
- 탐지: 집계 평가는 기준 범위에 남았지만, 항목별 결과에서 특정 질문의 필수 출처가 사라졌습니다.
- 원인 가설: 말투 프롬프트가 길어지면서 근거 표시 지시가 밀렸거나, 평균 지표가 소수의 필수 실패를 가렸다고 봅니다.
- 대응: 배포 후보를 멈추고 해당 질문의 검색 근거와 최종 응답을 나란히 본 뒤, 필수 출처 단언을 회귀 평가 자료에 추가합니다.
- 재발 확인: 변경 전·후 환경에서 같은 질문을 다시 돌리고, 집계 결과와 필수 단언이 모두 통과하며 근거 링크가 원문과 일치하는지 담당자가 보고 승인합니다.
가상 시나리오 2: 확인일이 지난 출처가 표면 검사를 통과한 경우
- 탐지: 응답에 출처는 있었고 차단 규칙도 통과했지만, 사람이 출처 기록을 대조하니 실제 확인일이 운영 기준보다 오래됐습니다.
- 원인 가설: 본문 가드는
cited의 날짜를 파싱·비교하지 않고, 답변 안에확인일이 지난 근거라는 특정 문구가 있는지만 검사하므로 낡은 출처가 그 문구 없이 통과했다고 봅니다. - 대응: 해당 응답의 외부 제공을 멈추고 출처별 확인일·개정일을 구조화한 뒤, 기준일과 비교해 낡은 출처를 별도 중단 또는 사람 검토로 보냅니다.
- 재발 확인: 기준일 전·후의 합성 출처 메타데이터를 함께 실행해 오래된 출처는 문구와 무관하게 분리되고, 최신 출처는 통과하는지 확인합니다. 이 날짜 검증은 본문 최소 가드 밖에 별도로 구현합니다.
한계와 리스크
| 리스크 | 발생 조건 | 영향 | 완화·사람 승인 |
|---|---|---|---|
| 골든셋 편향 | 자주 나오거나 쉽게 통과하는 질문만 남음 | 실제 경계·범위 밖 질문의 품질을 알 수 없음 | 실패·거절·모호한 질문을 함께 구성하고 업무 담당자가 표본 승인 |
| 평균에 숨은 개별 실패 | 집계 점수만 배포 기준으로 쓸 때 | 중요 질문의 근거 누락이 통과 | 질문별 필수 단언과 하락 목록을 함께 보고 담당자 승인 |
| 판정 과정의 외부 전송 | 판정 모델을 지정하지 않거나 외부 전송 기능을 켜 둔 채 실행 | 골든셋 질문과 내부 SOP 근거가 외부 모델로 전송 | 판정 모델을 내부 서버로 지정하고 외부 연결이 막힌 환경에서 실행, 설정을 사람이 확인 |
| 가드레일 과도 차단 | 응답 형식·용어가 바뀌었지만 규칙은 예전 그대로 | 정상 질문의 응답 지연과 검토 대기 누적 | 차단 이유를 기록하고 정상·위험 예시를 다시 돌린 뒤 사람이 규칙 변경 승인 |
자주 묻는 질문
Q. 평균 점수가 좋으면 배포해도 되나요?
평균만으로는 부족합니다. 하락한 질문, 필수 단언, 거절해야 할 범위 밖 질문을 함께 봐야 합니다. 근거 누락 한 건이 평균 안에 숨을 수 있습니다.
Q. 골든셋을 한 번 만들면 계속 쓸 수 있나요?
아닙니다. 문서·업무 범위·사용자 질문이 바뀌면 골든셋도 낡습니다. 실패 기록에서 새 유형을 반영하되, 기대 답을 임의로 바꾸지 않고 담당자가 근거를 다시 확인합니다.
Q. 가드레일에 걸린 답은 삭제하면 되나요?
차단 이유·실행 ID·사용한 규칙을 민감한 본문과 분리해 필요한 기간만 기록해야 원인을 고칠 수 있습니다. 응답 본문의 보관은 소속 기관의 보안·보존 기준을 따릅니다.
Q. 평가자 모델의 판정을 정답으로 써도 되나요?
안 됩니다. 평가자 모델도 틀릴 수 있어 실제 품질을 대신 보여 주는 지표일 뿐입니다. 근거 일치·필수 단언 같은 기계적 검사와 사람 표본 검토를 함께 둡니다.
핵심 정리
- 골든셋은 질문만이 아니라 근거·기대 요점·거절 조건의 묶음이고, 법령이 바뀌면 함께 고칩니다.
- 집계 지표와 질문별 단언은 서로 다른 크기의 실패를 보여 주며, 필수 단언이 하나라도 깨지면 평균과 관계없이 변경을 멈춥니다.
- LLM 판정은 판정 모델을 내부에 두고, 판정 모델과 골든셋의 판을 결과와 함께 남깁니다.
- 예제 가드레일의 낡은 근거 검사는 특정 문구를 찾는 표면 검사이므로, 실제 확인일 기반 판정은 구조화 날짜 검증으로 따로 둡니다.
- 직접 만든 시스템과 도입한 AI 서비스 모두 같은 골든셋으로 변경 전후와 정기적으로 확인합니다.
다음 단계
- 소방 법령·SOP, RAG로 근거 있게 답하기 — 평가가 지키는 검색·청킹·근거 생성의 기준을 다시 확인합니다.
- 안전한 AI 운영 도구 — 평가·가드레일 도구의 외부 전송 기본값과 운영 위치를 비교합니다.
- AI 결과, 제출 전 확인 사항 — 자동 평가를 통과한 답도 외부에 내기 전에 사람이 확인할 기준을 봅니다.