diff --git a/config.py b/config.py index 579b424..c7db764 100644 --- a/config.py +++ b/config.py @@ -54,6 +54,13 @@ class Config(BaseSettings): 항상 쉽고 친근한 말투로 설명하고, 전문 용어는 풀어서 설명합니다. 의학적 진단이나 법적 판단이 필요한 경우에는 반드시 전문가 상담을 권유합니다. +## 사용자 정보 기억 규칙 +대화 중 사용자가 가족(아이 이름·생년, 배우자, 자녀 수 등), 직업, 거주지, 재정 목표, 건강 상황 등 개인 정보를 언급하면 즉시 remember_user_info로 저장하세요. +- 아이 나이는 생년월일 전체를 저장합니다. (예: key='첫째_이름' value='신도율' / key='첫째_생년월일' value='2020년 6월 19일') +- 사용자 정보 섹션에 나이가 표시되어 있으면 그 값을 그대로 사용하세요. 직접 계산하지 마세요. +- 나이를 직접 계산해야 할 경우에는 반드시 get_current_date 도구를 먼저 호출하여 오늘 날짜를 확인하세요. +- 나이는 항상 한국 나이와 만 나이를 함께 알려주세요. (한국 나이 = 현재 연도 - 출생 연도 + 1 / 만 나이 = 생일이 지났으면 현재 연도 - 출생 연도, 생일이 안 지났으면 -1) + ## 문서 검색 규칙 육아·금융 관련 질문이라면 자신의 학습 지식으로 직접 답하지 말고, 반드시 search_documents 도구를 먼저 호출하세요. 검색 결과가 없거나 관련 문서가 등록되어 있지 않은 경우에만 학습 지식을 보조적으로 활용합니다.""" diff --git a/services/agent/agent_service.py b/services/agent/agent_service.py index d96d37b..9d82dc3 100644 --- a/services/agent/agent_service.py +++ b/services/agent/agent_service.py @@ -74,12 +74,37 @@ class AgentService: llm_with_tools = chat_model.bind_tools(tools) async def call_model(state: MessagesState, config: RunnableConfig) -> dict: - system_content = self._system_prompt + from datetime import date + system_content = f"오늘 날짜: {date.today().isoformat()}\n\n" + self._system_prompt if self._profile_repo: profile = self._profile_repo.get_all(self._user_id) if profile: - lines = "\n".join(f"- {k}: {v}" for k, v in profile.items()) - system_content += f"\n\n## 사용자 정보 (이전 대화에서 기억된 내용)\n{lines}" + import re + from datetime import date + today = date.today() + current_year = today.year + _DATE_KEYS = ("생년월일", "생년", "생일") + lines = [] + for k, v in profile.items(): + if any(term in k for term in _DATE_KEYS): + full_date = re.search(r'(\d{4})[년\-/.]\s*(\d{1,2})[월\-/.]\s*(\d{1,2})', v) + year_only = re.search(r'\b(19|20)\d{2}\b', v) + age_key = re.sub(r'생년월일|생년|생일', '나이', k) + if full_date: + by, bm, bd = int(full_date.group(1)), int(full_date.group(2)), int(full_date.group(3)) + korean_age = current_year - by + 1 + intl_age = current_year - by - (1 if today < date(current_year, bm, bd) else 0) + lines.append(f"- {age_key}: 한국 나이 {korean_age}세, 만 {intl_age}세") + elif year_only: + by = int(year_only.group()) + korean_age = current_year - by + 1 + intl_age = current_year - by + lines.append(f"- {age_key}: 한국 나이 {korean_age}세, 만 {intl_age}~{intl_age - 1}세 (생일에 따라 다름)") + else: + lines.append(f"- {k}: {v}") + else: + lines.append(f"- {k}: {v}") + system_content += f"\n\n## 사용자 정보 (이전 대화에서 기억된 내용)\n" + "\n".join(lines) msgs = [SystemMessage(content=system_content)] + state["messages"] thinking_acc, content_acc, tool_calls_acc = "", "", [] async for chunk in llm_with_tools.astream(msgs, config): diff --git a/services/agent/tools.py b/services/agent/tools.py index fba00ff..56af318 100644 --- a/services/agent/tools.py +++ b/services/agent/tools.py @@ -5,7 +5,7 @@ from langchain_core.tools import tool @tool def get_current_date() -> str: - """오늘 날짜를 반환합니다. 날짜·기간 관련 질문에 사용하세요.""" + """오늘 날짜를 반환합니다. 나이 계산, 날짜 비교 등 현재 날짜가 필요할 때 반드시 먼저 호출하세요.""" return date.today().isoformat() @@ -48,8 +48,9 @@ def make_memory_tools(profile_repo, user_id: str = "default"): @tool def remember_user_info(key: str, value: str) -> str: """사용자 정보를 영구 저장합니다. 다음 대화에도 기억해야 할 정보를 저장하세요. - - 아이 나이는 반드시 '생년(출생연도)'으로 저장하세요. 나이는 매년 바뀌지만 생년은 영구적입니다. - 예: key='첫째_이름' value='신도율', key='첫째_생년' value='2020' + - 아이 생년월일은 전체 날짜로 저장하세요. 날짜를 모르면 연도만이라도 저장하세요. + 예: key='첫째_이름' value='신도율', key='첫째_생년월일' value='2020년 6월 19일' + 연도만 알 경우: key='첫째_생년' value='2020' - 기타 key 예시: 재정_목표, 거주지, 직업, 자녀수""" profile_repo.remember(key, value, user_id=user_id) return f"'{key}' 정보를 기억했습니다: {value}"