-- 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 '레코드 수정 일시';