Проект, охватывающий веб-программирование, математику, искусственный интеллект и многое другое.

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

Но теперь, с профессиональным присутствием в Интернете для моей основной работы, подработок и хобби, у меня появилась возможность создать чат-бота с целью: отвечать на вопросы посетителей моего сайта и направлять их через него. Сила программирования на JavaScript позволила мне сделать это довольно легко. Более того, я мог бы наделить своего чат-бота двумя механизмами ответа: один основан на большом наборе данных пар вопрос-ответ, которому помогают функции приблизительного сопоставления строк; и другой, основанный на тонкой настройке GPT-3 в зависимости от вопроса. В этой статье я расскажу о первом треке, в котором используются открытые наборы данных пар вопросов и ответов и стоп-слов, а также процедуры количественной оценки сходства пары строк. Трек GPT-3 появится в следующей статье, и он важен для того, чтобы освободиться от ограничений закрытых баз данных вопросов и ответов, так что следите за обновлениями!

Введение

Как вы видели в резюме выше, меня всегда интересовали чат-боты. Оказывается, я только что создал (на самом деле я продолжаю расширять каждый день) полный чат-бот, полностью основанный на Интернете, который появляется на разных страницах моего веб-сайта, направляя своих посетителей и отвечая на их вопросы. Я написал этот чат-бот как компонент HTML/JS, поэтому я могу легко встроить его на любую страницу с помощью всего лишь тега скрипта. Используя функцию браузера localStorage, мой чат-бот может свободно общаться, когда пользователь открывает несколько страниц моего сайта, даже если он находится в разных вкладках или окнах. Используя CSS, чат-бот может легко адаптироваться к экранам смартфонов или компьютеров. И я позволяю боту записывать разговоры в файл на моем сайте, который я затем могу проверить, чтобы узнать, что обычно спрашивают посетители и какие отклонения они обычно делают от основной базы данных знаний, чтобы затем соответствующим образом улучшить чат-бота.

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

Отвечая на вопросы из базы знаний с терпимостью к опечаткам и переменным формулировкам — благодаря алгоритмам сравнения строк

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

Я скоро перейду на модуль GPT-3 своего чат-бота, а здесь я буду развивать модуль, который работает через сопоставление вопросов и ответов. Если вам очень любопытно и вы не можете дождаться моей статьи с описанием модуля GPT-3 бота, позвольте мне поделиться с вами некоторыми статьями, которые я написал о GPT-3, где вы найдете как отрицательные, так и положительные моменты, а также немало немного кода и инструкции для вас, чтобы сделать свои собственные тесты с этой технологией:









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

Модуль вопрос-ответ чат-бота моего сайта

Здесь у вас есть скриншот моего чат-бота, использующего трек соответствия вопросов/ответов для чата с пользователем-человеком, который попросил пошутить:

Давайте посмотрим, как работает этот модуль сопоставления вопросов и ответов, являющийся альтернативой сложным моделям ИИ и более безопасным, поскольку он отвечает только на то, что закодировано в базе данных. По сути, это состоит в «простом» поиске входных данных человека в базе данных вопросов и ответов, а затем предоставлении соответствующих предварительно скомпилированных ответов. Если база данных достаточно велика и человек предупрежден о том, что код бота ограничен только определенными темами, общий опыт может быть достаточно хорошим, по крайней мере, при его предполагаемом использовании.

Тем не менее, есть несколько важных моментов, на которые стоит обратить внимание:

  • «Достаточно большую» базу данных пар вопрос-ответ получить непросто, по крайней мере, такую, в содержании которой вы можете быть уверены.
  • Люди могут делать опечатки и ошибки в письме, поэтому чат-бот в идеале должен быть терпим к ним.
  • Даже без каких-либо ошибок люди могут (и, скорее всего, будут) задавать вопросы способами, отличными от закодированных в наборе данных. Чат-бот тоже должен учитывать это.

Решение проблемы с базой данных не простое. Как я подробно расскажу ниже, для своего чат-бота я взял базу данных с открытым исходным кодом (лицензия MIT) с парами вопросов и ответов из учетной записи Microsoft GitHub и расширил ее контентом, касающимся меня и проектов, над которыми я работаю, потому что это то, чем является чат-бот. должен ответить. Между тем трудности, связанные с опечатками, ошибками и изменчивостью входных данных, можно решить путем поиска в базе данных не конкретных вопросов, а вопросов, которые напоминают каждую из записей в базе данных. Это требует использования метрик сравнения строк, а не идеального совпадения, и некоторой очистки ввода человека перед выполнением поиска.

Давайте рассмотрим все эти пункты один за другим.

1. Очистка человеческого ввода

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

Операции, связанные с очисткой, кажутся тривиальными, но опять же ограничены доступностью баз данных, например стоп-слов. Я составил довольно длинный список из некоторых ресурсов, которые вы можете позаимствовать прямо сейчас, но, пожалуйста, признайте меня, так же как мой код признает мои источники!

Вот полная функция, включая списки стоп-слов, символов и т. д.: http://lucianoabriata.altervista.org/chatbotallweb/cleaningfunction.txt

Обратите внимание, что при вызове функции можно выбрать, что очищать. Некоторые части моего кода требуют полной очистки, в то время как другие требуют очистки символов и чисел, но не стоп-слов. Кроме того, мой код также очищает другие потенциальные источники проблем прямо перед созданием поискового запроса для базы знаний. Например, он заменяет вхождения «он», «его» и «его» на «лучиано», потому что я предполагаю, что любой, кто спрашивает бота моего веб-сайта о третьем лице, имеет в виду меня, и это закодировано в базе данных таким образом. Конечно, это не будет работать должным образом, если посетитель на самом деле спрашивает о другом человеке… В любом случае, в базе данных везде в ответах есть «Лучано», поэтому будет ясно, что ответы относятся ко мне, даже если человек может думать о кто-нибудь еще. Точно так же часть процедуры очистки переводит все входные данные в нижний регистр и переводит все вопросы базы данных в нижний регистр (в то время как все ответы правильно пишутся с заглавной буквы). Кроме того, все входные данные и вопросы полностью убраны из любых терминальных пространств.

2. База данных пар вопрос-ответ

Для своего чат-бота я взял английскую версию базы данных персональных чатов Microsoft для чат-ботов и начал добавлять контент, относящийся ко мне и проектам, над которыми я работаю. Почему? Ну, потому что весь смысл моего бота в том, чтобы направлять посетителей моих сайтов и отвечать на их вопросы обо мне и моих проектах — и, конечно же, Microsoft ничего не знает обо мне и моих проектах! На самом деле, когда посетитель попадает на мой веб-сайт, чат-бот уже объясняет, что его знания довольно ограничены разговорами на определенные темы (которые я вручную ввел в базу данных) и простой болтовней (из базы данных Microsoft плюс некоторые пользовательские дополнения и правки). .

Вот база данных, которую я использовал от Microsoft. Как видите, поддерживаются разные языки и стили личности:



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

Это пример записи из базы знаний:

hello||good morning||good evening||good night||whats up||wasup||whasup##***##***##Hello, all good?||Hi there, how are doing?

Строка разделена разделителями ## в 4 полях: первое поле содержит все возможные способы задать вопрос (ну тут просто несколько способов поздороваться, а в другой строке их больше), разделенные ||. Последнее поле представляет собой список возможных ответов, снова разделенных ||, здесь два разных варианта.

Второе поле содержит своего рода «отказ от ответственности», который чат-бот будет использовать, если найдет лишь частичное совпадение с одним из вопросов, прежде чем дать возможный ответ, чтобы сделать разговор более естественным. Например, если пользователь спрашивает «Как вас зовут?» с некоторыми опечатками, то бот ответит «Спрашиваю, как меня зовут?», а затем один из предустановленных ответов. . Обратите внимание, как я закодировал своего бота, это не сработает, если опечатка очень маленькая. Например, здесь я спрашиваю сначала с одной опечаткой (что приводит к прямому ответу), а затем с несколькими опечатками (где ответу предшествует небольшое отказное предложение):

В третьем поле сохраняются ключевые слова, представляющие основную тему пары вопрос-ответ, что полезно для поддержания хотя бы минимального контекста в разговоре. Например, здесь человек спрашивает о moleculARweb (веб-сайте, который я разработал вместе с коллегой по работе), а затем задает другой вопрос о том, чтобы называть его «этим»… и чат-бот его получает:

3. Поиск в базе данных

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

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

Расстояние Джаро-Вринклера, которое измеряет расстояние редактирования между двумя последовательностями, т. е. минимальное количество операций, необходимых для преобразования одной в другую. Он варьируется от 0 до 1, где 1 означает идеальное совпадение. См. Здесь запись в Википедии. а здесь за оригинальную статью Яро и Вринкера.

Сходство текстового косинуса, которое измеряет, насколько хорошо количество вхождений каждого слова совпадает между двумя строками, как косинус угла, образованного n-мерными векторами, сделанными вверх из всех частот всех n слов из обеих строк. Он также варьируется от 0 до 1, где 1 означает идеальное совпадение. Это одно из конкретных применений более общего косинусного сходства, о котором вы можете прочитать в этой очень хорошей статье на TDS от Бена Чамбли.

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

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

Порог на самом деле имеет 2 уровня: когда сходство между текстом пользователя и одним из вопросов базы знаний выше 0,95, это считается полным совпадением, поэтому ответ из базы дается сразу. Если оценка находится в диапазоне от 0,88 до 0,95, программа выдает тот же ответ, но с предшествующим вариативным предложением вида «Вы имели в виду это?». Если оценка находится в диапазоне от 0,8 до 0,88, чат-бот поясняет, что не уверен в вопросе, после чего следует вопрос-кандидат из базы и соответствующий ему ответ.

Но как точно вычислить сходство Яро-Вринклера и текстового косинуса?

Я взял эти функции из прекрасной статьи Suman Kunwar, где они представлены уже в JavaScript:



На самом деле эта статья описывает (и дает код) для 4 функций сравнения строк. Но я взял только Jaro-Wrinkler и Text Cosine по причинам, изложенным выше. И у меня они оказались весьма неплохими — хотя нет, они не безошибочны.

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

Хотите пообщаться с моим чат-ботом?

Вы можете попробовать моего чат-бота здесь:

http://lucianoabriata.altervista.org/chatbotallweb/chatbottest.html

Если вы предоставите ключ API GPT3 (который вы можете получить бесплатно здесь), вы сможете использовать более продвинутый модуль бота; но это все еще в разработке (я опубликую статью, когда она будет полностью функциональной).

Would you like to order a personalized chatbot? Or have a job for me about protein modeling, bioinformatics, protein design, molecular modeling, or protein biotechnology? Contact me here!
www.lucianoabriata.com I write and photoshoot about everything that lies in my broad sphere of interests: nature, science, technology, programming, etc. Become a Medium member to access all its stories (affiliate links of the platform for which I get small revenues without cost to you) and subscribe to get my new stories by email. To consult about small jobs check my services page here. You can contact me here.