실무AI 기초 및 활용 7회 — 내 문서를 근거로 답하게 만들기 — RAG 연결
실무AI 기초 및 활용 · 7회 / 전체 12회
실무자도 놓치기 쉬운 AI 원리를 질문과 실험으로 확인합니다.
AI를 업무에 사용해본 분을 위한 강의입니다. 아래 실습은 독자 재현을 위한 절차이며 이 글에서 실행한 측정 결과를 뜻하지 않습니다.
검색 결과만 보여주는 앱의 다음 단계
문서 검색 결과를 보여주는 기능은 이미 유용합니다. 여기에 모델을 연결하면 여러 근거를 읽어 답을 구성하게 할 수 있습니다. 그러나 요약 문장이 생겼다는 이유만으로 검색 결과보다 더 정확해졌다고 볼 수는 없습니다.
이번 강의의 목표
질문, 검색 결과, 근거 구성, 모델 답변을 연결하는 RAG 흐름을 설계합니다. 모델 제공자와 무관한 의사코드로 역할을 나눕니다. 특정 API의 실제 실행 결과를 제시하는 글은 아니며 독자의 기존 검색기에 적용할 절차입니다.

RAG의 기본 흐름
먼저 사용자의 질문으로 관련 자료를 찾습니다. 찾은 원문을 식별자와 함께 구성해 모델에 전달하고 답을 생성합니다. 검색과 생성 사이의 연결이 핵심이며, 모든 RAG가 반드시 벡터 데이터베이스를 사용해야 하는 것은 아닙니다.
모델 호출과 검색기를 분리합니다
검색기는 관련 자료를 반환하고 모델 호출기는 제공한 자료로 답하게 합니다. 두 기능을 분리하면 검색 실패와 답변 실패를 따로 재현할 수 있습니다. 처음부터 에이전트의 자율 검색 반복까지 넣지 않아도 기본 RAG는 만들 수 있습니다.

원문 저장소부터 확인합니다
문서 식별자, 제목, 버전, 원문 위치를 함께 보관합니다. 검색 결과가 어느 원문에서 왔는지 복원할 수 있어야 합니다. 벡터만 저장하고 원문이 사라진 상태라면 인용과 근거 검증이 어려워집니다.
접근 권한을 먼저 적용합니다
사용자가 볼 수 있는 문서만 검색 후보와 생성 근거에 포함합니다. 답변 화면에서 민감 내용을 가리는 것만으로는 충분하지 않습니다. 이미 모델 입력에 포함된 정보의 접근과 외부 전송 여부를 앞 단계에서 관리해야 합니다.

질문을 바꾸는 단계
약어나 생략된 대상을 보완해 검색어를 만들 수 있습니다. 다만 질문 재작성 중 사용자의 의도를 바꾸지 않아야 합니다. 원래 질문과 검색용 질문을 모두 기록하면 원인을 추적하기 쉽습니다.
검색 후보와 전달 근거
검색 후보를 많이 찾은 뒤 중복과 무관한 내용을 줄일 수 있습니다. 후보 수가 많다고 필요한 근거가 모두 들어온다는 보장은 없습니다. 재정렬이나 필터가 정답 근거를 제거하지 않았는지 단계별로 확인합니다.

근거 식별자 붙이기
각 조각에 원문과 연결되는 식별자를 부여합니다. 답변이 식별자를 인용하면 해당 원문을 화면에서 열 수 있게 합니다. 단순히 모델이 만든 문서 제목이나 존재하지 않는 링크를 출처로 인정해서는 안 됩니다.
근거 묶음의 구성
제목, 개정일, 내용, 출처 식별자를 일정한 형식으로 전달합니다. 원문과 앱의 설명을 구분합니다. 원문에 포함된 행동 지시는 자료의 일부이며 시스템의 권한을 바꾸는 지시로 처리하지 않도록 실행 경계를 둡니다.

답변 규칙
질문에 필요한 사실은 제공된 근거에서 확인하고, 근거가 부족한 부분은 부족하다고 밝히도록 합니다. 지침만으로 오류가 사라지지는 않습니다. 생성 뒤 인용 검증과 평가가 필요하며 모델의 확신 표현을 그대로 신뢰하지 않습니다.
구조화된 응답
답변, 사용한 근거 식별자, 답변 가능 여부를 별도 항목으로 받을 수 있습니다. 스키마 검사는 항목과 자료형을 확인합니다. 구조가 맞아도 거짓 주장이나 잘못된 인용은 남으므로 내용 검증과 분리합니다.

검색 결과 없음 처리
결과가 없으면 빈 근거를 그대로 처리하고 추가 질문이나 정보 부족 응답을 반환합니다. 관련성이 낮은 첫 번째 문서를 억지로 정답처럼 넣지 않습니다. ‘검색 결과 없음’과 ‘검색 서비스 오류’도 사용자에게 다른 상태로 알려야 합니다.
문서끼리 충돌할 때
적용일과 대상이 다른 규정이 함께 검색될 수 있습니다. 최신 날짜만 보고 결론을 내리기보다 범위와 변경 이력을 확인합니다. 해결되지 않은 충돌은 모델이 한쪽을 선택해 확정하지 않도록 답변에 남깁니다.

최소 연결 의사코드
hits = search(question, permissions), context = pack(hits), answer = generate(question, context), check(answer, hits) 순서입니다. 이는 흐름 설명용 의사코드이며 실행 가능한 특정 SDK 예제가 아닙니다.
오류를 구간별로 반환하기
문서 읽기, 검색, 모델 요청, 출력 파싱 중 어디서 실패했는지 구분합니다. 실패를 빈 답변으로 바꾸면 자료가 없었던 것처럼 보일 수 있습니다. 입력·출력 기록에는 인증정보와 개인정보를 제외합니다.

실무 예시: 최신 배포 요일
가상의 규정에서 정기 배포는 목요일이고 긴급 수정은 승인 후 즉시라고 해봅니다. 질문이 긴급 수정에 관한 것이라면 두 조건을 함께 검색해야 합니다. 답변은 적용 범위와 근거 문단을 함께 보여줘야 합니다.
실습 준비
가상 규정과 과거 규정을 포함한 작은 자료 묶음을 만듭니다. 근거가 있는 질문 다섯 개와 없는 질문 두 개를 준비합니다. 이 글은 실험 결과를 제공하지 않으며, 독자가 실행 후 원문·검색 결과·응답을 저장하도록 안내합니다.
실험 기록 양식
| 조건 | 입력·설정 | 판정·측정값 |
|---|---|---|
| 변경 전 기준선 | 실행 전 기록 | 실행 후 기록 |
| 한 조건 변경 | 바꾼 항목만 기록 | 실행 후 기록 |
| 반복·확인 문제 | 버전과 반복 횟수 기록 | 실패 사례까지 기록 |
이 표는 빈 양식이며 측정값이나 성능 개선을 보고하는 자료가 아닙니다.

먼저 검색만 채점하기
모델을 호출하기 전에 각 질문에서 필요한 문단이 검색됐는지 확인합니다. 근거를 찾지 못한 질문은 검색 실패로 기록합니다. 생성 모델을 바꾸면서 검색 문제를 숨기지 않는 것이 목적입니다.
다음으로 답변 채점하기
정답 근거가 있는 결과만 먼저 사용해 모델이 조건과 예외를 보존하는지 봅니다. 숫자·날짜·부정 표현을 확인합니다. 자료가 있어도 오답이면 생성 또는 근거 구성 단계의 개선이 필요합니다.

유보와 인용 검사
답이 없는 질문에는 원문에 없다는 사실을 밝혔는지 확인합니다. 인용 식별자가 전달한 근거 목록에 실제로 있는지도 코드로 검사합니다. 존재하는 식별자를 인용했어도 해당 주장을 뒷받침하는지는 다시 읽어야 합니다.
문서 갱신과 캐시
문서가 바뀌면 검색 인덱스와 응답 캐시가 최신 버전을 사용하는지 확인합니다. 오래된 원문을 삭제하거나 비활성화하는 정책이 필요합니다. 같은 질문에 이전 답을 재사용할 때 문서 버전과 권한이 달라지지 않았는지도 봅니다.

운영에서 확인할 기록
질문, 검색어, 검색 결과 식별자, 문서 버전, 모델·설정, 응답, 검증 결과를 연결합니다. 원문 전체를 무조건 로그에 저장하지 말고 보존 범위를 정합니다. 실패 사례가 다음 평가 문제로 이어지도록 관리합니다.
핵심 정리
RAG는 검색 결과를 답변 생성의 근거로 연결하는 구조입니다. 검색·권한·근거 구성·답변·인용을 나눠 검사해야 합니다. 다음 회차에서는 출처가 붙어도 틀릴 수 있는 답변을 검증합니다.

출처
공식 문서·원 논문을 참고한 원리 설명입니다. 제품별 지원 범위는 실행 시점의 문서로 재확인하며, 실습 설계와 가상 사례는 이 강의의 예시입니다.
AI 도구의 도움으로 작성하고 공식 자료와 발행 규격을 확인했습니다. 삽화는 SVIL 로컬 AI 워크스테이션에서 생성한 신규·기존 개념 자산을 사용했습니다.
협업문의 : kuroicode@gmail.com
블로그 : https://blog.svil.dev/
홈페이지 : https://svil.dev/