이야기 챗봇 구현-3 에 이어서 작성
이제 최종적으로 앞에서 정의한 함수들을 chatbot() 함수에서 통합하고 대화를 구현해야 한다.
def chatbot():
session_id = str(datetime.now().timestamp())
print(f"세션 ID가 생성되었습니다: {session_id}")
json_files = ["filtered_unsolved_cases.json", "korea_crime.json"]
texts = process_json_data(json_files)
splits = [split.page_content for split in split_texts(texts)]
session_id를 생성하고 json파일을 가져오는 부분
이 때 splits = [split.page_content for split in split_texts(texts)] 는 리스트컴프리핸션 문법인데,
split_texts(texts)가 문장을 쪼개면 그 안의 split에는 텍스트 데이터와 더불어 원본에서의 위치, 문맥정보 등이 들어있을 수 있다. split.page_content는 split에서 텍스트 데이터만 가져온다.
index = load_index()
if index is None:
create_index(splits)
index = load_index()
json_texts = texts
rag_chain = initialize_rag_chain(model, splits)
while True:
print("\n어떤 이야기를 들려드릴까요?")
user_query = input("듣고 싶은 이야기를 입력 (종료하려면 'quit'): ").strip()
if user_query.lower() in ["quit", "종료"]:
print("대화를 종료합니다.")
break
user에게 듣고싶은 이야기 주제를 받아서 story_parts에 전달하면
story_parts함수는 주제에 맞게 검색을 하거나, 랜덤이야기를 가져온다.
try:
story_parts = get_story_parts(user_query=user_query, json_texts=json_texts, rag_chain=rag_chain)
if story_parts is None:
print("이야기를 가져오는 데 실패했습니다. 다시 시도해주세요.")
continue
except Exception as e:
print(f"이야기를 가져오는 중 오류 발생: {e}")
continue
이야기를 가져오거나 예외처리를 하는 코드
for part_name, segment in story_parts.items():
print(f"\n=== {part_name} ===\n")
print(f"이야기꾼: {segment}")
챗봇은 story_parts가 기/승/전/결로 쪼갠 part_name과 각각에 해당하는 이야기인 segment를 받아서 segment를 순서대로 반환한다.
turns = 0
while turns < 2:
turns는 챗봇-사용자간의 대화횟수이다. 최대 2회의 대화를 하고 다음 part로 넘어가도록 설정했다.
문제점: 뭔가 부자연스럽다. 이를 해결할 똑똑한방법이 필요하다.
user_message = input("사용자입력: ")
if user_message.lower() in ["잘들었어", "그만", "quit", "exit"]:
print("대화를 종료합니다.")
return
if user_message.lower() in ["그래서", "next"]:
break
예를 들어 기-승 까지 말했는데 사용자가 그만. 이라고 하면 즉시 이야기를 끝냄
혹은 2턴이 되지 않아도 사용작가 그래서? 라고 하면 바로 다음 part로 넘어감
response = storytelling(part_name=part_name, segment=segment, user_message=user_message)
print(f"이야기꾼: {response}")
save_conversation(session_id, user_message, response)
turns += 1
대화는 모두 저장되고 turn을 하나 올려서 2턴 이내에 대화가 끝나는 로직을 완성시킴
while True:
next_action = input("\n새로운 이야기를 듣고 싶으신가요? (yes: 새 이야기 / no: 종료): ").lower()
if next_action in ["no", "그만", "종료"]:
print("대화를 종료합니다.")
return
elif next_action in ["yes", "새 이야기", "다음 이야기"]:
break
else:
print("잘못된 입력입니다. 'yes' 또는 'no'로 응답해주세요.")
현재까지 코드의 문제점:
1. 랜덤데이터는 잘 뽑아오는데 rag chain 작동시키고 검색하면 오류 발생(string indices must be integers)
2. 속도가 느림
3. 대화가 매끄럽지 않음
4. 데이터셋 전처리 필수
이야기 챗봇 구현-5 에서 계속
'머신러닝' 카테고리의 다른 글
이야기 챗봇 구현-3 (2) | 2024.11.27 |
---|---|
이야기 챗봇 구현-2 (1) | 2024.11.26 |
이야기 챗봇 구현-1 (1) | 2024.11.25 |
LLM과 RAG를 활용한 챗봇 구현-3 (3) | 2024.11.20 |
LLM과 RAG를 활용한 챗봇 구현-2 (0) | 2024.11.19 |