Пошаговое руководство по PDF-чатботам с Langchain и Ollama

Подробное руководство по созданию PDF-чатботов с использованием Langchain и Ollama

Введение

В эпоху, когда технологии продолжают изменять способ взаимодействия с информацией, концепция чат-бота для PDF приносит новый уровень удобства и эффективности на стол. В этой статье мы углубимся в увлекательный мир создания чат-бота для PDF с использованием Langchain и Ollama, где открытые модели становятся доступными с минимальной конфигурацией. До свидания, сложности выбора фреймворка и настройки параметров модели, поскольку мы отправляемся в путешествие, чтобы разблокировать потенциал чат-ботов для PDF. Узнайте, как безупречно установить Ollama, загрузить модели и создать чат-бота для PDF, предоставляющего интеллектуальные ответы на ваши запросы. Давайте исследуем эту захватывающую смесь технологий и обработки документов, делающую поиск информации проще прежнего.

Цели обучения

  • Понять, как установить Ollama на свой компьютер.
  • Узнать, как загрузить и запустить открытую модель с помощью Ollama.
  • Открыть процесс создания чат-бота для PDF с использованием Langchain и Ollama.

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

Предпосылки

Для правильного понимания этой статьи вам понадобятся:

  • Хорошие знания Python и,
  • Базовые знания Langchain, т.е. цепочек, векторных хранилищ и т.д.

Langchain предоставляет различные типы функциональности для создания приложений LLM. Он заслуживает отдельной статьи. Если вы не знаете, что такое Langchain, рекомендуется прочитать несколько статей или учебников по этой теме. Вы также можете посмотреть это видео.

Что такое Ollama?

Ollama дает вам возможность загружать открытые модели и использовать их локально. Он автоматически загружает модели с лучшего источника. Если у вас есть выделенный графический процессор на вашем компьютере, модель будет работать с ускорением графического процессора. Вам не нужно устанавливать его вручную. Вы также можете настроить модель, изменяя ее подсказку (да, для этого вам не нужен Langchain). Ollama также доступен как образ докер-контейнера, так что вы можете развернуть свою собственную модель в виде контейнера Docker. Увлекательно, не так ли? Теперь давайте посмотрим, как вы можете установить Ollama на свою машину.

Как установить Ollama?

К сожалению, Ollama доступен только для MacOS и Linux. Но не волнуйтесь, у пользователей Windows также есть способ использовать Ollama – WSL2. Если у вас нет WSL2 на вашем компьютере, ознакомьтесь с этой статьей. Здесь я объяснил все о WSL2 и как его использовать в VS Code. Если вы уже установили его, откройте Ubuntu и выполните следующую команду в терминале.

curl https://ollama.ai/install.sh | sh

Это установит Ollama в WSL2. Если вы используете MacOS, посетите здесь. Теперь вы готовы загрузить модель с помощью Ollama. Оставьте терминал открытым, мы еще не закончили.

Загрузка модели

Ollama предлагает различные модели – llama2, llama2-uncensored, codellama, orca-mini и т.д. Если вы хотите узнать о всех доступных моделях, вы можете посетить этот веб-сайт. Здесь вы загрузите модель orca-mini 3b. Это модель Llama, обученная на наборах данных в стиле orca, созданных с использованием подходов, описанных в статье Orca. Хотя эта модель небольшая (1,9 ГБ), она все равно дает хороший ответ. Чтобы загрузить эту модель, выполните следующую команду:

ollama run orca-mini

Эта команда загрузит и запустит модель orca-mini в терминале. Убедитесь, что на вашем компьютере есть не менее 8 ГБ оперативной памяти, прежде чем вы запустите эту модель.

Если вы запускаете модель, задайте ей несколько вопросов и посмотрите, как она отвечает. Вот пример:

Вы можете видеть из приведенного выше примера, что иногда он дает нерелевантную информацию. Мы можем исправить это, изменив запрос. Мы изменим запрос при создании чат-бота.

Теперь, когда модель работает правильно, давайте создадим PDF-чат-бот с ее помощью.

Создание чат-бота

Настройка каталога проекта

Если вы не знаете, как создать проект в WSL2, обратитесь к последней части этой статьи. Все объяснялось там. Здесь мы используем VS Code в качестве IDE.

Установка необходимых библиотек

Прежде чем мы начнем, установим необходимые библиотеки. Создайте файл с именем requirements.txt и запишите зависимости ниже.

langchainpymupdfhuggingface-hubfaiss-cpusentence-transformers

После этого просто откройте терминал в VS Code и выполните следующую команду.

>>> pip install -r requirements.txt

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

Создание необходимых функций

Для создания чат-бота в Langchain нам нужно следовать некоторым шагам:

  • Чтение PDF-файла с использованием любого загрузчика PDF из Langchain.
  • Если документ действительно большой, хорошей идеей будет разделить его на более мелкие части, так называемые части. Таким образом, мы можем убедиться, что модель получает правильную информацию для вашего вопроса, не используя слишком много ресурсов. Это похоже на то, что мы даем модели только те части, которые ей нужны, вместо того, чтобы перегружать ее всем сразу. Каждая модель имеет ограничение на количество токенов, не так ли?
  • После этого нам нужно преобразовать эти части в векторные вложения, чтобы модель лучше понимала данные. Затем мы должны создать векторное хранилище, где мы можем хранить эти вложения и эффективно извлекать их при необходимости. Здесь мы будем использовать векторное хранилище FAISS.
  • Теперь мы готовы задать запрос к файлу PDF. Для этого мы будем использовать RetrievalQA из Langchain. Он будет использовать векторное хранилище в качестве поисковика и модель, которую мы собираемся использовать. Также используются другие параметры в соответствии с нашими потребностями.

Импорт необходимых пакетов

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

# Импорт необходимых пакетовfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.document_loaders import PyMuPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.vectorstores import FAISSfrom langchain.chains import RetrievalQAimport textwrap

Затем мы создаем нашу первую функцию, которая загрузит PDF-файл. Здесь вы будете читать PDF-файл с использованием PyMuPDFLoader из Langchain.

# Это загрузит PDF-файлdef load_pdf_data(file_path):    # Создание объекта PyMuPDFLoader с file_path    loader = PyMuPDFLoader(file_path=file_path)        # Загрузка PDF-файла    docs = loader.load()        # Возвращение загруженного документа    return docs

Затем мы должны разделить документы на несколько частей. Здесь мы будем использовать RecursiveCharacterTextSplitter из Langchain, который является наиболее популярным для разделения текстов.

# Ответственен за разделение документов на несколько частейdef split_docs(documents, chunk_size=1000, chunk_overlap=20):        # Инициализация RecursiveCharacterTextSplitter с    # chunk_size и chunk_overlap    text_splitter = RecursiveCharacterTextSplitter(        chunk_size=chunk_size,        chunk_overlap=chunk_overlap    )        # Разделение документов на части    chunks = text_splitter.split_documents(documents=documents)        # Возвращение частей документа    return chunks

Теперь пришло время для встраивания. Для этого мы должны сначала загрузить модель встраивания с помощью HuggingFaceEmbedding из Langchain, а затем использовать FAISS для создания векторного хранилища. Модель, используемая для встраивания, называется all-MiniLM-L6-v2, о ней вы узнаете позже.

# функция для загрузки модели встраиванияdef load_embedding_model(model_path, normalize_embedding=True):    return HuggingFaceEmbeddings(        model_name=model_path,        model_kwargs={'device':'cpu'}, # здесь мы будем запускать модель только на CPU        encode_kwargs = {            'normalize_embeddings': normalize_embedding # установите True для вычисления косинусного сходства        }    )# Функция для создания встраиваний с использованием FAISSdef create_embeddings(chunks, embedding_model, storing_path="vectorstore"):    # Создание встраиваний с использованием FAISS    vectorstore = FAISS.from_documents(chunks, embedding_model)        # Сохранение модели в текущем каталоге    vectorstore.save_local(storing_path)        # возвращение векторного хранилища    return vectorstore

Давайте создадим шаблон для настроек по умолчанию, чтобы чат-бот работал как ожидается. Шаблон по умолчанию для модели orca-mini приведен ниже.

prompt = """### Система: Ты помощник AI, который следует инструкциям крайне хорошо. \Помогай столько, сколько можешь.### Пользователь:{prompt}### Ответ:"""

Таким образом, сохранение формата подсказки в данном виде дает нам лучшие ответы. Вот модифицированный шаблон подсказки:

template = """### Система: Ты уважительный и честный помощник. Ты должен отвечать на вопросы пользователя, \используя только предоставленный контекст. Если ты не знаешь ответа, \просто скажи, что не знаешь. Не пытайся придумать ответ.### Контекст:{context}### Пользователь:{question}### Ответ:"""

Теперь нам необходимо создать цепочку вопросов и ответов. Здесь мы используем RetrievalQA из Langchain. RetrievalQA не имеет памяти бота, т.е. он просто отвечает на ваши вопросы, но не запоминает предыдущие разговоры.

# Создание цепочки вопросов и ответовdef load_qa_chain(retriever, llm, prompt):    return RetrievalQA.from_chain_type(        llm=llm,        retriever=retriever, # здесь мы используем векторное хранилище в качестве поисковика        chain_type="stuff",        return_source_documents=True, # включение исходных документов в вывод        chain_type_kwargs={'prompt': prompt} # настройка подсказки    )

Мы также создадим функцию, которая будет выводить ответ в удобной форме. Вот код:

# Оформление ответа в удобной формедef get_response(query, chain):    # Получение ответа из цепочки    response = chain({'query': query})        # Перенос текста для лучшего отображения в Jupyter Notebook    wrapped_text = textwrap.fill(response['result'], width=100)    print(wrapped_text)

Теперь, когда мы создали все необходимые функции, пришло время создать чат-бота.

Создание Jupyter Notebook

Сначала создайте Jupyter Notebook в своем каталоге. Для этого создайте новый файл с расширением .ipynb. Также не забудьте установить Jupyter из pip. В противном случае блокнот не запустится. Просто выполните следующую команду для установки Jupyter.

>>> pip install jupyter

Если VS Code не обнаруживает ядро для Jupyter Notebook, вы увидите опцию “Select Kernel” в верхнем правом углу. Откроется несколько вариантов.

Выберите Python Environments. Появятся еще некоторые варианты.

Выберите предоставленное ядро. После этого вы готовы использовать Jupyter Notebook.

Импорт необходимых библиотек

Теперь мы собираемся импортировать необходимые библиотеки. Здесь мы импортируем три библиотеки:

  • Скрипт на Python, в котором мы пишем все функции. Я назвал файл lang_funcs.py
  • Ollama из langchain.llms и,
  • PromptTemplate из langchain.

Давайте импортируем эти библиотеки:

from lang_funcs import *from langchain.llms import Ollamafrom langchain import PromptTemplate

Загрузка моделей

Теперь нам нужно загрузить модель orca-mini и модель встраивания с названием all-MiniLM-L6-v2. Эта модель встраивания небольшая, но эффективная.

# Загрузка orca-mini из Ollamaallm = Ollama(model="orca-mini", temperature=0)# Загрузка модели встраиванияembed = load_embedding_model(model_path="all-MiniLM-L6-v2")

Модели Ollama размещаются локально на порту 11434. Нам не нужно указывать это, так как уже указано в классе Ollama() из langchain. Если модель встраивания не загружена на ваш компьютер, она будет загружена автоматически с Huggingface. Просто подождите некоторое время и можете приступать.

Загрузка данных и создание векторного хранилища

Пришло время загрузить данные и создать встраивание. Здесь мы будем использовать книгу в формате PDF о машинном обучении.

# Загрузка и разбиение документовdocs = load_pdf_data(file_path="data/ml_book.pdf")documents = split_docs(documents=docs)# Создание векторного хранилищаvectorstore = create_embeddings(documents, embed)# Преобразование векторного хранилища в систему поискаretriever = vectorstore.as_retriever()

Процесс создания встраивания займет некоторое время. Так что будьте терпеливы. Программирование – это все о терпении, не так ли?

Вы почти готовы!

Я знаю, что вы прошли долгий путь. Теперь нам нужно создать цепь и начать тестировать наш чат-бот. Давайте это сделаем.

# Создание запроса на основе ранее созданного шаблонапrompt = PromptTemplate.from_template(template)# Создание цепочкиchain = load_qa_chain(retriever, llm, prompt)

Теперь мы готовы протестировать наш чат-бот.

Тестирование чат-бота

Теперь давайте зададим несколько вопросов нашему чат-боту. Вот несколько примеров:

>>>get_response("What is random forest?", chain)>>> Random Forest - это метод ансамблевого обучения, который использует деревья решений в качестве базовых классификаторов для создания нового классификатора. Это метод ансамблевого обучения, который объединяет несколько деревьев решений для улучшения точности и снижения переобучения окончательной модели. Алгоритм Random Forest представляет дополнительную случайность при построении деревьев, вместо поиска наилучшего признака при делении узла (как делают обычные деревья решений). Это приводит к большему разнообразию деревьев, что увеличивает смещение и уменьшает разброс. Он также более вычислительно эффективен по сравнению с другими методами ансамблевого обучения, такими как Bagging и Boosting.>>>get_response("What is Voting Classifier?", chain)>>> Голосовой классификатор - это тип алгоритма машинного обучения, который предсказывает класс заданной точки входных данных на основе большинственного голосования нескольких классификаторов. Другими словами, он принимает предсказания нескольких различных классификаторов и предсказывает класс, который получает наибольшее количество голосов. Такой подход может повысить точность моделей машинного обучения, благодаря разнообразию предсказаний от различных классификаторов. Жесткий голосовой классификатор - это тип голосового классификатора, который предсказывает класс с наибольшим большинством голосов.>>>get_response("What is the difference between voting classifier and random forest?", chain)>>> Голосовые классификаторы и Random Forest - это два разных подхода к созданию ансамбля классификаторов. Голосовые классификаторы используют многозначное голосование для предсказания класса, который получает наибольшее количество голосов от классификаторов в ансамбле. Этот подход основан на идее, что мнение большинства вероятнее всего будет правильным, и что, объединяя предсказания нескольких классификаторов, мы можем улучшить точность. Жесткий голосовой классификатор - это простая реализация этого подхода. С другой стороны, Random Forest - это метод ансамблевого обучения, который использует деревья решений в качестве базовых классификаторов. Он обучается с помощью метода bagging, где каждое дерево растет из случайно выбранного подмножества обучающих данных. Классификатор Random Forest более удобен и оптимизирован для деревьев решений, чем голосовые классификаторы, и, как правило, дает более качественную модель.

Он действительно дает хорошие ответы. Вы можете задать еще несколько вопросов, чтобы увидеть, как он реагирует.

Заключение

Надеюсь, теперь у вас есть четкое представление о том, как создать бота для PDF с использованием Langchain и Ollama. Ollama – новичок в этой области, и он действительно упрощает нашу жизнь. Вы уже видели, как мы инициализировали модель orca-mini всего в одной строке. В противном случае, вам нужно было бы использовать HuggingfacePipeline из Langchain.

Основные выводы

  • Ollama упрощает развертывание моделей: Ollama упрощает развертывание открытых моделей, предоставляя простой способ их загрузки и запуска на вашем локальном компьютере.
  • Разработка чат-бота для PDF: Узнайте о шагах, необходимых для создания чат-бота для PDF, включая загрузку PDF-документов, разбиение их на блоки и создание цепочки чат-бота.
  • Настройка для лучших ответов: Понимайте, как настраивать подсказки и шаблоны, чтобы улучшить ответы вашего чат-бота.

Вы найдете все использованные в этой статье коды здесь.

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

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