Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 38 additions & 41 deletions service/auto.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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
Expand All @@ -123,21 +125,20 @@ 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
).raise_for_status()
print(f"[{room_id}] kobart 요약 업데이트 완료")



# 매일 채팅방 업데이트 post 함수
def post_summary_update(
room_id: str, summary_json_str: str, parsed_summary: AssistantSummary
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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",
Expand All @@ -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()
scheduler.start()
26 changes: 17 additions & 9 deletions service/summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand All @@ -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 만 출력
Expand All @@ -125,6 +132,7 @@ def get_reply(response, userId) -> str:

# 프롬프트 생성
messages = user_prompt(response, userId)
print(messages)

# open 인스턴스 생성
load_dotenv()
Expand Down