AI 에이전트가 시간이 지남에 따라 오래되거나 잘못된 지침을 잊게 하는 방법 구현하기
요약
AI 에이전트가 오래되거나 잘못된 지침을 잊게 하는 세 가지 방법을 제시합니다. 단순히 삭제하는 대신, '닫기(Close)'를 통해 적용 중단 날짜와 대체 항목을 기록하고, '감쇠(Decay)'를 통해 사용되지 않은 정보의 검색 우선순위를 점진적으로 낮춥니다. 또한, 잘못된 지침은 명시적인 부정 표시로 하향 조정해야 합니다.
핵심 포인트
- 지침 삭제 대신 닫기/감쇠 메커니즘을 활용하여 정보를 관리합니다.
- 폐쇄(Closing)는 이전 버전의 기록을 보존하며, 대체 관계를 명확히 해야 합니다.
- 컨텍스트 디케이(Context decay)는 검색 우선순위를 낮추어 정보가 경쟁하는 것을 막습니다.
프로젝트를 시작한 지 1년이 되었는데, 한 에이전트의 메모리에는 더 이상 유효하지 않은 세 가지 지침이 남아 있습니다. npm으로 패키지를 설치하라고 되어 있고, 6월부터는 pnpm을 사용하라고도 되어 있습니다. 둘 다 여전히 존재하며, 어느 것이든 먼저 나올 수 있습니다. 봄에 수정된 라이브러리 버그에 대한 임시 해결책(workaround)이 있는데, 몇 달 동안 아무도 그것을 사용할 필요가 없었습니다. 실패하는 통합 테스트를 통과할 때까지 재시도하라고 되어 있는데, 에이전트가 마지막으로 그렇게 했을 때 재시도가 실제 회귀(regression)를 가리고 있었습니다. 이 모든 것은 작성된 날짜에 질문에 정확히 일치합니다.
간단한 답변은 다음과 같습니다. 오래되거나 잘못된 지침을 잊게 하는 것에는 세 가지 작업이 필요하며, '감쇠(decay)'는 그중 하나일 뿐입니다. 더 새로운 지침으로 대체될 때 지침을 닫고: 유지하되, 적용 중단 날짜와 무엇으로 대체되었는지 표시하고, 읽기 작업을 할 때 열려 있는 지침을 선호하도록 만듭니다. 오랫동안 사용되지 않고 확인되지 않은 지침은 감쇠시켜 시간이 지남에 따라 순위를 낮추어 전력을 다해 경쟁하는 것을 막습니다. 에이전트가 그 지침에 따라 행동하여 잘못된 정보를 제공했을 경우, 명시적인 부정 표시와 함께 해당 지침을 하향 조정합니다(push down). 이 세 가지 중 어느 것도 무언가를 삭제하지는 않습니다. 삭제는 비밀 정보, 요청에 따른 개인 데이터, 그리고 아무도 의존하지 않는 노이즈에만 적용됩니다.
스토어는 스스로 잊지 못하는 이유
벡터 스토어(vector store)는 임베딩 공간에서의 근접성으로 순위를 매기며, 나이, 폐기(deprecation), 대체는 그 공간의 차원이 아닙니다. 유사성은 나이나 상태가 없습니다. 작년의 관습은 오늘날의 질문과 마찬가지로 정확하게 일치하며, 코사인 거리(cosine distance)에 있는 어떤 것도 '폐기됨'이라고 말하지 않습니다. 스토어 자체는 고장나지 않았습니다. 그것은
컨텍스트 디케이션(Context decay)과 지침 폐쇄 메커니즘
컨텍스트 디케이(Context decay)는 특정 항목이 사용되거나 확인되지 않은 시간이 지나면 해당 항목의 검색 우선순위(recall priority)를 낮추어, 전력을 다해 경쟁하기보다는 순위에서 서서히 내려가게 만듭니다. 이는 저장소 자체를 변경하는 것이 아니라 순위만 변경합니다. 세 가지 작업 각각은 지침이 더 이상 우위를 점해서는 안 되는 서로 다른 이유에 답합니다:
| 작업 | 적용 시점 | 변화하는 것 | 해서는 안 되는 것 |
|---|---|---|---|
| 닫기 (Close) | 새로운 지침이 이를 대체할 때 | 폐쇄된 상태로 표시되며, 날짜와 후속 항목을 기록합니다. 읽기는 열린 항목을 선호합니다. | 이전 항목을 덮어쓰거나 삭제해서는 안 됩니다. |
| ... |
폐쇄 (Closing). 지침이 대체될 때는 이를 덮어쓰거나 삭제하지 마십시오. 폐쇄된 상태로 표시하고, 적용이 중단된 날짜를 기록하며, 후속 항목과 연결하십시오: "npm으로 설치, 2026-06까지 유효, pnpm에 의해 대체됨". 읽기는 열린 지침을 선호하지만, 폐쇄된 지침도 여전히 존재하며, 이는 생각보다 더 중요합니다. 에이전트가 왜 1월 분기에 package-lock.json 파일이 필요한지 물었다면, 답변하기 위해 1월의 지침이 필요합니다. 덮어쓰기는 역사를 다시 쓰는 것이고, 폐쇄는 버전을 기록하는 것입니다.
폐쇄는 무엇이 무엇을 대체했는지 알아야 하며, 이는 수정 시점에만 확실하게 알려집니다. 따라서 수정할 때는 나중에 두 개의 유사한 텍스트를 보고 추측하기보다는, 폐쇄하는 지침의 이름을 명시해야 합니다.
디케이 (Decay). 한 번도 검색되지 않고, 확인되지 않으며, 모순되지도 않는 지침들이 영원히 전력을 다해 경쟁해서는 안 됩니다. 사용자가 통제하는 저장소에 이를 구축하는 한 가지 방법은 각 항목에 마지막 사용일과 마지막 확인일을 기록하고, 둘 다 작성 시점에 설정하는 것입니다. 읽기 시점에는 필요한 것보다 더 많은 후보군을 가져와서, 두 날짜 중 더 늦은 날짜 이후 경과된 시간에 따라 수치가 줄어드는 계수(factor)를 각 검색 점수에 곱하고, 이 계수가 0보다 큰 최저선(floor)에서 멈추도록 합니다. 이렇게 하면 질문과 가깝게 일치하는 오래된 항목도 여전히 나올 수 있습니다. 디케이는 지우는 것이 아니라 격하시켜야 합니다. 조용히 삭제하는 디케이 방식은 데이터 손실과 구별할 수 없습니다.
푸시 다운(Pushing down). 어떤 지침은 오래된 것이 아니라, 그저 틀린 것일 뿐이며, 당신은 그것이 틀렸다는 것을 알고 행동해 보니 실패했기 때문입니다. 그러한 지침들은 명시적인 부정적 표시가 필요하며, 이 표시는 다음에 같은 질문이 발생했을 때 다른 대안들보다 낮은 순위로 매겨져야 합니다. 푸시 다운은 목표 지향적(targeted)입니다: 오도했던 항목에 직접 적용됩니다. 반면, 디케이(Decay)는 주변 환경적(ambient)입니다: 사용되지 않은 모든 것에 영향을 미칩니다.
삭제(Deleting). 하드 삭제(Hard deletion)는 좁고 실제적인 역할을 유지합니다. 테스트는 간단합니다: 만약 어떤 것도 그 항목에 의존하지 않았다면, 그것을 삭제하고; 만약 무언가라도 의존했다면, 대신 폐쇄(close)합니다.
일반 파일과 메모리 시스템으로 구현하기
일반 파일의 경우, 이 세 가지 모두 편집 습관이 됩니다: 각 항목에 상태 표시줄(active 또는 closed, replaced by ...)을 두는 것, 사람이 조용히 제거하는 대신 승인할 목록을 생성하는 주기적인 검토를 수행하는 것, 그리고 오래된 항목을 제자리에 다시 작성하지 않는 규칙입니다. 이것은 작동하며, 사람 한 명이 가비지 컬렉터 역할을 합니다.
메모리 시스템의 경우, 같은 세 가지가 찾아야 할 속성이 됩니다: 항목에 대한 상태 및 유효 기간(validity windows), 삭제 대신 순위를 낮추는 디케이(decay), 그리고 무엇이 오도했는지 표시하기 위한 피드백 채널입니다.
코드에서 지침 폐쇄하기
코드는 Mnemoverse의 Python SDK인 mnemoverse 0.4.0을 PyPI에서 사용하며, Python SDK 페이지에 설정되어 있습니다. 예제는 작성 시(on the write)와 읽기 시(on the read)의 폐쇄 방식, 그리고 에이전트가 행동한 후의 평점 부여를 다룹니다. 에이전트 자체의 로직은 생략되었습니다.
from mnemoverse import MnemoClient
client = MnemoClient() # MNEMOVERSE_API_KEY 읽기
...
6월 기록은 supersedes에서 1월 기록을 언급하며, API 참조는 그곳에 이름이 붙은 기록에 무슨 일이 일어나는지 설명합니다: "대상 기록은 삭제되지 않고, 새로운 원자(atom)를 가리키는 superseded_by 포인터를 얻으며 ID로 계속 가져올 수 있습니다". 교체된 기록을 일반 읽기에서 숨기는 것은 조직 설정이며, 콘솔의 설정 섹션에 있는 "교체된 메모리 숨기기(Hide replaced memories)"입니다. 이 기능은 기본적으로 꺼져 있으므로, 읽기 작업은 1월과 6월 지침을 나란히 반환할 수 있습니다. 이런 경우 참조는 확인할 필드를 언급합니다: "필터링이 비활성화된 상태에서, 이 필드는 교체된 개정본(revision)과 활성 기록을 구별하는 방법입니다". 이것이 코드가 superseded_by 자체로 필터링하는 이유이며, 이는 설정의 켜짐/꺼짐 여부와 관계없이 동일한 결과를 제공합니다. 이 기능이 켜져 있으면 일반 읽기에서는 현재 기록만 반환하고, include_history=True는 읽기 기록에서 설명하듯이 교체된 기록도 동일한 순위로 다시 포함할 수 있게 합니다.
평점(Ratings)은 다음에 무엇이 반환될지 재순위화합니다. 개요는 그 한계를 명시합니다: 피드백은 "다음 읽기의 순서를 변경할 뿐, 저장된 텍스트를 변경하지 않습니다". 두 개의 stored 확인(checks)은 쓰기 게이트에 있습니다: 동일 도메인의 가장 가까운 메모리와 너무 유사한 쓰기는 저장되지 않으며, 거부된 쓰기는 supersedes로 전달할 ID를 반환하지 않습니다.
제어 그룹으로 확인해 보기
- 지침을 작성한 후, 이를 대체한다고 명시하는 수정 사항(correction)을 작성합니다. 에이전트에게 작업을 어떻게 수행할지 물어봅니다. 이때 에이전트는 원래의 지침이 아닌 수정 사항에 따라야 합니다.
- 오래된 지침, 예를 들어 January lockfile과 같이 발생했던 일에 대해 설명해 달라고 요청합니다. 에이전트는 닫힌(closed) 지침을 찾아내고 이것이 대체되었다고 말해야 하며, 이는 기록을 삭제했을 경우 손실되었을 역사가 보존되었음을 보여줍니다.
- 제어: 한 번도 대체되지 않은 지침, 예를 들어 테스트를 실행하는 방법에 대해 질문합니다. 이때 에이전트는 현재(current) 상태여야 합니다. 만약 '대체됨'으로 표시되거나 npm 관련 지침이 표시되지 않는다면, 닫기 기능은 작동하지 않는 것이고 첫 번째 답변은 아무것도 증명하지 못합니다.
library page에는 에이전트에게 지침을 맡기기 전에 메모리 시스템에서 무엇을 찾아야 하는지에 대한 내용이 포함된 더 긴 버전이 있습니다. 당신의 에이전트는 어떤 폐기된(retired) 지침을 여전히 따르고 있나요?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기