실용주의 AI 에이전트 활용

참고

컨텍스트 엔지니어링?

“원하는 결과를 가장 잘 생성할 수 있는 컨텍스트 구성은 무엇인가?”

더 적은 비용(토큰)으로 일관된 결과물의 품질을 유지(컨텍스트 오염 방지)하기 위한 전략들의 집합을 컨텍스트 엔지니어링이라고 할 수 있겠다.

간단하게 말하자면 “제한된 컨텍스트 윈도우를 효율적으로 활용” 하는 전략 집합.

에이전트 루프가 실행되면서 자연스럽게 컨텍스트가 방대해지기 마련인데, 컨텍스트 윈도우는 제한되어 있다. 따라서 컨텍스트들 중에서 최소한의 고성능 컨텍스트들만 선별적으로 저장하고, 불필요한 컨텍스트는 버림으로써 루프(턴)이 계속되더라도 컨텍스트 오염을 최소화 하여 일관된 품질의 결과물을 얻을 수 있도록 해야한다.

실용주의적 전략들

  • 프롬프트 엔지니어링을 통해 더 나은 품질의 결과물을 얻는 방법
  • 컨텍스트 엔지니어링을 통해 적은 비용으로 일관적인 품질의 컨텍스트를 유지하는 방법

을 조합하여 에이전트를 더 효과적으로 활용하도록 하자.

시스템 프롬프팅

세션 전반에 적용될 가장 중요한 지시사항.

  • 매우 명확해야 한다.
  • 에이전트에 적절한 수준으로 아이디어를 제시할 수 있는 간단하고 직접적인 언어를 사용해야한다.
  • 예상되는 동작을 완전히 설명하는 최소한의 정보 세트를 전달해야 한다.
  • 에이전트가 원하는 동작을 준수하도록 충분한 정보를 초기에 제공해야 한다.

예시를 보면 Role을 정의함 시스템 프롬프트를 작성해달라고 요청할 때 위 예시를 전달하면 효과적이지 않을까?

생각보다 ‘간단’하지는 않은 것 같음. 연습이 필요할 듯.

Just-In-Time

필요한 시점에 필요한 정보만 사용

  • 클로드는 JIT를 잘 활용한다. 프롬프트상의 파일 경로와 링크를 보고 그걸 가져오는 식.
  • 좋은 컨텍스트를 JIT으로 불러오려면 처음부터 좋은 구조로 정보를 저장해야 한다. 여기에는 인출에 도움이 되는 메타데이터를 어떻게 저장해둘 것인가에 대한 고민도 포함된다.
  • 폴더 구조, 네이밍 컨벤션, 타임스탬프를 비롯해 사람에게 중요하고 유의미한 시그널이 에이전트에게도 정보 활용에 큰 도움을 준다.

스텝/태스크을 잘게 나누고, 각 턴 별로 해당 스텝에 대한 내용만 전달하도록 하는 구조를 만들자.

압축

컨텍스트 윈도우 제한에 가까워지면 중요한 컨텐츠를 요약해서 새 윈도우에 넘기는 것.

  • 클로드 코드에서는 메시지 히스토리를 넘겨 요약하게 한다. 아키텍처 의사결정, 해결 안 된 버그, 구현 디테일 등.
  • 압축의 묘는 결국 뭘 남기고 뭘 버릴 것인가에 있다.
  • 광범위한 양방향 소통이 필요한 작업에서 대화 흐름을 유지하는데 좋다.

구조화된 노트테이킹

컨텍스트를 외부에 메타데이터화

  • 에이전틱 메모리라고도 부른다. 정기적으로 컨텍스트 윈도우 바깥(즉 파일 시스템)에 노트를 남겼다가 나중에 가져오는 기법이다.
  • 이전에도 가능했지만 Sonnet 4.5부터 메모리 툴로 이걸 하기가 더 수월해졌다.
  • 폴더구조, 네이밍 컨벤션, 타임스탬프를 비롯한 좋은 구조로 저장?
  • 명확한 이정표가 있는 작업을 이터레이션을 돌며 개발하기에 좋다.