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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:09:59