You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:55:39