📖 Scenario: You are building a small app that reads text files from a folder and loads their content for further processing. Langchain does not have a built-in loader for your file type, so you will create a custom document loader class.
🎯 Goal: Build a custom document loader class in Langchain that reads all text files from a folder and returns their content as documents.
📋 What You'll Learn
Create a class called CustomTextLoader that inherits from BaseLoader.
Add an __init__ method that takes a folder_path string parameter.
Implement a load method that reads all .txt files in the folder and returns a list of documents with their content.
Use the Document class from Langchain to create document objects.
💡 Why This Matters
🌍 Real World
Custom document loaders let you bring your own data files into Langchain pipelines for AI processing, search, or analysis.
💼 Career
Many AI and data jobs require integrating custom data sources. Knowing how to build loaders helps you prepare data for language models and other tools.
Progress0 / 4 steps
1
Set up the folder path variable
Create a variable called folder_path and set it to the string './texts'.
LangChain
Hint
Use a simple string assignment to set the folder path.
2
Create the CustomTextLoader class with __init__
Define a class called CustomTextLoader that inherits from BaseLoader. Add an __init__ method that takes self and folder_path as parameters and assigns folder_path to self.folder_path.
LangChain
Hint
Remember to import BaseLoader from Langchain before defining the class.
3
Implement the load method to read .txt files
Inside CustomTextLoader, add a method called load that takes only self. Use os.listdir(self.folder_path) to get all files. For each file ending with .txt, open and read its content. Create a Document object with the content and add it to a list called documents. Return documents at the end.
LangChain
Hint
Use os.path.join to build the full file path. Remember to import os and Document.
4
Instantiate and use the CustomTextLoader
Create an instance of CustomTextLoader called loader using the folder_path variable. Then call loader.load() and assign the result to a variable called docs.
LangChain
Hint
Instantiate the class with folder_path and call load() to get documents.
Practice
(1/5)
1. What is the main purpose of creating a custom document loader in Langchain?
easy
A. To load and preprocess documents from any data source before use
B. To create user interfaces for document display
C. To train machine learning models directly
D. To manage database connections automatically
Solution
Step 1: Understand the role of document loaders
Document loaders bring data into Langchain, preparing it for processing.
Step 2: Identify the purpose of custom loaders
Custom loaders allow loading from any source and preprocessing like cleaning or adding metadata.
Final Answer:
To load and preprocess documents from any data source before use -> Option A
Quick Check:
Custom loaders = load + preprocess documents [OK]
Hint: Custom loaders bring in and prep data from any source [OK]
Common Mistakes:
Confusing loaders with UI components
Thinking loaders train models
Assuming loaders manage databases
2. Which of the following is the correct way to start defining a custom document loader class in Langchain?
easy
A. class MyLoader():\n def load(self):\n pass
B. def MyLoader():\n return BaseLoader.load()
C. class MyLoader(BaseLoader):\n def load(self):\n pass
D. class MyLoader(BaseLoader):\n def read(self):\n pass
Solution
Step 1: Check inheritance from BaseLoader
Custom loaders must inherit from BaseLoader to fit Langchain's pattern.
Step 2: Confirm the method name is load
The required method to implement is load(), not read().
Final Answer:
class MyLoader(BaseLoader):\n def load(self):\n pass -> Option C
Quick Check:
Inherit BaseLoader + define load() method [OK]
Hint: Inherit BaseLoader and implement load() method [OK]
Common Mistakes:
Not inheriting from BaseLoader
Using wrong method name like read()
Defining function instead of class
3. Given this custom loader code snippet, what will print(docs) output?
from langchain.schema import Document
from langchain.document_loaders.base import BaseLoader
class SimpleLoader(BaseLoader):
def load(self):
return [Document(page_content='Hello World', metadata={'source': 'test'})]
loader = SimpleLoader()
docs = loader.load()
medium
A. [Document(page_content='Hello World', metadata={'source': 'test'})]
B. ['Hello World']
C. None
D. SyntaxError
Solution
Step 1: Analyze the load method return value
The load method returns a list with one Document object containing content and metadata.
Step 2: Understand what docs holds
docs is assigned the list returned, so printing docs shows the list with the Document instance.
Final Answer:
[Document(page_content='Hello World', metadata={'source': 'test'})] -> Option A
Quick Check:
load() returns list of Document objects [OK]
Hint: load() returns list of Document objects, not strings [OK]
Common Mistakes:
Expecting a list of strings instead of Document objects
Thinking load() returns None
Assuming syntax error due to imports
4. Identify the error in this custom loader code:
from langchain.document_loaders.base import BaseLoader
class FaultyLoader(BaseLoader):
def load(self):
docs = []
docs.append('Just a string')
return docs
loader = FaultyLoader()
loader.load()
medium
A. The load method must be named read
B. BaseLoader cannot be inherited directly
C. The class must not have a load method
D. The load method should return Document objects, not strings
Solution
Step 1: Check what load returns
The load method returns a list with a string instead of Document objects.
Step 2: Recall Langchain expects Document objects
Custom loaders must return Document instances, not plain strings, for proper processing.
Final Answer:
The load method should return Document objects, not strings -> Option D
Quick Check:
load() must return Document objects [OK]
Hint: load() must return Document objects, not plain strings [OK]
Common Mistakes:
Returning strings instead of Document objects
Misnaming the load method
Thinking BaseLoader can't be inherited
5. You want to create a custom loader that reads text files from a folder, adds the filename as metadata, and returns Document objects. Which approach correctly implements this?
hard
A. Use BaseLoader directly without subclassing, call load() with folder path argument
B. Inherit BaseLoader, implement load() to read files, create Document with content and metadata filename, return list
C. Create a function that returns file contents as strings without Document wrapping
D. Subclass BaseLoader but return raw file paths as strings in load()
Solution
Step 1: Confirm inheritance and method implementation
Custom loaders must subclass BaseLoader and implement load() method.
Step 2: Ensure load reads files and returns Document objects with metadata
Reading files and wrapping content in Document with filename metadata is correct.
Final Answer:
Inherit BaseLoader, implement load() to read files, create Document with content and metadata filename, return list -> Option B
Quick Check:
Subclass + load() returns Document list with metadata [OK]
Hint: Subclass BaseLoader, load files, wrap in Document with metadata [OK]
Common Mistakes:
Not subclassing BaseLoader
Returning strings instead of Document objects
Ignoring metadata addition
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.