RAG 없는 오답노트만으로 행동 예측하기
Agent memory 연구는 오랫동안 “긴 기록을 어떻게 압축하고 검색할까”라는 질문을 중심으로 움직였어요. Mem0나 MemOS처럼 추출, 요약, 검색을 조합하는 방식이 대표적이에요. PraMem은 이 전제를 뒤집어요. 긴 행동 시퀀스는 줄여야 할 부담이 아니라, 정답 라벨이 이미 붙어 있는 연습 문제 더미라는 주장이에요.
- PraMem: Practice-derived Experiential Memory for Long-horizon Behavior Prediction, arXiv, 2026.
- Code: github.com/icip-cas/PraMem.
Long-horizon behavior prediction이란
문제 설정은 단순해요. 사용자의 과거 scene-action 기록 $H_t = {(s_i, a_i)}_{i=1}^{t-1}$ 이 주어졌을 때, 현재 scene $s_t$ 에서의 행동 $a_t$ 를 맞히는 과제예요.
\[\hat{a}_t = \text{LLM}(H_t, s_t)\]시퀀스가 수천 스텝으로 늘어나면 두 가지가 무너져요.
첫째는 latent pattern induction이에요. 브랜드 선호, 가격 민감도, 구매 전 찜하는 습관 같은 신호가 긴 시퀀스에 흩어져 있어서 추론 시점에 즉석으로 뽑아내기 어려워요.
둘째는 model-intrinsic cognitive bias예요. 다수 행동을 따라가려는 경향, 학습 과정에서 생긴 편견, 시퀀스 특정 구간에만 주의가 쏠리는 문제가 겹쳐요. 정보가 충분해도 모델 자체의 성향 때문에 틀리는 경우예요.
기존 memory management는 첫 번째 문제만 부분적으로 건드려요. 압축과 검색은 정보량을 줄일 뿐 pattern induction을 대신하지 못하고, 두 번째 문제에는 아예 손을 대지 않아요. 저자들은 이 한계가 “긴 컨텍스트는 부담”이라는 관점 자체에서 나온다고 봐요.
Experiential memory는 경험을 담아요
PraMem이 유지하는 memory $M_t$ 는 두 종류의 경험으로 구성돼요.
Pattern Experience는 사용자 행동 규칙이에요. “이 사용자는 Apple 전자제품을 선호한다”, “구매 전에 먼저 찜한다” 같은 서술이고, 주어가 사용자예요.
Bias-alert Experience는 모델 자신에 대한 경고예요. “최근 기록만 보는 proximal bias를 피하라”, “특정 집단에 대한 학습 편견을 적용하지 말라” 같은 서술이고, 주어가 모델이에요. 부록의 실제 prompt에서는 Calibration Experience라는 이름을 써요.
예측 시점에는 짧은 suffix만 컨텍스트로 넣고 memory를 함께 제공해요.
\[M_t = \text{Practice}(H_t, M_{t'}), \quad \hat{a}_t = \text{LLM}(\tilde{H}_t, s_t, M_t), \quad \tilde{H}_t = \{(s_i, a_i)\}_{i=t-k}^{t-1}\]$k \ll t$ 이므로 온라인 입력은 짧아요. 긴 시퀀스는 오프라인 practice 단계에서만 소비돼요.
연습은 세 단계를 거쳐요
Existing Experience Trial. 아직 memory에 반영되지 않은 구간 $H_t \setminus H_{t’}$ 에서 샘플을 뽑아 연습 문제를 만들어요. 라벨은 실제 사용자 행동이에요. 모델은 현재 memory를 근거로 explicit deep thinking을 거쳐 예측해요.
\[(\hat{a}_j, r_j) = \text{LLM}_{\text{thinking}}(\tilde{H}_j, \tilde{s}_j, M_{t'})\]$r_j$ 는 사고 과정이고, 이후 reflection의 입력이 돼요. 샘플링 시점 $j$ 는 항상 $t’ < j < t$ 를 만족해서 memory 진화가 시간 순서를 거스르지 않아요.
부록 A의 prompt는 예측 전에 두 단계의 추론을 강제해요.
1
2
3
4
5
Before predicting each task, please first complete the following two reasoning steps:
1. List the Pattern Experience entries relevant to this task, and explain this
user's behavioral tendencies in such scenarios.
2. List the Calibration Experience entries relevant to this task, and explain
what I need to pay attention to when reasoning.
Memory를 참고 자료로 던져주는 것이 아니라 어떤 항목을 왜 적용했는지 명시하게 만들어요. 이 흔적이 다음 단계 reflection의 입력이 되기 때문에 필수예요.
Reflective Proposal Generation. 연습 문제, 사고 과정, 예측과 라벨의 비교를 함께 놓고 반성해서 memory 수정 제안 $n$ 개를 생성해요. 각 제안은 대상 experience 종류와 구체적 연산으로 이뤄져요. Self-review를 통과한 제안만 proposal pool $P$ 에 쌓여요.
\[\{p_i\}_{i=1}^{n} = \text{LLM}_{\text{reflection}}(\tilde{H}_j, \tilde{s}_j, \tilde{a}_j, \hat{a}_j, r_j)\]부록 B의 prompt는 두 experience를 주어로 구분해요. 올바른 예시와 잘못된 예시를 나란히 붙여서 분류를 강제해요.
1
2
3
4
5
6
7
8
9
10
【Pattern Experience】
Records this user's own preferences and behavioral habits.
The described subject is "this user."
Correct example: "This user prefers livestream content featuring outdoor natural scenes."
Incorrect example: "When predicting, check whether there are natural scenes."
【Calibration Experience】
Records the model's tendencies toward mistakes, overlooked points, or aspects
requiring special attention when reasoning about this user's behavior.
The described subject is "I (the model)."
제안 출력 형식도 고정돼 있어요.
1
2
【Proposal】 Brief description of triggering scenario | Proposal type: Add Pattern /
Add Calibration / Modify Existing Experience / Remove Existing Experience | Specific content
맞은 예측을 다루는 지시가 특히 눈에 띄어요.
1
2
3
- Was this correct prediction merely "accidentally correct" (the experience logic
relied on was flawed but the result happened to be correct)? If so, the experience
still needs revision.
정답 여부만 신호로 쓰지 않고 근거의 타당성까지 보겠다는 설계예요. 이 밖에 추론 시점에 볼 수 없는 정보에 의존하지 말 것, 통계적 근거 없는 수치 대신 정도를 나타내는 표현을 쓸 것 같은 품질 조건이 다섯 개 붙어요.
Consensual Experience Adjustment. Memory를 매 라운드 고치면 우발적 행동 하나에 흔들려요. PraMem은 $T$ 라운드마다만 갱신하고, 여러 제안이 일관되게 지지하는 연산만 채택해요. 부록 prompt를 보면 3개 이상의 제안이 같은 관점을 지지해야 반영되고, 기존 experience도 3개 이상이 문제 삼아야 수정되거나 pool로 강등돼요.
\[M_t, P = \text{LLM}_{\text{consensus}}(M_{t'}, P)\]채택된 제안은 pool에서 제거되고 나머지는 남아서 다음 라운드에 누적돼요.
부록 C의 prompt는 채택 기준을 수치로 못 박아요.
1
2
3
4
5
6
7
8
9
**Rules for adding or modifying experience:**
- If a viewpoint is supported by 3 or more proposals → it may be incorporated into
experiential memory or used to modify existing experience.
- If a viewpoint is supported by only 1-2 proposals → it must remain in the proposal
pool and must not be incorporated into experiential memory.
**Note: The proposal pool is not a to-do list, but a set of candidate experiences
under observation. Under normal circumstances, most proposals should still remain
in the proposal pool after each review.**
마지막 note가 이 단계의 성격을 잘 드러내요. 기본 동작이 반영이 아니라 보류예요. 최종 출력은 user_exp, model_exp, proposal 세 리스트를 담은 JSON이고, 강등된 experience는 요약 없이 원문 그대로 pool에 복사하도록 지시해요.
모든 제안을 받아드리지 않아요
이 프레임워크의 성능은 제안 품질에 좌우돼요. 저자들은 나쁜 제안을 두 유형으로 나누고 각각에 대응하는 검증을 붙여요.
Groundedness Review는 근거 없이 지어낸 제안을 잡아요. Scene은 그대로 두고 각 기록의 action만 바꿔서 시퀀스가 정반대의 선호 신호를 내도록 만들어요. Figure 2의 예시에서는 AirPods를 Buy하고 MacBook을 Collect했던 기록이 각각 Collect와 Skip으로 뒤집혀요. 이렇게 바뀐 시퀀스에서도 제안이 그대로 성립하면 원래 데이터에 근거하지 않았다는 뜻이에요.
\[\text{Gr.Review}(p_i) = \begin{cases} \text{Out}, & \text{if } \text{LLM}_{\text{judge}}(p_i \mid \tilde{H}'_j, \tilde{s}_j, \tilde{a}_j) = \text{Hold} \\ \text{Pass}, & \text{otherwise} \end{cases}\]Generalizability Review는 반대 방향의 실패를 잡아요. 실제 scene에서 핵심 entity만 같은 유형의 다른 것으로 바꿔 virtual scene $m$ 개를 만들고, 실제 scene을 섞어 객관식 문제를 구성해요($m = 7$). 그다음 히스토리 없이 제안 문장만 주고 어느 선택지에 대한 제안인지 고르게 해요. Figure 2에서는 실제 scene이 MateBook이고 RedmiBook, DellBook, MatePad, Mate 80 Pro가 후보로 붙어요. “MateBook의 사전 확률을 낮춰라”는 제안은 이름이 그대로 들어 있어서 바로 특정되니 탈락하고, “이 사용자는 이미 개인용 PC를 보유했을 수 있다”는 제안은 어느 선택지에도 걸리지 않아 통과해요. 특정된다면 그 제안은 개별 샘플에 과적합된 서술이에요.
\[\text{Ge.Review}(p_i) = \begin{cases} \text{Out}, & \text{if } \text{LLM}_{\text{select}}(S_j \mid p_i) = \tilde{s}_j \\ \text{Pass}, & \text{otherwise} \end{cases}\]부록 D의 판정 기준은 직관과 반대 방향이에요.
1
2
3
4
5
6
- If the proposal **no longer holds** after the perturbation is executed, this
indicates that the proposal truly depends on the specific content of the
historical data and is a well-grounded conclusion.
- If the proposal **still holds** after the perturbation is executed, this indicates
that the proposal is unrelated to the specific content of the historical data and
is a hallucinated conclusion by the model.
Perturbation 자체에도 강도 조건이 붙어요.
1
2
3
4
5
- **The perturbation must be aggressive enough**: Do not make only minor adjustments.
- **The perturbation must cover multiple behaviors**: Do not modify only one item.
- **The perturbation direction must be clear**, for example:
- Direction A: Change all positive/active responses ... into negative/passive responses
- Direction C: Change all purchase/conversion behaviors into abandonment behaviors
부록 E의 판정도 같은 구조예요.
1
2
3
4
- If A can be precisely identified, this indicates poor generalizability, and the
proposal fails the check.
- If A cannot be precisely identified, this indicates good generalizability, and the
proposal passes the check.
정답 scene을 항상 선택지 A로 고정하고 모델에게 그 사실을 알려준다는 점이 특이해요. 정답 위치를 맞히는 문제가 아니라 제안만으로 A가 특정되는지를 묻는 문제라는 뜻이에요.
설계는 깔끔하지만 구현은 전부 LLM 판단에 의존해요. 부록 D를 보면 perturbation을 실제로 실행하지 않고 계획 설명만 준 뒤 그 결과를 모델이 추론해요. 검증 신호가 외부 근거가 아니라 같은 모델의 판단이라는 점은 유의할 부분이에요.
결과
OmniBehavior의 전체 성능은 아래와 같아요.
GPT-OSS-120B 백본에서 전체 ACC 73.5, F1 24.7(Truncation)이 84.7, 31.6으로 올라가요. Mem0는 74.7, 26.4이고 MemOS는 73.1, 26.2, user profile을 만드는 ProEx는 77.7, 26.9예요. 압축 계열 memory 방법들이 Truncation 대비 거의 이득을 못 내는 구간에서 PraMem만 큰 폭으로 벌어져요.
주목할 지점이 몇 가지 있어요.
Long-context가 Truncation보다 나빠요. OmniBehavior에서 32K 전체를 넣은 경우가 8K로 자른 경우보다 ACC가 5점 낮아요. 긴 기록을 그대로 주는 것이 오히려 해가 된다는 뜻이고, 압축 계열 방법들의 출발점이 낮은 이유이기도 해요. 반면 MovieLens-1M에서는 Long-context F1이 38.9로 Truncation 28.8, Mem0 28.1, MemOS 27.3보다 높아요. 태스크에 따라 긴 컨텍스트의 가치가 반대로 뒤집혀요. PraMem은 49.6으로 confusion matrix의 대각 성분이 가장 뚜렷해요.
시나리오별 편차가 커요. Ads에서 F1이 26.2에서 43.7로 뛰는 반면 Video에서는 25.6으로 ProEx의 26.2보다 낮아요. ACC는 Video에서도 82.5에서 86.4로 오르지만 F1은 뒤처져요. 전체 이득의 상당 부분이 Ads 한 시나리오에서 나온다고 읽는 편이 정확해요.
ACC와 F1의 격차가 커요. ACC 84.7에 F1 31.6이라는 조합은 positive class가 매우 희소한 이진 분류라는 뜻이에요. 절대 수치만 보면 소수 클래스 예측은 여전히 어려운 상태예요.
Memory가 백본을 넘어 전이돼요. Memory는 GPT-OSS-120B로만 구축했는데 Qwen3.5-35B-A3B에서도 67.6, 21.5(ProEx) 대비 75.6, 25.3을 기록해요. Pattern experience가 사용자 속성이라 전이되는 것은 자연스럽지만, 모델 편향을 겨냥한 bias-alert experience까지 다른 모델에서 작동한다는 점이 흥미로워요. 저자들은 Platonic representation hypothesis를 근거로 서로 다른 LLM이 공통 인지 성향을 공유한다고 설명해요. 다만 이 설명은 검증이 아니라 사후 해석이에요. 한 번 만든 memory를 여러 백본에 재사용할 수 있다는 실용적 함의는 분명해요.
Memory는 어떻게 진화할까
라운드별 성능은 10라운드에서 ACC 79.0, F1 28.3, 40라운드에서 83.5, 30.7, 80라운드에서 84.7, 31.6으로 단조 증가해요. Trial-and-error 누적이 실제로 memory 품질로 이어진다는 근거예요.
더 중요한 관찰은 길이 곡선이에요. Memory 토큰 수는 10라운드부터 60라운드까지 늘다가 이후 안정돼요. Revising, supplementing, pruning 세 연산이 함께 작동하면서 커버리지가 포화된 뒤로는 추가가 아니라 정정 위주로 바뀌기 때문이에요. 정보를 계속 축적하는 기존 memory 시스템과 대비되는 지점이고, memory 자체가 새로운 long-context 부담이 되는 상황을 피해요.
Ablation 결과
전체 F1 31.6 기준으로 deep thinking을 빼면 29.3, reflection을 빼고 예측-라벨 비교만으로 제안을 만들면 30.9, consensus 없이 모든 제안을 즉시 반영하면 28.8이에요. 하락 폭이 가장 큰 요소는 consensual adjustment예요. 무엇을 memory에 넣을지보다 언제 넣을지를 통제하는 쪽이 더 결정적이라는 신호로 읽을 수 있어요.
Pattern experience와 bias-alert experience 중 하나만 쓰면 둘 다 성능이 떨어져요.
Groundedness review와 generalizability review도 각각 제거 시 하락해요. 두 검증이 서로 반대 방향의 실패를 막고 있어서 한쪽만으로는 부족해요.
Case study가 이 논문의 주장을 가장 잘 압축해요. 같은 사용자에 대해 MemOS와 PraMem이 유지한 memory예요.
1
2
3
4
[MemOS]
On 2025-09-28 at 20:16:18, the user watched a video titled '#RenovationSite
... Quick Assembly of Gypsum Board Partition Walls,' posted by an author with
242K followers ... The video is 57 seconds long ... The user watched for 3 seconds.
1
2
3
4
5
6
7
[PraMem - Pattern Experience]
The user is more inclined to follow authors whose tags contain social or
emotional elements.
[PraMem - Bias-alert Experience]
Alert against the training-induced prejudice that treats 'follow author' as a
rare, need-driven action by default.
전자는 예측 시점에 다시 induction을 요구하고, 후자는 induction 결과를 미리 확정해 둬요.
마무리하며
PraMem은 mem0 계열의 사실 기반 memory를 experiential memory로 옮기는 시도예요. ReasoningBank나 Memp처럼 agent 도메인에서 쓰이던 자기 진화 memory를 behavior prediction에 가져왔고, 긴 히스토리가 라벨이 붙은 연습 데이터라는 관찰이 이 이식을 가능하게 해요. Gradient 없이 텍스트 memory만 갱신하는 training-free 방식이라 백본 교체가 자유롭다는 점도 실용적 장점이에요.
한계는 비용이에요.
사용자 한 명당 memory 구축에 55.8분이 들어요. ProEx 대비 2배가 넘어요. 오프라인 작업이라 온라인 지연에는 영향이 없지만, 사용자 수가 백만 단위인 실제 추천 서비스에 그대로 올리기는 어려운 수치예요. 저자들도 practice scheduling 최적화나 trial-reflection 병렬화를 후속 과제로 남겨요.
Bias-alert experience를 memory의 일급 구성 요소로 올린 점은 다시 볼 만해요. 기존 agent memory 설계는 대부분 “세계에 대한 기록”만 다루고 “모델 자신에 대한 기록”은 시스템 프롬프트에 고정 문구로 넣어요. 이 논문은 후자를 사용자별로, 데이터로부터 학습해요. 다만 실험은 그 효과를 총합으로만 보여주고, 실제로 어떤 bias가 얼마나 교정됐는지를 분리해서 측정하지는 않아요. 이 부분이 후속 연구에서 채워질 여지예요.
구조 측면에서 가장 실용적인 차이는 retrieval이 없다는 점이에요. Mem0와 MemOS는 fact를 저장해 두고 질의 시점에 관련 항목을 꺼내오는 RAG 구조인데, PraMem의 memory는 600~800 토큰 규모로 수렴하는 static summary라 통째로 컨텍스트에 들어가요. 검색 단계가 없으니 retrieval miss나 순위 오류가 성능에 개입하지 않고 vector store도 필요 없어요. 이 단순한 구성이 RAG 기반 memory를 앞섰다는 사실은 이득의 출처가 검색 정교화가 아니라 저장 내용의 추상화 수준에 있다는 뜻이에요. Memory를 키우고 잘 찾는 방향과, 작게 유지하되 무엇을 담을지 다듬는 방향 중 후자에 아직 여지가 남아 있다는 신호로 읽을 수 있어요.







