머신러닝

이야기 챗봇 구현-4

content0474 2024. 11. 28. 11:13

이야기 챗봇 구현-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)

더보기
load_index() 함수를 호출해서 인덱스를 만들고 rag_chain을 초기화함앞에서 이미 다룬 부분

 

    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'로 응답해주세요.")

더보기
하나의 이야기가 끝나면 사용자에게 새로운 이야기를 들은건지 물어보고듣고싶다고 하면 가장 바깥의 while문으로 돌아가 다시 듣고싶은 주제를 물어보고 주제검색 또는 이야기 랜덤뽑기

 

현재까지 코드의 문제점:

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