DOCS/troubleshooting/250806_happybell80_동적프롬프트구현.md
happybell80 9d70b7e49b docs: Phase 5 및 동적 프롬프트 구현 문서화
- Phase 5 캐시 사용 횟수 관리 추가
- 동적 프롬프트 컨텍스트 구현 과정 별도 문서화
- 의도 파악 개선 및 교훈 정리
2025-08-06 14:50:16 +09:00

4.3 KiB

250806 동적 프롬프트 컨텍스트 구현

오후 2시 55분

문제 상황

서버팀 테스트 결과 분석:

  • Phase 5는 정상 작동 (캐시 3회 사용 후 재생성)
  • 하지만 의도 파악 실패 지속
    • "내 이름은?" → "저는 베르단디입니다" (잘못됨)
    • "네 이름은?" → "저는 베르단디입니다" (맞음)
    • 사용자 이름을 묻는 것을 자기소개로 오해

원인 분석:

  1. 캐시 임계값 너무 관대 (0.3) → 다른 질문도 같은 캐시 사용
  2. 프롬프트 하드코딩 → "당신은 로빙입니다" 고정
  3. 메모리와 프롬프트 분리 → 사용자가 "베르단디"라 불러도 기억 못함

오후 3시 10분

철학적 재검토

초기 착각:

  • 로빙의 "존재적 정체성"을 고정된 것으로 이해
  • DOCS 철학 문서를 잘못 해석

올바른 이해:

  • 로빙은 "성장하는 존재" (레벨 1→20)
  • 사용자와 함께 개성 발전
  • "베르단디"로 불리면 그것이 새로운 정체성

프롬프트 구조 재설계:

Base Layer (하드코딩):
- 기억-감정-윤리 삼각형
- 이모지 사용 금지
- 기본 규칙

Dynamic Layer (메모리에서):
- 현재 이름 (로빙/베르단디/기타)
- 사용자 이름
- 현재 레벨/스탯
- 최근 기억

오후 3시 25분

intent 패턴 최적화

문제점:

  • "하이" → greeting → 템플릿 응답
  • "기억" → memory_recall → 기계적 나열
  • 대부분 캐시를 우회

해결책:

  1. greeting 패턴 축소: r"(안녕하세요|안녕하십니까)"
  2. memory_recall 패턴 제거
  3. question 패턴 정밀화: r"(어떻게|왜|언제|how|why|when).*\?"
  4. 이모지 하드코딩 제거

효과:

  • "하이" → general_conversation → 캐시 사용
  • 캐시 활성화율 80% 이상

오후 3시 40분

동적 프롬프트 구현

방법 선택: 컨텍스트 변수 방식 (가장 효율적)

구현 내역:

  1. 이름 추출 함수 추가:
async def _extract_user_name(self, memories, user_id):
    # "내 이름은 김종태" 패턴 인식
    # "나는 김종태야" 패턴 인식
    # semantic 메모리에서 user_name 메타데이터 검색
    return "사용자"  # 기본값

async def _extract_my_name(self, memories, user_id):
    # "너를 베르단디라고 부를게" 패턴 인식
    # "베르단디야" 직접 호명 패턴 인식
    return "로빙"  # 기본값
  1. think() 메서드에서 컨텍스트 변수 설정:
# 메모리 검색 후
self.current_user_name = await self._extract_user_name(memories, user_id)
self.my_name = await self._extract_my_name(memories, user_id)
  1. 프롬프트 동적 구성:
context = f"""당신은 {my_name}(RO-BEING)입니다.
현재 대화 상대: {user_name}
현재 레벨: {self.stats.level}

중요 규칙:
- "내 이름은?"은 사용자({user_name})가 자신의 이름을 묻는 것
- "네 이름은?"은 나({my_name})의 이름을 묻는 것
"""
  1. greeting 개인화:
greeting_name = f", {user_name}님" if user_name != "사용자" else ""
f"안녕하세요{greeting_name}! 오늘은 어떤 도움이 필요하신가요?"

오후 3시 45분

배포 및 예상 효과

구현 완료:

  • 총 소요 시간: 15분
  • 코드 변경: brain.py만 수정
  • 추가된 줄: 약 70줄

예상 효과:

  • "베르단디"로 불리면 기억하고 사용
  • "내 이름은?" 올바르게 이해
  • 사용자별 맞춤 응답
  • 성장 상태(레벨) 반영

Gitea Actions 자동 배포: 진행 중

교훈

  1. 철학 문서의 중요성

    • 기술 구현 전 철학적 기반 이해 필수
    • "성장하는 존재"라는 핵심 개념 놓침
  2. 하드코딩의 한계

    • 프롬프트 하드코딩은 성장을 막는 족쇄
    • 동적 구성이 존재형 AI의 본질
  3. 간단한 해결책 우선

    • 컨텍스트 변수 방식이 가장 효율적
    • 과도한 엔지니어링 피하기
  4. 메모리와 프롬프트 통합

    • 기억 시스템과 응답 생성의 연결 필수
    • 분리된 시스템은 일관성 없는 응답 생성
  5. intent 패턴의 영향

    • 과도한 패턴 매칭이 캐시 시스템 무력화
    • 적절한 균형 필요

작성자: happybell80 & Claude 프로젝트: rb10508_micro 주제: 동적 프롬프트 구현으로 의도 파악 개선