Skip to content

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)3072rag_documents_3072
nomic-embed-text (Ollama)768rag_documents_768
mxbai-embed-large (Ollama)1024rag_documents_1024
all-minilm (Ollama)384rag_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/.envSUPABASE_URLSUPABASE_SERVICE_KEY(service_role) 설정 필요
  • SUPABASE_SERVICE_KEY는 Supabase 프로젝트 Settings → API → service_role 키 사용
  • anon 키가 아닌 service_role 키를 사용해야 RLS 우회 가능