Создайте мощного чат-ассистента для PDF и статей без ключа OpenAI
Создайте мощного чат-ассистента для PDF и статей без использования ключа OpenAI
Введение
Мир обработки естественного языка стремительно расширяется, особенно с появлением больших языковых моделей, которые революционизировали эту область и сделали ее доступной для всех. В этой статье мы рассмотрим и реализуем некоторые методы NLP для создания мощного чат-ассистента, который может отвечать на ваши вопросы на основе данной статьи (или PDF) с использованием библиотек с открытым исходным кодом, без необходимости использования ключа API OpenAI.
Эта статья была опубликована в рамках Блогосферы по науке о данных.
Рабочий процесс
Рабочий процесс приложения выглядит следующим образом:
- Амазон планирует вложить до 4 миллиардов долларов в передовую стартап-компанию по искусственному интеллекту Anthropic.
- Раскрытие расширенной генерации получения (RAG) | Когда искусственный интеллект встречается с человеческим знанием
- Приложения ChatGPT в реальном мире
Пользователь предоставляет 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 и используются по усмотрению автора.