ИнфоКомпас — это виртуальный помощник, разработанный для помощи пользователям в поиске информации из различных источников, таких как Excel-таблицы и PDF-документы, с использованием методов NLP (Natural Language Processing) и TF-IDF (Term Frequency-Inverse Document Frequency) для анализа текста и поиска наиболее релевантных ответов. Проект располагается на облаке Cloud.ru и доступен по адресу https://инфокомпас.рф/.Дашборд проекта располагается по адресу: http://176.109.109.61:8080/dashboard
Функция load_excel_data(path) загружает данные из Excel-файла, который содержит вопросы и ответы. Эти данные используются для поиска ответов на основе введенных пользователем вопросов.
Функция preprocess_excel_data(df, column_name) предварительно обрабатывает данные из Excel, разделяя текст вопросов на отдельные вопросы и приводя их к нижнему регистру.
Функция get_embedding(text) использует модель AutoModel из библиотеки transformers для получения эмбеддингов текста. Эти эмбеддинги используются для вычисления сходства между введенными пользователем вопросами и текстом в документах.
Функция find_relevant_links(user_question, threshold) создает TF-IDF матрицу на основе вопросов из файла links.xlsx. Эта матрица используется для вычисления сходства между введенными пользователем вопросами и вопросами в файле links.xlsx.
Функция find_best_answer(query_embedding, df) находит наиболее релевантный ответ на основе введенного пользователем вопроса, используя эмбеддинги и DataFrame с вопросами и ответами.
Функция find_relevant_links(user_question, threshold) находит релевантные ссылки на основе введенного пользователем вопроса и порогового значения сходства.
Функция preprocess_user_question(question) обрабатывает текст вопросов, приводя его к нижнему регистру и удаляя лишние пробелы.
Функция find_relevant_fork_links(user_question, threshold) находит релевантные ссылки на основе введенного пользователем вопроса и порогового значения сходства.
При нажатии на кнопку ссылки, вопрос, связанный с этой ссылкой, отправляется на сервер для поиска ответа, и ссылка открывается в новом окне. Это позволяет пользователю получить дополнительную информацию, связанную с их запросом.
Функция save_feedback(question, answer, feedback) сохраняет данные о лайках и дизлайках в CSV-файл. Функция load_feedback() загружает эти данные для дальнейшего использования.
Маршрут / отвечает за отображение главной страницы с интерфейсом для ввода вопросов.
Маршрут /chat обрабатывает POST-запросы с вопросами от пользователей и возвращает наиболее релевантный ответ.
Маршрут /download_pdf позволяет пользователям скачать PDF-документ.
Маршрут /feedback обрабатывает POST-запросы с данными о лайках и дизлайках от пользователей.
Маршрут /analytics_data возвращает аналитические данные о запросах пользователей.
Описание: Функция отображает приветственное сообщение и начальные вопросы при загрузке страницы.
Детали:
Создает приветственное сообщение и добавляет его в чат-бокс. Создает кнопки с начальными вопросами и добавляет их в чат-бокс. При нажатии на кнопку начального вопроса, текст вопроса вводится в поле ввода и отправляется.
Описание: Функция загружает предложения для автодополнения из сервера.
Детали: Делает запрос к серверу для получения списка предложений. Сохраняет полученные предложения в переменную suggestions.
Описание: Функция отображает предложения для автодополнения на основе введенного текста.
Детали: Ищет совпадения в списке предложений на основе введенного текста. Отображает найденное предложение в виде кнопки. При нажатии на кнопку предложения, текст предложения вводится в поле ввода.
Описание: Функция отправляет сообщение пользователя на сервер и отображает ответ.
Детали: Получает текст сообщения из поля ввода или из аргумента функции. Отправляет сообщение на сервер с помощью POST-запроса. Отображает сообщение пользователя и ответ бота в чат-боксе. Обрабатывает ссылки и кнопки, возвращаемые сервером. Добавляет кнопки обратной связи для ответа бота.
Описание: Функция отображает кнопки в контейнере кнопок.
Детали: Очищает контейнер кнопок. Создает и добавляет кнопки в контейнер на основе переданного массива.
Описание: Функция очищает контейнер кнопок.
Детали: Удаляет все содержимое контейнера кнопок.
Описание: Функция создает кнопку для ссылки.
Детали: Создает кнопку с текстом вопроса. Добавляет классы в зависимости от типа ссылки (форк, PDF-страница, внешняя ссылка). Обрабатывает нажатие на кнопку.
Описание: Функция обрабатывает нажатие на кнопку ссылки.
Детали: Если ссылка является форком, отправляет вопрос на сервер. Если ссылка является PDF-страницей, открывает PDF и переходит к указанной странице. Если ссылка является внешней, открывает ее в новой вкладке.
Описание: Функция проверяет, является ли значение числом (номером страницы).
Детали: Удаляет пробелы в начале и конце строки. Проверяет, состоит ли строка только из цифр.
Описание: Функция создает контейнер с кнопками ссылок.
Детали: Создает контейнер для кнопок. Сортирует ссылки по типу (форки, PDF-страницы, внешние ссылки). Добавляет кнопки в контейнер. Добавляет кнопку "Показать больше", если есть скрытые ссылки.
Описание: Функция очищает контейнер ссылок.
Детали: Удаляет все содержимое контейнера ссылок.
Описание: Функция добавляет кнопки обратной связи к сообщению бота.
Детали: Создает контейнер для кнопок обратной связи. Создает кнопки "Нравится" и "Не нравится". Добавляет кнопки в контейнер и контейнер в сообщение бота.
Описание: Функция создает кнопку обратной связи.
Детали: Создает кнопку с изображением. Обрабатывает нажатие на кнопку, отправляя обратную связь на сервер.
Описание: Функция удаляет старые кнопки обратной связи.
Детали: Проходит по всем сообщениям бота и удаляет кнопки обратной связи, кроме последнего сообщения.
Описание: Функция отправляет вопрос, связанный с ссылкой, на сервер.
Детали: Отправляет вопрос на сервер. Обрабатывает ответ сервера, отображая его в чат-боксе. Обрабатывает ссылки и кнопки, возвращаемые сервером.
Описание: Функция добавляет сообщение в начало чат-бокса.
Детали: Создает элемент сообщения с указанным классом и иконкой. Добавляет текст сообщения и ссылку на PDF-страницу, если указана. Добавляет сообщение в начало чат-бокса.
Описание: Функция открывает PDF и переходит к указанной странице.
Детали: Открывает PDF-контейнер, если он скрыт. Создает новый iframe для отображения PDF. Переходит к указанной странице в PDF.
Описание: Функция проверяет, является ли сообщение приветствием.
Детали: Проверяет, содержит ли сообщение одно из приветственных слов.
Описание: Функция прокручивает чат-бокс вниз.
Детали: Прокручивает чат-бокс до самого нижнего сообщения.
Описание: Функция отправляет обратную связь на сервер.
Детали: Отправляет обратную связь на сервер с помощью POST-запроса. Устанавливает атрибут data-feedback-sent для сообщения, чтобы предотвратить повторную отправку.
Описание: Функция проверяет, используется ли мобильное устройство.
Детали: Проверяет строку userAgent на наличие признаков мобильного устройства.
Описание: Функция проверяет, используется ли браузер Telegram.
Детали: Проверяет строку userAgent на наличие признаков браузера Telegram.
Описание: Обработчики событий для кнопок и поля ввода.
Детали:
Обработчик для кнопки "Отправить": вызывает функцию sendMessage(). Обработчик для поля ввода: вызывает функцию sendMessage() при нажатии клавиши Enter. Обработчик для кнопки "Показать руководство": переключает отображение PDF-контейнера.
Для установки и запуска ИнфоКомпас, следуйте этим простым шагам:
-
Клонируйте репозиторий:
git clone https://github.com/Vikkingsk8/InfoCompas_2.0.git cd InfoCompas_2.0 -
Установите зависимости:
pip install -r requirements.txt
-
Запустите приложение: для 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возвращает корректные аналитические данные.
pip install 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
ИнфоКомпас — это мощный инструмент для поиска информации, который использует современные методы обработки текста и машинного обучения для предоставления пользователям наиболее релевантных ответов и ссылок. Благодаря интеграции с различными источниками данных, ИнфоКомпас обеспечивает высокую точность и эффективность в работе.
- Ермилов В.В. (разработчик)
- Файбисович В.А. (аналитик)
