GPU 서버에 untracked로만 존재하던 Phase 0.1 코드를 정식 commit: - app/models/chunk.py — DocumentChunk ORM (country/source/domain 메타 포함) - app/workers/chunk_worker.py — 6가지 chunking 전략 (legal/news/markdown/email/long_pdf/default) - migrations/014_document_chunks.sql — pgvector + FTS + trigram 인덱스 - app/models/queue.py — ProcessingQueue enum에 'chunk' stage 추가 - app/workers/queue_consumer.py — chunk stage 등록, classify→[embed,chunk] 자동 연결 Phase 1 reranker 통합 작업의 전제 조건. document_chunks 테이블 기반 retrieval에 사용.
55 lines
2.6 KiB
SQL
55 lines
2.6 KiB
SQL
-- 문서 chunk 단위 검색 테이블 (chunk 중심 retrieval)
|
|
-- Phase 0.1: 문서를 의미 단위(조항/문단/슬라이딩 윈도우)로 쪼개어 별도 테이블에 저장
|
|
-- 검색 품질 승부처는 chunk 품질 + reranker 입력 품질
|
|
|
|
CREATE TABLE document_chunks (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
doc_id BIGINT REFERENCES documents(id) ON DELETE CASCADE NOT NULL,
|
|
chunk_index INTEGER NOT NULL, -- 문서 내 순서
|
|
|
|
-- chunking 전략 메타
|
|
chunk_type VARCHAR(30) NOT NULL, -- legal_article | paragraph | section | window | email_body
|
|
section_title TEXT, -- "제80조", "3.1 Methods" 등
|
|
heading_path TEXT, -- "Chapter 3 > Section 2"
|
|
page INTEGER, -- PDF 페이지 번호
|
|
|
|
-- 다국어 및 domain-aware retrieval 메타
|
|
language VARCHAR(10), -- ko | en | ja | zh | fr | de
|
|
country VARCHAR(10), -- KR | US | JP | CN | FR | DE (뉴스 필수)
|
|
source VARCHAR(100), -- 경향신문 | NYT | ... (뉴스 필수)
|
|
domain_category VARCHAR(20) NOT NULL, -- document | news (파이프라인 분기 키)
|
|
|
|
-- 본문 + 임베딩
|
|
text TEXT NOT NULL,
|
|
embedding vector(1024), -- bge-m3
|
|
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
|
UNIQUE (doc_id, chunk_index)
|
|
);
|
|
|
|
-- 벡터 유사도 인덱스 (IVFFlat, cosine)
|
|
-- lists는 데이터 증가에 따라 조정 필요. 초기 500-5000 chunks 기준.
|
|
CREATE INDEX idx_chunks_embedding ON document_chunks
|
|
USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
|
|
|
-- FTS 인덱스 (simple tokenizer — 한국어는 trigram 보조)
|
|
CREATE INDEX idx_chunks_fts ON document_chunks
|
|
USING GIN (to_tsvector('simple', text));
|
|
|
|
-- Trigram 인덱스 (한국어/부분매치 보조)
|
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
CREATE INDEX idx_chunks_trgm ON document_chunks
|
|
USING GIN (text gin_trgm_ops);
|
|
|
|
-- 필터용 B-tree 인덱스
|
|
CREATE INDEX idx_chunks_doc_id ON document_chunks (doc_id);
|
|
CREATE INDEX idx_chunks_domain_category ON document_chunks (domain_category);
|
|
CREATE INDEX idx_chunks_country ON document_chunks (country) WHERE country IS NOT NULL;
|
|
CREATE INDEX idx_chunks_source ON document_chunks (source) WHERE source IS NOT NULL;
|
|
CREATE INDEX idx_chunks_language ON document_chunks (language) WHERE language IS NOT NULL;
|
|
|
|
-- chunk stage 추가 (processing_queue에서 chunk 단계로 처리)
|
|
ALTER TYPE process_stage ADD VALUE IF NOT EXISTS 'chunk';
|