Гид по технологиям

Анализ локальных документов с LangChain и OpenAI

7 min read Инструменты ML Обновлено 22 Dec 2025
Анализ локальных документов с LangChain и OpenAI
Анализ локальных документов с LangChain и OpenAI

Коротко о подходе

LangChain помогает строить конвейеры обработки текста: загрузка документа → разбиение на фрагменты → создание эмбеддингов → индексирование в векторном хранилище (FAISS) → поиск и генерация ответов через OpenAI. Данные остаются локально: эмбеддинги и индекс хранятся у вас.

Важное: OpenAI не использует данные, отправленные через API, для обучения своих моделей или улучшения сервисов.

Основные варианты применения

  • Быстрый вопрос-ответ по внутренней документации.
  • Поиск по контрактам и политикам компании.
  • Аналитика научных статей или отчётов.
  • Автоматизация обзора исходного кода.

Что потребуется

  • Python 3.8+
  • OpenAI API-ключ (безопасно храните его как переменную окружения)
  • Документы в PDF или TXT в локальной папке проекта

Настройка окружения

Создайте виртуальное окружение, чтобы избежать конфликтов версий, затем установите зависимости:

pip install langchain openai tiktoken faiss-cpu pypdf

Пояснение по библиотекам

  • LangChain: модульная сборка для загрузки документов, разбиения, эмбеддингов и работы с векторным хранилищем.
  • OpenAI: модель для генерации ответов и создания эмбеддингов (через специализированный класс).
  • tiktoken: подсчёт токенов для учёта затрат API.
  • FAISS: быстрый поиск по векторному индексу.
  • PyPDF (pypdf): извлечение текста из PDF.

Получение OpenAI API-ключа

Перейдите на платформу OpenAI и получите секретный ключ в разделе управления аккаунтом.

Главная страница OpenAI — получение API-ключа

Под вашим профилем в правом верхнем углу выберите View API keys и создайте новый секретный ключ. Скопируйте его и сохраните в безопасном месте — просмотреть ключ позже нельзя.

Страница управления API-ключами в OpenAI

Важно: не храните ключи в исходниках репозитория. Используйте переменные окружения или менеджеры секретов.

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

from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

Эти импорты позволяют: загрузить PDF/TXT, разбить текст на фрагменты, создать эмбеддинги через OpenAI, индексировать в FAISS и запускать RetrievalQA.

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

Создайте переменную для API-ключа. В боевой системе лучше брать ключ из переменных окружения:

import os
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
    raise EnvironmentError("Переменная OPENAI_API_KEY не установлена")

Пример функции загрузки документа и разбиения на фрагменты:

def load_document(filename):
    if filename.endswith(".pdf"):
        loader = PyPDFLoader(filename)
        documents = loader.load()
    elif filename.endswith(".txt"):
        loader = TextLoader(filename)
        documents = loader.load()
    else:
        raise ValueError("Неподдерживаемый тип файла: используйте .pdf или .txt")

    text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=30, separator="\n")
    return text_splitter.split_documents(documents=documents)

Почему разбиение важно: фрагменты фиксированного размера позволяют контролировать контекст, который передаётся в модель, и облегчают поиск релевантных отрывков.

Создание эмбеддингов и индекса FAISS

def build_vectorstore(docs, api_key):
    embeddings = OpenAIEmbeddings(openai_api_key=api_key)
    vectorstore = FAISS.from_documents(docs, embeddings)
    vectorstore.save_local("faiss_index_local")
    return vectorstore

Сохранение индекса локально ускоряет последующие запуски и делает процесс детерминированным.

Запросы к документу (Retrieval + QA)

def query_pdf(query, retriever, api_key):
    qa = RetrievalQA.from_chain_type(
        llm=OpenAI(openai_api_key=api_key),
        chain_type="stuff",
        retriever=retriever
    )
    result = qa.run(query)
    print(result)
    return result

chain_type=”stuff” — самый простой способ собрать контекст. Для больших наборов документов рассмотрите chain_type=”refine” или специализированные конвейеры.

Главная функция — поток исполнения

def main():
    filename = input("Введите имя документа (.pdf или .txt):\n")
    docs = load_document(filename)
    vectorstore = build_vectorstore(docs, openai_api_key)

    persisted_vectorstore = FAISS.load_local("faiss_index_local", OpenAIEmbeddings(openai_api_key=openai_api_key))
    query = input("Введите вопрос (введите 'exit' для выхода):\n")

    while query != "exit":
        query_pdf(query, persisted_vectorstore.as_retriever(), openai_api_key)
        query = input("Введите вопрос (введите 'exit' для выхода):\n")

if __name__ == "__main__":
    main()

Это CLI-приложение. Для веб-интерфейса можно добавить Streamlit или FastAPI.

Пример: запуск и вывод

Поместите исследуемый файл в папку проекта и запустите скрипт. При вводе вопросов вы получите сгенерированные ответы на основе локального индекса.

Результаты анализа PDF через запросы в терминале

Вывод программы: анализ исходного кода в терминале

Что происходит под капотом — кратко

  1. Текст → эмбеддинги: каждая часть текста преобразуется в вектор чисел, отражающих семантику.
  2. Индекс FAISS: быстрый поиск ближайших векторов.
  3. RetrievalQA: подтягивает релевантные фрагменты и передаёт их в LLM для генерации ответа.

Практические советы по безопасности и приватности

  • Не храните API-ключи в открытом исходнике. Используйте env-vars, Vault или Secret Manager.
  • Ограничьте права ключа (если доступна такая опция) и используйте отдельные ключи для dev/prod.
  • Удаляйте временные файлы и индексы, если они содержат чувствительные данные.
  • Логируйте доступ и запросы только в обезличенном виде.

Важное: при работе с персональными данными учитывайте региональные правила (например, GDPR в ЕС). Если у вас есть персональные данные, проконсультируйтесь с DPO.

Безопасность и харднинг

  • Используйте изолированные окружения для разных проектов.
  • Шифруйте диск, где хранятся индексы и данные.
  • Контролируйте доступ к серверу и правам файловой системы.
  • Ограничьте количество токенов и контролируйте затраты через мониторинг.

Критерии приёмки

  • Скрипт загружает PDF или TXT без ошибок.
  • Индекс FAISS сохраняется и загружается локально.
  • Запрос возвращает осмысленный ответ на контрольный вопрос по документу.
  • Отсутствуют утечки секретов в логах или репозитории.

Роль‑ориентированные чек-листы

Разработчик

  • Настроить виртуальное окружение
  • Проверить импорт всех библиотек
  • Добавить обработку ошибок для файлов

Инженер по безопасности

  • Установить механизмы хранения секретов
  • Проверить права доступа к файлам индекса
  • Настроить шифрование диска при необходимости

Администратор данных

  • Проверить соответствие GDPR/локальным требованиям
  • Дать рекомендации по обезличиванию данных

Оператор / DevOps

  • Автоматизировать построение индекса в CI/CD
  • Настроить мониторинг API-ключей и расходов

SOP: Быстрый рабочий процесс (Playbook)

  1. Склоните репозиторий и создайте виртуальное окружение.
  2. Установите зависимости.
  3. Экспортируйте OPENAI_API_KEY в среду.
  4. Положите документ в папку проекта.
  5. Запустите main() и создайте индекс.
  6. Выполните серию тестовых запросов и проверьте релевантность.
  7. Сохраните итоговый индекс и сделайте резервную копию.

Инцидент: руководство по восстановлению

  • Симптом: индекс повреждён или недоступен.
    • Шаг 1: остановите сервис, который использует индекс.
    • Шаг 2: восстановите индекс из резервной копии.
    • Шаг 3: проверьте контрольные вопросы; если ответы некорректны — пересоздайте индекс.
  • Симптом: утечка API-ключа.
    • Шаг 1: немедленно отозвать ключ в панели OpenAI.
    • Шаг 2: сгенерировать новый ключ и заменить в системе.
    • Шаг 3: проверить логи на подозрительную активность.

Тест-кейсы и приёмка

  • TC1: Загрузка корректного PDF → успешное создание индекса.
  • TC2: Загрузка некорректного формата (например .docx) → ValueError.
  • TC3: Поиск по документу с известным фактом → ответ содержит ожидаемую информацию.
  • TC4: Потеря соединения с OpenAI → читаемый message об ошибке и graceful degradation.

Шаблон контрольного чек-листа (таблица)

ШагОжидаемый результатСтатус
Установка пакетовpip install завершился без ошибок✅/❌
Получение API-ключаЕсть переменная OPENAI_API_KEY✅/❌
Создание индексаfaiss_index_local/ существует✅/❌
Вопрос-ответОтвет релевантен на контрольный вопрос✅/❌

Альтернативные подходы и когда они подходят

  • Если вы не хотите использовать облачные эмбеддинги, можно применять локальные эмбеддинговые модели (например, SentenceTransformers). Это снижает зависимость от внешних API, но повышает требования к ресурсам.
  • Для реального времени и стриминга лучше использовать архитектуру с микросервисами и кэшированием результатов.

Ограничения и случаи, когда это не работает

  • Очень большие документы (сотни тысяч слов) требуют сегментации и продуманной стратегии поиска; простого разбиения может быть недостаточно.
  • Документы с множеством таблиц или форматов: извлечение структуры (таблиц, изображений) потребует дополнительной обработки.

Совместимость и миграция

  • LangChain и OpenAI обновляются: фиксируйте версии в requirements.txt для повторяемости сборки.
  • При переходе с faiss-cpu на faiss-gpu проверьте совместимость версий и изменение путей к индексам.

Мини‑методология качества ответов

  1. Начните с контрольных вопросов с чёткими ожидаемыми ответами.
  2. Проверьте, какие фрагменты возвращает retriever.
  3. Настройте размер фрагментов и overlap, пока качество не станет приемлемым.
  4. При необходимости используйте цепочки уточнения (refine).

Факт‑бокс: ключевые числа (оценочно, без метрик использования)

  • Рекомендуемый chunk_size: 500–1500 символов.
  • Рекомендуемый overlap: 20–100 символов.
  • Минимальные требования: 2–4 ГБ RAM для простых индексов (зависит от объёма данных).

Короткая аннотация для соцсетей (100–200 слов)

Этот инструмент позволяет безопасно и локально анализировать PDF и текстовые файлы с помощью LangChain и OpenAI. Вы научитесь: настраивать окружение, создавать эмбеддинги, индекс FAISS и задавать вопросы к документам через интерфейс командной строки. Подробные рекомендации по безопасности, чек-листы для ролей и план действий при инцидентах помогут внедрить решение в продакшн без утечек секретов.

Подсказки по отладке

  • Если ответы не релевантны, проверьте, какие фрагменты возвращает retriever — возможно, нужно увеличить overlap.
  • При ошибках token limit разбивайте текст на меньшие куски или уменьшите контекст, передаваемый в LLM.

Глоссарий (1‑строчная версия)

  • Эмбеддинг: векторное представление текста, отражающее его смысл.
  • FAISS: библиотека для быстрого поиска ближайших векторов.
  • Retriever: компонент, извлекающий релевантные фрагменты из индекса.
  • RetrievalQA: конвейер, совмещающий поиск и генерацию ответа.

Резюме

  • LangChain + OpenAI позволяют анализировать локальные документы без загрузки данных в облако.
  • Основные шаги: загрузка → разбиение → эмбеддинги → индекс FAISS → RetrievalQA.
  • Обязательно обеспечьте безопасное хранение ключей и соответствие локальным законам о данных.

Короткие рекомендации по следующему шагу: протестируйте конвейер на небольшом наборе документов, настройте размеры фрагментов и добавьте автоматизированные тесты для контроля качества.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

LetterBomb и Homebrew: установка на Nintendo Wii
Игры

LetterBomb и Homebrew: установка на Nintendo Wii

Google Docs офлайн: как включить и работать
Инструкции

Google Docs офлайн: как включить и работать

Автозагрузка музыки на iPhone через умные плейлисты
Инструкции

Автозагрузка музыки на iPhone через умные плейлисты

Отключить или удалить Copilot в Windows 11
Windows

Отключить или удалить Copilot в Windows 11

Как проверить время игры на Xbox Series X|S
Игры

Как проверить время игры на Xbox Series X|S

Отключить Quick Access в Проводнике Windows 10
Windows 10

Отключить Quick Access в Проводнике Windows 10