Log in to leave a comment
No posts yet
커서(Cursor)나 데빈(Devin) 같은 도구는 편리합니다. 하지만 내부에서 정확히 어떤 일이 벌어지는지 알기 어렵고, 가끔은 내가 원하지 않는 방식으로 코드를 난도질하기도 합니다. 백엔드 개발자라면 파이썬 표준 라이브러리와 LLM API를 조합해 본인에게 최적화된 에이전트를 직접 만드는 것이 훨씬 경제적이고 확실합니다.
에이전트가 단순히 코드만 짜는 단계를 넘어 터미널 명령어를 직접 실행하게 만들려면 subprocess 모듈을 정교하게 다뤄야 합니다. 무턱대고 shell=True 옵션을 쓰면 쉘 인젝션 공격에 노출되거나 타임아웃 상황에서 프로세스가 죽지 않고 좀비처럼 남는 문제가 생깁니다.
직접 구현할 때는 subprocess.run() 호출 시 shell=False를 설정하고 명령어를 리스트 형태로 전달하십시오. 타임아웃은 30초 정도로 짧게 잡고, TimeoutExpired 예외가 발생하면 즉시 process.kill()을 호출해 자원을 회수해야 합니다. 모델에게 실행 결과를 전달할 때도 전체 내용을 다 보낼 필요는 없습니다. 텍스트가 1,000자를 넘어가면 마지막 20줄 위주로 잘라서 반환하십시오. 토큰 낭비를 막으면서도 모델이 에러 원인을 파악하기에는 충분한 정보입니다.
대화가 길어질수록 컨텍스트 윈도우에 쌓이는 데이터는 곧 비용 폭탄으로 돌아옵니다. Anthropic의 발표에 따르면 Claude 3.5 모델에서 cache_control 마커를 활용할 경우 캐시된 데이터를 읽는 비용을 최대 90%까지 아낄 수 있습니다. 100만 토큰당 0.30달러 수준입니다.
비용을 줄이려면 시스템 메시지와 사용자 입력을 엄격하게 분리하십시오. 프로젝트 전체 파일 트리 구조처럼 변하지 않는 정보는 시스템 프롬프트 상단에 고정하고 캐시 지점으로 설정합니다. 대화 기록이 쌓여 토큰이 넘칠 때는 tiktoken으로 양을 계산한 뒤, 오래된 메시지들을 별도의 LLM 호출로 요약하는 계층적 요약 방식을 쓰면 좋습니다. 이렇게 요약된 컨텍스트만 상단에 유지하고 최신 메시지를 덧붙이는 슬라이딩 윈도우를 적용하면, 긴 개발 세션에서도 비용을 기존 대비 40% 이상 줄이면서 모델의 추론 정확도를 방어할 수 있습니다.
에이전트에게 파일 전체를 다시 출력하게 만드는 방식은 무식하고 느립니다. 출력 토큰이 많아질수록 모델이 중간 코드를 생략하거나 헛소리를 할 확률도 높아집니다. 소위 "에딧 트릭(Edit Trick)"이라 부르는 방식은 수정이 필요한 부분의 앞뒤 텍스트(Anchor)만 찾아서 바꾸게 유도합니다. 이 기법은 실제 데이터에서 출력 토큰 양을 최대 86%까지 줄이는 효과가 있습니다.
파이썬의 re.sub()를 활용해 특정 XML 태그나 정규표현식으로 넘어온 수정 사항만 로컬 파일에 적용하는 기능을 만드십시오. 또한 모든 기술 문서를 프롬프트에 넣는 대신 LanceDB 같은 가벼운 벡터 DB를 붙여서 꼭 필요한 문서 조각만 가져오게 설계해야 합니다. 이 구조를 갖추면 파일 수정 속도가 체감상 79% 이상 빨라지며, 대형 파일 작업 시 모델이 갈팡질팡하는 고질적인 문제를 해결할 수 있습니다.
사람이 일일이 디버깅 메시지를 복사해서 모델에게 붙여넣는 수고를 멈춰야 합니다. 에이전트가 코드를 작성하기 전에 pytest 기반의 테스트 코드를 먼저 짜게 만드십시오.
테스트가 실패하면 발생하는 Traceback 전문을 가공 없이 모델에게 다시 던져서 스스로 고치게 하는 피드백 루프를 구축하면 됩니다. 다만 rm이나 deploy 같은 위험한 명령어는 파이썬의 input() 함수를 사용해 사용자의 승인을 거치는 가드레일을 반드시 삽입해야 합니다. 이 순환 구조가 완성되면 개발자는 그저 에이전트가 올린 git diff 요약만 확인하고 커밋 버튼만 누르면 됩니다.
결국 에이전트 구축의 핵심은 화려한 프레임워크가 아니라 터미널과 LLM 사이에서 데이터를 얼마나 정교하게 정제하고 캐싱하느냐에 있습니다. 직접 짠 600줄의 파이썬 코드가 수만 줄짜리 블랙박스 도구보다 당신의 의도를 더 잘 반영할 것입니다.