Skip to content

Vikkingsk8/InfoCompas_2.0

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

107 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ИнфоКомпас: Виртуальный помощник на основе TF-IDF и NLP

Описание проекта

ИнфоКомпас — это виртуальный помощник, разработанный для помощи пользователям в поиске информации из различных источников, таких как Excel-таблицы и PDF-документы, с использованием методов NLP (Natural Language Processing) и TF-IDF (Term Frequency-Inverse Document Frequency) для анализа текста и поиска наиболее релевантных ответов. Проект располагается на облаке Cloud.ru и доступен по адресу https://инфокомпас.рф/.Дашборд проекта располагается по адресу: http://176.109.109.61:8080/dashboard

Основные компоненты и функциональность

Описание функций в главном файле app.py

1. Загрузка и обработка данных

1.1. Загрузка данных из Excel

Функция load_excel_data(path) загружает данные из Excel-файла, который содержит вопросы и ответы. Эти данные используются для поиска ответов на основе введенных пользователем вопросов.

1.2. Предварительная обработка данных

Функция preprocess_excel_data(df, column_name) предварительно обрабатывает данные из Excel, разделяя текст вопросов на отдельные вопросы и приводя их к нижнему регистру.

2. Обработка текста

2.1. Получение эмбеддингов

Функция get_embedding(text) использует модель AutoModel из библиотеки transformers для получения эмбеддингов текста. Эти эмбеддинги используются для вычисления сходства между введенными пользователем вопросами и текстом в документах.

2.2. Создание TF-IDF матрицы

Функция find_relevant_links(user_question, threshold) создает TF-IDF матрицу на основе вопросов из файла links.xlsx. Эта матрица используется для вычисления сходства между введенными пользователем вопросами и вопросами в файле links.xlsx.

3. Поиск ответов

3.1. Поиск наилучшего ответа

Функция find_best_answer(query_embedding, df) находит наиболее релевантный ответ на основе введенного пользователем вопроса, используя эмбеддинги и DataFrame с вопросами и ответами.

3.2. Поиск релевантных ссылок

Функция find_relevant_links(user_question, threshold) находит релевантные ссылки на основе введенного пользователем вопроса и порогового значения сходства.

4. Обработка вопросов и ссылок

4.1. Предварительная обработка текста

Функция preprocess_user_question(question) обрабатывает текст вопросов, приводя его к нижнему регистру и удаляя лишние пробелы.

4.2. Поиск релевантных ссылок

Функция find_relevant_fork_links(user_question, threshold) находит релевантные ссылки на основе введенного пользователем вопроса и порогового значения сходства.

5. Функциональность кнопок ссылок

5.1. Отправка вопроса и открытие ссылки

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

6. Обратная связь

6.1. Сохранение и загрузка данных о лайках и дизлайках

Функция save_feedback(question, answer, feedback) сохраняет данные о лайках и дизлайках в CSV-файл. Функция load_feedback() загружает эти данные для дальнейшего использования.

7. Маршруты и эндпоинты

7.1. Главная страница

Маршрут / отвечает за отображение главной страницы с интерфейсом для ввода вопросов.

7.2. Эндпоинт для чата

Маршрут /chat обрабатывает POST-запросы с вопросами от пользователей и возвращает наиболее релевантный ответ.

7.3. Эндпоинт для загрузки PDF

Маршрут /download_pdf позволяет пользователям скачать PDF-документ.

7.4. Эндпоинт для обратной связи

Маршрут /feedback обрабатывает POST-запросы с данными о лайках и дизлайках от пользователей.

7.5. Эндпоинт для аналитики

Маршрут /analytics_data возвращает аналитические данные о запросах пользователей.

Описание функций JS в файле templates/index.html

1. showWelcomeMessage()

Описание: Функция отображает приветственное сообщение и начальные вопросы при загрузке страницы.

Детали:

Создает приветственное сообщение и добавляет его в чат-бокс. Создает кнопки с начальными вопросами и добавляет их в чат-бокс. При нажатии на кнопку начального вопроса, текст вопроса вводится в поле ввода и отправляется.

2. loadSuggestions()

Описание: Функция загружает предложения для автодополнения из сервера.

Детали: Делает запрос к серверу для получения списка предложений. Сохраняет полученные предложения в переменную suggestions.

3. showSuggestion(query)

Описание: Функция отображает предложения для автодополнения на основе введенного текста.

Детали: Ищет совпадения в списке предложений на основе введенного текста. Отображает найденное предложение в виде кнопки. При нажатии на кнопку предложения, текст предложения вводится в поле ввода.

4. sendMessage(message = null)

Описание: Функция отправляет сообщение пользователя на сервер и отображает ответ.

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

5. displayButtons(buttons)

Описание: Функция отображает кнопки в контейнере кнопок.

Детали: Очищает контейнер кнопок. Создает и добавляет кнопки в контейнер на основе переданного массива.

6. clearButtonsContainer()

Описание: Функция очищает контейнер кнопок.

Детали: Удаляет все содержимое контейнера кнопок.

7. createLinkButton(link)

Описание: Функция создает кнопку для ссылки.

Детали: Создает кнопку с текстом вопроса. Добавляет классы в зависимости от типа ссылки (форк, PDF-страница, внешняя ссылка). Обрабатывает нажатие на кнопку.

8. handleLinkButtonClick(link)

Описание: Функция обрабатывает нажатие на кнопку ссылки.

Детали: Если ссылка является форком, отправляет вопрос на сервер. Если ссылка является PDF-страницей, открывает PDF и переходит к указанной странице. Если ссылка является внешней, открывает ее в новой вкладке.

9. isValidPageNumber(value)

Описание: Функция проверяет, является ли значение числом (номером страницы).

Детали: Удаляет пробелы в начале и конце строки. Проверяет, состоит ли строка только из цифр.

10. createLinksContainer(links, questionText)

Описание: Функция создает контейнер с кнопками ссылок.

Детали: Создает контейнер для кнопок. Сортирует ссылки по типу (форки, PDF-страницы, внешние ссылки). Добавляет кнопки в контейнер. Добавляет кнопку "Показать больше", если есть скрытые ссылки.

11. clearLinksContainer()

Описание: Функция очищает контейнер ссылок.

Детали: Удаляет все содержимое контейнера ссылок.

12. addFeedbackButtons(messageElement, question, answer)

Описание: Функция добавляет кнопки обратной связи к сообщению бота.

Детали: Создает контейнер для кнопок обратной связи. Создает кнопки "Нравится" и "Не нравится". Добавляет кнопки в контейнер и контейнер в сообщение бота.

13. createFeedbackButton(feedbackType, initialImage, activeImage)

Описание: Функция создает кнопку обратной связи.

Детали: Создает кнопку с изображением. Обрабатывает нажатие на кнопку, отправляя обратную связь на сервер.

14. removeOldFeedbackButtons()

Описание: Функция удаляет старые кнопки обратной связи.

Детали: Проходит по всем сообщениям бота и удаляет кнопки обратной связи, кроме последнего сообщения.

15. sendLinkQuestion(question, url)

Описание: Функция отправляет вопрос, связанный с ссылкой, на сервер.

Детали: Отправляет вопрос на сервер. Обрабатывает ответ сервера, отображая его в чат-боксе. Обрабатывает ссылки и кнопки, возвращаемые сервером.

16. prependMessage(message, className, icon, images = [], pdfPage = null)

Описание: Функция добавляет сообщение в начало чат-бокса.

Детали: Создает элемент сообщения с указанным классом и иконкой. Добавляет текст сообщения и ссылку на PDF-страницу, если указана. Добавляет сообщение в начало чат-бокса.

17. openPdfAndGoToPage(pageNumber)

Описание: Функция открывает PDF и переходит к указанной странице.

Детали: Открывает PDF-контейнер, если он скрыт. Создает новый iframe для отображения PDF. Переходит к указанной странице в PDF.

18. isGreeting(userMessage)

Описание: Функция проверяет, является ли сообщение приветствием.

Детали: Проверяет, содержит ли сообщение одно из приветственных слов.

19. scrollToBottom()

Описание: Функция прокручивает чат-бокс вниз.

Детали: Прокручивает чат-бокс до самого нижнего сообщения.

20. sendFeedback(messageElement, feedbackType)

Описание: Функция отправляет обратную связь на сервер.

Детали: Отправляет обратную связь на сервер с помощью POST-запроса. Устанавливает атрибут data-feedback-sent для сообщения, чтобы предотвратить повторную отправку.

21. isMobileDevice()

Описание: Функция проверяет, используется ли мобильное устройство.

Детали: Проверяет строку userAgent на наличие признаков мобильного устройства.

22. isTelegramInAppBrowser()

Описание: Функция проверяет, используется ли браузер Telegram.

Детали: Проверяет строку userAgent на наличие признаков браузера Telegram.

23. Обработчики событий

Описание: Обработчики событий для кнопок и поля ввода.

Детали:

Обработчик для кнопки "Отправить": вызывает функцию sendMessage(). Обработчик для поля ввода: вызывает функцию sendMessage() при нажатии клавиши Enter. Обработчик для кнопки "Показать руководство": переключает отображение PDF-контейнера.

Установка

Для установки и запуска ИнфоКомпас, следуйте этим простым шагам:

  1. Клонируйте репозиторий:

    git clone https://github.com/Vikkingsk8/InfoCompas_2.0.git
    cd InfoCompas_2.0
  2. Установите зависимости:

    pip install -r requirements.txt
  3. Запустите приложение: для windows

    python app.py 
    

    для linux и Mac

    python3 app.py 
    

Использование

Откройте ваш любимый браузер и перейдите по адресу http://127.0.0.1.

Введите ваш вопрос в поле ввода и нажмите кнопку "Отправить".

Примечание к использованию

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

Тестирование

Для запуска тестов используйте следующую команду:

python -m unittest test_app.py

Тесты для маршрутов

  • test_index_page: Проверяет, что главная страница возвращает статус-код 200.
  • test_download_pdf: Проверяет корректность работы маршрута для скачивания PDF-файла.
  • test_chat_endpoint: Проверяет корректность обработки запроса к чат-боту.
  • test_load_suggestions: Проверяет, что эндпоинт /load_suggestions возвращает список предложений.
  • test_chat_endpoint_with_short_question: Проверяет обработку некорректного ввода пользователя.
  • test_chat_endpoint_with_conversational_response: Проверяет, что эндпоинт /chat возвращает корректный ответ на приветствие.
  • test_feedback_endpoint: Проверяет, что эндпоинт /feedback корректно обрабатывает отзывы.
  • test_like_endpoint: Проверяет, что эндпоинт /like корректно обрабатывает лайки.
  • test_dislike_endpoint: Проверяет, что эндпоинт /dislike корректно обрабатывает дизлайки.
  • test_analytics_data_endpoint: Проверяет, что эндпоинт /analytics_data возвращает корректные аналитические данные.

Тестирование отказоустойчивости

Установка locust

  • pip install locust

Запуск locust

  • locust -f locustfile.py --host=http://localhost:8080
    Замените http://localhost:8080 на адрес вашего сервера, если он запущен на другом хосте или порту.

  • Откройте браузер и перейдите по адресу http://localhost:8089. Введите количество пользователей и скорость их набора, затем нажмите "Start swarming".

Анализ результатов:

RPS (Requests Per Second): Количество запросов в секунду, которое ваш сервер может обработать.

Response Time: Время ответа сервера на запросы.

Failures: Количество неудачных запросов.

Users: Количество одновременных пользователей, которые могут взаимодействовать с вашим ботом.


Структура проекта

InfoCompas/
├── app.py
├── dashboard.py
├── .gitattributes
├── requirements.txt
├── LICENSE.md
├── README.md
├── config.py
├── locust.py
├── test_app.py
├── pycache/
│ ├── app.cpython-310.pyc
│ ├── app.cpython-311.pyc
│ ├── config.cpython-310.pyc
│ ├── dashboard.cpython-310.pyc
│ └── test_app.cpython-310-pytest-8.3.2.pyc
├── cache/
│ ├── cached_instruction.pdf
│ └── embeddings_cache.npy
├── model/
│ ├── config.json
│ ├── model.safetensors
│ ├── special_tokens_map.json
│ ├── tokenizer.json
│ ├── tokenizer_config.json
│ └── vocab.txt
├── data/
│ ├── ответы.xlsx
│ ├── links.xlsx
│ ├── instruction.pdf
│ └── развилка.xlsx
├── static/
│ ├── styles.css
│ ├── background.jpg
│ ├── bot_icon.png
│ ├── image.png
│ ├── background.jpg
│ ├── dislike_2.png
│ ├── dislike_1.png
│ ├── like_2.png
│ ├── like_1.png
│ ├── user_icon.png
| ├── number_of_users.png
│ └── icon.png
├── templates/
| └── index.html

Заключение

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

Авторы

  • Ермилов В.В. (разработчик)
  • Файбисович В.А. (аналитик)

About

Чат бот для Банка России 2.0

Topics

Resources

License

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors