보험RAG (2) : Vector DataBase에서 메타 데이터 구축하기
문제 인식
보험 도메인 RAG 프로젝트에서 메타데이터를 활용한 검색 성능 향상을 목표로 벡터 데이터베이스(Chroma)를 재설계 했다.
ver0 RAG 시스템의 구조는 다음과 같다.
Ver0
- 사용자가 질문을 한다
- 모든 청크(22,374개)에 대해 벡터 유사도 검색
- 청크는
chunk_size=1000,chunk_overlap=100으로 설정하였다. - 하지만, 합리적으로 청크를 쪼개려면(도메인 특성에 맞게), 조항별로 청크를 쪼개서 보완해보는 게 좋을 것 같다.
- 청크는
- 상위 k개 문서를 LLM에게 전달
- 답변 생성
이 과정은 문서가 많아질수록 비례하여 느려지는 구조이다.
또한 ver0은 두가지 상품만 타겟팅하여 개발하였지만, ver1은 모든 카테고리별로 각각 1개 이상의 상품군의 문서를 지식 소스로 사용할 것이다.
이런 경우, 보험은 상품 카테고리가 많기 때문에
- 건강
- 운전자
- 여행·레저
- 자동차
- 연금
등 각 상품군의 문서가 전부 섞여 검색되며,
모든 검색 요청이 “대용량 전체 검색”이 되어 버린다.
이 구조에서는 벡터 검색 과정이 불필요하게 크고 느리다.
오늘의 개선점은 아래와 같은 두 가지 피드백에서 출발했다.
- 고객이 이미 자신이 물어보고 싶은 특정 상품이 정해져 있다면, 굳이 전체 문서를 검색할 필요가 없다.
- 보험 약관은 보험업의 특성상 문서의 구조가 서로 비슷하다.
- 보장 내용 문구가 유사할 수 있다.
- 예시로, “운전자보험 암진단금 알려줘”라는 사용자 질문에 “건강보험” 암 관련 내용이 끌려올 수 있다.
- 이런 문제는 결국 RAG 시스템의 정확도를 급격히 떨어뜨린다.
실제로 우리의 프로젝트는 고객이 AI 챗봇을 사용하려고 접속할 때,
상품의 대분류(보험 종류)를 선택하고, 그 중에서도 소분류(보험 상품 이름)를 선택한 후에 재설계하였다.
그래서 Vector DB를 다음과 같이 재설계했다.
Ver1
1) 사용자 입력으로 ‘카테고리’와 ‘상품명’을 먼저 선택 → 예: “운전자&상해”, “안전파트너플러스”
2) 1번의 정보로 정보로 벡터 DB에서 메타데이터 필터링
3) 축소된 영역 내에서 벡터 검색 수행
→ latency 감소
→ irrelevant 문서 제거
→ 더 빠른 답변 생성
메타 데이터
Ver0 vs Ver1 비교
메타데이터 필터 기반 RAG (사용자가 상품명/카테고리를 선택) - Ver1
- 프레임워크
- 사용자가 category 및 product_name을 선택
- 검색 단계에서 metadata filter를 먼저 적용
- 해당 범위 내에서만 검색 수행
- 특정 상품의 정보만 확실히 검색되므로 정확도 증가
이를 위해 벡터 저장 시 문서 메타데이터를 함께 저장한다.
텍스트 청크와 함께 아래 정보를 모두 포함하도록 한다.
- Meta Data
category: 대분류 폴더명 (예: 건강, 운전자&상해, 여행·레저 등)product_name: 상품명 (예: 안전파트너플러스, 마이핏 등)document_type: 약관 / 설명서 등 파일명에서 파싱document_name: 원본 파일 이름
이렇게 구성하면 각 청크는 단순 텍스트가 아니라 “정확히 어떤 상품의 어떤 문서의 어떤 페이지인지”를 설명할 수 있다.
비교 실험
총 66개의 테스트 케이스에서 Latency 시간과 답변 정확도를 비교해 보았다.
테스트 케이스를 아래와 같은 2가지 유형으로 분류했다.
-
단순 보장 여부 확인 질문(Simple Coverage Check) → “병원용 미용 크림 처방도 보장돼?” 같은 형태의 짧은 단순 질의
-
상황 기반 시나리오 질문(Scenario-Based Complex Questions) → “만약 해외 여행 중 자동차 사고가 발생하면?”처럼 문맥 추론이 필요한 것
각각의 유형에서 보험 대분류 11개 중 3개씩 질문을 생성하였다. (표본의 크기가 각각의 유형에서 30개 이상이 되도록)
테스트 케이스 생성 방법은 각 문서를 GPT에게 주고, 질문과 정답을 만들어 달라고 하였다. 그 후, 2차 검증으로 팀원들끼리 같이 검증하여 사용 가능하다고 판단한 테스트 케이스만 사용하였다.
테스트 결과는 LLM과 팀원 검증으로 교차 검증하여 정답 여부를 판단하였다.
실험 결과
1) 정확도
- ver0
- 시간이 없는 관계로 .. (2차 검증까지 해야해서)
- ver1
- 약 94%의 정확도가 나왔다.
1) 평균 Latency
- ver0
- 유형 1 질문 : 7.34
- 유형 2 질문 : 7.59
- ver1
- 유형 1 질문 : 6.56
- 유형 2 질문 : 7.24
ver1이 ver0보다 latency는 평균 8%정도 감소했다.
Discussion - Ver3
GraphRAG를 활용하여 버전을 만들어봐도 좋은 실험이 될 것 같다.
마이크로소프트에서 낸 GraphRAG는 지엽적인 질문에도 잘 답변을 하지만,
일반 RAG가 잘 답변하지 못하는 Global한 질문에도 답변을 잘한다는 강점이 있다.
예를 들어서 고객이 다음과 같은 Global한 질문을 하게 될 수도 있다.
- “꼭 알아야 하는 보험약관이 뭐야?”
- “중요한 내용 알려줘”
- “0조에 대해 전체적으로 핵심 내용을 얘기해줘”
이러한 답변에도 잘 대답할 수 있는 graphRAG의 확장가능성을 생각해볼 수 있다.
GPU 문제도 있고, 하루아침에 될 프로젝트는 아니라서 discussion으로 남겨두자.