feat: 추가된 메모리 기능으로 광맥 및 마지막 행동 저장

- 에이전트가 발견한 광맥 좌표를 `ore_patch_memory.json`에 저장하여 재시작 시 활용 가능
- 마지막 실행한 행동과 결과를 `agent_last_action_memory.json`에 저장하여 다음 상태 요약에서 참고 가능
- `state_reader.py`에서 메모리 로드 및 상태 요약에 포함
- `ai_planner.py`에서 시스템 프롬프트에 기억된 광맥 및 마지막 행동 관련 가이드 추가
- `README.md`에 새로운 메모리 기능 설명 추가
This commit is contained in:
21in7
2026-03-25 23:34:25 +09:00
parent 8c90e80582
commit 25eaa7f6cd
16 changed files with 498 additions and 12 deletions

View File

@@ -112,3 +112,96 @@
- `README.md`
- 인벤토리 캐시 동작과 파일명(`inventory_memory.json`)을 설명
---
## 발견된 광맥 좌표 기억(메모리) 추가 계획
### 문제 관찰
- `explore`로 광맥을 발견해도, 재실행/재계획/초기화 상황에서 동일 좌표를 다시 추천받지 못해
불필요한 탐색이 반복될 수 있음.
### 변경 목표
1. 자원 엔티티(광맥)의 좌표를 `ore_patch_memory.json`에 ore 종류별로 여러 패치 좌표로 저장
2. 다음 상태 요약에서 “기억된 광맥” 섹션으로 AI에게 제공
3. LLM이 가능하면 기억된 좌표로 먼저 이동해 `move -> mine_resource`를 수행하도록 유도
### 구현 범위
- `action_executor.py`
- `explore` 성공 시 발견한 광맥 좌표를 파일에 갱신
- `state_reader.py`
- `scan_resources()` 결과로도 광맥 좌표를 `ore_patch_memory.json`에 갱신
- `summarize_for_ai()`에 “기억된 광맥” 출력 추가
- `ai_planner.py`
- SYSTEM_PROMPT에 기억된 광맥 우선 이동 가이드 추가
### README 업데이트
- `ore_patch_memory.json` 파일과 동작 방식 설명 추가
---
## 에이전트 재시작 시 마지막 행동 기억(메모리) 추가 계획
### 문제 관찰
- 코드를 수정하면 보통 에이전트를 재시작해야 하고,
이때 `ai_planner.py``feedback_log`/직전 실패 정보가 초기화되어 같은 시행착오가 반복될 수 있음.
### 변경 목표
1. 재시작 시에도 “직전에 실행했던 action”과 결과(success/message)를 파일에 저장
2. 다음 실행의 상태 요약(`state_reader.summarize_for_ai()`)에 “기억된 마지막 행동” 섹션을 포함
3. LLM이 마지막 행동이 실패였다면 같은 행동을 즉시 반복하지 않도록 유도
### 저장 기준(확정)
- 성공/실패 상관없이 **가장 마지막으로 실행을 시도한 action 1개**만 저장한다.
### 구현 범위
- `main.py`
- 행동 실행 직후 action/result를 `agent_last_action_memory.json`에 저장
- `state_reader.py`
- 재시작 시 파일을 로드해 상태 요약에 포함
- `ai_planner.py`
- SYSTEM_PROMPT에 “마지막 행동 실패 재시도 금지/원인 해결 우선” 가이드 추가
### README 업데이트
- `agent_last_action_memory.json` 존재/동작 설명 추가
---
## `place_entity` BLOCKED 완화 계획 (인접 타일 탐색)
### 문제 관찰
- 로그에서 `stone-furnace` 배치가 `FAIL 배치 불가`(내부적으로 `BLOCKED`)로 반복됨
- `mine_resource`가 자원 엔티티 근처(종종 자원 패치 타일)로 이동한 뒤, 같은 좌표에 건물을 배치하려고 하면
Factorio의 `can_place_entity` 조건에 걸려 막힐 수 있음
### 변경 목표
1. `action_executor.py``place_entity`에서 먼저 `surface.can_place_entity`로 배치 가능 여부를 검사
2. 현재 좌표 `(x,y)`가 불가능하면, `(x,y)` 주변 `±1 타일` 후보(대각 포함)로 순차 시도
3. 실제로 배치된 좌표를 결과 메시지에 포함해 이후 계획이 더 안정적으로 반복되게 함
### 구현 범위
- `action_executor.py`
- `place_entity` 로직을 (x,y) 실패 시 인접 타일 후보로 확장
### README 업데이트
- `place_entity``BLOCKED` 시 인접 타일을 자동 탐색하도록 동작 설명 추가
---
## GLM HTTP read timeout 대응 계획 (예외 포함 재시도)
### 문제 관찰
- 로그에 `TimeoutError: The read operation timed out` 가 발생
- 현재 `ai_planner.py`는 JSON 파싱 실패만 재시도하고, 네트워크 타임아웃/연결 오류는 별도 재시도 경로가 약함
### 변경 목표
1. `AIPlanner.decide()`의 재시도 예외 범위를 `TimeoutError`, `ConnectionError`, `urllib.error.URLError`까지 확장
2. 해당 오류가 발생하면 동일한 “plan 응답 받기” 재시도로 복구 시도
3. 3회 연속 실패 시에는 기존과 동일하게 `explore` 기본 행동으로 폴백
### 구현 범위
- `ai_planner.py`
- `decide()``except` 절 범위 확장 및 경고 로그 보강
### README 업데이트
- GLM read timeout/연결 오류 발생 시 재시도 동작을 `주의사항`에 추가