-
PostgreSQL과 pgvector를 활용한 FAQ 검색 시스템 구축하기사소한 개발팁 2025. 4. 1. 10:45반응형
PostgreSQL과 pgvector를 활용한 FAQ 검색 시스템 구축하기
최근 AI와 자연어 처리 기술이 발전하면서 벡터 데이터베이스(Vector DB)를 활용한 검색 시스템이 주목받고 있습니다. 특히, 매뉴얼이나 FAQ 데이터를 효율적으로 검색할 수 있는 시스템을 만들 때 벡터 검색이 강력한 도구가 될 수 있습니다.
이번 글에서는 PostgreSQL과 pgvector를 이용한 FAQ 검색 시스템 구축 과정을 살펴보겠습니다.
1. 벡터 데이터베이스(Vector DB)란?
기존의 키워드 기반 검색 시스템은 정확한 단어가 포함된 문서만 찾아줍니다. 하지만 벡터 검색(Vector Search) 을 활용하면 의미적으로 유사한 문장도 함께 검색할 수 있습니다.
벡터 검색에서는 텍스트 데이터를 벡터(숫자로 표현된 다차원 공간의 점) 로 변환하여 비교합니다. 그리고 유사도를 계산하여 가장 관련성이 높은 데이터를 반환합니다.
2. FAQ 검색을 위한 데이터 스키마 설계
FAQ 데이터는 보통 질문(Question) 과 답변(Answer) 으로 구성됩니다. 이를 PostgreSQL 데이터베이스에 저장할 때 벡터 값(embedding) 을 추가하여 유사도 검색이 가능하도록 설계합니다.
FAQ 테이블 생성
CREATE TABLE faq ( id SERIAL PRIMARY KEY, question TEXT NOT NULL, answer TEXT NOT NULL, embedding vector(1536) -- 1536차원 벡터 저장 );
이 테이블에서
embedding
컬럼이 질문을 숫자로 변환한 벡터 데이터를 저장하는 부분입니다.
3. 질문을 벡터로 변환하는 방법
OpenAI의
text-embedding-ada-002
같은 모델을 활용하면 질문을 벡터로 변환할 수 있습니다.Python을 이용한 벡터 변환 코드
import openai query = "비행기 탑승 절차는?" response = openai.Embedding.create( input=query, model="text-embedding-ada-002" ) embedding = response["data"][0]["embedding"] print(len(embedding)) # 1536차원 벡터 출력
이렇게 변환한 벡터 값을
embedding
컬럼에 저장하면 됩니다.
4. 유사한 질문 찾기 (쿼리 작성)
사용자가 검색창에 질문을 입력하면, 그 질문을 벡터로 변환한 후
pgvector
를 이용해 가장 유사한 질문을 찾습니다.유사한 질문을 찾는 SQL 쿼리
SELECT question, answer, embedding <-> '[사용자 입력 벡터]' AS distance FROM faq ORDER BY distance LIMIT 3;
<->
연산자는 PostgreSQLpgvector
에서 유클리드 거리(L2 distance) 를 계산하는 연산자입니다.ORDER BY distance
를 통해 가장 유사한 질문 3개를 가져옵니다.
Threshold(임계값) 설정하기
유사도가 낮은 결과를 필터링하려면 distance 값을 제한할 수 있습니다.
SELECT question, answer FROM faq WHERE embedding <-> '[사용자 입력 벡터]' < 1.5 ORDER BY embedding <-> '[사용자 입력 벡터]' LIMIT 3;
📌 일반적으로 distance 값이 1.5 이하인 경우 꽤 유사한 질문이라고 판단할 수 있습니다.
Distance 값 유사성 판단 기준 0.0 ~ 0.7 매우 유사 (정확한 답변 가능) 0.7 ~ 1.5 꽤 유사 (사용 가능) 1.5 ~ 2.5 연관 있음 (보조 정보 활용) 2.5 이상 거의 무관 (검색 결과에서 제외 가능)
5. 성능 최적화를 위한 인덱스 추가
FAQ 데이터가 많아질수록 검색 속도가 느려질 수 있습니다. 이를 해결하기 위해 HNSW (Hierarchical Navigable Small World) 인덱스를 추가할 수 있습니다.
pgvector HNSW 인덱스 생성
CREATE INDEX ON faq USING hnsw (embedding vector_l2_ops);
이렇게 하면 벡터 검색 속도를 크게 개선할 수 있습니다.
6. 키워드 검색과 벡터 검색을 조합하기
키워드 검색도 함께 활용하면 검색의 정확도를 높일 수 있습니다.
키워드 검색 + 벡터 검색 조합 쿼리
SELECT question, answer FROM faq WHERE question ILIKE '%비행기%' ORDER BY embedding <-> '[사용자 입력 벡터]' LIMIT 3;
이렇게 하면 키워드가 포함된 질문 중에서 가장 유사한 질문을 검색할 수 있습니다.
7. 결론
✅ FAQ 검색 시스템을 구축하는 과정 정리
- 질문/답변 데이터를 준비
- 질문을 임베딩하여 벡터 값으로 변환
- PostgreSQL에 저장 (
pgvector
활용) - 사용자 질문을 벡터로 변환 후 유사한 질문 검색
- Threshold 설정 및 검색 결과 필터링
- HNSW 인덱스를 추가하여 속도 최적화
- 키워드 검색과 벡터 검색을 조합하여 정밀도 향상
이 방법을 활용하면 더욱 정확하고 빠른 FAQ 검색 시스템을 만들 수 있습니다. 😊🚀
반응형'사소한 개발팁' 카테고리의 다른 글
변수 선언에 _(언더바)를 붙이는 경우와 상세 예시 (0) 2025.04.03 Vector DB와 Vector 연산을 활용할 수 있는 API 소개 (0) 2025.04.02 Supabase RLS 마스터하기: 데이터 보안의 핵심 (0) 2025.03.27 발전하는 생성형 AI, 프롬프트 엔지니어링이 더 이상 필요 없다고? 천만에 말씀 (0) 2025.03.27 GitHub Copilot Instruction MD 설정 가이드 (0) 2025.03.25