基于Langchain构建多JSON文件查询机器人的技术实现问询
基于多文件JSON构建查询机器人的实现指南
问题背景
手里有30GB多文件JSON数据,已实现基于文本文件的查询机器人,现需适配JSON数据,利用LangChain的JSONLoader将数据转换为向量并存储到ChromaDB,实现问答查询。
分步实现方案
1. 正确加载JSON文件(修复JSONLoader配置)
之前的代码未正确配置JSONLoader的关键参数,导致无法有效提取JSON中的文本内容。需根据你的JSON结构,通过jq_schema指定要提取的字段/路径,确保加载的是有用的文本数据。
示例代码:
from langchain.document_loaders import DirectoryLoader, JSONLoader def load_json_docs(directory): # 根据你的JSON结构定义jq_schema: # - 如果是单文档JSON(如{"content": "文本内容"}),用".content"提取 # - 如果是数组JSON(如[{"text": "内容1"}, {"text": "内容2"}]),用".[] | .text"遍历提取 loader = DirectoryLoader( directory, glob='**/*.json', loader_cls=JSONLoader, loader_kwargs={ "jq_schema": ".content", # 替换为你的JSON实际字段路径 "text_content": True } ) documents = loader.load() return documents # 加载JSON文件 directory = '/content/drive/MyDrive/Data Science/LLM/docs/json files' json_documents = load_json_docs(directory) print(f"加载有效文档数:{len(json_documents)}")
2. 拆分JSON文档
JSON提取后的文本和普通文本处理逻辑一致,使用RecursiveCharacterTextSplitter拆分成长度合适的文档块,确保语义完整:
from langchain.text_splitter import RecursiveCharacterTextSplitter def split_json_docs(documents, chunk_size=1000, chunk_overlap=20): text_splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap, separators=["\n\n", "\n", " ", ""] # 可根据JSON文本特点调整分隔符 ) docs = text_splitter.split_documents(documents) return docs # 拆分文档 split_json_documents = split_json_docs(json_documents) print(f"拆分后文档块数:{len(split_json_documents)}")
3. 生成向量并存储到ChromaDB
这部分和文本版逻辑完全一致,直接复用即可:
from langchain.embeddings import SentenceTransformerEmbeddings from langchain.vectorstores import Chroma # 初始化嵌入模型 embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2") # 向量库持久化目录 persist_directory = "/content/drive/MyDrive/Data Science/LLM/docs/chroma_json_db" # 构建并持久化向量库 vectordb = Chroma.from_documents( documents=split_json_documents, embedding=embeddings, persist_directory=persist_directory ) vectordb.persist() print("向量库持久化完成")
4. 构建问答查询链
同样直接复用文本版的问答逻辑:
import os from langchain.chat_models import ChatOpenAI from langchain.chains.question_answering import load_qa_chain # 设置OpenAI API密钥 os.environ["OPENAI_API_KEY"] = "sk-your-key" # 初始化LLM模型 model_name = "gpt-3.5-turbo" llm = ChatOpenAI(model_name=model_name, temperature=0) # 加载问答链 chain = load_qa_chain(llm, chain_type="stuff", verbose=True) # 测试查询 query = "who is Mr. Jabez Wilson?" # 搜索相关文档,k可调整返回数量 matching_docs = vectordb.similarity_search(query, k=3) answer = chain.run(input_documents=matching_docs, question=query) print(f"查询结果:{answer}")
大体积JSON数据优化建议
针对30GB的大规模数据,需注意以下优化点:
- 分批处理:不要一次性加载所有文件,分批次加载拆分后,逐步合并到ChromaDB,避免内存溢出
- 数据校验:在加载阶段加入JSON格式校验,跳过损坏或不符合结构的文件
- 参数调优:根据JSON内容长度调整
chunk_size,确保每个文档块包含完整语义 - 异步加载:对于超大规模数据,可结合异步加载提升处理效率
内容的提问来源于stack exchange,提问作者Juned Ansari
相关产品推荐
相关产品推荐

