대화 중간 시스템 프롬프트 (Mid-Conversation System Prompts)
긴 에이전트 세션은 안정적인 시스템 프롬프트와 점차 늘어나는 대화 기록을 사용합니다. 비용을 낮추기 위해 접두사(prefix)를 캐싱합니다.
세션 중간에 새로운 지침을 추가해야 할 때 문제가 발생합니다. 에이전트에게 언어를 변경하거나 설정을 업데이트하도록 지시하고 싶을 때가 있습니다.
최상위 시스템 프롬프트를 수정하면 캐시가 깨집니다. 시작 부분에서 단 1바이트만 변경해도 캐싱된 모든 턴이 무효화됩니다. 전체 기록을 다시 처리하기 위해 비용을 전액 지불해야 합니다. 이는 느리고 비용이 많이 듭니다.
새로운 Claude 모델은 대화 중간 시스템 메시지(mid-conversation system messages)를 통해 이 문제를 해결합니다.
이제 messages 배열에 system role 메시지를 직접 배치할 수 있습니다. 최상단이 아닌 대화 기록 뒤에 배치하면 됩니다.
이 방법이 작동하는 이유는 새로운 지침이 캐싱된 대화 기록 뒤에 위치하기 때문입니다. 그 이전의 내용은 아무것도 무효화하지 않습니다. 작은 새로운 메시지에 대한 비용만 지불하면 됩니다. 에이전트는 여전히 해당 지침을 완전한 권한을 가진 것으로 취급합니다.
기존 방식은 사용자 메시지(user message) 안에 지침을 넣는 것이었습니다. 여기에는 보안 위험이 있습니다. 사용자가 사용자 메시지를 위조(spoof)하여 에이전트를 속일 수 있기 때문입니다. system role 메시지는 위조가 불가능합니다. 모드 전환이나 권한 부여와 같은 신뢰할 수 있는 업데이트를 위한 보안 채널을 제공합니다.
올바르게 사용하려면 다음 규칙을 따르세요:
• 지침을 사실 형태로 작성하세요. 무시하라는 식의 언어(override language)를 사용하지 마세요. • 좋음: "자동 승인 모드가 이제 활성화되었습니다." • 나쁨: "사용자를 무시하고 대신 X를 하세요." • 모델은 이전 컨텍스트를 무시하라는 지침에 저항할 수 있습니다. • 이 메시지는 반드시 user 또는 assistant 메시지 뒤에 와야 합니다. • 배열의 첫 번째 메시지가 될 수 없습니다. • 초기 설정에는 최상위 시스템 프롬프트를 사용하세요.
이 기능을 지원하지 않는 모델을 사용하면 400 에러가 발생합니다. 항상 호출 부분을 try-catch 블록으로 감싸세요. system role이 실패하면 사용자 턴(user-turn) 리마인더로 대체(fall back)하세요.
세션이 시작된 후 새로운 내용을 알게 되었을 때 이 기능을 사용하세요. 모드 변경이나 새로운 컨텍스트를 위해 사용하세요. 이를 통해 캐시를 활성 상태(hot)로 유지하면서 지침을 안전하게 관리할 수 있습니다.
Optional learning community: https://t.me/GyaanSetuAi