File size: 2,459 Bytes
08bdd80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
-- Supabase 데이터베이스 설정 스크립트
-- Supabase SQL Editor에서 실행하세요

-- 1. pgvector 확장 활성화
CREATE EXTENSION IF NOT EXISTS vector;

-- 2. 문서 테이블 생성
CREATE TABLE IF NOT EXISTS documents (
    id BIGSERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    content TEXT NOT NULL,
    category TEXT DEFAULT '일반',
    embedding VECTOR(768),  -- ko-sroberta 모델 차원
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 3. 채팅 기록 테이블 생성
CREATE TABLE IF NOT EXISTS chat_history (
    id BIGSERIAL PRIMARY KEY,
    session_id TEXT NOT NULL,
    user_message TEXT NOT NULL,
    bot_response TEXT NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- 4. 벡터 검색 함수 생성
CREATE OR REPLACE FUNCTION match_documents(
    query_embedding VECTOR(768),
    match_count INT DEFAULT 3
)
RETURNS TABLE (
    id BIGINT,
    title TEXT,
    content TEXT,
    category TEXT,
    similarity FLOAT
)
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN QUERY
    SELECT
        d.id,
        d.title,
        d.content,
        d.category,
        1 - (d.embedding <=> query_embedding) AS similarity
    FROM documents d
    WHERE d.embedding IS NOT NULL
    ORDER BY d.embedding <=> query_embedding
    LIMIT match_count;
END;
$$;

-- 5. 인덱스 생성 (검색 성능 향상)
CREATE INDEX IF NOT EXISTS documents_embedding_idx
ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);

-- 6. 샘플 데이터 (선택사항)
INSERT INTO documents (title, content, category) VALUES
('연차휴가 기준', '소방공무원의 연차휴가는 근속년수에 따라 다르게 부여됩니다. 1년 미만: 11일, 1년 이상 2년 미만: 12일, 2년 이상: 매년 1일씩 가산되어 최대 21일까지 부여됩니다.', '휴가'),
('당직근무 시간', '소방서 당직근무는 일반적으로 09:00부터 다음날 09:00까지 24시간 교대근무 형태로 운영됩니다. 다만, 각 소방서별로 상이할 수 있습니다.', '근무'),
('병가 신청', '병가는 질병 또는 부상으로 인해 직무를 수행할 수 없을 때 신청합니다. 연간 60일 이내 사용 가능하며, 7일 이상 병가시 의사 진단서가 필요합니다.', '휴가'),
('초과근무수당', '초과근무수당은 정규 근무시간을 초과하여 근무한 경우 지급됩니다. 평일 초과근무는 통상임금의 150%, 휴일근무는 200%가 적용됩니다.', '수당');