LangChain SQL Agent:sql_db_query与checker的JSON路径差异排查及修复
问题原因分析
1. JSON路径语法适配错误
你的point_of_sales字段是对象类型JSON(键为字符串格式,如"10"),正确的遍历语法是$.*.quantity——用于遍历对象的所有属性,取出每个属性下的quantity值。而$.[*].quantity是数组类型JSON的专用语法,会把整个对象当作数组处理,自然匹配不到任何数据,返回None。
两个工具生成SQL的差异核心是LLM调用不同工具时的上下文提示不一致:
sql_db_query_checker可能通过FewShot示例或提示词,正确识别了JSON的对象类型,生成了符合语法的路径;sql_db_query工具调用时,因Agent提示词缺失明确的JSON语法说明,或工具底层存在路径转换逻辑,导致LLM错误生成了数组类型的路径语法。
2. FewShot提示词的局限性
如果你的FewShot示例没有覆盖对象类型JSON的查询场景,LLM在生成实际查询时容易混淆数组和对象的JSON路径语法,进而引发错误。
修复方案
1. 强化提示词的语法约束
修改system_prefix,明确指定数据库的JSON路径规则:
system_prefix = """ 你是SQL专家,针对当前数据库的JSON字段: - 若为对象类型(如{"key1": {...}, "key2": {...}}),必须用`$.*.quantity`遍历所有属性的quantity值; - 若为数组类型(如[{}, {}]),才使用`$.[*].quantity`遍历数组元素的quantity值。 请严格遵循上述语法生成SQL,禁止混淆两种路径格式。 """
2. 补充匹配场景的FewShot示例
添加针对对象类型JSON查询的示例,让LLM明确正确写法:
examples = [ { "input": "列出STORE_NAME门店库存中销售数据的所有数量", "query": "SELECT jsonb_path_query(point_of_sales, '$.*.quantity') AS quantity FROM stock WHERE store_name = 'STORE_NAME'" }, # 其他业务相关示例... ] example_selector = SemanticSimilarityExampleSelector.from_examples( examples, OpenAIEmbeddings(), FAISS, k=2 )
3. 自定义SQL修正逻辑
在Agent的中间步骤中加入SQL修正逻辑,自动替换错误的JSON路径:
通过自定义AgentExecutor的pre_tool_run钩子实现:
from langchain.agents import AgentExecutor def fix_json_path(tool_input): if "query" in tool_input: tool_input["query"] = tool_input["query"].replace("$.[*]", "$.*") return tool_input agent_executor = AgentExecutor( agent=agent, tools=tools, pre_tool_run=lambda run_manager, tool_input: fix_json_path(tool_input), return_intermediate_steps=True, max_iterations=5 )
4. 验证数据库工具的底层逻辑
检查LangChain的SQLDatabase工具是否存在自动修改JSON路径的逻辑。如果使用PostgreSQL,确认sqlalchemy对JSON路径的处理是否正确,必要时直接使用原生SQL语法替代工具的自动生成逻辑。
内容的提问来源于stack exchange,提问作者Kishore
相关产品推荐
相关产品推荐

