OpenRAL에서 가져올 것 — 메모리 구성과 Routine 가족
OpenRAL(github.com/OpenRAL/openral, 커밋 d3b6262)의 메모리 층과 그 원전 논문을 우리 벤치의 write-phase 전략과 D Routine 설계에 대조한 참고 문서. 코드 이식 대상은 없고, 가져올 것은 스키마 결정과 문헌 앵커다.
- 메모리. OpenRAL은 문헌의 메모리 패턴을 섹션별로 하나씩 채택한 조립품이다. 우리에게 유효한 참고는 7개 결정이고, 그중 4개는 기존 산출물로 측정만 하면 되는 분석 후보, 2개는 평가를 바꾸는 전략 추가 후보, 1개는 기록만이다.
- Routine. D1 배치는 TidyBot형으로 앵커링된다. D3 금지는 허용 표면이 여럿이면 임의 배치도 대부분 성공해 변별력이 없으므로 폐기하고, 실행 중 교정(Stateful 하드 변형)으로 흡수한다. Routine을 Direct / Stateful로 나누는 축은 "규칙의 증거가 심기 영상에서 오는가, 로봇 자신의 실행에서 오는가"다.
- 새 지표. 규칙 유도 → 규칙 적용의 2단 귀속. write-phase 산출물에서 계산되고 전략을 바꾸지 않는다.
- 결정 필요 9건은 마지막 표에 모았다. 지금 권고는 분석 2건, 데이터 설계 2건(D3 폐기·Direct/Stateful 분기), 지표 필드, 서지. 평가 변경 2건은 v1 이후.
메모리 — OpenRAL이 결정한 것과 우리가 재야 할 것
A.1 구조 한 장
두 겹이다. 센서가 자동으로 채우는 기하 메모리와, LLM만 쓸 수 있는 의미 메모리. 설계문서 원문은 "씬 그래프는 머그가 어디 있나, MEMORY.md는 이 집은 어떻게 하는 걸 좋아하나"다.
기하 SpatialMemory | 의미 MEMORY.md | |
|---|---|---|
| 누가 쓰나 | 자동. 매 틱 디텍션을 ingest, 거리 연관으로 같은 노드면 pose 갱신·last_seen_ns·observation_count++ | LLM만. memory_write op 4종. 자동 기록 없음 |
| 내용 | 노드 object/place/room/agent, map 좌표 pose, label, 용기 여부, 내용물 가림 여부, 첫·마지막 관측 | 5섹션 한 줄 사실, 중요도·시각·status |
| 읽기 | recall_object → pose + 접근 시점 + 열어야 할 용기; resolve_place → nav goal | 매 틱 ## MEMORY 전량 주입(cap 기본 0=무제한). cap 시 상위만 + archive 키워드 검색 |
| 영속 | JSON 씬 그래프 | 파일 + .archive.jsonl, 미션 간 지속 |
의미 메모리의 실제 모습. 아래 줄은 저장소 문서·테스트 fixture에 있는 원문 예시를 섹션 형식대로 배열한 것이다.
# MEMORY.md <!-- schema_version: 0.1 --> ## Object-Location Log - [imp:0.90 ts:2026-06-20T09:00 st:stale ] mug on the kitchen table - [imp:0.85 ts:2026-06-24T18:12 st:current] mug in the dishwasher ## User Preferences - [imp:0.90 ts:2026-06-24 st:current] Clothes go in the bedroom drawer. ## Learned Lessons / Corrections - [imp:0.70 ts:2026-06-25 st:current] Grasp mugs by the handle. ## Open Tasks / Commitments - [imp:0.60 ts:2026-06-25 st:current] bowls in drawer (decompose-mission이 add, 검증 후 supersede)
op 의미. add는 추가, update는 대상 본문 교체(구본은 archive), supersede는 대상을 stale로 바꾸고 새 줄 추가, delete는 제거(archive). 쓰기마다 consolidate()가 같은 (섹션, 내용) 중복을 랭크 최고 하나만 남긴다. 랭크는 current > stale → importance → 최근성.
A.2 결정 하나하나와 그 원전
OpenRAL 자체는 새 알고리즘을 내지 않았다. 각 섹션·op가 어느 논문의 어떤 장치를 옮긴 것인지가 우리에겐 더 쓸모 있다. 논문에 인용할 때는 OpenRAL이 아니라 이 원전을 인용한다.
| 결정 | OpenRAL 구현 | 원전 | 원전이 한 일 · 수치 |
|---|---|---|---|
| 사건과 규칙을 분리 저장 | preferences는 규칙 문장만("clothes go in the bedroom drawer"), EDIT in place | TidyBot — Wu et al., AuRo/IROS 2023, arXiv 2305.05658 | 사용자 배치 예시 몇 개 → LLM 요약으로 일반 규칙 → 미본 물체에 적용. 벤치 미본 물체 91.2%, 실물 85.0% (abstract 확인 260902) |
| 교정 → 증류 → 회수 | lessons APPEND; verify-outcome 실패 시 add | DROC — Zha et al., 2023, arXiv 2311.10678 | 실행 중 언어 교정을 task-level/skill-level 지식으로 증류, 텍스트·시각 유사도로 회수. 1라운드 교정 수 절반, 2회 반복 후 거의 불필요 (abstract 확인) |
| 시간적 supersede | object_locations 재관측 시 supersede→stale 보존 | Zep (2025) — 인용 전 id 대조 | 사실에 유효 구간을 붙여 옛 사실을 무효화하되 보존 |
| add/update/delete + 중복 병합 | apply() / consolidate() | Mem0 (2025) — 인용 전 id 대조 | 새 정보마다 ADD/UPDATE/DELETE/NOOP 판단, 병합 |
| core/archive 페이징 | to_context_block(cap) + .archive.jsonl + memory_search | MemGPT — Packer et al., 2023, arXiv 2310.08560 | 컨텍스트 안 core memory와 밖 archival memory, 함수 호출로 페이징 |
| importance 부여 | LLM이 0–1 지정, 랭크 current>stale>imp>recency | Generative Agents — Park et al., 2023, arXiv 2304.03442 | recency×importance×relevance 회수, reflection으로 상위 통찰 생성 |
| 읽기/쓰기 분리 | LLM은 op만 내고 파일은 코드가 쓴다 | Statler — Yoneda et al., 2023, arXiv 2306.17840 | world-state reader/writer 분리 |
A.3 우리 write-phase와 축별 대조
| 축 | OpenRAL | 우리 (sbench_online · exec 전략) |
|---|---|---|
| 저장 단위 | 규칙 문장 (사건은 기하 쪽) | 사건 라인 [t=k] / 프레임 태그(tagmem) / 오라클 textlog |
| 쓰기 시점 | LLM이 필요할 때만, "SPARINGLY" | 매 턴(unified) / 세그먼트 종료(rollforward) / 하네스(textlog) |
| 구조 | 5섹션 | 평문 |
| 상태 표기 | current / stale | 없음. rewrite는 덮어쓰고 append는 남긴다 |
| 중요도 | LLM 부여 | 없음. tagmem cap 8은 시간순 |
| 용량 초과 | 상위 cap 유지 + 나머지 archive 검색 | rewrite 12줄 / tagmem cap 8 축출(폴백) |
| 검색 | 키워드 매칭(임베딩 없음) | 없음, 전량 재투입 |
| 매체 | 텍스트만 (S2는 픽셀을 보지 않음) | 텍스트 + 이미지(frames / vis / tagmem) |
| 영속 | 파일, 미션 간 | 에피소드 내 (+initial_memory_lines 이어붙임) |
A.4 참고 포인트 7개
각 항목은 "무엇을 봤나 → 우리에게 어떤 질문이 되나 → 성격"이다. 분석은 기존 산출물로 측정 가능하고 평가를 바꾸지 않는다. 전략 추가는 평가지가 바뀌므로 사용자 결정이며, 기존 전략을 개조하는 것이 아니라 외부 방법을 하나 더 넣는 형태만 정당하다.
P1 규칙 vs 사건 저장 분석 전략 추가
OpenRAL은 규칙만 자필로 남긴다. 우리 노트는 사건 나열이다. 질문: write-phase 최종 노트에 일반화 문장이 있는 비율(규칙 유도율)은 얼마인가. D 가족의 핵심 지표가 된다(B.6). 전략 후보: "섹션형·타입드 op·희소 쓰기 노트" 1종.
P2 current / stale 상태 분석 전략 추가
옛 위치를 지우지 않고 stale로 둔다. 질문: C Restoring에서 rewrite 전략이 append보다 나쁜가, 즉 덮어쓰기가 "원래 상태"를 잃는가. 전략 후보: 노트에 supersede 표기를 허용하는 변형.
P3 중요도 cap vs 시간순 cap 분석
OpenRAL cap은 중요도→최근성, 우리 tagmem cap 8은 시간순. 질문: 축출된 태그가 사건인가 규칙인가. hidden 행과 D에서 시간순 cap이 규칙을 밀어내는지.
P4 archive + 검색 페이징 읽기 조건 추가
cap 밖은 검색으로 접근 가능하다. 우리 cap-8 조건은 축출이 곧 소실이다. 후보: "cap 밖은 검색 가능" 완화 조건 1개. 평가 변경.
P5 자동 기하 vs 자필 의미 해석 프레임
관측 유도 메모리와 자필 메모리의 이중화. 우리 frames/vis(관측 유도) vs notes/tagmem(자필) 축을 설명하는 discussion 프레임으로 쓸 수 있다.
P6 consolidate 중복 제거 분석
같은 사실을 다시 쓰면 병합한다. 질문: 우리 append 노트의 중복 라인 비율과 길이 팽창은 얼마인가. 긴 에피소드(L3)에서 특히.
P7 희소 쓰기 문장 기록만
"Use SPARINGLY… Do NOT store transient world state." 우리 프롬프트를 바꾸는 것은 튜닝이므로 기록만 한다.
A.5 논문 문장 후보
- Related work. 배포용 에이전트 스택은 이미 자기 관리 메모리 파일(물체 위치 로그, 사용자 선호, 교훈)을 설계에 넣고 있으나, 그 메모리가 행동 성공에 기여하는지를 재는 벤치는 없다. OpenRAL은 이 스키마를 시스템으로 구현한 사례로 한 줄 언급(URL 인용).
- Discussion. 배포 지향 메모리 스키마는 물체 위치(A), 미완 과제(B), 규칙(D)에는 자리를 두지만 "원래 상태"(C)에는 두지 않는다. stale 엔트리를 보존하면서도 복원에는 쓰지 않는다.
- Discussion. 실기 테스트에서 특정 모델만 집합 목표를 분해했다는 보고는 우리 "전략 순위의 모델 종속" 발견과 같은 방향이다.
Routine — D1·D3를 문헌에 앵커링하고 D3의 A5 충돌을 푼다
B.1 현재 상태
| 하위 | 정답의 정체 | 질의 문장(260821 확정) | 미해결 |
|---|---|---|---|
| D1 배치 | 그 집의 규칙 → 표면 클래스(any_instance_ok) | … place it in or on the kind of place where things usually go in this house | 배치 4/4 저작 시 find/restore 행 감소. 홀드아웃은 규칙 근거에 없는 카테고리여야 함 |
| D2 절차 | 앞선 반복 유닛의 순서 | Put one more egg in the basket, the way the others were done in this house | 순서 제약 있는 task 조합 필요(가장 저렴) |
| D3 금지 | 안 하는 것이 정답 | Put the mug down somewhere it can stay — somewhere this house would put it | A5 충돌 + 임의 배치도 대부분 성공(변별력 없음) → 폐기, B.4 교정 변형으로 흡수 |
편당 최대 1행, 총 ~90행(D1 40 · D2 30 · D3 20), 생성은 데이터팀 소관. 논문 §3은 완성태로 기술하고 PH-3에 수치가 들어간다.
B.2 OpenRAL 섹션과의 대응
| OpenRAL | 우리 | 비고 |
|---|---|---|
preferences | D1 배치 | TidyBot형. 규칙 문장 저장·EDIT in place |
lessons | D3 금지 | DROC형. 교정에서 증류·APPEND |
home_map | D 보조 | 집 고유 사실("왼쪽 캐비닛이 쓰레기통"). 우리는 A로 흡수 |
open_tasks · MissionState | B Resuming | D2가 아니다. 이어하기이지 순서 학습이 아님 |
| playbook | — | 사람이 쓴 SOP. D2 "관찰에서 유도한 절차"와 무관 |
B.3 D1 배치 — TidyBot 프로토콜을 설계 패턴으로
TidyBot의 절차는 세 단계다. 사용자의 배치 예시 몇 개를 받고, LLM이 이를 일반 규칙으로 요약하고("밝은 색 옷은 서랍, 어두운 색은 옷장"), 처음 보는 물체에 그 규칙을 적용해 놓을 곳을 고른다. 벤치에서 미본 물체 91.2%, 실물에서 85.0%였다. 우리 D1에 항목별로 대응된다.
| TidyBot | 우리 D1 | 설계 결정 |
|---|---|---|
| 사용자 예시 배치 k개 | 심기 구간에서 관찰된 배치 4/4 | 반례 0. val_406의 3/5는 "경향"이라 실패(260821) |
| LLM이 규칙 요약 | 메모리에 규칙이 유도되는가 | 측정 대상(B.6 규칙 유도) |
| 미본 물체에 적용 | 홀드아웃 = 규칙 근거에 없는 하위 카테고리 | 같은 카테고리면 find로 풀린다. 규칙은 상위 클래스 위에 정의(예: 작은 식기류 → dresser) |
| receptacle 선택 정확도 | 표면 클래스 any_instance_ok | 에셋클래스↔낱말 매핑(dresser↔chestofdrawers)을 채점기가 들어야 함 |
| 사용자별 다른 규칙(개인화) | 반사실 짝(A6) | 같은 집·같은 홀드아웃·다른 규칙 2편 → 정답 표면이 갈려야 함. blind ≤ 1/K가 구조적으로 보장됨 |
B.4 Routine을 Direct / Stateful로 나누기 — 규칙 증거의 출처
TidyBot식 설정을 그대로 쓴다. 심기에서 옷→박스, 리모컨→쇼파, 사과→식탁을 보여주고, 처음 보는 옷을 "정리해"라고 시킨다. 우리 정의에서 Direct는 요청 이전의 회고 기억으로 푸는 것, Stateful은 실행 중 갱신되는 상태가 필요한 것이다. 그러면 두 모드는 규칙의 증거가 어디서 오느냐로 갈린다.
| Direct | Stateful | |
|---|---|---|
| 규칙의 증거 | 심기 영상에서 관찰: 옷→박스, 리모컨→쇼파, 사과→식탁 | 로봇 자신의 실행: 앞 k개는 목적지를 지정받아 놓음 |
| 질의 | "이 스웨터 정리해" (처음 보는 옷) | "셔츠는 박스에" → "양말은 박스에" → "리모컨은 쇼파에" → "나머지도 정리해" (재킷, 다른 리모컨, 바나나: 목적지 미지정) |
| 메모리 없으면 | 규칙을 모름 | 자기가 뭘 어디 놨는지 모름 → 규칙을 못 세움 |
| 정답 | 표면 클래스 (any instance) | 남은 아이템마다 표면 클래스 |
| 반사실 짝 | 같은 집, 다른 심기 규칙 | 첫 지시들을 옷→옷장으로 바꾼 쌍둥이 편 → 재킷 정답이 옷장 |
Stateful이 성립하는 이유는 우리 온라인 플래너가 턴 간 상태를 갖지 않고 노트만 넘기기 때문이다. "나머지도 정리해" 시점의 입력에는 목적지 정보가 없다. 노트에 "셔츠·양말→박스, 리모컨→쇼파"를 남긴 모델만 재킷을 박스에 넣는다. 같은 규칙과 같은 홀드아웃에 증거 출처만 바꾸므로, 논문 제목의 회고 기억 vs 온라인 실행 상태를 한 가족 안에서 정확히 대비시킨다.
B.5 D2 절차 — OpenRAL에서 얻을 것 없음
OpenRAL의 절차 지식은 사람이 쓴 플레이북이고, 과제 큐는 이어하기(B)다. 관찰에서 순서 규칙을 유도하는 장치는 없다. 260821 설계(type2 반복 유닛에 순서 제약을 얹는다, 가장 저렴)를 그대로 둔다.
B.6 새 지표 — 규칙 유도 → 규칙 적용 2단 귀속
D 가족의 실패는 두 곳에서 날 수 있다. 규칙을 메모리에 만들지 못했거나, 만들었는데 홀드아웃에 적용하지 못했거나. 둘을 나누면 C5(단계별 지표)와 정합한다.
- 규칙 유도. write-phase 최종 메모리에 규칙 문장이 있는가. 구조화 필드(
rule_stmt)를 요구하거나, 오라클 규칙과 대조하는 LLM 판정 yes/no. 사건 나열만 있으면 "유도 없음". - 규칙 적용. 홀드아웃 행동 성공 여부(기존 채점).
| 적용 성공 | 적용 실패 | |
|---|---|---|
| 유도 있음 | 정상 경로 | grounding·제어 실패 (규칙은 알았다) |
| 유도 없음 | 인퍼런스 시점 추론 또는 상식 (사건 나열로 풂) | 기억 실패 |
기존 write-phase 산출물로 계산된다. 전략을 바꾸지 않으므로 평가지 튜닝이 아니다. TidyBot의 "요약이 예시 나열보다 일반화가 낫다"는 주장을 우리 데이터로 재검하는 셈이 된다.
B.7 데이터팀 전달용 저작 요건
D1 편
- 규칙은 상위 클래스 → 표면 클래스. 배치 4/4, 반례 0
- 홀드아웃은 규칙 근거에 없는 하위 카테고리, 어느 사건에도 등장 안 함
- 반사실 짝: 같은 집·같은 홀드아웃·다른 규칙
- 미끼 표면 집계(src/dst 횟수) 동봉. 채점엔 안 씀
- 선택: 규칙 2개/편
- 스키마:
rule{type, value, utterance_word},evidence[],holdout,answers[].any_instance_ok
D3 편
- 교정 사건: X에 놓임 → 옮겨짐, 서로 다른 물체 3회+
- X는 상식 최다 표면, 허용 표면 K ≥ 2
- 쌍둥이 편(금지 없음) 필수, 나머지 동일
- 채점: 허용=성공 / X=위반 / 무행동=미완, 짝 채점 병기
- 스키마:
rule{type:"forbidden_surface", value, evidence[]},allowed_surfaces[],twin_id
결정 필요 목록
| # | 항목 | 성격 | 영향·비용 | 권고 |
|---|---|---|---|---|
| 1 | 규칙 유도율 분석(P1) | 분석 | 기존 노트 산출물, LLM 판정 소액 | 지금 |
| 2 | rewrite vs append의 C 격차(P2), cap 축출 종류(P3), 중복률(P6) | 분석 | 기존 산출물 | 지금 |
| 3 | D3 금지형 폐기 → Stateful 교정 변형으로 흡수 | 데이터 설계 | 금지형은 변별력 없음(사용자 지적 260902) | 확정 권고 |
| 4 | D1 하드닝(규칙 2개/편, 상위 클래스 규칙) | 데이터 설계 | 저작 비용↑, find/restore 행 추가 감소 | 선택 |
| 5 | Routine 2단 지표 필드(rule_stmt) | eval 스키마 | 소규모 | 지금 |
| 6 | 섹션형·타입드 op·희소 쓰기 전략 추가(P1) | 평가 변경 | write-phase 1전략 × 모델 × 편 | v1 이후 |
| 7 | supersede 표기 변형(P2), archive 검색 읽기 조건(P4) | 평가 변경 | 전략·조건 추가 | v1 이후 |
| 8 | related work 인용: 원전 7편 + OpenRAL 한 줄 | 논문 | Zep·Mem0 등 5편 arXiv 대조 필요 | 지금 |
| 9 | Routine Direct/Stateful 분기(증거 출처) 채택 + 데이터팀 확인 ①② | 데이터 설계 | PH-3 전제. Stateful은 type2 순차 지시 재사용 가능 시 저비용 | 지금 |