문제 해결 과정
1.
user_db 스키마 정의하기
user_db 스키마 정의
2.
situation_db 스키마 정의하기
situation_db 스키마 정의
결과
결과
1.
생각보다 서비스 적으로 대화 생성이 많이 어려운 것 같습니다….
결과 파일
위급상황이 아닌 경우
•
CASE 1
<USER>
이름 : '김철수'
성별 : '남'
생년월일 : '1990-01-01'
전화번호 : '010-1234-5678'
주소 : '서울특별시 강남구'
장애타입 : '지적 장애'
장애등급 : '3급'
보호자 전화번호 : '010-9876-5432'
특이사항 : '주기적인 과잉 행동이 있으나 보호자와의 소통 가능.'
<Situation>
(4, '자해', '스스로를 꼬집는 행동을 반복', FALSE, '경미', '2024-09-12 14:50:00')
<result>
•
CASE 2
<USER>
('박민수', '남', '2000-08-15', '010-1111-2222', '대구광역시 중구', '지적 장애', '2급', '010-2222-3333', '특정 자극에 민감, 밝은 조명에 반응이 심함.')
<Situation>
(8, '타해', '보호자를 밀침', FALSE, '경미', '2024-09-14 09:45:00')
<result>
위급상황인 경우
•
CASE 1
<USER>
('김철수', '남', '1990-01-01', '010-1234-5678', '서울특별시 강남구', '지적 장애', '3급', '010-9876-5432', '주기적인 과잉 행동이 있으나 보호자와의 소통 가능.')
<Situation>
(2, '타해', '옆 사람의 팔을 세게 움켜잡음', TRUE, '심각', '2024-09-11 08:45:00')
<result>
•
CASE 2
<USER>
('박민수', '남', '2000-08-15', '010-1111-2222', '대구광역시 중구', '지적 장애', '2급', '010-2222-3333', '특정 자극에 민감, 밝은 조명에 반응이 심함.')
<Situation>
(9, '응급 상황', '호흡 곤란을 호소함', TRUE, '심각', '2024-09-14 11:00:00')
<result>
현재까지 진행된 코드는 아래와 같습니다.
대화 4단계 과정 소스코드
대화 4단계 과정을 관리하는 코드
DialogueSessionManager.py
import mysql.connector
from record_play import record_audio, play_audio
from CSR import audio_to_text
from Chatbot_240913V import execute_chatbot, emergency_execute_chatbot
from TTS_240914V import text_to_speech
import re
def connect_to_db():
try:
connection = mysql.connector.connect(
host='localhost',
user='hanshin',
password='hanshin2024',
database='user_data'
)
return connection
except mysql.connector.Error as err:
print(f"Error : {err}")
return None
def get_user_data(user_id):
connection = connect_to_db()
if connection is None:
return {'error' : 'User_DB connection 실패'}
try:
cur = connection.cursor(dictionary =True)
# query 설정
query = """
SELECT name, gender, date_of_birth, contact_number, address,
disability_type, disability_grade, emergency_contact, special_notes
FROM users
WHERE user_id = %s
"""
# query 실행
cur.execute(query, (user_id,))
# user_data 내용 변수에 저장
user_data = cur.fetchone()
# 디버깅 출력을 추가
print("get_user_data 반환 값:", user_data)
if user_data:
return user_data
else:
return {'error' : 'User not found'}
except mysql.connector.Error as err:
return {'error' : f"User Data 조회 중 에러 : {err}"}
finally:
if connection.is_connected():
connection.close()
def get_situation_data(event_id):
connection = connect_to_db()
if connection is None:
return {'error' : 'Situation_DB connection 실패'}
try :
cur = connection.cursor(dictionary = True)
query = """
SELECT event_id, user_id, event_type, event_description,
is_emergency, harm_severity, event_timestamp
FROM situations
WHERE event_id = %s
"""
cur.execute(query, (event_id,))
situation_data = cur.fetchone()
if situation_data:
return situation_data
else:
return {'error' : 'Event not found'}
except mysql.connector.Error as err:
return {'error' : f"Situation Data 조회 중 에러 : {err}"}
finally:
if connection.is_connected():
connection.close()
def manage_dialogue_session(user_id, event_id):
user_data = get_user_data(user_id)
situation_data = get_situation_data(event_id)
if not user_data:
return {'error' : 'User not found'}
if not situation_data:
return {'error' : 'Event not found'}
# situation_data 딕셔너리에서 is_emergency 값을 가져오기
# 만약 is_emergency 값이 없으면 default값으로 False를 사용함
is_emergency = situation_data.get('is_emergency',False)
print(f"is_emergency : {is_emergency}")
if is_emergency:
response = generate_emergency_chat(user_data, situation_data)
else:
response = generate_usually_chat(user_data, situation_data)
# 상황이 위급한 상황인 경우 : situation 정보를 바탕으로 바로 chatbot을 시작해서 상황을 해결하기 위한 대화를 생성
def generate_emergency_chat(user_data, situation_data):
try:
chatbot_result = emergency_execute_chatbot(user_data=user_data, situation_data=situation_data)
print(f"chatbot_result : {chatbot_result}")
cleaned_result = clean_chatbot_result(chatbot_result)
print(f"cleand_result : {cleaned_result}")
if chatbot_result:
text_to_speech(text= cleaned_result, user_name=user_data['name'])
else:
print("chatbot 실행 실패")
return None
except Exception as e:
print(f"Error : {e}")
return None
# 상황이 위급하지 않은 상황인 경우 : recording부터 시작해서 사용자의 대화를 받아와서 Chatbot 시작
def generate_usually_chat(user_data, situation_data):
try:
# record_audio()
# play_audio()
# Clova Speech API로 오디오 파일을 텍스트로 변환
text_result = audio_to_text()
# debug 목적
print(f"""user_data : {user_data} \n
situation_data : {situation_data} \n
text : {text_result}""")
if text_result:
chatbot_result = execute_chatbot(user_data=user_data, situation_data=situation_data, text=text_result)
print(f"chatbot_result : {chatbot_result}")
else:
print("오디오 텍스트 변환 실패")
return None
if chatbot_result:
text_to_speech(text = chatbot_result, user_name= user_data['name'])
else:
print("chatbot 실행 실패")
return None
except Exception as e:
print(f"Error : {e}")
return None
def clean_chatbot_result(result):
# 정규 표현식을 사용하여 대괄호와 그 안의 내용 제거
cleaned_result = re.sub(r'\[.*?\]', '', result)
return cleaned_result.strip() # 필요 시 앞뒤 공백도 제거
if __name__ == '__main__':
user_id = 1
event_id = 4 # is_emergency = False
manage_dialogue_session(user_id, event_id)
pass
Python
복사
해결되지 않은 점
•
Controller를 어떻게 구현해야 하는가….
•
싱글턴이 완료되면 멀티턴은 어떻게 구현할 것인가…





