OpenWiki에서 스스로 고쳐지는 메모리 만들기
TMThttps://www.langchain.com/blog/self-correcting-memory-openwiki
메모리가 잊지 못한다는 문제
메모리 시스템의 수준은 결국 무엇을 잊을 수 있느냐로 결정됩니다.
에이전트 메모리를 두고 나누는 이야기는 대부분 기억을 만들어 두고 나중에 다시 찾아내는 데 쏠려 있습니다. 그런데 장기 메모리에는 자주 간과되는 또 하나의 흥미로운 문제가 있습니다. 기준이 되는 원천(source of truth)이 바뀌면 한때 맞았던 사실도 낡아 버리는데, 메모리 시스템에는 그 변화를 확실하게 알아차릴 방법이 없습니다. 시간이 지나면 이런 일이 쌓여 메모리 드리프트나 메모리 오염 같은 현상으로 시스템이 서서히 망가집니다.
OpenWiki처럼 계속 바뀌는 코드가 원천인 메모리 시스템에서는 이 문제가 특히 두드러집니다. 처음에는 위키가 API 동작이나 존재하는 여러 기능을 정확히 설명하겠지만, 코드가 바뀌면 그 동작과 기능도 함께 바뀔 수 있습니다. 그에 대해 문서로 적어 둔 지식이 코드와 계속 맞춰지지 않으면 위키의 그 부분은 낡은 정보가 됩니다.
OpenWiki가 잊고 스스로 고칠 수 있게 하려면, 위키가 무엇을 사실로 믿는지만이 아니라 그렇게 믿는 근거까지 함께 남겨 둘 방법이 필요했습니다. 그러면 어떤 주장을 받치던 근거가 바뀐 시점을 알아차리고, 위키에서 다시 살펴봐야 할 부분을 짚어 낼 수 있습니다.
위키가 믿는 내용에 근거를 붙이기
첫 단계는 OpenWiki가 내놓는 핵심적인 사실 주장(claim)을 지워지지 않는 기록으로 남기는 것이었습니다. 즉 에이전트가 위키 문서를 쓸 때, 그 문서에 담긴 주장과 그것을 받치는 코드상의 근거까지 함께 찾아내야 합니다.
예를 들어 실패한 작업을 기본값으로 세 번까지 다시 시도한다고 위키에 적혀 있다면, OpenWiki는 그 주장을 근거가 되는 코드와 함께 기록합니다.
{
"statement": "Failed tasks are retried three times by default.",
"evidence": [
"repo://src/scheduler.ts#L393-L404"
]
}그다음 런타임이 근거의 버전을 기록해 두어, 나중에 그 주장을 다시 검증할 수 있게 합니다. 이렇게 하면 위키의 주장 하나하나가 그것을 받치는 코드와 연결됩니다. 위키를 그저 글 뭉치로 다루는 대신, OpenWiki는 개별 주장과 그 주장이 의지하는 근거를 따라갈 수 있습니다.
지식이 낡는 시점을 알아내기
주장이 근거와 연결되면, OpenWiki는 애초에 그 주장을 받쳤던 원본의 버전과 지금 존재하는 버전을 견줘 근거가 바뀐 것을 알아냅니다. 둘이 다르면 그 주장은 낡았다고 표시됩니다.
낡았다고 표시된 주장이 반드시 틀렸다는 뜻은 아닙니다. 원본을 다시 확인하지 않고서는 그 주장이 여전히 참이라고 마음 놓고 가정할 수 없다는 뜻입니다. 코드가 바뀌어도 그에 딸린 주장이 곧바로 무효가 되는 경우는 많지 않지만, 다시 따져 볼 이유는 생깁니다.
이를 위해 OpenWiki가 상태 플래그를 따로 저장해 둘 필요는 없습니다. 저장된 근거 버전만으로도 업데이트마다 그 주장이 아직 최신인지 다시 검증할 수 있어서, 근거를 다시 확인할 때까지 불확실한 상태가 그대로 남습니다.
낡은 주장을 고치기
낡은 지식을 찾아내는 일은 시스템이 그것을 고칠 방법을 갖추고 있을 때만 의미가 있습니다.
OpenWiki가 어떤 주장을 낡았다고 판정하면, 지금의 근거를 들여다보고 그 주장이 참인지 거짓인지 판단할 수 있습니다. 여전히 참이면 근거 버전만 새로 갱신합니다. 이제 거짓이라면 위키 본문과 그것을 받치는 근거를 함께 고칩니다.
여기서 중요한 동작은, 검증이 실제로 이뤄지기 전까지 낡은 주장은 계속 낡은 상태로 남는다는 점입니다. 이것이 시간이 지나면서 스스로를 고치는 피드백 고리를 만듭니다. 원본이 바뀌면 그전까지 믿어 온 주장이 낡은 상태가 되고, 각 주장을 다시 검증할 때까지 그 불확실함이 유지됩니다. 그리고 위키를 업데이트하면 문서가 지금의 사실과 다시 맞아떨어집니다.
이는 위키를 처음부터 다시 생성하는 것과는 다릅니다. OpenWiki는 이미 알고 있는 내용을 그대로 남겨 두고, 어떤 주장이 낡았는지 추적하며, 원본이 계속 바뀌는 동안 그 주장들을 고쳐 나갑니다.
주장을 OKF v0.2와 잇기
주장 기록은 각 문서가 무엇을 사실로 믿는지, 그리고 그것을 받치는 근거의 버전이 무엇인지를 OpenWiki 내부에 남겨 줍니다. 그리고 Open Knowledge Format(OKF) v0.2는 문서 단위의 결과물을 OpenWiki 밖으로 옮기고 들여다볼 수 있게 만듭니다.
OpenWiki는 주장의 근거를 각 문서의 OKF sources 메타데이터로 투영하고, 문서 본문을 마지막으로 바꾼 생성 주체를 generated에 기록하며, verified는 그 문서의 주장 전체를 맞춰 보고 다시 확인해 저장한 뒤에만 붙입니다. 위키의 루트 인덱스는 okf_version: "0.2"를 선언해, OKF를 읽는 다른 도구가 이 마크다운 파일 묶음을 알아볼 수 있게 합니다.
이렇게 하면 역할이 유용하게 나뉩니다. 주장 기록은 개별 믿음이 여전히 믿을 만한지를 판정합니다. OKF는 그 주장들을 담은 문서가 어디서 왔고, 근거의 출처가 무엇이며, 어떻게 검증돼 왔는지를 알려 줍니다. 자세한 주장과 정확한 근거 버전은 OpenWiki의 사이드카 파일에 남고, 밖으로 옮길 수 있는 마크다운에는 OKF 프런트매터의 일부로 표준화된 신뢰도 요약만 드러납니다.
실제로 어떻게 돌아가는가
낡음 검사는 위키를 업데이트할 때마다 맨 처음, 에이전트가 아무 일도 하기 전에 돌아갑니다. 런타임이 주장 전체를 훑으면서 각 주장에 저장된 근거 버전을 지금의 원본과 견줍니다. 모델을 호출하지 않는 결정론적 검사라서, 위키에 주장이 수천 개까지 쌓여도 속도가 유지됩니다.
에이전트가 주장 전체를 직접 쓸어 보는 일은 없습니다. 업데이트 중에 어떤 문서를 읽으면 그 문서에 달린 낡은 주장이 본문과 함께 드러나고, 에이전트는 이미 하고 있는 작업의 일부로 그것을 처리합니다. 주장을 다시 검증해 근거를 갱신하거나, 주장과 위키 본문을 같이 고치는 식입니다. 처리하지 못한 것은 조용히 사라지지 않고 다음 업데이트를 위해 표시된 상태로 남습니다.
그래서 실제 업데이트 비용은 위키가 주장을 몇 개 갖고 있느냐가 아니라 코드가 얼마나 바뀌었느냐에 따라 늘어납니다.
잊는 능력을 평가하기
이를 측정하려고, 코드 저장소를 git 커밋 순서대로 다시 재생하면서 미리 정해 둔 체크포인트에서 위키를 업데이트하는 평가를 만들었습니다. 커밋에는 새 기능 추가, 기존 동작 변경, 버그 수정, 되돌리기가 섞여 있습니다.
업데이트가 끝날 때마다 위키에 담긴 사실 주장을 평가해 다음 네 가지 가운데 하나로 분류했습니다.
- 근거 있음: 지금 체크포인트의 코드가 그 주장을 받쳐 줍니다.
- 낡음: 이전 체크포인트에서는 맞았지만 그 뒤 코드가 바뀌어 더는 성립하지 않습니다.
- 환각: 저장소 이력의 어느 시점에서도 참이었던 적이 없습니다.
- 확인 불가: 코드에 견줘 맞다고도 틀렸다고도 확인할 수 없습니다.
같은 커밋 순서를 OpenWiki 주장 런타임을 켠 경우와 끈 경우로 각각 돌렸습니다.
| 기준선 (n = 2,000) | 주장 런타임 (n = 2,000) | |
|---|---|---|
| 근거 있음 | 92.9% | 97.8% |
| 낡음 | 3.5% | 0.5% |
| 환각 | 0.7% | 0% |
| 확인 불가 | 2.9% | 1.7% |
업데이트 전체를 통틀어 보면 낡은 주장은 기준선의 80건에서 주장 런타임을 켰을 때 9건으로 줄었고, 환각 주장은 15건에서 0건으로 줄었습니다.
스스로 고치는 동작은 개별 실행에서도 직접 확인했습니다. 한 예에서는 코드가 바뀌면서 첫 체크포인트에 위키 주장의 17%가 낡은 상태로 남았습니다. 다음 체크포인트에 이르자 낡은 주장은 다시 0%가 되고, 근거 있는 주장은 77%에서 98%로 회복됐습니다.
| 체크포인트 | 근거 있음 | 낡음 | 환각 | 확인 불가 |
|---|---|---|---|---|
| T1 | 77% | 17% | 1% 미만 | 5% |
| T2 | 98% | 0% | 1% 미만 | 2% |
우리가 가장 중요하게 보는 동작이 바로 이것입니다. 주장 런타임 덕분에 OpenWiki는 기존 지식이 더는 믿을 만하지 않을 수 있는 시점을 짚어 내고, 그 불확실함을 여러 업데이트에 걸쳐 유지하며, 코드가 계속 바뀌는 가운데 나중에 그것을 고칠 수 있습니다.
무엇이 메모리를 스스로 고쳐지게 만드는가
메모리 시스템에는 자신이 무엇을 사실로 믿고 왜 그렇게 믿는지 말할 방법이 있어야 합니다. 더 중요한 것은, 한때 유효했던 것이 낡아 버렸을 때 잊고 스스로 고칠 방법이 있어야 한다는 점입니다.
주장 런타임이 OpenWiki에 그 능력을 줍니다. 주장 기록은 위키의 지식을 원본 근거에 단단히 붙여 두므로, 근거가 바뀌면 그에 딸린 주장이 낡음으로 표시됩니다. 그러면 이후의 위키 업데이트에서 위키를 처음부터 다시 만들지 않고도 낡은 주장을 검증하거나 스스로 고칠 수 있습니다.
이 모델에서 잊는다는 것은 오래된 기억을 지우는 일이 전부가 아닙니다. 오히려 어떤 믿음을 이제 더는 믿어서는 안 되는지 아는 일입니다. 덕분에 OpenWiki는 자신이 설명하는 소스 코드에서 조금씩 멀어지는 대신, 먼저 나서서 잊고 그 코드와 함께 변해 갈 수 있습니다.
OpenWiki 0.4.0을 써 보세요
이미 OpenWiki를 쓰고 있다면, 0.4.0으로 올리면 다음 업데이트에서 위키의 주장이 자동으로 생성되기 시작하고 OKF v0.2로 이전됩니다. 저장소를 살펴보거나 공식 문서에서 OpenWiki에 대해 더 알아보세요.
지금 바로 써 보세요.
npm install -g openwiki@latest
openwiki --init