hgzero/rag/migrations/V1__create_rag_minutes_table.sql
2025-10-29 05:54:08 +09:00

78 lines
2.9 KiB
SQL

-- RAG 회의록 테이블 생성
-- 회의록 정보를 embedding과 함께 저장하여 유사 회의록 검색에 사용
-- pgvector 확장이 이미 설치되어 있는지 확인 (terms 테이블용으로 설치되어 있음)
CREATE EXTENSION IF NOT EXISTS vector;
-- rag_minutes 테이블 생성
CREATE TABLE IF NOT EXISTS rag_minutes (
-- Meeting 정보
meeting_id VARCHAR(50) NOT NULL,
title VARCHAR(200) NOT NULL,
purpose VARCHAR(500),
description TEXT,
scheduled_at TIMESTAMP,
location VARCHAR(200),
organizer_id VARCHAR(50) NOT NULL,
-- Minutes 정보
minutes_id VARCHAR(50) PRIMARY KEY,
minutes_status VARCHAR(20) NOT NULL DEFAULT 'FINALIZED',
minutes_version INTEGER NOT NULL DEFAULT 1,
created_by VARCHAR(50) NOT NULL,
finalized_by VARCHAR(50),
finalized_at TIMESTAMP,
-- 회의록 섹션 (JSON 형태로 저장)
sections JSONB,
-- 전체 회의록 내용 (검색용 텍스트)
full_content TEXT NOT NULL,
-- Embedding 벡터 (1536 차원)
embedding vector(1536),
-- 메타데이터
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 인덱스 생성
-- Meeting ID로 검색
CREATE INDEX IF NOT EXISTS idx_rag_minutes_meeting_id
ON rag_minutes(meeting_id);
-- 제목으로 검색 (Full-text search)
CREATE INDEX IF NOT EXISTS idx_rag_minutes_title
ON rag_minutes(title);
-- 확정 일시로 정렬
CREATE INDEX IF NOT EXISTS idx_rag_minutes_finalized_at
ON rag_minutes(finalized_at DESC);
-- 작성자로 검색
CREATE INDEX IF NOT EXISTS idx_rag_minutes_created_by
ON rag_minutes(created_by);
-- 벡터 유사도 검색용 인덱스 (IVFFlat)
-- lists 파라미터는 데이터 크기에 따라 조정 (작은 데이터셋의 경우 100 정도가 적당)
CREATE INDEX IF NOT EXISTS idx_rag_minutes_embedding
ON rag_minutes USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- Full-text search를 위한 GIN 인덱스
CREATE INDEX IF NOT EXISTS idx_rag_minutes_full_content_gin
ON rag_minutes USING gin(to_tsvector('simple', full_content));
-- 코멘트 추가
COMMENT ON TABLE rag_minutes IS '회의록 RAG 저장소 - Embedding 벡터와 함께 저장된 회의록 정보';
COMMENT ON COLUMN rag_minutes.meeting_id IS '회의 ID';
COMMENT ON COLUMN rag_minutes.title IS '회의 제목';
COMMENT ON COLUMN rag_minutes.purpose IS '회의 목적';
COMMENT ON COLUMN rag_minutes.minutes_id IS '회의록 ID (Primary Key)';
COMMENT ON COLUMN rag_minutes.sections IS '회의록 섹션 목록 (JSON 배열)';
COMMENT ON COLUMN rag_minutes.full_content IS '전체 회의록 내용 (검색용 텍스트)';
COMMENT ON COLUMN rag_minutes.embedding IS 'OpenAI text-embedding-ada-002 벡터 (1536차원)';
COMMENT ON COLUMN rag_minutes.created_at IS '레코드 생성 일시';
COMMENT ON COLUMN rag_minutes.updated_at IS '레코드 수정 일시';