문서-카테고리 매핑이 데이터(임베딩 문서)와 사용자 질의(rag chain 문서)가 달랐다. 따라서 임베딩 문서 매핑을 rag chain 문서 매핑에 맞게 수정했다.
category_map = {
"복리후생 규정.docx": "복리후생 규정",
"보안 규정.docx": "보안 규정",
"복무 규정.docx": "복무 규정",
"안전보건관리 규정.docx": "안전보건관리 규정",
"여비 규정.docx": "여비 규정",
"인사 규정.docx": "인사 규정",
"인사팀 업무 가이드.docx": "인사팀 업무 가이드",
"전산팀 업무 가이드.docx": "전산팀 업무 가이드",
"회계 규정.docx": "회계 규정",
"회계팀 업무 가이드.docx": "회계팀 업무 가이드"
}
제숫자조 기준으로만 분리제숫자조 기준으로 분리 후 chunk_size와 chunk_overlap을 각각 1000과 100으로 지정했다. 또한 chunk_index는 없앴다. # Qdrant에 저장할 하나의 포인트 생성
point = PointStruct(
id=str(uuid.uuid4()), # 고유 ID 생성
vector=embedding, # 임베딩 벡터
payload={ # 메타데이터
"text": chunk, # 청크별 텍스트
"category": category, # 문서 카테고리
"article_title": article_title.strip(), # 전체 조문 제목 문자열
"article_number": article_number, # 조문 번호 분리 저장
"article_subject": article_subject, # 조문 제목 분리 저장
"article_content": article_content.strip(), # 조문 전체 본문
"chunk_index": i, # 조문 내 청크 순서
}
)
payload 딕셔너리 안에 있는 게 메타데이터이다.
위와 같이 메타데이터를 설정하면 다음과 같은 결과가 나온다.

"제3조(기존 규정의 폐지)"라는 조항이 있으면 "제3조"와 "기존 규정의 폐지"로 분리되기를 기대했다.
문서에 "제35조에 따라"라는 문구가 있었는데, 이 문구에서 "제35조", 즉 제숫자조가 인식되어서 문서 분할이 되었다.
조항 시작의 경우 "제3조(기존 규정의 폐지)"와 같이 제숫자조 뒤에 괄호가 들어오므로, 제숫자조 뒤에 괄호가 있는 경우에만 조항으로 인식하고 문서를 분할한다.
제 숫자 조와 같이 숫자 양옆에 공백이 있는 경우가 있었다. 제숫자조와 같이 공백이 있는 경우만 인식하지 않게 수정 필요!별표라는 이름의 첨부 파일이 있다는 걸 몰랐다. 이것도 적절히 분할 필요!SelfQueryRetriever에서 질의를 받으면 LLM을 통해 질의 카테고리 분류를 하고, 이를 이용해 메타데이터 필터링을 해야 하는데, LangSmith에서 확인해보니 메타데이터가 필터링이 안 되어 있는 것을 확인했다.
"filter": "NO_FILTER"
수정 필요!
나는 일정이 있어 멘토링에 불참해 아쉬웠다. 정리된 회의록을 보니 정말 알찬 멘토링이었구나 싶어서 다음에는 나도 꼭 참여해야겠다고 한 번 더 다짐했다!
정리된 회의록 내용을 한 번 더 숙지할 겸, 멘토링 내용을 정리해보겠다.
프로젝트 목표 구체화가 필요하며, 이에 맞게 기획서, 요구사항 정의서, 화면 설계서를 수정하도록 한다.
- 필터링
- LLM을 통한 질의 의도 분석
- 질의를 LLM에 넣어 카테고리를 도출한다.
- 검색
- 해당 카테고리 문서에서 유사도 기반으로 문서를 검색한다.
- LLM 답변 생성
- 질의를 검색된 문서와 함께 LLM에 넣어 답변을 추출한다.