diff --git a/service/auto.py b/service/auto.py index db1dc30..9c8dde2 100644 --- a/service/auto.py +++ b/service/auto.py @@ -54,29 +54,33 @@ def summary_scheduler(rooms): # 채팅 서버로 요약본 업데이트 post_summary_update(room_id, gpt_response_str, parsing_json_response) + # kobart 요약 스케줄러 6시간마다 요약 def kobart_summary_message(quarter_message) -> str: # 파이프라인 설정 pipe = pipeline( - task="text2text-generation", - model="sangsin/kobart-emotional", - tokenizer="sangsin/kobart-emotional", - device_map="auto",) - + task="text2text-generation", + model="sangsin/kobart-emotional", + tokenizer="sangsin/kobart-emotional", + device_map="auto", + ) + out = pipe( - quarter_message, - do_sample=False, - temperature=0.8, - max_length=128, - num_beams=5, - top_k=50, - top_p=0.9, - length_penalty=2.0, - eos_token_id=pipe.tokenizer.eos_token_id, - no_repeat_ngram_size=2,)[0]["generated_text"] + quarter_message, + do_sample=False, + temperature=0.8, + max_length=128, + num_beams=5, + top_k=50, + top_p=0.9, + length_penalty=2.0, + eos_token_id=pipe.tokenizer.eos_token_id, + no_repeat_ngram_size=2, + )[0]["generated_text"] clean = out.split("\n")[0].strip() return clean + def kobart_summary_scheduler(time: str) -> None: # 채팅방 리스트 요청 rooms = requests.get(f"{settings.CHAT_SERVER_URL}/room/list/all", timeout=5).json() @@ -88,32 +92,30 @@ def kobart_summary_scheduler(time: str) -> None: response_data = resp.json() if "today_messages" not in response_data: - response_data["today_messages"] = [] # - - + response_data["today_messages"] = [] # + if "quarter_messages" not in response_data: response_data["quarter_messages"] = [] summary_obj: AssistantSummary = AssistantSummary.model_validate(response_data) - + # 파싱 formatted_quarter_messages = [ f"[{msg.createdAt.strftime('%Y-%m-%d %H:%M:%S')}][{msg.sender.name}] \"{msg.content}\"" - for msg in summary_obj.quarter_messages ] - - if not formatted_quarter_messages: + for msg in summary_obj.quarter_messages + ] + + if not formatted_quarter_messages: print(f"[{room_id}] 요약할 분기 메시지가 없습니다. 요약 생략.") - quarter_summary_sentence = "이 시간대의 요약은 없습니다." + quarter_summary_sentence = "이 시간대의 요약은 없습니다." else: - long_message_string = "\n".join(formatted_quarter_messages) + long_message_string = "\n".join(formatted_quarter_messages) # kobart에 message 전달 -> 요약본 반환 - quarter_summary_sentence = kobart_summary_message(long_message_string) - + quarter_summary_sentence = kobart_summary_message(long_message_string) if len(summary_obj.quarter) < 4: # 현재 길이를 확인하고, 4개까지 부족한 만큼 빈 문자열로 채워 넣습니다. summary_obj.quarter.extend([""] * (4 - len(summary_obj.quarter))) - # 하루의 몇 번째 요청인지 확인하는 로직 if time == "first": summary_obj.quarter[0] = quarter_summary_sentence @@ -123,13 +125,13 @@ def kobart_summary_scheduler(time: str) -> None: summary_obj.quarter[2] = quarter_summary_sentence elif time == "fourth": summary_obj.quarter[3] = quarter_summary_sentence - + # 6시간 요약 업데이트 body = { "roomId": summary_obj.roomId, "persona": [p.model_dump() for p in summary_obj.persona], - "summaries": summary_obj.summaries.model_dump(mode='json'), - "quarter" : summary_obj.quarter + "summaries": summary_obj.summaries.model_dump(mode="json"), + "quarter": summary_obj.quarter, } requests.post( f"{settings.CHAT_SERVER_URL}/summary/update", json=body, timeout=5 @@ -137,7 +139,6 @@ def kobart_summary_scheduler(time: str) -> None: print(f"[{room_id}] kobart 요약 업데이트 완료") - # 매일 채팅방 업데이트 post 함수 def post_summary_update( room_id: str, summary_json_str: str, parsed_summary: AssistantSummary @@ -196,15 +197,13 @@ def summary_prompt(response) -> list[dict]: return [ { "role": "system", - "content": "너는 한국어 어르신 대화 코치이다. 두 어르신의 건강을 고려해 한 문장으로 답한다.", + "content": "너는 숙련된 요약 봇이다.", }, {"role": "user", "content": main_prompt_content}, # {"role": "user", "content": few_shot_example}, ] - - def weekly_summary_scheduler() -> None: rooms = requests.get(f"{settings.CHAT_SERVER_URL}/room/list/all", timeout=5).json() @@ -433,13 +432,11 @@ def yearly_summary_scheduler() -> None: dict(month="1", day="1", hour=5, minute=0), (), ), # 매년 1월1일 05:00 - - ( "kobart_first_summary_job", - kobart_summary_scheduler, + kobart_summary_scheduler, dict(hour=20, minute=24, second=0), - ("first",), + ("first",), ), # 매일 23:55:00 ( "kobart_second_summary_job", @@ -461,13 +458,13 @@ def yearly_summary_scheduler() -> None: ), # 매일 17:55:00 ] -for job_id, func, cron_kwargs, args_tuple in jobs: # args_tuple 추가 +for job_id, func, cron_kwargs, args_tuple in jobs: # args_tuple 추가 trigger = CronTrigger(**cron_kwargs) scheduler.add_job( func, trigger, id=job_id, - args=args_tuple, # <-- 여기에 args 전달 + args=args_tuple, # <-- 여기에 args 전달 replace_existing=True, ) -scheduler.start() \ No newline at end of file +scheduler.start() diff --git a/service/summary.py b/service/summary.py index cdd5aca..7622eeb 100644 --- a/service/summary.py +++ b/service/summary.py @@ -76,20 +76,27 @@ def extract_plain_reply(messages: str) -> str: # 프롬프팅 반환 def user_prompt(response, userId) -> list[dict]: - + print(f"요청한 사람 ID {type(userId)} {type(response.persona[0].id)}") + speaker_persona = None # 현재 대화추천을 요청한 사용자가 누구인지 판단하는 로직 - id = userId - if userId == response.persona[0].id: - speaker = response.persona[0].name - speaker_speech_style = response.persona[0].speech_style + + if userId == str(response.persona[0].id): + print(f"요청한 사람[0] ID실행 {response.persona[0]} \n") + speaker_persona = response.persona[0] + else: - speaker = response.persona[1].name - speaker_speech_style = response.persona[1].speech_style + print(f"요청한 사람[1] ID 실행 {response.persona[1]} \n") + speaker_persona = response.persona[1] + + + speaker_name = speaker_persona.name + print(f"\n최종 말하는 사람이름 {speaker_name}\n") + speaker_speech_style = speaker_persona.speech_style # open ai에 질의 메시지 user_content = f""" ### ROLE - 이번 문장은 {speaker}의 말투({speaker_speech_style})로 작성한다. + 이번 문장은 {speaker_name}의 말투({speaker_speech_style})로 작성한다. ### CRITICAL_FLAGS {response.persona[0].name}의 {response.persona[0].critical_flags} @@ -104,7 +111,7 @@ def user_prompt(response, userId) -> list[dict]: ### TASK 1) 상황 파악 → 사고 단계 기록 2) 반드시 요약에서 2개의 주제 "hobbies_and_interests"와 "relationship_context"를 먼저 파악하라. - 3) 최근 대화에 가장 많은 비중을 두어 {speaker} 입장에서 마지막 발화에 자연스럽게 이어질 한 문장을 작성해야 한다. + 3) 최근 대화에 가장 많은 비중을 두어 {speaker_name} 입장에서 마지막 발화에 자연스럽게 이어질 한 문장을 작성해야 한다. 3) 나머지 요약 내용도 최근 대화에 필요한 내용이라면 참고하여 최고의 한 문장으로 작성해라. 4) 문장을 총 7개 제안 → 셀프체크 후 3개 → 최종 1개 제안 5) JSON 만 출력 @@ -125,6 +132,7 @@ def get_reply(response, userId) -> str: # 프롬프트 생성 messages = user_prompt(response, userId) + print(messages) # open 인스턴스 생성 load_dotenv()