Neon PostgreSQL의 loan_products 테이블에서
pgvector(코사인 유사도)와 pg_search(paradedb)를
RRF 알고리즘으로 결합한 Python CLI 구현.
text-embedding-3-small 사용
claude mcp add --transport http neon https://mcp.neon.tech/mcp -s project
# Claude Code 시작
claude
# MCP 서버 목록 확인
/mcp
1. BM25 점수와 Similarity 점수로 각각 문서의 상위 결과 계산
2. 각 검색 방식별로 문서 순위 매기기
3. Reciprocal Rank 계산: 1/(k + r)
- k: 일반적으로 60 (조정 가능)
- r: 해당 문서의 순위
4. 두 Reciprocal Rank를 합산하여 최종 Hybrid Search 점수 생성
SELECT description,
bm25_score,
similarity_score,
hybrid_score
FROM (
-- BM25 텍스트 검색
SELECT id,
description,
paradedb.score(id) AS bm25_score
FROM products
WHERE description @@@ 'keyboard'
) bm25_results
JOIN (
-- Vector 유사도 검색
SELECT id,
1 - (embedding <=> '[1,2,3]'::vector) AS similarity_score
FROM products
) vector_results USING (id)
-- RRF로 결합
ORDER BY (1.0 / (60 + bm25_rank)) + (1.0 / (60 + vector_rank)) DESC
LIMIT 5;
스펙:
- Python, uv 패키지 매니저
- Neon PostgreSQL (pgvector, pg_search 확장)
- OpenAI text-embedding-3-small
- psycopg2
데이터베이스:
- Neon MCP 사용
- 프로젝트: nonghyup-loan
- 테이블: loan_products
핵심 기능:
- 대출 상품 데이터 파일(loan_products.json)을 loan_products 테이블에 저장
- 대출 상품이 searchable_text 를 bm25로 검색하기 좋게 특수문자 제거하여 cleaned_searchable_text 생성 -> bm25 search
- searchable_text 를 embedding해서 searchable_text_embedding에 저장 -> vector search
- hybrid_search(): RRF로 vector, bm25 search 결합
- https://docs.paradedb.com/documentation/guides/hybrid 참고 구현
- bm25, vector search 할 때는 테이블 전체를 대상으로 계산
CLI 동작:
uv run python ... "의사 전용 대출"
주의:
- PRD는 핵심만 간략하게
- 구체적인 SQL 코드 작성하지 않기
- 구현 세부사항은 AI에게 맡기기