RAG 지식정보 설계 (Record-based Retrieval)

Rony·2026년 6월 19일
post-thumbnail

이전 포스팅에서 RAG 지식정보 설계 전략을 다뤘는데, 상황에 따라 활용할 수 있는 추가적인 방법이 있어 별도로 정리해 보았다.

RAG 기반 챗봇의 효과적인 지식정보 설계 전략


청크 기반 검색의 한계

이전 포스팅에서 하나의 청크에 하나의 개념을 담는 것이 좋다고 설명했다. 그러나 실제로 청크 단위로 벡터 검색을 수행하다 보면 이를 완벽히 구현하기가 쉽지 않다.

예를 들어 여행사의 환불 정책을 검색하는 경우, 청크는 텍스트를 일정 크기로 분할하여 저장하기 때문에 하나의 의미 단위(환불 정책)가 청크 경계에 걸쳐 잘릴 수 있다. 결과적으로 환불 관련 정보의 앞뒤 일부만 검색 결과에 포함되거나, 관련 없는 내용이 함께 딸려오는 문제가 발생할 수 있다.


Record-based Retrieval: 레코드 단위 검색

이러한 문제의 대안으로, 청크를 사용하지 않고 JSONL이나 CSV 파일을 레코드(Row) 단위로 조회하는 Record-based Retrieval 방식을 고려할 수 있다.
(AWS Bedrock Knowledgebase 를 사용하고 있다면 JSONL 은 지원되지않으니 CSV 형식으로 데이터를 셋팅 해야 한다.)

이 방식은 특히 QnA 형태로 구성된 지식정보에 효과적이다. 파일 하나에 여러 질문·답변 쌍이 있더라도, 검색 시에는 레코드 단위로 정확히 조회되기 때문에 하나의 완전한 Q&A 쌍이 온전히 검색 결과로 반환된다.


비교 예시

아래와 같은 지식정보가 있다고 가정해 보자.

{ "question": "환불은 언제부터 가능한가요?", "answer": "사용 전까지는 100% 환불 가능하고, 사용 후에는 환불이 불가능합니다." },
{ "question": "예약은 어디서 할 수 있나요?",  "answer": "예약은 xxx.com 에서 가능합니다." }

사용자가 "환불이 불가능한 경우는 어떤 경우인가요?" 라고 질문했을 때, 두 방식의 차이는 다음과 같다.

청크 기반 검색의 경우, 설정된 청크 크기에 따라 레코드 경계를 무시하고 텍스트를 분할하므로, 아래처럼 첫 번째 레코드의 일부와 두 번째 레코드의 일부가 하나의 청크로 묶여 반환될 수 있다.

...가능한가요?', answer: '사용 전까지는 100% 환불 가능하고 사용 후에는 환불이 불가능합니다.' },
{ question: '예약은 어디서...

레코드 단위 검색의 경우, 환불 관련 레코드 전체가 온전히 반환되어 LLM이 정확한 컨텍스트를 기반으로 답변을 생성할 수 있다.

{ "question": "환불은 언제부터 가능한가요?", "answer": "사용 전까지는 100% 환불 가능하고, 사용 후에는 환불이 불가능합니다." }

특정 컬럼만 검색하여 품질 높이기

레코드 단위 검색의 또 다른 장점은 검색 대상 컬럼을 지정할 수 있다는 점이다. 예를 들어 question 컬럼에 대해서만 벡터 검색을 수행하면, 사용자의 질문과 의미적으로 가장 유사한 레코드를 더 정밀하게 찾아낼 수 있다.

이를 위해서는 아래와 같이 contentFields에 검색에 사용할 컬럼을 지정하고, metadataFieldsSpecification.fieldsToInclude에 출력에 포함할 컬럼을 추가하면 된다.

{
  "documentStructureConfiguration": {
    "type": "RECORD_BASED_STRUCTURE_METADATA",
    "recordBasedStructureMetadata": {
      "contentFields": [
        { "fieldName": "question" }
      ],
      "metadataFieldsSpecification": {
        "fieldsToInclude": [
          { "fieldName": "answer" }
        ]
      }
    }
  }
}
항목설명
documentStructureConfiguration지식 데이터 파일의 구조를 어떻게 해석할지 정의하는 최상위 설정 블록
type문서 구조 유형. RECORD_BASED_STRUCTURE_METADATA로 설정하면 파일을 청크 단위가 아닌 레코드(Row) 단위로 처리한다
recordBasedStructureMetadata레코드 단위 검색에 대한 세부 설정 블록
contentFields벡터 검색 대상 컬럼을 지정한다. 여기에 정의된 컬럼의 값만 임베딩되어 유사도 검색에 사용된다
contentFields[].fieldName검색에 사용할 컬럼명. 위 예시에서는 question 컬럼을 기준으로 검색한다
metadataFieldsSpecification검색 결과로 반환할 컬럼을 제어하는 설정 블록
fieldsToInclude검색 결과에 포함할 컬럼 목록. 검색에는 사용되지 않지만 LLM에 전달할 컨텍스트로 활용된다
fieldsToInclude[].fieldName출력에 포함할 컬럼명. 위 예시에서는 answer 컬럼이 검색 결과로 반환된다

이 설정을 통해 검색은 question 컬럼을 기준으로 수행되고, 검색 결과로는 answer 컬럼의 내용이 반환된다. 검색 노이즈를 줄이고 관련성 높은 결과를 얻는 데 효과적인 방식이다.

마무리

Record-based Retrieval은 모든 상황에 적합한 방식은 아니다. 자유로운 형태의 문서나 긴 설명 위주의 콘텐츠라면 여전히 청크 기반 검색이 더 유연하고 효과적이다.(사내규정이나 설명서를 지식정보로 사용하는 경우) 하지만 QnA, 약관, 정책 안내처럼 구조화된 데이터를 지식정보로 활용하는 경우라면, 레코드 단위 검색을 통해 검색 정확도를 높이고 불필요한 컨텍스트 노이즈를 줄일 수 있다.

지식정보의 성격에 맞는 검색 방식을 선택하는 것이 RAG 성능 최적화의 출발점이라고 본다...

profile
sang kwon seo

0개의 댓글