Создайте мощного чат-ассистента для PDF и статей без ключа OpenAI

Создайте мощного чат-ассистента для PDF и статей без использования ключа OpenAI

Введение

Мир обработки естественного языка стремительно расширяется, особенно с появлением больших языковых моделей, которые революционизировали эту область и сделали ее доступной для всех. В этой статье мы рассмотрим и реализуем некоторые методы NLP для создания мощного чат-ассистента, который может отвечать на ваши вопросы на основе данной статьи (или PDF) с использованием библиотек с открытым исходным кодом, без необходимости использования ключа API OpenAI.

Эта статья была опубликована в рамках Блогосферы по науке о данных.

Рабочий процесс

Рабочий процесс приложения выглядит следующим образом:

Пользователь предоставляет PDF-файл или URL-адрес статьи, задает вопрос, и приложение будет пытаться ответить на него на основе предоставленного источника.

Мы извлекаем содержимое с помощью библиотеки PYPDF2 (в случае PDF-файла) или BeautifulSoup (в случае URL-адреса статьи). Затем мы разделяем его на фрагменты с использованием CharacterTextSplitter из библиотеки langchain.

Для каждого фрагмента мы вычисляем соответствующий вектор вложения слов с использованием модели all-MiniLM-L6-v2, которая отображает предложения и абзацы в плотное векторное пространство размерности 384 (векторное представление слов/предложений – это всего лишь техника представления слова/предложения в виде вектора), и та же техника применяется к вопросу пользователя.

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

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

Примечание

  • Все указанные модели доступны через API с использованием только HTTP-запросов.
  • Код будет написан на языке Python.
  • FAQ-QN – ключевое слово, которое указывает на необходимость ознакомиться с разделом FAQ, конкретно с номером вопроса N, для получения более подробной информации.

Реализация

В этом разделе я сосредоточусь только на реализации, детали будут предоставлены в разделе FAQ.

Зависимости

Для начала мы загружаем зависимости, а затем импортируем их.

pip install -r requirements.txt

numpytorchsentence-transformersrequestslangchainbeautifulsoup4PyPDF2

import torchimport numpy as npfrom sentence_transformers import utilfrom langchain.text_splitter import CharacterTextSplitterfrom bs4 import BeautifulSoupimport requests
  • torch: очень полезная при работе с тензорами (библиотека PyTorch).
  • requests: для отправки HTTP-запросов.

Извлечение контента

В случаеPDF

try:    pdf=PdfReader(path_pdf_file)    result=''    for i in range(len(pdf.pages)):        result+=pdf.pages[i].extract_text()except:    print('Файл PDF не существует'))    exit(0)

В случае статьи мы пытаемся найти контент, находящийся между тегами html, такими как h1, p, li, h2 и т.д. (Эти теги работают хорошо для сайтов, например: VoAGI, и могут отличаться на других сайтах)

try:        request=requests.get(URL_LINK)        request=BeautifulSoup(request.text,'html.parser')        request=request.find_all(['h1','p','li','h2'])except:        print('Неверная ссылка на URL-адрес')        exit(0)result=[element.text for element in request]result=''.join(result)

Разделите на части

Каждая часть будет содержать 1000 токенов, с 200 токенами перекрытия, чтобы сохранить связь между частями и предотвратить разделение.(ЧАВ-В2)

text_splitter = CharacterTextSplitter(        separator="\n",        chunk_size=1000,        chunk_overlap=200,        length_function=len      )       chunks = text_splitter.split_text(result)

Вложение слов

Вы можете скачать модель all-MiniLM-L6-v2 из huggingface, или вы можете получить доступ к ней через HTTP-запросы, так как она доступна как API. (ЧАВ-В1)

Примечание: Чтобы получить доступ к API huggingface, вам нужно зарегистрироваться (это бесплатно) для получения вашего токена.

hf_token='Вставьте здесь ваш токен доступа huggingface'api_url= """https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"""headers = {"Authorization": f"Bearer {hf_token}"}    def query(texts):  response = requests.post(api_url, headers=headers, json={"inputs": texts, "options":{"wait_for_model":True}})  return response.json()user_question = 'Вставьте ваш вопрос здесь'question = query([user_question])            query_embeddings = torch.FloatTensor(question)    output=query(chunks)    output=torch.from_numpy(np.array(output)).to(torch.float)

Функция запроса возвращает плотный вектор размерности 384, и преобразование в “torch.Float” и FloatTensor необходимо для функции semantic_search.

В итоговом результате будет содержаться 2 текстовые части, которые могут включать ответ (устанавливаем top_k=2, чтобы увеличить вероятность получения правильного ответа от модели QA).(ЧАВ-В4)

result=util.semantic_search(query_embeddings, output,top_k=2)final=[chunks[result[0][i]['corpus_id']] for i in range(len(result[0]))]

Модель вопрос-ответ

Поскольку у вас есть контекст (текстовые части) и вопрос, вы можете использовать любую модель, которую хотите (вы можете взглянуть на модели вопрос-ответ от huggingface, чтобы получить представление). Я выбрал модель вопрос-ответ AI21studio, вы можете зарегистрироваться бесплатно, чтобы получить токен доступа.

AI21_api_key = 'API-ключ AI21studio'url = "https://api.ai21.com/studio/v1/answer"    payload = {                "context":' '.join(final),                "question":user_question          }  headers = {                "accept": "application/json",                "content-type": "application/json",                "Authorization": f"Bearer {AI21_api_key}"          }    response = requests.post(url, json=payload, headers=headers)    if response.json()['answerInContext']:     print(response.json()['answer'])else:     print('Ответ не найден в документе ⚠️,      пожалуйста, переформулируйте свой вопрос.')

Модель позволяет проверить, есть ли ответ в контексте или нет (в случае использования больших языковых моделей, возникает проблема, когда LLM отвечает на вопрос, не связанный с предоставленным контекстом).(ЧАВ-В3)****

Заключение

Вы можете расширить этот проект до различных источников ввода (файлы PowerPoint, видео/аудио с YouTube, слайды, аудиокниги) при относительно низкой стоимости, поэтому не стесняйтесь адаптировать его под свои потребности. Кроме того, вы можете создать простой пользовательский интерфейс для этого приложения и разместить его.

Как я сделал (репозиторий GitHub можно найти здесь, не забудьте поставить звезду.

В этой статье мы создали мощного чата-помощника для ваших файлов/статей в формате PDF.

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

Спасибо за ваше время и внимание. Для дальнейшей помощи:

LinkedIn: SAMY GHEBACHE 

Email: [email protected].

Часто задаваемые вопросы

Медиафайлы, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.