본문 바로가기

grep 넘은 AI 코딩 하니스, 컨텍스트가 승부

반응형

⚡ 한 줄 요약:
AI 코딩 도구의 실력은 모델 크기가 아니라 하니스(harness) — 즉 모델에 무엇을 어떻게 물려주느냐로 갈린다.
단순 grep 키워드 검색을 넘어 의존성·심볼·의미 기반 컨텍스트를 조립해 넣는 쪽이 정확도에서 앞선다.
온라인코딩파티처럼 손으로 짜던 시대에서,
이제는 "컨텍스트 엔지니어링"이 개발 생산성의 새 축이다.

 

 

📑 목차

 

 

🧩 무슨 일인지

Ars Technica가 AI 코딩 스타트업 Augment Code의 엔지니어링 리더 Vinay Perneti를 인터뷰했다.
핵심 주장은 한 문장으로 요약된다.
"좋은 코딩 AI는 좋은 모델이 아니라 좋은 하니스에서 나온다."

여기서 하니스(harness)란 LLM 자체가 아니라 모델을 감싸는 골격 — 코드베이스에서 관련 파일을 찾아오고(retrieval), 도구(테스트 실행·파일 편집)를 붙이고, 그 결과를 다시 모델에 물려주는 오케스트레이션 계층이다.
인터뷰 제목의 "Beyond grep(그렙을 넘어)"이 정확히 이 지점을 찌른다.
초기 AI 코딩 도구는 사용자의 질문에서 키워드를 뽑아 grep으로 소스를 훑고, 매칭된 줄을 그대로 프롬프트에 밀어 넣었다.
빠르지만 멍청하다.
변수명이 조금만 달라도, 호출 관계가 파일을 건너뛰어도 놓친다.

 

 

🔍 배경 — grep의 한계와 "컨텍스트 엔지니어링"

grep문자열 일치만 안다.
예를 들어 "결제 실패 시 재시도 로직을 고쳐줘"라고 하면, 실제로 필요한 건 retry라는 단어가 든 파일이 아니라 PaymentClientHttpRetryPolicy → 설정값으로 이어지는 호출·의존 그래프다.
문자열 검색은 이 연결을 보지 못한다.

context-rich 하니스는 여기서 세 가지를 더 한다.

  • 의미 기반 검색(semantic retrieval): 코드 조각을 임베딩해 "의미가 가까운" 부분을 찾는다. 단어가 달라도 잡힌다.
  • 구조 인덱스: 심볼 정의·참조, import 그래프, 콜 그래프를 미리 색인해 "이 함수를 누가 부르나"를 즉시 답한다.
  • 컨텍스트 예산 관리: 토큰은 유한하다. 관련도가 높은 순으로 잘라 넣어 노이즈를 줄인다.

즉 모델을 키우는 대신, 모델에게 물려줄 재료의 질을 높이는 접근이다.
최근 업계 용어로는 이걸 컨텍스트 엔지니어링(context engineering)이라 부른다.

 

 

💡 개발자에게 주는 의미

첫째, 모델 벤치마크 점수가 곧 도구 실력은 아니다. 같은 기반 모델을 써도 하니스 설계에 따라 실사용 정확도가 크게 갈린다.
도구를 고를 때 "어떤 모델이냐"보다 "코드베이스를 어떻게 이해하느냐(색인·검색 방식)"를 물어야 한다.

둘째, 대형 코드베이스일수록 격차가 벌어진다. 파일 수천 개짜리 모노레포에서 grep 기반은 금세 무너지지만, 색인형 하니스는 관련 맥락만 추려 넣어 버틴다.

셋째, 이건 남의 이야기가 아니다.
사내 개발 어시스턴트나 RAG 파이프라인을 직접 만든다면 "검색 품질 = 답변 품질" 이 그대로 적용된다.

 

 

🛠️ 실무 적용 — grep + 의미검색 하이브리드

핵심은 "grep을 버리는" 게 아니라 grep으로 후보를 넓게 잡고, 의미·구조로 다시 정렬하는 하이브리드다.
학습용 최소 골격을 보자.
실서비스라면 임베딩 검색은 FAISS·pgvector 등 벡터DB로, grep은 ripgrep으로 대체하는 게 정석이다.

# 학습용 골격: 실서비스는 grep→ripgrep, 유사도→FAISS/pgvector 권장
# 의존: anthropic>=0.40 (Claude API), 임베딩은 예시상 외부 함수로 가정
import subprocess, numpy as np
from anthropic import Anthropic

def keyword_candidates(query, root="."):
    # 1단계: ripgrep으로 후보 파일을 넓게 수집 (빠른 1차 필터)
    hits = subprocess.run(
        ["rg", "-l", "-i", query, root],
        capture_output=True, text=True
    ).stdout.splitlines()
    return hits

def rerank(query_vec, chunks, chunk_vecs, k=5):
    # 2단계: 코사인 유사도로 의미 재정렬 → 상위 k개만
    q = query_vec / (np.linalg.norm(query_vec) + 1e-9)
    M = chunk_vecs / (np.linalg.norm(chunk_vecs, axis=1, keepdims=True) + 1e-9)
    scores = M @ q
    top = np.argsort(scores)[::-1][:k]
    return [chunks[i] for i in top]

def ask(query, context_chunks):
    # 3단계: 추려낸 컨텍스트만 모델에 물려준다 (토큰 예산 관리)
    ctx = "\n\n---\n\n".join(context_chunks)
    client = Anthropic()
    msg = client.messages.create(
        model="claude-opus-4-8",   # 최신 모델 ID는 공식 문서 확인 권장
        max_tokens=1024,
        messages=[{
            "role": "user",
            "content": f"다음 코드 맥락을 참고해 답하라.\n\n{ctx}\n\n질문: {query}"
        }],
    )
    return msg.content[0].text

포인트는 k다.
너무 크면 노이즈로 정확도가 떨어지고, 너무 작으면 핵심을 놓친다.
실무에선 5~10에서 시작해 응답 품질을 보며 조정한다.
grep재현율(넓게 긁기), 의미 재정렬은 정밀도(추리기) 를 담당한다고 보면 된다.

 

 

✅ 체크포인트

  • 도구 평가 기준을 바꿔라: "어떤 모델?"이 아니라 "코드베이스 색인·검색을 어떻게 하나?"를 먼저 물어라.
  • 직접 만든다면 하이브리드: grep으로 후보를 넓히고, 임베딩·구조로 재정렬. 검색 품질이 답변 품질을 결정한다.
  • 컨텍스트는 유한 자원: 많이 넣지 말고 관련도 순으로 넣어라. top-k와 청킹 단위가 정확도를 좌우한다.

 

 

📚 참고(출처)

🔗 함께 보면 좋은 글

 

 

📊 오늘의 개발 트렌드 (자동 집계)

GitHub·Hacker News·Hugging Face·App Store·Cloudflare Radar에서 매일 자동으로 모은 개발 트렌드입니다. (2026-07-21 06:11 기준)

🐙 GitHub 급상승

📰 Hacker News 화제

🤗 Hugging Face 트렌딩 모델

💰 App Store 매출 TOP (한국)

  • YouTube — Google
  • ChatGPT — OpenAI OpCo, LLC
  • 네이버 웹툰 - Naver Webtoon — NAVER WEBTOON Ltd.

🌐 가장 많이 방문되는 웹 (Cloudflare Radar)

반응형