如何通过LangChain的DirectoryLoader将文件日期加入文档元数据?
实现LangChain DirectoryLoader加载文件时添加创建/修改日期至元数据
完全可行,你可以通过自定义元数据函数或加载后统一处理的方式实现,以下是具体方案:
方案一:通过加载器的metadata_func参数(推荐,针对单类型文件)
这种方式直接利用LangChain加载器的内置扩展能力,针对docx文件可以这样做:
- 导入所需模块并定义元数据处理函数
该函数接收文件路径,返回包含创建/修改时间的元数据字典:
import os import datetime from langchain.document_loaders import DirectoryLoader, Docx2txtLoader def add_file_time_metadata(file_path): file_stats = os.stat(file_path) # 将时间戳转换为易读的字符串格式 create_time = datetime.datetime.fromtimestamp(file_stats.st_ctime).strftime("%Y-%m-%d %H:%M:%S") modify_time = datetime.datetime.fromtimestamp(file_stats.st_mtime).strftime("%Y-%m-%d %H:%M:%S") return { "file_create_time": create_time, "file_modify_time": modify_time }
- 修改DirectoryLoader初始化代码
指定docx对应的加载器Docx2txtLoader,并通过loader_kwargs传入自定义元数据函数:
loader = DirectoryLoader( dir, glob="**/*.docx", show_progress=True, silent_errors=True, loader_cls=Docx2txtLoader, loader_kwargs={ "metadata_func": add_file_time_metadata } ) docs = loader.load()
- 验证结果
加载后每个文档的元数据会包含新增的时间字段:
for doc in docs: print(f"文件路径: {doc.metadata['source']}") print(f"创建时间: {doc.metadata['file_create_time']}") print(f"修改时间: {doc.metadata['file_modify_time']}\n")
方案二:加载后统一处理(通用型,适配未来扩展多类型文件)
如果未来要扩展到其他文档类型(如PDF、TXT等),部分加载器可能不支持metadata_func参数,这种情况下可以在加载完成后遍历文档手动添加元数据:
import os import datetime from langchain.document_loaders import DirectoryLoader # 原加载代码 loader = DirectoryLoader(dir, glob="**/*.docx", show_progress=True, silent_errors=True) docs = loader.load() # 遍历添加时间元数据 for doc in docs: file_path = doc.metadata["source"] file_stats = os.stat(file_path) doc.metadata["file_create_time"] = datetime.datetime.fromtimestamp(file_stats.st_ctime).strftime("%Y-%m-%d %H:%M:%S") doc.metadata["file_modify_time"] = datetime.datetime.fromtimestamp(file_stats.st_mtime).strftime("%Y-%m-%d %H:%M:%S")
这种方式无需关注具体加载器的特性,所有类型文件加载后都能统一处理,适合未来扩展需求。
内容的提问来源于stack exchange,提问作者Primoz
相关产品推荐
相关产品推荐

