求助:LangChain加载JSON文件夹遇ValueError错误的解决办法
解决LangChain DirectoryLoader加载JSON报错:Json schema does not match the Unstructured schema
问题原因
DirectoryLoader默认使用UnstructuredLoader,这个加载器对JSON的结构有特定要求(需符合Unstructured定义的文档schema),普通JSON文件基本不满足该要求,所以即便添加glob='**/*.json'参数仍会触发报错。
解决办法
1. 使用专门的JSONLoader替代默认加载器
直接指定DirectoryLoader的loader_cls为JSONLoader,同时根据你的JSON结构配置解析规则:
from langchain.document_loaders import DirectoryLoader, JSONLoader def metadata_func(record: dict, metadata: dict) -> dict: # 自定义元数据提取逻辑,可按需调整 metadata["source"] = metadata["source"] metadata["id"] = record.get("id") # 替换为你JSON中的实际字段 return metadata loader = DirectoryLoader( r'C:\your_json_folder_path', glob='**/*.json', loader_cls=JSONLoader, loader_kwargs={ "jq_schema": ".", # jq表达式,"."表示加载整个JSON内容 "content_key": "content", # 若JSON有专门的内容字段,替换为对应键名;无则可省略 "metadata_func": metadata_func } ) documents = loader.load()
2. 调整UnstructuredLoader的解析模式
如果坚持使用UnstructuredLoader,可尝试设置mode参数改变解析逻辑:
from langchain.document_loaders import DirectoryLoader from langchain.document_loaders.unstructured import UnstructuredLoader loader = DirectoryLoader( r'C:\your_json_folder_path', glob='**/*.json', loader_cls=UnstructuredLoader, loader_kwargs={ "mode": "elements" # 或尝试"single"模式,两种模式分别测试 } ) documents = loader.load()
3. 自定义加载函数处理任意JSON
若以上方法不适用,可手动编写加载函数解析JSON:
from langchain.document_loaders import DirectoryLoader from langchain.schema import Document import json import os def custom_json_loader(file_path: str) -> list[Document]: with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) # 将JSON转为字符串作为文档内容,元数据可自定义 content = json.dumps(data, ensure_ascii=False) metadata = {"source": file_path} return [Document(page_content=content, metadata=metadata)] loader = DirectoryLoader( r'C:\your_json_folder_path', glob='**/*.json', loader_func=custom_json_loader ) documents = loader.load()
内容的提问来源于stack exchange,提问作者peiwb
相关产品推荐
相关产品推荐

