ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 검색 시스템을 만들 수 있습니다. 😊🚀

    반응형
Designed by Tistory.