TL;DR
이 글은 모델이 직접 파일 경로나 라인 범위를 생성하는 전통적 워크플로의 근본적 약점을 지적하고, 이를 해결하기 위해 파서를 통해 심볼별 정확한 소스 슬라이스를 확보한 뒤 사실을 해시 ID로 저장하는 마이닝 패스와 모델에는 불투명 마커만 보이게 하는 작성 패스로 파이프라인을 분리한 방식을 제안한다. 마이닝 패스에서는 Tree-sitter로 얻은 소스 조각을 입력으로 모델을 호출해 2~5개의 검증 가능한 한 문장 사실을 생성하고, 각 사실은 경로·심볼·종류·정규화 텍스트를 해시해 ID로 보존함으로써 코드 이동 시 모델 호출 없이 사실을 재연결할 수 있다. 작성 패스에서는 모델 출력에 남긴 마커를 사실 저장소의 검증된 path:start-end로 치환해 최종 문서에 노출되는 위치 정보가 외부 검증값뿐이게 만들며, 이 설계는 RAG의 출처 인용이나 데이터베이스 요약의 행 식별자, 전사 타임스탬프 같은 다른 참조형 출력에도 적용 가능하다. 예상치 못한 문제로 모델이 임의 마커를 발명하는 현상이 관찰되어 하니스에서 기대 포맷만 허용하고 그 외 마커를 제거하는 검증 로직이 필요하며, 이 패턴은 검증 가능한 참조를 모델 출력에서 분리해 안정성을 높이는 실무적 해법이다.
커뮤니티 반응
커뮤니티 반응은 전반적으로 실무적이고 긍정적이었다. 많은 참여자가 모델이 위치를 생성하는 실패 모드를 근본적으로 제거하는 접근을 실무에서 적용해본 경험을 공유했고, 일부는 모델이 임의 마커를 발명하는 문제와 이를 검증·필터링하는 하니스 로직의 중요성을 지적했다. 일부 토론자는 이 패턴이 문서화 외에도 RAG의 소스 인용, 데이터베이스 요약의 행 식별자, 전사 타임스탬프 등 다양한 참조형 출력에 적용될 수 있다고 확장 가능성을 언급했다.
주요 논점
모델이 직접 위치 식별자를 생성하지 못하게 하고 외부에서 검증된 식별자를 주입하면 잘못된 인용이 사용자에게 전달되는 것을 구조적으로 차단할 수 있다.
마커 기반 치환을 도입하면 모델 출력과 검증 가능한 메타데이터를 엄격히 분리할 수 있으나, 모델이 생성한 임의 마커를 필터링하는 추가 로직이 필요하다.
사실 ID를 텍스트 기반 해시로 생성하면 코드 이동시에 재검증 비용을 크게 줄여 자주 발생하는 리런 비용을 분산시킬 수 있다.
합의점 vs 논쟁점
합의점
- 모델이 직접 라인 번호나 위치 식별자를 생성하면 검증으로 오류를 탐지해도 의도 복원이 불가능해 위험하다는 점에 대부분이 동의했다.
- 파서 기반의 정확한 소스 슬라이스 확보와 모델 출력의 위치 정보 분리는 실무적 안정성을 크게 높인다는 점에 공감대가 형성되었다.
논쟁점
- 모델이 생성하는 임의 마커를 어떻게 안전하게 필터링하고 실패 케이스에서 사용자에게 어떤 형태로 피드백할지에 관해서는 의견이 갈렸다.
- 사실 ID의 설계(예: 해시 입력에 포함할 요소, 정규화 방식, 충돌 처리 정책)를 중앙화할지 분산할지에 대한 운영적 선택에서 분열이 있었다.
실용적 조언
- 모델이 위치 식별자를 직접 생성하지 못하게 설계하라. 입력으로는 파서가 제공한 정확한 소스 슬라이스만 주고 모델 출력에는 불투명한 마커만 남긴 뒤, 별도의 해시 기반 사실 저장소에서 마커를 검증된 path:start-end로 치환하면 모델이 잘못된 라인 수를 생성하는 실패 모드를 애초에 제거할 수 있다. 이 방식은 최종 문서에 노출되는 위치 정보가 항상 외부 검증을 거친 값이 되도록 한다.
- 사실 ID는 파일 경로와 심볼 이름, 심볼 종류, 정규화된 사실 텍스트를 결합해 해시로 생성하라. 이렇게 하면 코드 포맷팅 변경이나 위쪽에 코드가 삽입되는 등 위치 이동이 발생해도 동일한 사실은 동일한 ID를 유지하므로 많은 경우에 모델 호출 없이 사실을 재연결할 수 있다. 운영상으로는 커밋 단위로 심볼 diff를 계산해 이동된 심볼을 자동으로 리앵커링하면 전체 재실행 비용을 크게 줄일 수 있다.
- 모델이 생성한 마커와 하니스가 기대하는 ID 포맷을 엄격히 검증하라. 모델은 사람이 읽기 쉬운 라벨을 발명하려는 경향이 있으므로 하니스는 오직 자체 포맷과 일치하는 마커만 치환하고 그 외 마커는 제거하거나 매핑 실패로 기록해 배포 버그를 예방해야 한다. 또한 내부 위키 링크·행 식별자·타임스탬프 등도 동일한 치환 규칙을 적용해 모델이 직접 생성하지 못하도록 통제하는 것이 안전하다.
섹션별 상세
[[f:a3f9c1]] Retries the request once when the response fails schema validation. (src/client.ts, function chatJson)이 코드는 출력 문장 끝에 삽입된 불투명한 사실 마커의 예시로, 이후 파이프라인이 해당 마커를 실제 파일:시작-끝 범위로 치환하는 용도로 사용된다.
용어 해설
- Tree-sitter
- — Tree-sitter는 소스코드를 파싱해 추상 구문 트리와 각 토큰의 정확한 소스 슬라이스 및 라인 범위를 반환하는 라이브러리이다. 이 게시물 맥락에서는 각 심볼(함수·변수·클래스)의 정확한 시작·끝 위치를 파싱 단계에서 확보해 모델 출력과 분리된 검증 가능 참조로 사용하기 위해 도입되었다. 파싱 결과를 이용하면 모델이 위치를 잘못 생성하더라도 올바른 파일·범위를 외부에서 주입할 수 있다.
- Fact ID
- — 사실 ID는 경로(path)와 심볼 이름, 심볼 종류, 정규화한 사실 텍스트를 해시해 생성한 불변 식별자이다. 이 식별자는 물리적 위치가 아니라 사실 내용과 코드 요소의 결합으로 동일한 사실을 코드 이동시에도 동일하게 식별할 수 있게 한다. 덕분에 코드 포맷팅이나 위로 삽입되는 변경이 있어도 사실의 재연결(리앵커링)이 가능해진다.
- Citation Substitution
- — 인용 대체는 모델이 직접 파일 경로나 라인 범위를 생성하지 못하게 하고 모델 출력의 토큰 자리표시자를 외부 해시 또는 범위로 대체하는 설계 패턴이다. 모델은 불투명한 마커를 문장 끝에 남기고, 파이프라인은 이후에 해당 마커를 검증된 경로:시작-끝으로 치환한다. 이 방식은 모델이 잘못된 위치를 생성하는 실패 모드를 근본적으로 제거한다.
- Mining Pass
- — 마이닝 패스는 파싱기로 얻은 각 심볼의 소스 슬라이스를 대상으로 모델을 한 번 호출해 2~5개의 검증 가능한 한 문장 사실을 추출하는 단계이다. 입력은 심볼의 실제 코드 슬라이스이고 출력은 정규화된 사실 텍스트이며, 각 사실은 해시 기반 ID와 연계되어 사실 저장소에 기록된다. 이 단계는 위치 정보가 아닌 사실 자체를 고정하는 역할을 하며 이후 쓰기 단계의 근거가 된다.
언급된 도구
소스코드 파싱으로 심볼과 정확한 소스 슬라이스 및 라인 범위를 추출하는 용도
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.