4.1 📤 RAG с вашими данными

🗂 Подробнее про DirectoryLoader 📥

В ноутбуке урока, вкратце упомянули о DirectoryLoader'е, который удобно использовать для загрузки текстов из директории с файлами, имеющими одинаковый формат ( расширение). По умолчанию этот лоадер работает только с файлами текстовых форматов (.txt, .md и т.п.), но это поведение можно поменять.

Рассмотрим несколько важных параметров этого лоадера:

# Например, в нашей папке лежат несколько Python файлов
from langchain_community.document_loaders import DirectoryLoader, PythonLoader
loader = DirectoryLoader(
    '../',                   # путь к папке с файлами
    glob="**/*.py",          # расширения файлов
    show_progress=True,      # показывать прогресс-бар загрузки
    use_multithreading=True, # использовать мультипоточную загрузку
    loader_cls=PythonLoader, # класс для загрузки файлов в папке
)
  • Допустим, у нас есть подобная структура директорий, в которых хранятся файлы разных форматов.
  • Файл с Python-скриптом (ноутбуком) из которого будет запускаться загрузчик лежит в папке scripts.
  • Названия папок соответствуют формату файлов в них.

Структура директорий (папок):

Выберите верные варианты объявления лоадера (отработает без ошибок):

A

from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader('../documents/md/', glob="**/*.md")
docs = loader.load()

B

from langchain_community.document_loaders import DirectoryLoader, DataFrameLoader
loader = DirectoryLoader(
    '../documents/csv/', 
    glob="**/*.csv",
    loader_cls=DataFrameLoader
)
docs = loader.load()

C

from langchain_community.document_loaders import DirectoryLoader
loader = DirectoryLoader('../documents/txt', glob="*/*.txt")
docs = loader.load()

D

from langchain_community.document_loaders import DirectoryLoader, CSVLoader
loader = DirectoryLoader(
    '/documents/csv/', 
    glob="**/*.csv",
    loader_cls=CSVLoader
)
docs = loader.load()

E

from langchain_community.document_loaders import DirectoryLoader, UnstructuredPDFLoader
loader = DirectoryLoader(
    '../documents/pdf/', 
    glob="**/*.pdf",
    loader_cls=UnstructuredPDFLoader
)
docs = loader.load()

Документация по лоадерам в LangChain


В варианте С появляется ошибка:

ValueError: unstructured package not found, please install it with `pip install unstructured`

Но если поставить эту библиотечку, то вариант С отрабатывает без ошибок.
К чему в итоге причислять этот вариант С? Ведь из ответов он исключён как верный.

@Albert_Murtazin, в варианте С указан путь к файлу с именем txt, а не к директории

@Иван_Александров, в то же время имея 3 файла в директории `documents/txt` вариант С отрабатывает без проблем и подгружает 3 документа. Спорный вариант получается.

@Albert_Murtazin, спасибо, проверим

@Иван_Александров, поправили вариант С, теперь точно упадет))

@Иван_Александров, Отработал без ошибок, хоть и не подгрузил документы)

Не принимает то что проверено локально:

A

Document(page_content='32132', metadata={'source': '../RAG/3.md'})]

Error loading file ../4_extract_name_language/raw_texts.csv
ValueError: Expected data_frame to be a pd.DataFrame, got <class 'str'>C
[Document(page_content='432fdsf', metadata={'source': '../RAG/32.txt'})]

D

[Document(page_content="raw_text: The sun was setting, casting long shadows over the small town. Jo¿hn, a middle-

E

File ~/mambaforge/envs/llm/lib/python3.12/site-packages/unstructured/partition/pdf.py:36
     28 from pdfminer.layout import (
     29     LTChar,
     30     LTContainer,
   (...)
     33     LTTextBox,
     34 )
     35 from pdfminer.pdftypes import PDFObjRef
---> 36 from pdfminer.utils import open_filename
     37 from PIL import Image as PILImage
     39 from unstructured.chunking import add_chunking_strategy
ImportError: cannot import name 'open_filename' from 'pdfminer.utils' (/home/bizon/mambaforge/envs/llm/lib/python3.12/site-packages/pdfminer/utils.py)
Зависит ли ответ от версий библиотек?

@Grigorii_Tarasov, Видимо, зависит. По варианту D проверьте, что запускаете скрипт из папки scripts. А в варианте С наличие документов после того как код отработал