Appearance
AI
- 경로:
/admin/ai - 라우트 이름:
admin-ai - 컴포넌트:
apps/web-ui/src/pages/admin/AdminAI.vue - 권한:
operator
목적
AI 운영 상태를 모니터링하고 주요 모델/에이전트/파이프라인 설정을 운영자가 점검합니다.
핵심 기능
- 모델·에이전트 가동 상태 확인
- 사용량·성능 지표 모니터링
- MCP/도구 연동 상태 점검
- RAG/벡터 파이프라인 상태 확인
- 추론 정책/파라미터 운영 설정
연계
- AI 관련 스토어(모델/요청/로그)
ragDocuments및 에이전트 설정 데이터
Supabase 설정 (RAG 파이프라인)
RAG 가공 기능을 사용하려면 Supabase SQL Editor에서 아래 스크립트를 순서대로 실행해야 합니다.
1. pgvector 확장 활성화
sql
create extension if not exists vector;2. 벡터 청크 테이블 생성
text-embedding-3-small (OpenAI, 1536차원) 기본 테이블:
sql
create table if not exists rag_documents (
id uuid primary key default gen_random_uuid(),
content text not null,
metadata jsonb default '{}',
embedding vector(1536)
);
-- 벡터 인덱스 (IVFFlat, 대용량 시 성능 향상)
create index if not exists rag_documents_embedding_idx
on rag_documents
using ivfflat (embedding vector_cosine_ops)
with (lists = 100);다른 임베딩 모델을 사용하는 경우
| 모델 | 차원 | 테이블명 |
|---|---|---|
text-embedding-3-large (OpenAI) | 3072 | rag_documents_3072 |
nomic-embed-text (Ollama) | 768 | rag_documents_768 |
mxbai-embed-large (Ollama) | 1024 | rag_documents_1024 |
all-minilm (Ollama) | 384 | rag_documents_384 |
예시 (768차원):
sql
create table if not exists rag_documents_768 (
id uuid primary key default gen_random_uuid(),
content text not null,
metadata jsonb default '{}',
embedding vector(768)
);3. 문서 메타 테이블 생성
청크와 별도로 문서 단위 메타데이터를 관리합니다.
sql
create table if not exists rag_document_meta (
id uuid primary key default gen_random_uuid(),
source text not null, -- 원본 파일명 또는 URL
kb_id text not null default 'default', -- 지식 베이스 ID
type text not null, -- 'pdf' | 'txt' | 'md' | 'html' | 'url'
embed_model text not null, -- 사용한 임베딩 모델 ID
chunk_count int default 0, -- 생성된 청크 수
created_at timestamptz default now(),
updated_at timestamptz default now(),
unique (source, kb_id) -- 동일 소스+KB 중복 방지 (upsert 기준)
);4. 유사도 검색 RPC 함수 생성
text-embedding-3-small (1536차원) 기본 함수:
sql
create or replace function match_rag_documents(
query_embedding vector(1536),
match_count int,
filter jsonb default '{}'
)
returns table (
id uuid,
content text,
metadata jsonb,
similarity float
)
language plpgsql
as $$
begin
return query
select
d.id,
d.content,
d.metadata,
1 - (d.embedding <=> query_embedding) as similarity
from rag_documents d
where d.metadata @> filter
order by d.embedding <=> query_embedding
limit match_count;
end;
$$;다른 차원 테이블용 함수 예시 (768차원):
sql
create or replace function match_rag_documents_768(
query_embedding vector(768),
match_count int,
filter jsonb default '{}'
)
returns table (
id uuid, content text, metadata jsonb, similarity float
)
language plpgsql
as $$
begin
return query
select d.id, d.content, d.metadata,
1 - (d.embedding <=> query_embedding) as similarity
from rag_documents_768 d
where d.metadata @> filter
order by d.embedding <=> query_embedding
limit match_count;
end;
$$;5. RLS(Row Level Security) 설정
백엔드는 service_role 키로 RLS를 우회하므로, 테이블에 RLS를 활성화해도 무방합니다. 프론트엔드에서 직접 접근하지 않는 테이블이므로 아래처럼 모든 접근을 차단하는 것을 권장합니다.
sql
alter table rag_documents enable row level security;
alter table rag_document_meta enable row level security;
-- service_role은 RLS를 우회하므로 별도 policy 불필요확인 사항
backend-server/.env에SUPABASE_URL과SUPABASE_SERVICE_KEY(service_role) 설정 필요SUPABASE_SERVICE_KEY는 Supabase 프로젝트 Settings → API →service_role키 사용- anon 키가 아닌 service_role 키를 사용해야 RLS 우회 가능