대안 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 기준선으로는 사용 가능
최종 검색 전략으로는 폐기 후보원문 메모의 판단은 “갈아엎는 게 맞다”에 가깝다.