Разработка системы НЛП для разговоров с использованием искусственного интеллекта

Введение

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

Бизнес-проблема

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

Проектирование системы машинного обучения для когнитивного ИИ

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

  • Сообщение пользователя в чат-боте — это входные данные пользователя, которые отправляются чат-боту для обработки и ответа. Это может быть текст, который чат-бот должен понимать и интерпретировать.
  • Автозамена сообщений в чат-боте означает способность чат-бота автоматически исправлять орфографические, грамматические или другие ошибки при вводе данных пользователем. Цель автозамены — повысить точность понимания чат-ботом пользовательского сообщения и обеспечить максимально релевантный ответ.
  • Tоннамерение в контексте чат-бота относится к основной цели или назначению сообщения пользователя. Это намерение стоит за словами, которые пользователь написал чат-боту. Например, пользователь может отправить сообщение чат-боту, чтобы узнать о расписании рейсов, запросить возмещение или запросить помощь в решении проблемы.
  • Сущности – это определенные слова или фразы в сообщении пользователя, имеющие отношение к беседе. Обычно они определяются разработчиком чат-бота и используются для извлечения соответствующей информации из сообщения пользователя. Например, в чат-боте для авиакомпании объектами могут быть номера рейсов, даты, города и аэропорты. Чат-бот может использовать эти объекты, чтобы понять намерения пользователя и предоставить соответствующий ответ. Например, если пользователь спросит: «Каков статус рейса AA123 1 марта?», чат-бот распознает «AA123» как номер рейса и «1 марта» как дату.
  • Создать ответ. Чтобы создать ответ на запрос пользователя, необходимо сначала определить намерение и извлечь необходимые сущности. Затем эти данные можно извлечь из базы данных с помощью вызовов API.

Сбор данных и аннотация

Набор данных классификации намерений

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

На гистограмме выше показано количество запросов на одно намерение для набора данных авиакомпании. Намерение «atis_flight» имеет огромные запросы по сравнению с другими.

Набор данных об авиакомпаниях

Этот набор данных содержит всю информацию об авиакомпаниях, аэропортах и ​​рейсах, которая необходима клиенту (пользователю).

Прикладные варианты использования ИИ для чат-бота

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

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

Автокорректор пользовательских запросов (исправление орфографии)

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

Что такое автокорректор на основе Transformer?

Автокорректор на основе Transformer — это тип модели машинного обучения, использующий архитектуру Transformer для исправления орфографических ошибок в тексте, повышения точности и качества текстовых данных.

Здесь мы использовали предварительно обученную модель обнимающего лица, которая обучена на данных, извлеченных из Википедии. Если вы хотите узнать больше о процессе обучения и реализации, обратитесь к репозиторию Оливергура на GitHub.

Классификация намерений

Следующим действием при создании чат-бота является определение намерения пользователя. Это включает в себя использование методов обработки естественного языка (NLP), чтобы понять, что спрашивает пользователь, и классифицировать запрос в соответствии с конкретным намерением.

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

В приведенной ниже таблице показана информация о модели машинного обучения, которая обучена набору данных классификации намерений ATIS.

В таблице есть 5 моделей ML с их точностью, где модель XG Boost имеет самую высокую точность, которая составляет 96%, за ней следует модель MLP (многослойный персептрон), которая составляет 95%.

Выводы для классификатора намерений

Конвейер выводов использует лучшую модель классификатора и используется в классификации намерений в реальном времени.

#Inferences for Intent Classifier
class IntentClassifier:
    def __init__(self,model,tokenizer):
        self.model=model
        self.tokenizer=tokenizer
        
    def preprocess_query(self, user_query):
        try:
            preprocessed_query=remove_punctuation(user_query)
            preprocessed_query=remove_stopwords(user_query)
            preprocessed_query=stem_words(user_query)
            return preprocessed_query
        except Exception as e:
            print(e)
    
    def tokenization(self,preprocessed_query ):
        try:
            query = self.preprocess_query(preprocessed_query)
            return self.tokenizer.transform([query]).toarray()
        except Exception as e:
            print(e) 
    
    def get_intent(self, query):
        
        intent_name_list = ['atis_abbreviation',
         'atis_aircraft',
         'atis_airfare',
         'atis_airline',
         'atis_flight',
         'atis_flight_time',
         'atis_ground_service',
         'atis_quantity']
        try: 
            if(len(query)==0):
                return -1
            else:
                tokenized_query = self.tokenization(query)
                pred_intent=self.model.predict_proba(tokenized_query)
                intent = intent_name_list[pred_intent.argmax()]
                return intent
        except Exception as e:
            print(e)
        
flight = IntentClassifier(ovr, tfidf_vectorizer)
flight.get_intent('what is the time for delhi to bhopal flight?')           

Распознавание объектов

Распознавание сущностей является ключевым компонентом обработки естественного языка (NLP) и общей функцией диалоговых чат-ботов с искусственным интеллектом. Это относится к процессу идентификации и извлечения определенных элементов значения из ввода пользователя, таких как имена, места, организации, даты и многое другое.

Например, если пользователь говорит: «Мне нужно забронировать рейс в Париж на следующую неделю», распознавание объекта в чат-боте идентифицирует «Париж» как место, а «на следующей неделе» — как дату. Эта информация затем может быть использована для предоставления пользователю соответствующей информации или для выполнения конкретной задачи, такой как поиск вариантов полета в Париж на желаемую дату.

Выводы для распознавания сущностей

import spacy 
class EntityRecognition:
    def __init__(self,model):
        self.nlp_spacy=model
    
    def get_entity(self,query:str):
        doc=self.nlp_spacy(query)
        entity_dict = dict()
        for ent in doc.ents:
            if ent.label_ not in entity_dict:
                entity_dict[ent.label_]=[]
                entity_dict[ent.label_].append(ent.text)
            else:
                entity_dict[ent.label_].append(ent.text)
        return entity_dict

Здесь мы используем библиотеку spacy, которая имеет предварительно обученную модель NER, способную аннотировать дату, имя, организацию (ORG) и местоположение (GPE). Вы можете обучить свою собственную модель NER в соответствии с вашими потребностями. Таким образом, вы можете извлечь конкретную информацию для создания ответа.

Интеграция с базами данных и API

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

API Amadeus Flight

Amadeus API используется для получения кода аэропорта (IATA/ICAO). После извлечения объекта местоположения мы получаем места отправления и назначения, а затем вызываем API для получения кодов.

from amadeus import Client, ResponseError
class AmadeusFlightAPI:
    """
        1. https://developers.amadeus.com
        2. https://github.com/amadeus4dev/
    """
    def __init__(self):
        pass
    
    def authentication(self):
        client_id='OmIrXd7UwDaN8EwIelTXy69B6oflO' ## API Key changed
        client_secret='wVEUCTF8fCNUA' ## Secret Key Changed
        self.amadeus = Client(client_id=client_id, client_secret=client_secret)
    
    def get_aitport_informaftion(self, location_name:str):
        try:
            '''
            What are the cities matched with keyword 'Paris' ?
            '''
            response = self.amadeus.reference_data.locations.cities.get(keyword=str(location_name))
            return response.data
        
        except ResponseError as error:
            raise 

База полетных данных

Приведенный ниже фрагмент кода предназначен для получения информации о рейсе из пункта отправления в пункт назначения, класс DataBase имеет функцию get_flight, которая принимает коды аэропортов и возвращает сведения о рейсе. .

class DataBase:
    def __init__(self):
        pass
    def load_data(self):
        self.airports =  pd.read_csv('/kaggle/input/flight-delays/airports.csv')
        self.airlines =  pd.read_csv('/kaggle/input/flight-delays/airlines.csv')
        self.flights =  pd.read_csv('/kaggle/input/flight-delays/flights.csv')
        
    
    def get_flight(self, origin_airport_code, destination_airport_code):
        try:
            flight_information_dict=dict()
            top_5_flight=self.flights.loc[lambda x:(x.ORIGIN_AIRPORT == origin_airport_code) & (x.DESTINATION_AIRPORT == destination_airport_code)]
            origin_airport_detail=self.airports.loc[lambda x:(x.IATA_CODE == origin_airport_code)]
            destination_airport_detail=self.airports.loc[lambda x:(x.IATA_CODE == destination_airport_code)] 
            flight_information_dict['flight']=top_5_flight.head()
            flight_information_dict['origin_airport']=origin_airport_detail
            flight_information_dict['destination_flight']=destination_airport_detail
            return flight_information_dict
            
        except Exception as e:
            raise

Пусть пользователь задаст запрос на получение информации о рейсе из Нью-Йорка в Бхопал. Таким образом, в режиме реального времени наш корректор орфографии проверяет запрос, затем классификатор намерений классифицирует намерение (flight_information) и сущность Распознаватель извлекает объект, например местоположение: Нью-Йорк и Бхопал и организацию: Air India.

Генерация ответа:

После того, как намерение, сущности, база данных и API определены, чат-бот должен сгенерировать ответ, соответствующий запросу пользователя. Это требует хорошего понимания намерений пользователя и использования передовых алгоритмов генерации естественного языка (NLG) для получения правильно сформированного и грамматически правильного ответа.

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

В приведенном ниже фрагменте кода класс Conversation имеет функцию get_response, которая принимает параметр query от пользователя и возвращает ответ пользователю.

class Conversation:
    def __init__(self):
        pass
        
    def load_model(self):
        self.clf=ovr
        self.tokenizer=tfidf_vectorizer
        self.nlp_spacy=spacy.load("en_core_web_sm")
        self.autocorrect=pipeline("text2text-generation",model="oliverguhr/spelling-correction-english-base")
        self.amadeus_flight_API=AmadeusFlightAPI()
        self.amadeus_flight_API.authentication()
        self.flight_db=DataBase()
        self.flight_db.load_data()
        
    def get_response(self,query):
        autocorrect_query=self.autocorrect(query,max_length=2048)[0]['generated_text']
        flight = IntentClassifier(self.clf, self.tokenizer)
        entity_recognition=EntityRecognition( self.nlp_spacy)
        pred_intent=flight.get_intent(autocorrect_query)   
        if pred_intent == "atis_flight":
            entity_dict=entity_recognition.get_entity(autocorrect_query)
            location_list=entity_dict['GPE']
            if len(location_list)>0:
                if len(location_list)==1:
                    source_location=location_list[0]
                    # Information not enough
                    
                else:
                    source_location=location_list[0]
                    destination_location=location_list[-1]
                    source_location_info=self.amadeus_flight_API.get_aitport_informaftion(source_location)[0]
                    destination_location_info=self.amadeus_flight_API.get_aitport_informaftion(destination_location)[0]
                    flight_information=self.flight_db.get_flight(source_location_info['iataCode'],destination_location_info['iataCode'])
                    respose = dict()
                    respose['source_location']=flight_information
                    return flight_information

Вот результат заданного запроса.

Рекомендации

  1. https://drive.google.com/file/d/1OuYkYB5J2getuL89ud7Xvt21WKp9QbwU/view
  2. https://www.linkedin.com/pulse/end-nlp-model-using-syntactic-processing-atis-data-over-nilesh-gode/
  3. https://www.cs.cmu.edu/~dkaushik/assets/pubs/RANLP047.pdf
  4. https://www.kaggle.com/code/divyansh22/airline-review-data-preprocessing-pt-2-nlp/ноутбук
  5. https://www.travelpayouts.com/blog/flight-apis-and-travel-project-ideas/
  6. https://github.com/vishalstark512/ChatBot_With_Intents
  7. https://meta-guide.com/software/100-best-github-chatbot-dataset
  8. https://www.kaggle.com/datasets/536db59649ec509a2808c8d2c85d560c64e1dce44778a22ab79ce3408813e8fb -> Создать набор данных учетной записи