idea_world_labDEV JOURNAL
2026년 6월 28일 일요일

대안 A: 현재 PostgreSQL full-text 유지

흐름

raw chunkText
  -> plainto_tsquery
  -> search_tsv @@ query
  -> ts_rank_cd
  -> top JSONL 반환

장점

  • 이미 구현되어 있다.
  • PostgreSQL만으로 가능하다.
  • 인프라가 단순하다.
  • search_tsv를 이미 가진 테이블과 바로 맞는다.

단점

  • BM25가 아니다.
  • 긴 코드 chunk에 약하다.
  • plainto_tsquery가 만든 조건이 과하게 좁아질 수 있다.
  • 코드 토큰 노이즈가 많다.
  • 의미 검색을 하지 못한다.
  • chunk 분할이 조금만 달라져도 0건이 나올 수 있다.

기준 chunk에서 예상되는 문제

기준 chunk에는 다음 토큰이 한꺼번에 들어 있다.

func
process
delta
velocity
vector2
zero
input
is_action_pressed
move_right
move_left
normalized
animatedsprite2d
play
stop
position
clamp
screen_size

이 모든 토큰이 한 JSONL row 안에 동시에 들어있지 않으면 검색 결과가 빠질 수 있다.

PoC 시뮬레이션

기준 chunk가 그대로 /api/retrieve에 들어간다고 가정한다.

입력:

chunkText = 전체 _process(delta) 함수 본문

현재 방식은 이 입력을 plainto_tsquery('simple', chunkText)로 바꾼다.

예상 query 성격:

func & process & delta & var & velocity & vector2 & zero
& input & is_action_pressed & move_right & move_left
& length & normalized & speed & animatedsprite2d
& play & stop & position & clamp & screen_size

이때 실제 관련 문서가 다음처럼 두 chunk로 나뉘어 있으면 문제가 생긴다.

docs chunk A:
  Input.is_action_pressed("move_right")
  Input.is_action_pressed("move_left")
  velocity.normalized() * speed
  $AnimatedSprite2D.play()
  $AnimatedSprite2D.stop()

docs chunk B:
  position += velocity * delta
  position = position.clamp(Vector2.ZERO, screen_size)

사람이 보면 A와 B 모두 관련 있다.

하지만 full-text query가 너무 많은 토큰을 동시에 요구하면 다음처럼 될 수 있다.

docs chunk A:
  animatedsprite2d = 있음
  is_action_pressed = 있음
  move_left/move_right = 있음
  clamp = 없음
  screen_size = 없음
  position.clamp = 없음
  => query 전체를 만족하지 못함

docs chunk B:
  clamp = 있음
  screen_size = 있음
  position = 있음
  animatedsprite2d = 없거나 약함
  move_left/move_right = 없음
  is_action_pressed = 없음
  => query 전체를 만족하지 못함

눈에 보이는 실패 형태:

검색 결과 0건
또는 아주 좁은 chunk만 반환

이 방식에서는 검색 실패가 “문서에 근거가 없어서 실패”인지, “query 조건이 과해서 실패”인지 구분하기 어렵다.

PoC에서 확인할 로그

이 대안을 테스트할 때는 결과만 보면 안 된다.

다음 값을 같이 보여줘야 한다.

1. raw chunkText
2. plainto_tsquery로 만들어진 query
3. query에 들어간 토큰 목록
4. 반환 row 수
5. 0건이면 어떤 토큰 때문에 너무 좁아졌는지

예상 관찰:

raw chunk가 길수록 query가 길어지고,
관련 문서가 여러 chunk에 나뉘어 있으면 결과가 빠진다.

판정

PoC 기준선으로는 사용 가능
최종 검색 전략으로는 폐기 후보

원문 메모의 판단은 “갈아엎는 게 맞다”에 가깝다.