RAG, 그게 뭔데
RAG, 그게 뭔데 오덕아.
진짜다.
AI: auth.ts 32번째 줄 수정했습니다.
가보면 공백.
AI: 아, 34번째 줄입니다.
가보면 주석.
이쯤 되면 깨닫는다.
얘는 틀리는 게 아니다.
안 보고 말하는 거다.
우리는 착각한다.
AI가 내 프로젝트를 이해하고 있겠지.
아니다.
LLM은
“읽는 기계”가 아니라
“이어 말하는 기계”다.
파일을 실제로 안 보면
패턴으로 메꾼다.
패턴은 그럴듯하다.
그래서 더 위험하다.
상상하지 말고
먼저 찾아보고 말해.
이게 RAG다.
거창한 약자 아니다.
Retrieval Augmented Generation = 생성하기 전에 조회하라.
한 줄 요약 끝.
내가 제일 먼저 한 건 이거다.
“파일이 실제로 존재하는지 확인하고 말해.”
어떻게?
아주 단순한 리눅스 명령어(find, grep)를 쥐여준다.
이 한 줄.
이거 안 하면 이런 일이 벌어진다.
AI: user_login.js 수정하겠습니다.
없는 파일이다. 그럼
- ai는 "어 없네? 어디갔지? 찾아볼까? 여기있나?" 이렇게 있을만한 곳을 찾기 시작한다.
그래서 이렇게 고정했다.
수정 전에
1. 관련 파일을 실제로 검색하고
2. 경로를 명시한 뒤 작업해.
이것만 해도
헛소리의 절반이 사라진다.
[적용 후]
AI: (잠시 멈춤) 시스템이 몰래 find ./src -name "*login*" 명령어를 때려봄.
AI: "아, 찾아보니 UserLogin.tsx가 있네요. 이걸 고치겠습니다."
이건 고급 기술 아니다.
그냥 “본 뒤에 말해”다.
맨 밑에 일단 간단한 프롬프트 하나 있으니, 나중에 복붙해서 넣으시라.
파일 하나만 보고 고치면
또 틀린다.
왜냐면 코드는 텍스트가 아니라
연결이기 때문이다.
login.ts
├──import AuthTypefrom'./types'
├──import dbfrom'./db'
하수 AI는 이렇게 움직인다.
login.ts만 열어보고 수정한다.
그리고 바로 이런 대사가 나온다.
“AuthType 정의가 어디 있나요?”
그럼 또 설명해줘야 한다.
또 시간 날린다.
또 빡친다
고치려는 파일이 import하는 파일도 같이 가져와라.
이 한 줄.
이게 진짜 RAG다.
키워드 검색은
파일 하나를 가져온다.
의존성 기반 검색은
연결된 파일까지 같이 가져온다.
"파일을 수정할 때는, 그 파일 상단에 import 된 파일들도 찾아서 내용을 먼저 읽고 계획을 세워라."
이 한 줄이 AI의 지능을 2배로 올려준다.
차이는 단순하다.
[눈치 없는 AI]
login.ts
파일만 덜렁 가져온다.코드를 고치려는데
AuthType
이 뭔지 모른다.에러를 낸다.
[눈치 챙긴 AI]
일단 login.ts를 찾는다.읽어보니 맨 위에 import { AuthType } from './types'라고 써있네?
"아, 주인이 말 안 했지만 types.ts도 필요하겠군."
types.ts도 알아서 챙겨온다.
이걸 기술적으로는 "의존성 그래프 탐색"이라고 하는데,
쉽게 말하면 "눈치껏 족보 찾기"다.
만약 여러분이 Cursor나 Claude를 쓴다면,
설정 파일(.cursorrules 같은 곳)에 이 한 줄만 추가해라.
이걸 안 하면
AI는 항상 반쪽짜리 컨텍스트로 수정한다.
그리고 반쪽짜리 수정은
언젠가 터진다.
이건 바로 써먹을 수 있다.
작업 전:1. 수정 대상 파일 검색2. 해당 파일이 import하는 내부 모듈 목록 정리3. 관련 파일을 함께 읽은 뒤 수정 시작
이 세 줄을 고정했다.
그 이후로
“이거 어디 정의돼 있나요?”
라는 질문이 거의 사라졌다.
요약하면 이거다.
AI가 구라치는 이유는 두 가지다.
파일을 안 보고 말해서
연결을 모르고 고쳐서
그래서 해결책도 두 줄이다.
먼저 조회해라
연결된 것까지 같이 가져와라
이게 내가 RAG를 붙인 이유다.
빡쳐서 만든 안전장치다.
연결된 파일을 다 가져오면
이번엔 AI 머리가 터진다.
파일 15개만 넘어가도
컨텍스트가 꽉 찬다.
이번엔 구라가 아니라
혼란이 생긴다.
그래서 다음 단계가 필요해졌다.
다 가져오되,
중요한 것만 남기는 기술.