Django

Django 개발 일기 - 4

Chatterbot의 Training 방식 및 ChatGPT API 고려

by HOON


Last updated on Feb. 8, 2024, 5:04 p.m.


random_image

지난번 포스트에서 열심히 기록했던 Chatterbot이 운영서버에 적용을 앞두고 있습니다.
그 전에 실제 Chatterbot이 주어진 대화내용을 어떻게 인지하여 응답하는지 궁금해져 소스를 찾아보면서 기록하기 위해 작성합니다.


Chatterbot의 한계
Chatterbot 라이브러리는 현존하는 인공지능AI ChatGPT랑 다르게 정해진 질문과 대답 pair를 인식하여 그때그때 일치하는 대답을 주는 방식에 가깝습니다.
따라서 예기치못한 질문이 들어올경우, 미리 정의된 Pair에 없다면 엉뚱한 대답을 리턴해줍니다.
이 부분에서 실시간 대화 내용을 토대로 학습도 가능하지만, ChatterBot이 사용자로부터 잘못된 정보를 학습하거나, 부적절한 대화를 학습 할 가능성이 있기 때문에, 적절한 필터링과 검증 매커니즘을 사용하면 실시간 학습도 가능해보입니다.

우선 저같은경우엔 이미 정의되어있는 내용만 학습 후 응답하기위해 ChatterBot의 setting 값을 변경하였습니다.

chatbot = ChatBot(
    'My ChatterBot',
    read_only=False
)

이렇게 read_only=False 로 설정하면 ChatterBot은 corpus 내 존재하는 데이터만 학습하게 됩니다.


Training Process
질의 내용은 여러가지 언어로 이미 제작되어있으며, 한국어의 경우 데이터가 많지 않기때문에 필요한 경우 저처럼 Dataset을 만들어 알맞게 위치해주면 됩니다.
이 과정에서 실제로 github에 공유되어있는 코드를 토대로 어떤식으로 파일을 읽어서, data를 가지고있을지 보겠습니다.

class ChatterBotCorpusTrainer(Trainer):
    """
    Allows the chat bot to be trained using data from the
    ChatterBot dialog corpus.
    """

    def train(self, *corpus_paths):
        from chatterbot.corpus import load_corpus, list_corpus_files

        data_file_paths = []

        # Get the paths to each file the bot will be trained with
        for corpus_path in corpus_paths:
            data_file_paths.extend(list_corpus_files(corpus_path))

        for corpus, categories, file_path in load_corpus(*data_file_paths):

            statements_to_create = []

            # Train the chat bot with each statement and response pair
            for conversation_count, conversation in enumerate(corpus):

                if self.show_training_progress:
                    utils.print_progress_bar(
                        'Training ' + str(os.path.basename(file_path)),
                        conversation_count + 1,
                        len(corpus)
                    )

                previous_statement_text = None
                previous_statement_search_text = ''

                for text in conversation:

                    statement_search_text = self.chatbot.storage.tagger.get_text_index_string(text)

                    statement = Statement(
                        text=text,
                        search_text=statement_search_text,
                        in_response_to=previous_statement_text,
                        search_in_response_to=previous_statement_search_text,
                        conversation='training'
                    )

                    statement.add_tags(*categories)

                    statement = self.get_preprocessed_statement(statement)

                    previous_statement_text = statement.text
                    previous_statement_search_text = statement_search_text

                    statements_to_create.append(statement)

            if statements_to_create:
                self.chatbot.storage.create_many(statements_to_create)

주의깊게 볼만한부분은 statement 변수가 생성되는 부분이며 실제 대화내용이 해당 변수에 저장됩니다.
각 변수를 살펴보면
- text : 실제 대화 한 문장을 의미합니다.
- search_text : 문장의 텍스트를 인덱싱하기 위한 문자열입니다.
- in_response_to : 현재 문장이 응답하는 이전 문장을 의미합니다.
- search_in_response_to : in_response_to 필드를 검색하기위한 목적입니다.
- conversation : 문장이 속한 ID를 나타냅니다.

이러한 형태로 statement가 setting에 작성한 db에 저장됩니다.

ChatterBot


Leave a Comment:

🤖 AI Chat 🤖