사소한 개발팁

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;
  • <-> 연산자는 PostgreSQL pgvector에서 유클리드 거리(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 검색 시스템을 구축하는 과정 정리

  1. 질문/답변 데이터를 준비
  2. 질문을 임베딩하여 벡터 값으로 변환
  3. PostgreSQL에 저장 (pgvector 활용)
  4. 사용자 질문을 벡터로 변환 후 유사한 질문 검색
  5. Threshold 설정 및 검색 결과 필터링
  6. HNSW 인덱스를 추가하여 속도 최적화
  7. 키워드 검색과 벡터 검색을 조합하여 정밀도 향상

이 방법을 활용하면 더욱 정확하고 빠른 FAQ 검색 시스템을 만들 수 있습니다. 😊🚀

반응형