기술 블로그

RAGO-X

RAGO-X 이해하기: 문서에서 근거 있는 답변까지

문서 적재와 질문 처리를 구분하고, 버전·권한·검색·출처 검증으로 RAG 답변을 점검하는 설계 가이드입니다.

RAGO-X작성 수정
#RAG#Architecture#LLM
RAGO-X는 어떻게 기업 문서를 AI의 지식으로 만드는가 개념도

RAG를 이해할 때는 “문서를 모델에 넣는다”는 설명보다 두 흐름을 구분하는 편이 유용합니다. 첫 번째는 문서를 검색 가능한 상태로 준비하는 적재 과정이고, 두 번째는 질문마다 허용된 근거를 찾아 답변을 만드는 과정입니다. 원문 저장, 검색 인덱스, 답변 생성은 서로 다른 책임을 가집니다.

이 글은 RAGO-X 제품 개요의 문서 기반 답변과 출처 확인 기능을 이해하기 위한 설계 가이드입니다. 아래 흐름과 코드는 설명용 참조 설계이며, 특정 데이터베이스·모델·재순위화 기능이 현재 제품에 적용되어 있다는 사양표가 아닙니다. 지원 범위는 문서 허브지원 문서 형식을 확인하세요.

적재와 질문 처리를 나누기

text
Ingestion:
Document -> Extract text + source positions -> Chunks -> Search index

Question answering:
Question + permitted scope -> Retrieve evidence -> Select context
-> Generate answer -> Validate citations -> Show answer + sources

문서가 업로드됐다는 것과 검색 준비가 끝났다는 것은 다릅니다. 추출이나 인덱스 생성이 실패했다면 업로드 성공만으로 답변을 기대할 수 없습니다. 사용자에게는 처리 상태를 구분해 보여주고, 재시도할 때 같은 문서의 청크가 중복 등록되지 않도록 해야 합니다.

단계마다 확인할 결과

단계 남겨야 할 결과 실패를 구분하는 질문
원문 저장·추출 문서 버전, 텍스트, 위치 표와 본문이 원문 순서대로 추출됐나?
분할·인덱스 청크 ID와 원문 연결 정답 문장이 잘리거나 빠지지 않았나?
접근 범위 결정 서버에서 허용한 문서 범위 다른 조직·그룹의 문서가 후보에 섞이나?
검색·문맥 선택 선택한 근거와 버전 정답 근거가 모델 입력에 실제로 들어갔나?
생성·출처 표시 답변과 근거 연결 인용된 원문이 답변 내용을 뒷받침하나?

임베딩을 사용하는 설계에서는 문서와 질문의 벡터가 호환되는 공간에 있어야 합니다. 임베딩 모델이나 전처리를 바꿀 때 기존 벡터와 무조건 섞지 말고 재색인 범위와 전환 절차를 정하세요. 분할 경계는 청킹 검증, 검색 후보 결합은 RRF 실행 예제에서 따로 다룹니다.

출처 ID를 검증하는 작은 실행 예제

모델이 답변에 S9를 인용했는데 실제로 제공한 근거는 S1뿐이라면, 출처 링크를 만들어 주면 안 됩니다. 아래 코드는 제공된 근거 목록에 포함된 ID만 원문 정보로 연결합니다. citation_demo.py에 저장하고 python3 citation_demo.py로 실행하세요.

python
def resolve_sources(citation_ids, evidence):
    by_id = {source["id"]: source for source in evidence}
    unknown = set(citation_ids) - by_id.keys()
    if unknown:
        raise ValueError("citation not present in supplied evidence")
    return [by_id[key] for key in dict.fromkeys(citation_ids)]


evidence = [{
    "id": "S1", "document_id": "manual-17", "revision": "v2",
    "page": 3, "text": "Disconnect power before opening the cover."
}]
print([s["id"] for s in resolve_sources(["S1", "S1"], evidence)])
assert len(resolve_sources(["S1", "S1"], evidence)) == 1
try:
    resolve_sources(["S9"], evidence)
except ValueError:
    print("Unknown source rejected")
else:
    raise AssertionError("unknown source was accepted")

출력은 ['S1']Unknown source rejected입니다. 같은 출처는 한 번만 표시하며 제공하지 않은 ID는 거부합니다. 이 검사는 출처가 존재하는지만 확인합니다. 답변 문장이 그 출처에서 논리적으로 뒷받침되는지는 별도로 검토해야 합니다. 근거 목록 자체도 이미 권한 확인을 마친 결과여야 하며, 이 함수는 인증·인가를 대체하지 않습니다.

문서 교체와 근거 부족 처리

같은 제목의 매뉴얼이 새 버전으로 교체되면 검색 청크, 인덱스, 출처 링크가 같은 버전을 가리켜야 합니다. 그렇지 않으면 답변은 이전 지침을 사용하고 링크는 새 파일을 여는 일이 생길 수 있습니다. 문서 삭제나 열람 권한 변경 후에는 검색 결과와 원문 접근 모두에서 변경이 반영되는지 확인하세요.

근거가 없는 질문에는 답을 꾸며내는 대신 부족한 정보와 확인할 문서를 안내해야 합니다. 검색된 본문 안의 명령문도 시스템 지시가 아니라 인용 대상 데이터로 취급해야 합니다. 점수가 높은 후보가 있다는 것만으로 답할 수 있다고 판단하지 마세요.

출시 전에 따라 해 볼 점검

  1. 작은 매뉴얼에서 정답이 있는 질문과 없는 질문을 각각 정합니다.
  2. 정답 문장이 추출 텍스트, 청크, 검색 후보, 최종 문맥에 남아 있는지 순서대로 확인합니다.
  3. 같은 질문을 접근 권한이 없는 사용자로 실행해 근거가 노출되지 않는지 검사합니다.
  4. 문서를 수정하고 이전 버전이 검색되거나 출처에 연결되지 않는지 확인합니다.
  5. 답변의 각 핵심 주장과 인용문을 대조합니다. 검색 성공률과 근거에 충실한 답변 비율은 따로 기록합니다.

RAG는 검색 근거를 생성 과정에 연결하는 접근이며 답변의 정확성을 자동 보장하지 않습니다. 개념의 연구 배경은 Lewis 등의 RAG 논문을 참고하세요. RAGO-X의 실제 API 사용 흐름은 API 활용 가이드, 사용자와 문서 접근 범위는 접근 권한 관리에서 이어집니다.