Разработка собственного чат-бота с искусственным интеллектом для конкретных случаев использования

Обзор

Если вы не живете под скалой, вы, возможно, играли с ChatGPT или Bard, и я уверен, что вы были очарованы человеческим разговором, который могут генерировать эти модели. Возможно, вы думаете о том, чтобы получить доступ к API и поэкспериментировать с вариантами использования в вашем бизнесе. Однако, как и во всем остальном, для утверждения бюджета вам, вероятно, будет поручено создать доказательство концепции, демонстрирующее ценность, которую эти диалоговые боты с искусственным интеллектом могут принести вашей организации.

В этом примере я покажу вам, как быстро создать диалогового ИИ-бота / ИИ-чатбота, используя DialoGPT и трансформеры PyTorch Hugging Face 🤗. DialoGPT — это крупномасштабная предварительно обученная модель генерации диалоговых ответов. Это модель на основе GPT2, обученная на 147 миллионах диалоговых обменов, извлеченных из Reddit. Эта модель не поразит вас так сильно, как GPT-4, но, в зависимости от вашего варианта использования, она делает довольно приличную работу.

Чат-бот с искусственным интеллектом, который я создаю в этом примере, будет отвечать на вопросы о соблюдении стандартов признания доходов. Мы будем использовать DialoGPT для обычного разговора, но мы перенаправим вопросы, связанные с соблюдением требований по признанию доходов, к модели текстового классификатора, которую я создал ранее. Вы можете прочитать больше о том, как построить модель классификатора текста здесь.

Переходим к модели 🚀🚀😀.

Шаг 1. Импортируйте необходимые библиотеки

#import required libraries
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import pickle
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize

Шаг 2. Импорт пакетов для предварительной обработки текста для классификатора (T)

# import packages to preprocess text
nltk.download('stopwords')
nltk.download('wordnet')
nltk.download('punkt')
nltk.download('omw-1.4')

Этот шаг является необязательным, так как он требуется только для предварительной обработки текста для подачи в модель классификатора. Если ваш вариант использования не включает модель классификатора, вам не нужно выполнять этот шаг для чат-бота с искусственным интеллектом. Я буду отмечать все шаги, необходимые только для модели классификатора (T).

Шаг 3. Импорт стоп-слов и лемматизатора (T)

# Define stop words to be removed
stop_words = set(stopwords.words('english'))

# Initialize lemmatizer
lemmatizer = WordNetLemmatizer()

Шаг 4. Определите функцию для предварительной обработки данных для текстового классификатора (T)

# Define function to preprocess text data
def preprocess_text(text):
    # Convert to lowercase
    text = text.lower()
   
    # Remove non-alphanumeric characters
    text = re.sub(r'[^a-zA-Z0-9\s]', '', text)
   
    # Tokenize text into words
    words = word_tokenize(text)
   
    # Remove stop words
    words = [word for word in words if word not in stop_words]
   
    # Lemmatize words
    words = [lemmatizer.lemmatize(word) for word in words]
   
    # Join words back into text
    text = ' '.join(words)
   
    return text

Шаг 5. Загрузите DialoGPT

# Load the DialoGPT 
chatbot_name = "microsoft/DialoGPT-medium"
chatbot_tokenizer = AutoTokenizer.from_pretrained(chatbot_name, padding_side='left')
chatbot_tokenizer.add_special_tokens({'pad_token': chatbot_tokenizer.eos_token})  # Add a new pad token
chatbot_model = AutoModelForCausalLM.from_pretrained(chatbot_name)

В этом примере мы используем среду DialoGPT. Согласно Microsoft, результаты оценки модели человеком показывают, что ответ, сгенерированный DialoGPT, сравним с качеством ответа человека в тесте Тьюринга с однократным разговором. Из приведенных ниже ответов вы увидите, что модель генерирует достойные человеческие ответы.

Шаг 6. Загрузите классификационную модель ASC606 (T)

# Load the ASC606classification model
model_path = "./Python/ASC606/asc606.pkl"
# Load the model
with open(model_path, 'rb') as file:
    asc606_classifier = pickle.load(file)

Вы можете заменить этот шаг любой другой моделью для вашего варианта использования, которую вы хотели бы вызвать.

Шаг 7. Определите функцию, которая будет генерировать ответ от нашего чат-бота с искусственным интеллектом

# Function to generate chatbot response
def generate_response(input_text):
    bot_input_ids = chatbot_tokenizer.encode(input_text + chatbot_tokenizer.eos_token, return_tensors='pt', padding=True)
    chatbot_output = chatbot_model.generate(bot_input_ids, max_length=1000, num_return_sequences=1)
    chatbot_response = chatbot_tokenizer.decode(chatbot_output[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True)
    return chatbot_response

Шаг 8. Определите функцию для прогнозирования соответствия признанию доходов с помощью предварительно обученной модели (T)

# Function to classify the revenue recognition standard using trained model
def classify_standard(text):
    # Preprocess the text
    preprocessed_text = preprocess_text(text)

    # Use the ASC606 classifier model for classification
    predicted_class = asc606_classifier.predict([preprocessed_text])[0]
    return predicted_class

Вы можете заменить этот шаг генерацией прогнозов с использованием модели для вашего конкретного варианта использования.

Шаг 9. Векторизация текста для подачи в модель классификатора (T)

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()

with open('./Python/ASC606/vec_lib.pkl', 'rb') as f:
    vectorizer.vocabulary_ = pickle.load(f)

Шаг 10. Определение функции для нашего чат-бота с искусственным интеллектом

def chat():
    print("606Bot: Hello! How can I assist you today?")
    while True:
        user_input = input("User: ")
        
        if user_input.lower() == "end chat":
            print("606Bot: Goodbye! Have a great day!")
            break
        
        if "asc606" in user_input.lower():
            if "compliance with asc606" in user_input.lower():
                # Extract the text in quotes
                question = re.search(r'"([^"]*)"', user_input)
                if question:
                    text_to_classify = question.group(1)
                    # Preprocess the text
                    preprocessed_text = preprocess_text(text_to_classify)
                    vectorized_text = vectorizer.transform([preprocessed_text])
                    vectorized_text = vectorized_text.reshape(1, -1)
                    # Use the multinomial classification model
                    classification_result = asc606_classifier.predict(vectorized_text)
                    if classification_result == 1:
                        print("606Bot: Yes, it is in line with ASC606.")
                    else:
                        print("606Bot: No, it is not in line with ASC606.")
                else:
                    print("606Bot: I'm sorry, I couldn't find a valid question in your input.")
            else:
                print("606Bot: How can I assist you with ASC606?")
        else:
            response = generate_response(user_input)
            print("606Bot:", response)

В этой функции мы делаем следующее:

  • Предоставление стандартного сообщения для отправки чат-ботом в начале.
  • Условие для проверки, если пользователь задает какой-либо вопрос в отношении ASC606, то передает текст через модель классификатора ASC606, в противном случае пропуская текст через обычный экземпляр DialoGPT.
  • Если пользователь пишет «Завершить чат», сеанс чата завершается.

Шаг 11. Отключение регистрации сообщений об ошибках (необязательно)

import logging

def set_global_logging_level(level=logging.ERROR, prefices=[""]):
    """
    Override logging levels of different modules based on their name as a prefix.
    It needs to be invoked after the modules have been loaded so that their loggers have been initialized.

    Args:
        - level: desired level. e.g. logging.INFO. Optional. Default is logging.ERROR
        - prefices: list of one or more str prefices to match (e.g. ["transformers", "torch"]). Optional.
          Default is `[""]` to match all active loggers.
          The match is a case-sensitive `module_name.startswith(prefix)`
    """
    prefix_re = re.compile(fr'^(?:{ "|".join(prefices) })')
    for name in logging.root.manager.loggerDict:
        if re.match(prefix_re, name):
            logging.getLogger(name).setLevel(level)

set_global_logging_level(logging.ERROR, ["transformers"])

Это отключает любые сообщения об ошибках от трансформатора, который мы используем.

Шаг 12. Запуск нашего чат-бота с искусственным интеллектом

# Start the chatbot
chat()

Ниже вы можете увидеть ответ нашего чат-бота в текстовом и графическом виде.

606Bot: Hello! How can I assist you today?
User: How are you?
606Bot: I'm good, how are you?
User: I am great. I would like some assistance with ASC606 today
606Bot: How can I assist you with ASC606?
User: Is the following in compliance with ASC606: "Subscription revenue is recognized ratably over the life of the contract"
606Bot: Yes, it is in line with ASC606.
User: I have another question
606Bot: What is your question?
User: Is the following in compliance with ASC606 "
606Bot: I'm sorry, I couldn't find a valid question in your input.
User: Is the following in compliance with ASC606: "revenue is recognized upon receipt of payment, regardless of contract start and end dates"
606Bot: No, it is not in line with ASC606.
User: Thank you for your help
606Bot: No problem, I hope you get it sorted out.
User: End chat
606Bot: Goodbye! Have a great day!

Заключение

Как вы можете видеть из взаимодействия с нашим ИИ-чат-ботом выше, разговор довольно приличный и похож на человеческий, и вы можете легко реализовать его для конкретного случая использования, когда вы используете свою пользовательскую модель для ответа на определенные экспертные запросы, но используя предварительно обученная диалоговая модель для обработки оставшегося разговора.

В этом примере мы использовали DialoGPT, но вы можете очень легко реализовать любую другую модель, включая GPT-3.5 или GPT-4. Однако, если вы реализуете чат-бота с искусственным интеллектом для определенного варианта использования, вы, вероятно, захотите, чтобы он был слишком диалоговым, если только вы не хотите увеличивать затраты на вычисления и затраты на API 😊.

Если вам понравилась статья, хлопните в ладоши и подпишитесь на меня в Medium и LinkedIn, чтобы оставаться на связи.

Дополнительные инструменты и ресурсы ➡️ Посетите StartupStash
Zendesk дарит стартапам кредиты и привилегии на сумму 75 000 долларов США! ➡️ Подать заявку!