day2_practice/chunking.pychunking_md.pymetadata.pyembedding.pysimilarity.py

청킹과 임베딩: 자르고, 꼬리표 달고, 벡터로

연차 규정 문서(323자)가 chunk_size 와 chunk_overlap 에 따라 어디서 잘리는지, 마크다운 헤더로 자르면 무엇이 달라지는지, 청크에 어떤 메타데이터가 붙는지, 그리고 글이 Titan v2 임베딩으로 1024개의 실수가 되어 코사인 유사도로 비교되는 과정을 단계별로 봅니다. 청킹 결과는 원고의 실제 값이고, 유사도 수치는 지어내지 않습니다.

한눈에 보는 구조

단계를 넘기면 지금 일하는 부품이 파란 테두리로 표시됩니다
청킹 · 메타데이터 · 모델 호출 없음 연차 규정 원문323자 · 문단 5개leave_policy.md RecursiveCharacterTextSplitter구분자 \n\n → \n → 공백 → 글자큰 단위로 나누고 다시 이어 붙임 (100, 0) 6개 (100, 50) 6개 (300, 50) 2개 메타데이터source · department· updated_at청크마다 복사됨 MarkdownHeaderTextSplitter# → title, ## → section title만 부여 기준 이월 신청 절차 임베딩 · 유사도 · Bedrock 호출 글 하나"오늘은 며칠인가요?" BedrockEmbeddingstitan-embed-text-v2:0embed_query / embed_documents 벡터 · 실수 1024개 cosine(a, b)dot / (na × nb)같은 방향 1 · 직각 0 청크도 같은 모델로 벡터가 됩니다 (vectorstore.py)

이 시점의 데이터

세 설정 한 번에 비교 (연차 규정 323자)

설정청크 수청크별 글자 수눈여겨볼 점
(100, 0)629, 66, 45, 69, 58, 48"3년 이상 근속자는 … 최대 25일까지" 줄이 혼자 청크가 되어 소제목도 '연차'라는 말도 없습니다
(100, 50)629, 66, 45, 69, 58, 98겹침이 생긴 곳은 마지막 청크 하나뿐입니다
(300, 50)2214, 107겹침이 전혀 생기지 않습니다. 오늘 벡터 DB에 쓰는 설정입니다

함정과 주의

관련 파일

파일하는 일
chunking.py연차 규정을 (100, 0), (100, 50), (300, 50) 세 설정으로 잘라 청크 수와 앞 40자를 비교. 모델 호출 없음
chunking_md.py마크다운 제목(#)과 소제목(##)을 기준으로 자르고 헤더를 metadata로 보존
metadata.py세 문서에 부서·개정일을 붙이고 300자/겹침 50으로 자르는 load_chunks(). 벡터 DB와 BM25가 이 함수를 씁니다
embedding.py문장 하나를 Titan v2로 임베딩해 벡터의 차원과 값을 출력
similarity.py문장 쌍 네 개를 임베딩해 직접 만든 cosine 함수로 유사도를 계산