260904

u·2026년 9월 5일

TIL

목록 보기
15/30

Neo4j 벡터 검색 전체 흐름

  1. Document 준비
    Document 노드에 title, text 같은 원본 텍스트가 존재 → "검색할 문서를 먼저 준비"

  2. 문서 임베딩
    title + text → embed_texts()
    → 텍스트의 의미를 숫자 벡터로 변환 → 논문마다 하나의 벡터 생성

  3. 벡터를 노드에 저장
    Document → emb 속성에 벡터 저장
    db.create.setNodeVectorProperty(n, 'emb', vec)
    → "Neo4j 노드가 자신의 의미 벡터를 가지게 됨"

  4. Vector Index 생성
    Document.emb → Vector Index
    → 수많은 벡터를 매번 전부 비교하지 않고
    가까운 벡터를 빠르게 찾기 위한 검색 구조 생성

  5. 사용자 질문 입력

  6. 질문 임베딩
    질문 → embed_query() → q_vec
    → 문서와 질문을 같은 벡터 공간에서 비교할 수 있게 만듦

  7. 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부터 이어지는 흐름

  1. Retriever
    질문
    ↓
    Retriever
    ↓
    Vector Index 검색
    ↓
    관련 Document 반환

→ 지금까지 직접 작성한 '검색 과정'을
RAG에서 사용하기 편한 검색 컴포넌트로 연결

  1. 그래프 정보까지 검색에 활용

벡터 유사도

  • PageRank
    → 의미도 비슷하면서 그래프에서 중요한 결과를 위로 재랭킹

벡터 유사도

  • Louvain
    → 특정 커뮤니티에 속하는 결과로 검색 범위 제한
  1. 검색 결과를 LLM에 전달

질문
↓
Retriever
↓
관련 Document 검색
↓
검색된 내용을 LLM에게 제공
↓
답변 생성

= RAG

[또 다른 검색 방식: Text2Cypher]

자연어 질문
↓
LLM이 Cypher 생성
↓
Neo4j의 노드와 관계 조회
↓
그래프 구조를 기반으로 답변

Vector Search → 의미 기반
Full-text Search → 키워드 기반
Text2Cypher → 노드·관계 기반

0개의 댓글