Содержание
Как загрузить PDF в LangChain
Черновик готовит редакция с помощью ИИ. За стандарт издания отвечает главный редактор — Валерий Курземнек.
Материал редакции Зерокодера. Счёт по выдаче снят собственным прогоном 22 октября 2026 года; цитаты источников приведены дословно. Обновлено: октябрь 2026.
Как загрузить PDF в LangChain: выберите загрузчик документов, передайте ему путь к файлу или URL, вызовите load() для всего файла либо lazy_load() для потоковой обработки. В документации LangChain метод load() описан как загрузка всех документов сразу, а lazy_load() — как потоковая выдача документов, полезная для больших наборов данных. Дальше PDF превращается в объекты Document, которые идут в разбиение, эмбеддинги и поиск.
Прямой ответ и границы продукта
LangChain — это фреймворк для приложений на языковых моделях, и загрузка PDF здесь решается через отдельный класс-загрузчик. В документации проекта загрузчики собраны в каталог интеграций: у каждого указаны класс, пакет, поддержка локального запуска, сериализации и JavaScript. Каталог описывает загрузчики как способ получать документы из разных источников и приводить их к единому виду.
Границы стоит держать в голове сразу. LangChain сам не «читает» PDF: он вызывает библиотеку-парсер, установленную рядом. Для PyPDFLoader это pypdf из пакета langchain-community, для PyMuPDFLoader — PyMuPDF, для PDFMinerLoader — PDFMiner, для PDFPlumberLoader — pdfplumber. В документации эти четыре загрузчика помечены как community-решения, а DoclingLoader и UnstructuredLoader идут отдельными пакетами с собственными возможностями.
Второй момент — где именно выполняется разбор. Часть загрузчиков работает локально на вашем железе, часть обращается к внешнему API. В каталоге интеграций у UnstructuredLoader отмечена поддержка локального режима и JavaScript, а у DoclingLoader — локальный запуск при отсутствии поддержки JavaScript. Разделение важно: локальный разбор не отправляет файл наружу, API-разбор требует ключа и сетевого доступа.
Третий момент — формат результата. Метод load() возвращает список объектов Document с полем page_content и словарём metadata; lazy_load() выдаёт документы через итератор. Метаданные различаются от загрузчика к загрузчику: у UnstructuredLoader в примере документации видны source, coordinates с системой PixelSpace, layout_width, layout_height, file_directory, filename, languages, last_modified, page_number, filetype, category и element_id. Такой набор позволяет фильтровать страницы и элементы до отправки в модель.
Отдельно про доступность. Источники, которые мы прочитали, описывают установку пакетов и запуск кода без привязки к стране. Утверждать что-либо о работе сервисов из России на этом основании нельзя, поэтому проверяйте доступность конкретного API-провайдера самостоятельно.
Счёт по выдаче: скачали подборку результатов веб-поиска по запросу «Как загрузить PDF в LangChain»: текст отдали 8 из 10. Медиана объёма читаемого текста топа — 1851 слово. Метку 2026 года несут 5 из 8 прочитанных страниц.
Условия доступа и источник актуальных требований
Актуальные требования живут в документации LangChain по интеграциям. Именно там перечислены классы загрузчиков и их пакеты, и именно оттуда стоит брать имена модулей перед установкой. Каталог обновляется вместе с релизами, поэтому сверяйтесь с ним.
Установка зависит от выбранного загрузчика. Для Docling в документации указана команда pip install -qU langchain-docling. Для локального Unstructured приводится pip install "langchain-unstructured[local]", а для варианта, совместимого с API-разбором, — pip install -qU langchain-unstructured unstructured-client unstructured "unstructured[pdf]" python-magic. Системные зависимости в документации Unstructured перечислены отдельно: libmagic, poppler, tesseract, а для XML и HTML дополнительно libxml2 и libxslt.
Ключи и переменные окружения. Для API-разбора Unstructured документация предлагает сохранить ключ в переменную UNSTRUCTURED_API_KEY и передавать его в загрузчик через api_key. Для примеров с HuggingFace в документации Docling упоминается переменная HF_TOKEN, повышающая квоту Inference API.
Провайдеры моделей перечислены в отдельном каталоге интеграций. Там у пакетов отмечена поддержка JavaScript и TypeScript: у langchain-anthropic, langchain-google-genai, langchain-huggingface, langchain-elasticsearch, langchain-astradb, langchain-oracledb, langchain-unstructured стоит отметка поддержки, а у langchain-nvidia-ai-endpoints, toolbox-langchain, langchain-google-community, langchain-graph-retriever, langchain-oci такой отметки нет. Эти данные нужны, когда вы выбираете, чем генерировать ответ поверх найденных фрагментов.
Ещё одна опора — таблица совместимости у конкретного загрузчика. У Docling в документации приведена строка langchain_docling.loader langchain-docling с отметками локального запуска, сериализации и поддержки JavaScript. У Unstructured строка выглядит как UnstructuredLoader langchain-unstructured с отметками локального запуска и JavaScript. Такие таблицы экономят время: видно, можно ли запускать разбор без сети.
Практический порядок: откройте страницу интеграции нужного загрузчика, скопируйте команду установки, проверьте список системных зависимостей, задайте переменные окружения для ключей. После этого переходите к коду. Если что-то падает на импорте, причина обычно в неполной установке, и разбор таких случаев есть в статье LangChain не работает: причины и решения.
Порядок действий: загрузка PDF через DoclingLoader
Разберём документированный путь на примере Docling. В документации LangChain показан минимальный сценарий: импорт загрузчика, путь к файлу, создание объекта и вызов загрузки.
from langchain_docling.loader import DoclingLoader
FILE_PATH = "https://arxiv.org/pdf/2408.09869"
loader = DoclingLoader(file_path=FILE_PATH)
documents = loader.load()
Первый шаг — установка пакета командой из документации. Второй — импорт класса DoclingLoader из модуля langchain_docling.loader. Третий — подготовка пути: параметр file_path в документации описан как источник в виде одной строки с URL или локальным файлом либо итерируемого объекта из таких строк. Четвёртый — создание загрузчика. Пятый — вызов load() и получение списка документов.
Для больших наборов документация предлагает потоковый вариант. В примере показан цикл по loader.lazy_load(), где каждый документ обрабатывается по мере поступления. Тот же приём описан в общем каталоге загрузчиков: lazy_load() выдаёт документы потоком и подходит для крупных наборов данных.
Режим экспорта задаётся параметром export_type. В документации перечислены два значения: ExportType.DOC_CHUNKS как значение по умолчанию, когда каждый входной документ разбивается на части и каждая часть становится отдельным Document, и ExportType.MARKDOWN, когда каждый входной документ сохраняется как один Document. Выбор влияет на то, что попадёт в векторное хранилище.
У загрузчика Docling в документации перечислены и другие параметры: converter для конкретного конвертера, convert_kwargs для аргументов конвертации, md_export_kwargs для настроек экспорта в Markdown, chunker для конкретного чанкера в режиме doc-chunk, meta_extractor для извлечения метаданных. Все они необязательные, и начинать стоит без них.
Проверка результата. В документации Docling приведён вывод первых трёх документов: первый содержит строку вида arXiv:2408.09869v5 [cs.CL] 9 Dec 2024, второй — заголовок отчёта, версию и список авторов, третий — начало аннотации. Такой вывод показывает разбиение на текстовые блоки; отдельный Document в режиме DOC_CHUNKS соответствует чанку, который может включать сведения со страниц документа.
Если нужен разбор с координатами элементов, документация Unstructured приводит другой пример. Там загрузчик создаётся из списка путей, а в метаданных документа видны координаты блока в пиксельной системе, ширина и высота макета, номер страницы и категория элемента. Это пригодится, когда нужно вернуть читателю ссылку на конкретное место в PDF.
Учебный пример и критерии проверки
Соберём упражнение, которое можно выполнить на своём файле. Возьмите PDF на несколько страниц с заголовками и таблицей. Задача — получить документы, убедиться в корректности разбора и найти фрагмент по вопросу.
Шаг первый. Загрузите файл через DoclingLoader с export_type=ExportType.DOC_CHUNKS. Шаг второй. Выведите первые несколько документов и посмотрите на page_content. Шаг третий. Соберите из полученных документов векторное хранилище и подключите поиск с небольшим числом возвращаемых фрагментов. Шаг четвёртый. Задайте вопрос по содержанию файла и посмотрите, какие фрагменты вернулись в качестве контекста.
В документации Docling показан близкий сценарий: загрузка отчёта, разбиение, построение хранилища на Milvus с эмбеддингами HuggingFace, создание цепочки поиска и генерации, вывод ответа и источников. В примере используется шаблон запроса с блоком контекста и вопросом, а также вывод первых символов каждого найденного фрагмента вместе с метаданными.
Критерии самостоятельной проверки:
| Что проверяем | Признак успеха | Признак проблемы |
|---|---|---|
| Разбор текста | В page_content читаемые предложения |
Строки из случайных символов |
| Разбиение | Части не обрываются посреди слова | Части короче одного предложения |
| Метаданные | Для Docling есть source и dl_meta; номер страницы при наличии ищется во вложенных doc_items → prov → page_no. |
Не удаётся привязать фрагмент к исходному файлу. |
| Поиск | Возвращаются фрагменты с нужной темой | Фрагменты из других разделов |
| Ответ | Опирается на найденный контекст | Ссылается на сведения вне файла |
Проверка на таблицах. Возьмите PDF, где есть таблица с числами, и посмотрите, сохранилась ли структура строк. У Docling в описании пакета упоминается распознавание структуры таблиц, поэтому сравнение вывода на табличном и текстовом файле даёт понятную картину.
Проверка на объёме. Загрузите файл целиком через load() и тот же файл через lazy_load(), сравните число полученных документов. Совпадение говорит о том, что потоковый режим не теряет части. Расхождение — повод разобраться в настройках разбиения.
Проверка на смешанном наборе. Документация Unstructured показывает загрузку списка файлов разных типов в одном вызове: PDF и текстовый файл обрабатываются вместе, и в выводе видно имя файла рядом с содержимым. Такой тест показывает, как ведёт себя конвейер, когда на входе не только PDF.
Критерий по метаданным особенно полезен. Если в документах нет номера страницы, вы не сможете показать читателю, откуда взялся ответ. Метаданные Unstructured в примере включают page_number и coordinates, а метаданные Docling содержат сведения об источнике и структуре. Наличие этих полей — условие для честной ссылки на первоисточник.
Смежные варианты и выбор по задаче
Загрузчиков PDF в каталоге LangChain много, и выбор определяется содержимым файла и требованиями к разбору. Ниже сведены варианты, которые описаны в документации проекта.
| Загрузчик | Пакет | Особенность по документации |
|---|---|---|
| PyPDFLoader | langchain-community | Загрузка PDF через pypdf |
| PyMuPDFLoader | langchain-community | Загрузка PDF через PyMuPDF |
| PDFMinerLoader | langchain-community | Загрузка PDF через PDFMiner |
| PDFPlumberLoader | langchain-community | Загрузка PDF через pdfplumber |
| DoclingLoader | langchain-docling | Разбор PDF через Docling, локальный запуск |
| UnstructuredLoader | langchain-unstructured | Разбор PDF через открытую библиотеку Unstructured |
| UpstageDocumentParseLoader | отдельный пакет | Разбор PDF через Upstage |
| MinerU | отдельный пакет | Разбор PDF и других документов |
| UnDatasIO | отдельный пакет | Разбор PDF через UnDatasIO |
| OpenDataLoader PDF | отдельный пакет | Разбор PDF через OpenDataLoader |
| CVFileLoader | отдельный пакет | Загрузка файлов PDF/A-3u с встроенными данными |
| pdfmuse | отдельный пакет | Детерминированный разбор PDF и DOCX с координатами и таблицами |
| oxidize-pdf | отдельный пакет | Разбор PDF на движке Rust с разбиением под RAG |
| pdf-inspector | отдельный пакет | Разбор PDF через pdf-inspector |
Как выбирать. Для простого текстового PDF хватает community-загрузчика на pypdf. Для файлов с таблицами и сложной вёрсткой документация описывает Docling с распознаванием структуры таблиц и разметкой блоков. Для смешанного набора файлов удобен Unstructured, который принимает список путей и умеет работать как локально, так и через API. Для случаев, где важны точные координаты блока, документация приводит pdfmuse с координатами и таблицами, а также oxidize-pdf с разбиением под RAG.
Отдельная ветка — разбор через API. В документации Unstructured показан загрузчик с partition_via_api=True, собственным клиентом, настройками повторов и разбиением PDF на диапазоны страниц. В логе видно, как документ делится на части, каждая отправляется отдельным запросом, а результаты собираются в общий список. Такой путь подходит для больших файлов, когда локальный разбор занимает слишком много времени.
Ещё вариант — загрузка по URL. В документации Docling путь задаётся ссылкой на PDF, а в документации Unstructured показана загрузка веб-страницы через параметр web_url с метаданными о языке, типе файла и адресе. Для PDF логика та же: источником может быть ссылка.
Если вы строите диалог поверх документов, посмотрите материал про Ollama ошибка 500: диагностика и решение — там разобраны сбои локального запуска моделей, которые часто идут в одной связке с загрузкой файлов.
Типичные проблемы и способы диагностики
Первая группа проблем связана с установкой. Импорт падает с ошибкой модуля — значит, пакет не установлен или установлен не тот. Сверьте имя пакета со строкой в каталоге интеграций: у Docling это langchain-docling, у Unstructured — langchain-unstructured. Для локального Unstructured документация отдельно перечисляет системные библиотеки, и их отсутствие даёт сбой на этапе разбора.
Вторая группа — предупреждения модели при разборе. В документации Docling приведено сообщение о том, что длина последовательности токенов превышает заданный максимум для модели, и обработка такой последовательности приведёт к ошибкам индексации. Сообщение появляется при работе с длинными фрагментами и указывает на необходимость разбиения.
Третья группа — пустой или мусорный текст. Причина обычно в самом PDF: сканированные страницы содержат изображения, и текстовый слой в них отсутствует. Проверяется просто: откройте файл и попробуйте выделить текст мышью. Если выделение не работает, нужен разбор с распознаванием, и здесь пригодятся загрузчики с поддержкой OCR.
Четвёртая группа — потеря структуры. Таблицы превращаются в набор чисел без привязки к строкам, заголовки сливаются с абзацами. Диагностика: выведите несколько документов подряд и сравните с исходной страницей. Если структура важна, переходите на загрузчик с разметкой блоков и координатами.
Пятая группа — ошибки сети при API-разборе. В документации Unstructured показана настройка повторов с экспоненциальной задержкой и указанием собственного адреса сервера. Если запросы падают, проверьте ключ, адрес и настройки повторов.
Шестая группа — расхождение числа документов. Загрузите файл двумя способами и сравните результат. Разница говорит о настройках разбиения.
Диагностический порядок, который экономит время:
- Проверьте, что пакет установлен и импортируется.
- Загрузите одну страницу и посмотрите
page_content. - Выведите метаданные и убедитесь, что есть источник и номер страницы.
- Сравните
load()иlazy_load()по числу документов. - Проверьте поиск на вопросе, ответ на который точно есть в файле.
- Посмотрите, какие фрагменты вернулись в контекст.
Если сбой происходит на этапе обращения к модели, пригодится разбор в статье Как подключить Gemini к n8n — там показана работа с ключами и запросами к провайдеру.
Частые вопросы
Как загрузить PDF в LangChain?
Для Docling установите langchain-docling, импортируйте DoclingLoader и передайте путь или URL в file_path. Метод load() вернёт список Document с текстом и метаданными; lazy_load() выдаст итератор документов. Имена параметров у других загрузчиков сверяйте с их документацией.
Какой загрузчик PDF выбрать в LangChain?
Для простого текста подойдут community-загрузчики на pypdf, PyMuPDF, PDFMiner или pdfplumber. Для таблиц и сложной вёрстки в документации описан Docling с распознаванием структуры таблиц. Для смешанного набора файлов удобен Unstructured, который принимает список путей и работает локально либо через API.
Почему PDF загружается пустым?
Сканированные страницы содержат изображения без текстового слоя, и обычный парсер возвращает пустой текст. Проверьте, выделяется ли текст в файле вручную. Если нет, нужен разбор с распознаванием символов и загрузчик с поддержкой OCR.
Как проверить, что PDF разобран правильно?
Выведите несколько документов подряд и сравните с исходными страницами. Убедитесь, что части не обрываются посреди слова, а в метаданных есть источник и номер страницы. Затем задайте вопрос, ответ на который точно есть в файле, и посмотрите, какие фрагменты вернулись в контекст.
Что делать с длинным PDF?
Используйте потоковую загрузку через lazy_load(), которая выдаёт документы по мере обработки. Для API-разбора документация Unstructured показывает разбиение файла на диапазоны страниц с отправкой частей отдельными запросами. Дополнительно настройте разбиение на фрагменты подходящего размера перед построением хранилища.
Промпт, чтобы получить от модели разбор структуры загруженного PDF:
Ты помогаешь разобрать PDF-документ, загруженный в LangChain. Ниже контекст — фрагменты, полученные загрузчиком.
Контекст:
[вставьте сюда содержимое page_content из полученных Document]
Задача: [ваша задача, например — составить оглавление документа]
Сделай следующее:
1. Определи, к каким разделам относятся фрагменты.
2. Перечисли заголовки в порядке следования.
3. Отметь фрагменты, где текст разобран неполно или содержит мусор.
4. Для каждого вывода укажи номер страницы из метаданных.
Отвечай по-русски, кратко, без вступлений.
В промпте меняйте задачу под себя и подставляйте свои фрагменты. Вариации той же задачи: извлечь список таблиц и подписей к ним; собрать глоссарий терминов с номерами страниц; найти противоречия между разделами; составить краткий пересказ по разделам; выделить фрагменты, требующие повторного разбора.
