2025. 1. 22. 20:56ㆍProject Log/학부 졸업프로젝트
Conceptual Design?
교수님께서 Conceptual Design, Logical Design, Physical Design에 대해 설명해 주셨다. 지난 포스팅에서 서버리스 아키텍처 초안을 올렸다. 인프라는 AWS 서비스들을 주로 활용하므로, 내가 그렸던 아키텍처는 Logical Design에 해당한다.
2025.01.15 - [Project Log/학부 졸업프로젝트] - 교수님 면담 후 생각 정리 (3): Monitoring/Analyzer/Advisor & 'Event'의 의미
지난번에 보여주셨던 Monitoring, Analyzer, Advisor 등으로 구성된 설계가 바로 Conceptual Design이다. 이 그림을 다시 보여주셔서, '우리 팀의 서비스 구체화가 더 필요하구나'라고 생각했다.
피그마에 교수님이 주신 Conceptual Design 틀을 놓고, 회의를 하면서 각 컴포넌트의 세부 사항을 적어보았다.
전반적인 내용을 아래와 같이 잡아놓고, 나는 Mental Health Monitoring과 Daily Activity Monitoring 요소와 구현 방법 탐색을 맡았다.
GPT를 통한 Mental Health Monitoring
A. 하루 동안 느낀 기분 파악
gpt-4 모델을 사용하여, 답변을 테스트했다. USER_CONTEXT에 나이, 성별, 활동량, 질환 정보를 입력하여 프롬프트에 포함했다. 사용자가 노인정에 가서 트로트를 불러서 재밌었다고 했는데, 모든 정보를 고려하느라 맥락에 맞지 않는 잠 이야기를 꺼내고 있다.
활동량과 질환 정보를 제거했는데도 대화에 어색한 면이 있다. 재밌었다는 사실에 호응만 해도 괜찮은데, 재미가 없다면 다른 취미를 찾아보라는 과한 조언을 한다. 시스템 역할에 조언을 제공하라고 해서 그런 듯하다. 사용자를 지칭하는 단어도 '할머니', '할아버지'보다는 '어르신'이라고 정중하게 부르는 게 좋을 것 같다.
시스템 역할을 '조언' 대신 '대화'로 수정하니 대화 맥락을 벗어나는 과한 조언을 하지 않았다. 사용자 호칭도 어르신으로 잘 부르고, 어떤 노래를 불렀는지 대화를 이어가는 말도 한다.
B. 행복감을 주는 요소 파악
행복한 기분을 만드는 요소에 공감하고, 다음에도 이러한 활동을 하도록 권유한다.
C. 스트레스 요인 파악
자식처럼 친밀한 대화를 하라고 했더니, GPT가 자신을 자식으로 인식했다. 자식에게 요즘 연락이 없다고 하니, 자기가 여기 있다고 응답했다.
D. 발화 내용에서 긍정적 단어 / 부정적 단어 추출
프롬프트에 포함되는 STYLE 정보에서 '자식처럼 친밀한 대화'를 '친밀한 대화'로 수정했다. 위의 사진처럼 자신을 자식으로 착각하지 않고, 연락을 권유하면서 스트레스 요인을 해소할 방법을 제시하고 있다.
사용자의 말에서 긍정적 단어와 부정적 단어를 추출하는 함수를 만들어 보았다. 이 함수도 GPT에게 단어를 추출하는 업무를 주고, 데이터의 포맷도 지정하였다. 문자열 응답을 json 형태로 변환하고, 새로운 단어 리스트를 추출하여 전역 변수인 positive_word와 negative_word에 추가한다.
😋 Mental Health Monitoring 전체 코드 및 실행 결과
다른 사람들이 함수의 컨셉을 이해하기 쉽도록, 각 함수에 docstring을 추가하며 정리했다. 실행 결과는 아래와 같다.
mental_health_monitoring.py
from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
import os
from typing import List
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def chat_completion(system_role, prompt, model="gpt-4", temperature=0):
"""
GPT에 프롬프트를 제공하고 응답을 받는 함수.
Args:
system_role: GPT 시스템 역할
prompt: 프롬프트
model: GPT 모델명
temperature: 응답의 무작위성 설정 (0은 반복적이고 일관된 답변 생성)
Returns:
gpt_response: GPT 모델의 응답
"""
messages = [{"role": "system", "content": system_role},]
messages.append({"role": "user", "content":prompt})
res = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
)
gpt_response = res.choices[0].message.content
return gpt_response
positive_word = []
negative_word = []
def count_pn_word(user_input):
"""
사용자의 말에서 긍정적 단어와 부정적 단어를 추출하는 함수.
전역 변수 positive_word, negative_word에 단어를 추가함.
Args:
user_input: 사용자의 말
Returns:
None
"""
system_role = """당신은 사람의 말로부터 심리를 분석하는 사람입니다.
당신의 임무는 UTTERANCE로부터 긍정적 단어와 부정적 단어를 추출하는 것입니다.
당신은 지침을 따라야 합니다: DATA_FORMAT."""
data_format = {"긍정": ["단어1", "단어2", "단어3"], "부정": ["단어1", "단어2", "단어3"]}
prompt = f'UTTERANCE: {user_input}\nDATA_FORMAT: {data_format}'
response = chat_completion(system_role, prompt)
json_response = eval(response)
positive_word.extend(json_response.get("긍정", []))
negative_word.extend(json_response.get("부정", []))
def daily_emotion(user_context: List[str], length: int, style: str):
"""
하루 동안 느낀 기분을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 마음 건강 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 하루 동안 느낀 기분 파악 ***")
print("챗봇: 안녕하세요 어르신~ 오늘 기분이 어떠신가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def happiness(user_context: List[str], length: int, style: str):
"""
행복감을 주는 요소를 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 마음 건강 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 행복감을 주는 요소 파악 ***")
print("챗봇: 오늘 하루 중 가장 행복했던 순간을 떠올려주실 수 있나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def stress(user_context: List[str], length: int, style: str):
"""
스트레스 요인을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 마음 건강 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 스트레스 요인을 파악 ***")
print("챗봇: 안녕하세요 어르신~ 오늘 특별히 힘들었던 순간이나 걱정되었던 일이 있으셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def main():
daily_emotion(["70세", "여성"], 20, "친밀한 대화")
happiness(["80세", "남성"], 20, "친밀한 대화")
stress(["60세", "여성"], 20, "친밀한 대화")
print("Positive word: ", positive_word)
print("Negative word: ", negative_word)
if __name__ == "__main__":
main()
GPT를 통한 Daily Activity Monitoring
A. 식사 패턴 파악 (식사 여부, 섭취량, 식사 시간)
<식사 여부>
datetime 라이브러리를 임포트하여 current_time에 현재 시각을 저장한다. current_time이 속하는 범위에 따라 meal에 아침, 점심, 저녁 문자열 중 하나를 저장한다. 현재 시각에 맞게 "OO 식사는 하셨나요?"라고 할 수 있다.
<섭취량>
이슈는 없었다. 식사량을 파악하고, 더부룩하다는 말에 해결 방안도 제시했다.
<식사 시간>
어르신 질문에만 현재 시각에 맞는 식사 정보(아침, 점심, 저녁)를 주고, 프롬프트에 포함하지 않으면 아래와 같은 결과가 나온다. 그래서 식사 관련 함수 모두 시스템 역할과 프롬프트에 MEAL 정보를 추가했다.
<실행 결과>
B. 일상생활 파악 (일과, 목표 달성, 익일 계획, 인간관계)
앞서 나온 코드 패턴이 반복되기 때문에, 여기서부터는 특이 사항이 없으면 실행 결과만 기록한다. 전체 코드는 포스팅 끝부분에 있다.
<실행 결과>
C. 수면 상태 파악 (수면의 질과 컨디션, 영향 요인)
수면 상태 모니터링은 Fitbit 데이터를 함께 고려하는 편이 좋겠다고 판단했다. 함수의 파라미터, 시스템 역할, 프롬프트에 Fitbit 데이터를 활용하도록 수정했다. 함수를 호출할 때, 수면 점수와 단계별 수면 시간 데이터를 제공했다.
<실행 결과>
D. 운동 소감 파악 (즐거운 점, 힘든 점)
<실행 결과>
E. 데일리 미션 달성 파악 (미션을 달성하지 못한 이유)
의미가 모호하고, 미션 달성에 대한 동기부여가 부족한 답변이 나왔다.
시스템에 미션 달성을 할 수 있도록 동기 부여하는 역할을 추가했다.
<실행 결과>
😋 Daily Activity Monitoring 전체 코드
daily_activity_monitoring.py
from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
import os
from typing import List
from datetime import datetime
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def chat_completion(system_role, prompt, model="gpt-4", temperature=0):
"""
GPT에 프롬프트를 제공하고 응답을 받는 함수.
Args:
system_role: GPT 시스템 역할
prompt: 프롬프트
model: GPT 모델명
temperature: 응답의 무작위성 설정 (0은 반복적이고 일관된 답변 생성)
Returns:
gpt_response: GPT 모델의 응답
"""
messages = [{"role": "system", "content": system_role},]
messages.append({"role": "user", "content":prompt})
res = client.chat.completions.create(
model=model,
messages=messages,
temperature=temperature,
)
gpt_response = res.choices[0].message.content
return gpt_response
positive_word = []
negative_word = []
def count_pn_word(user_input):
"""
사용자의 말에서 긍정적 단어와 부정적 단어를 추출하는 함수.
전역 변수 positive_word, negative_word에 단어를 추가함.
Args:
user_input: 사용자의 말
Returns:
None
"""
system_role = """당신은 사람의 말로부터 심리를 분석하는 사람입니다.
당신의 임무는 UTTERANCE로부터 긍정적 단어와 부정적 단어를 추출하는 것입니다.
당신은 지침을 따라야 합니다: DATA_FORMAT."""
data_format = {"긍정": ["단어1", "단어2", "단어3"], "부정": ["단어1", "단어2", "단어3"]}
prompt = f'UTTERANCE: {user_input}\nDATA_FORMAT: {data_format}'
response = chat_completion(system_role, prompt)
json_response = eval(response)
positive_word.extend(json_response.get("긍정", []))
negative_word.extend(json_response.get("부정", []))
def current_meal():
"""
현재 시간에 따라 아침, 점심, 저녁 문자열을 반환하는 함수.
Args:
None
Returns:
meal: 현재 시간이 속하는 범주 (아침, 점심, 저녁)
"""
current_time = datetime.now().time()
if current_time.hour < 11: # 00:00 ~ 10:59
meal = "아침"
elif current_time.hour < 17: # 11:00 ~ 16:59
meal = "점심"
else: # 17:00 ~ 23:59
meal = "저녁"
return meal
def meal_status(user_context: List[str], length: int, style: str):
"""
현재 시간에 따라 아침, 점심, 저녁 식사 여부를 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
현재는 MEAL 식사 시간입니다.
사용자를 부르는 호칭은 '어르신'입니다."""
meal = current_meal()
print("*** 식사 여부 파악 ***")
print(f"챗봇: 안녕하세요 어르신~ {meal} 식사는 하셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\nMEAL: {meal}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def meal_amount(user_context: List[str], length: int, style: str):
"""
현재 시간에 따라 아침, 점심, 저녁 식사량을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
현재는 MEAL 식사 시간입니다.
사용자를 부르는 호칭은 '어르신'입니다."""
meal = current_meal()
print("*** 식사 여부 파악 ***")
print(f"챗봇: {meal} 식사는 알맞은 양으로 드셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\nMEAL: {meal}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def meal_time(user_context: List[str], length: int, style: str):
"""
현재 시간에 따라 아침, 점심, 저녁 식사 시간을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
현재는 MEAL 식사 시간입니다.
사용자를 부르는 호칭은 '어르신'입니다."""
meal = current_meal()
print("*** 식사 시간 파악 ***")
print(f"챗봇: {meal}은 식사 시간에 맞게 드셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\nMEAL: {meal}'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def daily_activity(user_context: List[str], length: int, style: str):
"""
오늘 수행한 주요 활동을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 하루 주요 활동 파악 ***")
print(f"챗봇: 오늘은 무엇을 하셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def goal_achievement(user_context: List[str], length: int, style: str):
"""
오늘의 목표 달성 여부를 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 오늘의 목표 달성 여부 파악 ***")
print(f"챗봇: 오늘 하루의 목표를 이루셨나요? 목표를 이루는 데 어떤 점이 도움이 되셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def next_day_plan(user_context: List[str], length: int, style: str):
"""
내일 활동 계획을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 내일 활동 계획 파악 ***")
print(f"챗봇: 내일은 어떤 활동을 해보고 싶으신가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def relationship(user_context: List[str], length: int, style: str):
"""
인간 관계(자주 만나는 사람)를 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 인간 관계 (자주 만나는 사람) 파악 ***")
print(f"챗봇: 요새 어떤 사람을 가장 자주 만나시나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def sleep_quality_condition(user_context: List[str], length: int, style: str):
"""
수면의 질과 사용자의 컨디션을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 수면의 질과 사용자의 컨디션 파악 ***")
print(f"챗봇: 어젯밤 잘 주무셨나요? 기분이 어떠신가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def sleep_influencing_factor(user_context: List[str], fitbit_sleep: str, length: int, style: str):
"""
수면 데이터를 바탕으로 수면에 영향을 미치는 요인을 파악하는 함수.
Args:
user_context: 사용자 정보
fitbit_sleep: Fitbit의 수면 데이터
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
사용자의 수면 데이터 FITBIT_SLEEP을 고려하십시오.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 수면 데이터를 바탕으로 수면 영향 요인 파악 ***")
print(f"챗봇: 오늘 수면 데이터를 고려했을 때, 잘 못 주무신 것 같네요. 무슨 일이 있으신가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nFITBIT_SLEEP: {fitbit_sleep}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def exercise_enjoy(user_context: List[str], length: int, style: str):
"""
운동할 때 즐거운 점을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 운동할 때 즐거운 점 파악 ***")
print(f"챗봇: 오늘 운동 중에 가장 즐거웠던 순간은 무엇인가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def exercise_challenge(user_context: List[str], length: int, style: str):
"""
운동할 때 힘든 점을 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 운동할 때 힘든 점 파악 ***")
print(f"챗봇: 오늘 운동을 하면서 특별히 힘들었던 점이 있으셨나요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def mission_failure_reason(user_context: List[str], length: int, style: str):
"""
미션을 달성하지 못한 이유를 파악하는 함수.
Args:
user_context: 사용자 정보
length: 응답 단어 수
style: 응답 스타일
Returns:
None
"""
system_role = """당신은 노인을 위한 일일 활동 비서입니다.
당신의 임무는 USER_CONTEXT를 바탕으로 대화를 하는 것입니다.
미션 달성을 부드럽게 권유하고 동기 부여 해야 합니다.
당신은 지침을 따라야 합니다: LENGTH, STYLE.
사용자를 부르는 호칭은 '어르신'입니다."""
print("*** 미션을 달성하지 못한 이유 파악 ***")
print(f"챗봇: 일일 미션을 아직 안 하셨는데, 혹시 이유가 있으신가요?")
print("어르신: ", end="")
user_message = input()
count_pn_word(user_message)
prompt = f'{user_message}\nUSER_CONTEXT: {user_context}\nLENGTH: {length}\nSTYLE: {style}\n'
response = chat_completion(system_role, prompt)
print("챗봇: ", response)
def main():
# 식사 패턴 파악
meal_status(["70세", "여성"], 20, "친밀한 대화")
meal_amount(["70세", "여성"], 20, "친밀한 대화")
meal_time(["70세", "여성"], 20, "친밀한 대화")
# 일상 생활 파악
daily_activity(["85세", "남성"], 20, "친밀한 대화")
goal_achievement(["85세", "남성"], 20, "친밀한 대화")
next_day_plan(["85세", "남성"], 20, "친밀한 대화")
relationship(["85세", "남성"], 20, "친밀한 대화")
# 수면 상태 파악
sleep_quality_condition(["85세", "남성"], 20, "친밀한 대화")
sleep_influencing_factor(["85세", "남성", "불면증 환자"], "{수면 점수: 45점, deep: 1시간, light: 3시간, rem: 1시간, wake: 15분}", 20, "친밀한 대화")
# 운동 소감 파악
exercise_enjoy(["60세", "여성"], 20, "친밀한 대화")
exercise_challenge(["60세", "여성"], 20, "친밀한 대화")
# 데일리 미션 달성 파악
mission_failure_reason(["75세", "남성"], 20, "친밀한 대화")
# 긍정 / 부정 단어 목록
print("Positive word: ", positive_word)
print("Negative word: ", negative_word)
if __name__ == "__main__":
main()
테스트를 통해 알게 된 점 & 활용 방안
- 유저 컨텍스트로 질환과 같은 상세한 건강 정보를 제공하면, 모니터링하려는 부분과 동떨어진 답변을 생성한다. 기분을 파악하라고 했는데 불면증을 어색하게 엮어서 말을 한다. 모든 모니터링 요소에 일관된 유저 컨텍스트를 제공하는 방법은 옳지 않다.
- 활용 방안: 제공한 정보를 빠짐없이 캐치하고 응답에 반영하는 것은 장점이다. 단, 모니터링하려는 정보와 관련이 있는 유저 컨텍스트를 선택적으로 제공해야 한다. 수면 관련 모니터링이면, 수면 질환이나 Fitbit 수면 데이터를 제공하는 것이다.
- 현재 '정해진 질문 제공 - 사용자 응답 - GPT의 응답'만 개별로 테스트했다. 실제 앱에서는 어느 정도 대화를 이어가다가, 다음 필수 모니터링 요소에 대한 질문으로 넘어가야 한다.
- 활용 방안: 대화 턴이 몇 번 이상이면, 다음 요소를 모니터링하는 질문을 던지도록 설계하면 좋을 것 같다. 하지만, 이 부분은 생각을 더 해봐야 한다.
- 대화 흐름을 온전히 GPT에게 맡길 수는 없다. 필수로 수집하고자 하는 정보는 고정 질문을 만들어서 반드시 물어봐야 한다.
- 활용 방안: 필수 질문은 Lex에 Intent를 추가해서 순차적으로 물어보도록 하고, 답변은 GPT 모델에게 요청하면 될 것 같다. 사용자가 매일 반복되는 필수 질문들에 지루함을 느낀다면, 이를 해소할 방법을 찾아야 한다.