[사이드프로젝트] - LLM 활용 블로그 검색 만들기 1편: KURE 임베딩 + pgvector + Docker로 비슷한 글 찾기
생성일 : 2026.10.14 10:41 / 수정일 : 2026.10.14 10:41
- 구성요소: FE inote, BE inote-server, AI inote-ai, KURE 임베딩, Groq LLM 등으로 구성된 분산 아키텍처
- 데이터 흐름: 글 저장 시 BE DB에 원본 저장 → AI 서버에 KURE 호출로 1024차원 벡터 생성 → AI DB에 저장, 비슷한 글은 AI 서버가 벡터 유사도 검색 후 BE가 접근권한 확인 후 결과 반환
- 기능 흐름: 비슷한 글 표시, RAG 기반 질문에 대한 답변, 비공개 글 접근 제한 등 규칙이 BE와 AI 서버 모두에서 검증
- 로드맵: A(기반 완성)→B(관련 글 추천 완료)→C(카테고리 제안·유사 글 알림 미착수)→D(내 글 기반 답변 미착수) 단계 진행 중
1. 부품과 역할
부품 | 하는 일 | 어디서 실행 |
|---|---|---|
inote (FE) | 화면. 글 상세 아래 "비슷한 글" 등 | 브라우저 |
inote-server (BE) | 글 원본 관리, 누가 어떤 글을 볼 수 있는지 판정, AI 서버 호출 | 터미널에서 실행 |
inote-ai (AI 서버) | 벡터 저장·검색, KURE 호출, (나중에) Groq 호출 | 터미널에서 실행 |
KURE 임베딩 서비스 | 글을 숫자 1024개로 바꾸는 계산 (LLM이 아님) | 도커 컨테이너 |
Groq (LLM) | 글을 읽고 답변을 만들어 냄 (요약, 나중에 RAG) | 외부 서비스 |
2. 데이터가 있는 곳
데이터 | 위치 |
|---|---|
글 원본(제목·본문·공개 여부·작성자) | BE DB |
글의 벡터(글 id + 숫자 1024개) | AI DB (공개 여부·작성자는 일부러 복사하지 않음) |
KURE 모델 파일 | 도커 볼륨 |
로컬에서는 모두 도커에 있고, 운영(Supabase)에는 벡터 관련 변경이 아직 없습니다.
3. 동작 흐름 3가지
① 글을 저장할 때 (벡터 만들기)
글 저장 → BE DB에 원본 저장 → (기다리지 않고) AI 서버에 요청
→ AI 서버가 KURE로 벡터 변환 → AI DB에 저장AI·KURE가 꺼져 있어도 글 저장은 정상입니다. 내용이 같으면 다시 계산하지 않습니다.
② 비슷한 글 보여 주기 (B 단계)
글 상세 열기 → BE: 볼 수 있는 글인지 확인(없으면 404)
→ BE: "이 사람이 볼 수 있는 글 id 목록" 계산 (공개 글 + 내 글, 이 글 제외)
→ AI 서버: 그 목록 안에서만 벡터가 가까운 글 찾기
→ BE: AI 응답을 한 번 더 걸러 글 정보를 붙여 응답저장된 글을 기준으로 할 때는 이미 있는 벡터를 쓰므로 KURE를 다시 부르지 않습니다.
③ 내 글로 답변하기 (D 단계, RAG)
질문 입력 → KURE로 질문을 벡터로 변환 → ②와 같은 방식으로 관련 글 찾기
→ 찾은 글을 Groq(LLM)에 넘김 → 답변 + 출처 글4. 지켜지는 규칙
공개 여부는 BE만 판단합니다. AI 서버는 BE가 준 목록 안에서만 찾아서, 목록 밖의 비공개 글은 구조적으로 나올 수 없습니다. BE도 AI 응답을 한 번 더 확인합니다.
AI·임베딩 서비스가 장애여도 글쓰기는 막히지 않습니다. 비슷한 글 영역만 빈 목록이 됩니다.
운영에서는
EMBEDDINGS_ENABLED로 스위치를 두고, 기본은 꺼져 있습니다.
5. 단계별 로드맵과 지금 위치
단계 | 내용 | 상태 |
|---|---|---|
A. 기반 | KURE 실행, 벡터 DB, 글 저장 시 벡터 만들기, 기존 글 일괄 처리 | ✅ 완료 (평가 세트 A7만 남음) |
B. 관련 글 추천 | 글 상세 아래 "비슷한 글" | BE ✅ 완료, 화면(FE) 보류 |
C. 카테고리 제안·유사 글 알림 | 쓰는 중인 글(저장 전)을 KURE로 변환해서 제안 | 미착수 (UX 승인 필요) |
D. 내 글 기반 답변(RAG) | 질문 → 관련 글 → Groq 답변 | 미착수 (요청자 검증 과제가 먼저) |