PostgreSQL과 pgvector를 활용한 FAQ 검색 시스템 구축하기
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 검색 시스템을 만들 수 있습니다. 😊🚀