Windows下无法pip安装jq,Langchain JSONLoader加载聊天历史受阻
问题解决:LangChain JSONLoader在Windows环境下依赖jq无法安装的替代方案
问题背景
基于LangChain开发的文档加载与AI问答功能原本运行正常,添加聊天历史功能后报错,提示需执行pip install jq,但Windows环境下执行该命令失败,报错信息:
Failed to build jq
ERROR: Could not build wheels for jq, which is required to install pyproject.toml-based projects
尝试过winget下载、手动配置jq路径,但LangChain的JSONLoader需要以Python包形式调用jq才能加载聊天历史,无法通过外部工具替代。
相关代码
PHP Laravel后端生成JSON字符串的代码:
$jsonHistory = json_encode($request['chatHistory'], JSON_PRETTY_PRINT);
Python后端核心处理代码:
class Request(BaseModel): ai_input: str company: str chatHistory: str class AiModel: async def get_answer(request: Request): txt_loader = DirectoryLoader(f"{request.company}/", glob="**/*.txt", loader_cls=TextLoader) pdf_loader = DirectoryLoader(f"{request.company}/", glob="**/*.pdf", loader_cls=PyMuPDFLoader) csv_loader = DirectoryLoader(f"{request.company}/", glob="**/*.csv", loader_cls=CSVLoader) json_loader = JSONLoader(request.chatHistory, jq_schema='.input[]content') loadersList = [txt_loader, pdf_loader, csv_loader, json_loader] index = VectorstoreIndexCreator().from_loaders(loadersList) llm = ChatOpenAI if request.ai_input: query = request.ai_input answer = index.query(query, llm=llm) return {"answer":answer}
解决方案
方案1:自定义加载器替代JSONLoader
直接解析JSON字符串生成LangChain的Document对象,完全避开jq依赖:
import json from langchain.schema import Document class ChatHistoryLoader: def __init__(self, json_str: str, content_key: str): self.json_str = json_str self.content_key = content_key def load(self): chat_data = json.loads(self.json_str) documents = [] # 对应原jq_schema '.input[]content'的解析逻辑 for item in chat_data.get('input', []): content = item.get(self.content_key, "") documents.append(Document(page_content=content)) return documents
替换原代码中的JSONLoader:
# 替换原来的json_loader chat_loader = ChatHistoryLoader(request.chatHistory, content_key='content') loadersList = [txt_loader, pdf_loader, csv_loader, chat_loader]
方案2:使用兼容Windows的jq替代包
安装pyjq替代官方jq包:
pip install pyjq
修改JSONLoader的调用(部分LangChain版本支持指定jq库):
from langchain.document_loaders import JSONLoader import pyjq json_loader = JSONLoader( request.chatHistory, jq_schema='.input[]content', jq_lib=pyjq )
注意:部分LangChain版本可能不支持jq_lib参数,需确认版本兼容性
方案3:将JSON字符串转为临时文件加载
把接收的chatHistory写入临时JSON文件,再用JSONLoader加载文件:
import tempfile import os # 创建临时JSON文件 with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f: f.write(request.chatHistory) temp_file_path = f.name # 使用JSONLoader加载文件 json_loader = JSONLoader(temp_file_path, jq_schema='.input[]content') # 加载完成后删除临时文件 os.unlink(temp_file_path)
内容的提问来源于stack exchange,提问作者zhz_dev
相关产品推荐
相关产品推荐

