def chunk_text(text, chunk_size=300, overlap=50):
    # 1) 정답
    chunks = []
    start = 0
    step = chunk_size - overlap          # 다음 시작 위치 이동량
    while start < len(text):
        end = start + chunk_size
        chunk = text[start:end]          # 현재 윈도우 잘라내기
        chunks.append(chunk)
        start += step                    # 겹침만큼 되돌려 다음 윈도우로
    return chunks


# 2) 정답
document = (
    "검색 증강 생성(RAG)은 대규모 언어 모델이 답변을 생성하기 전에 외부 문서에서 관련 정보를 "
    "먼저 찾아오는 기법이다. 모델이 학습 시점 이후의 최신 정보나, 학습 데이터에 없던 사내 문서까지 "
    "다룰 수 있게 해 주며, 답변의 근거가 된 문서를 출처로 제시할 수 있어 신뢰성을 높인다. "
    "RAG 파이프라인은 크게 두 단계로 나뉜다. 인제스션 단계에서는 원본 문서를 적당한 크기의 청크로 "
    "나누고, 각 청크를 임베딩 모델로 벡터화해 벡터 데이터베이스에 저장한다. 이때 청크가 너무 크면 "
    "검색 정확도가 떨어지고 너무 작으면 문맥이 끊기므로, 적절한 크기와 겹침을 정하는 것이 중요하다. "
    "질의 단계에서는 사용자의 질문을 같은 임베딩 모델로 벡터화하고, 저장된 청크 중 가장 가까운 것들을 "
    "찾아 프롬프트에 함께 넣어, 모델이 그 근거를 바탕으로 답하게 한다. 이처럼 검색 품질은 청크 크기와 "
    "겹침, 그리고 임베딩 모델의 성능에 크게 좌우되므로, 실제 서비스에서는 문서의 특성에 맞춰 이 값들을 "
    "실험적으로 조정하는 경우가 많다."
)  # 전처리로 추출된 긴 텍스트(예시)
chunks = chunk_text(document, chunk_size=300, overlap=50)
print(f"청크 개수: {len(chunks)}")
for i, c in enumerate(chunks):
    print(f"[{i}] {c[:30]}...")
