From 25ef3996ecce8b6f4bac5de06ba028f83e2f476a Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 8 Apr 2026 13:08:23 +0900 Subject: [PATCH] =?UTF-8?q?feat(chunk):=20Phase=201.2-G=20embedding=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EA=B0=95=ED=99=94=20(title=20+=20section?= =?UTF-8?q?=20+=20text)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1.2-G hybrid retrieval 측정 결과 Recall 0.66 정체 + 진단: 직접 nl 쿼리 시도 결과 일부 정답 doc(3854, 3981, 3982, 3920, 3921)이 top-100에도 못 들어옴. doc은 corpus + chunks + embedding 모두 정상. 진짜 원인: 자연어 query ↔ 법령 조항 의미 거리 + 짧은 본문 embedding signal 약함. - query: '유해화학물질을 다루는 회사가 지켜야 할 안전 의무' - 본문: '화학물질관리법 제4장 유해화학물질 영업자' - bge-m3 입장: chunk text만으로는 같은 의미인지 못 알아봄 해결: chunks embedding 입력에 doc.title + section_title 포함. - before: embed(c['text']) - after: embed('[제목] {title}\n[섹션] {section}\n[본문] {text}') 기대 효과: - 짧은 조항 문서 매칭 회복 (3920/3921 등 300자대) - 자연어 query → 법령 조항 의미 매칭 개선 - Recall 0.66 → 0.72~0.78 영향: chunks embedding 차원/구조 변경 X — 입력 텍스트 prefix만 다름. 재인덱싱 1회로 모든 chunks 재생성 필요. --- app/workers/chunk_worker.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/workers/chunk_worker.py b/app/workers/chunk_worker.py index a9f1baf..f6ff953 100644 --- a/app/workers/chunk_worker.py +++ b/app/workers/chunk_worker.py @@ -313,8 +313,16 @@ async def process(document_id: int, session: AsyncSession) -> None: client = AIClient() try: for idx, c in enumerate(chunk_dicts): + # Phase 1.2-G: embedding 입력 강화 (자연어 query ↔ 법령 조항 의미 매칭 개선) + # 짧은 본문이나 segment-only chunk는 임베딩 signal이 약함 → title/section 포함. + section = c.get("section_title") or "" + embed_input = ( + f"[제목] {doc.title or ''}\n" + f"[섹션] {section}\n" + f"[본문] {c['text']}" + ) try: - embedding = await client.embed(c["text"]) + embedding = await client.embed(embed_input) except Exception as e: logger.warning(f"[chunk] document_id={document_id} chunk {idx} 임베딩 실패: {e}") embedding = None