Document 준비
Document 노드에 title, text 같은 원본 텍스트가 존재 → "검색할 문서를 먼저 준비"
문서 임베딩
title + text → embed_texts()
→ 텍스트의 의미를 숫자 벡터로 변환 → 논문마다 하나의 벡터 생성
벡터를 노드에 저장
Document → emb 속성에 벡터 저장
db.create.setNodeVectorProperty(n, 'emb', vec)
→ "Neo4j 노드가 자신의 의미 벡터를 가지게 됨"
Vector Index 생성
Document.emb → Vector Index
→ 수많은 벡터를 매번 전부 비교하지 않고
가까운 벡터를 빠르게 찾기 위한 검색 구조 생성
사용자 질문 입력
질문 임베딩
질문 → embed_query() → q_vec
→ 문서와 질문을 같은 벡터 공간에서 비교할 수 있게 만듦
Vector Search
q_vec ↔ Document.emb
→ cosine 유사도 비교
→ 의미적으로 가까운 Document TOP K 검색
검색 조건을 추가하고 싶다면
Vector Search + 필터
사후필터:
전체에서 TOP K 검색 → 조건에 안 맞는 결과 제거
사전필터:
조건에 맞는 데이터로 범위 제한 → 그 안에서 TOP K 검색
정확한 단어를 찾고 싶다면
Full-text Index
↓
"IL-6", "hypertension" 등의 실제 키워드 검색
↓
AND / OR / 특정 필드 검색 가능
Vector Search = 의미가 비슷한가?
Full-text Search = 실제 단어가 들어 있는가?
과제 2부터 이어지는 흐름
→ 지금까지 직접 작성한 '검색 과정'을
RAG에서 사용하기 편한 검색 컴포넌트로 연결
벡터 유사도
벡터 유사도
질문
↓
Retriever
↓
관련 Document 검색
↓
검색된 내용을 LLM에게 제공
↓
답변 생성
= RAG
[또 다른 검색 방식: Text2Cypher]
자연어 질문
↓
LLM이 Cypher 생성
↓
Neo4j의 노드와 관계 조회
↓
그래프 구조를 기반으로 답변
Vector Search → 의미 기반
Full-text Search → 키워드 기반
Text2Cypher → 노드·관계 기반