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

基于LangChain+ChatGPT的NL2SQL输出JSON格式异常问题排查

LangChain自然语言转SQL结果缺失id字段及格式问题

我正在开发基于ChatGPT驱动的LangChain自然语言转SQL数据库查询功能,用LangChain的SQLDatabase模块与数据库交互,期望返回JSON格式结果,但自定义Prompt偶尔无法输出正确格式。数据库包含projects表,字段有id、project_name、area、price、bhk、amenities。

查询示例

Q="project in Bandra area"
Ans="{'id': 5, 'project_name': 'Anantara Abode', 'area': 'Bandra', 'price': 4500000, 'bhk': 3, 'amenities': 'None'}"
Q="Flats under 65 lakhs"
A={1: {'project_name': 'Anantara', 'area': 'Shahibaug', 'price': 5000000, 'bhk': 3, 'amenities': 'Club house,Swimming Pool'},
2: {'project_name': 'Vivanta', 'area': 'Shilaj', 'price': 7000000, 'bhk': 2, 'amenities': 'Club house, Swimming Pool'},
3: {'project_name': 'Athence', 'area': 'SG highway', 'price': 5500000, 'bhk': 2, 'amenities': 'Garden, Temple'},
4: {'project_name': 'Anantara Alpines', 'area': 'Hebatpur', 'price': 6000000, 'bhk': 3, 'amenities': 'None'},
5: {'project_name': 'Anantara Abode', 'area': 'Bopal', 'price': 4500000, 'bhk': 3, 'amenities': 'None'}}

第二个查询结果中缺失了id字段。

相关代码

依赖安装

%%capture  
!pip install -q langchain  
!pip install -q openai 

核心实现代码

from langchain import OpenAI , SQLDatabase , SQLDatabaseChain  
from langchain.chat_models import ChatOpenAI

from sqlalchemy import create_engine  
input_db= SQLDatabase.from_uri('sqlite:///main.db')  
llm_1=OpenAI(openai_api_key=openai_api_key,temperature=0)

db_agent=SQLDatabaseChain(llm = llm_1,database = input_db,verbose=True)

QUERY ="""
Given an input question, first create a syntactically correct sql query to run, then look at the results      of the query and return the answer in dictonary format and include id fieldname in all answers.
Use the following format.  
Question: "Question here"   
SQLQuery: "SQL Query to run include id in all queries"  
SQLResult: "Result of the SQLQuery include id in all result"  
Answer: "Final answer should be in dictionary format include id fieldname in all answers"  
{question}"""

question = QUERY.format(question="project in Bandra area")   
db_agent.run(question)

解决方法

  1. 强化Prompt约束
    原Prompt对id字段的强制要求不够明确,修改Prompt,明确要求SQL查询必须包含id,输出结果每个条目必须保留id字段:

    QUERY = """
    针对输入问题,先生成语法正确的SQL查询语句,**必须在SELECT中包含id字段**,执行查询后将结果整理为JSON格式的字典列表,每个字典必须包含id、project_name、area、price、bhk、amenities所有字段。
    严格遵循以下格式:
    Question: "用户问题"
    SQLQuery: "包含id字段的SQL查询语句"
    SQLResult: "包含id的查询结果"
    Answer: "JSON格式的最终结果,每个条目都必须包含id字段"
    {question}
    """
    
  2. 直接获取查询结果并自行格式化
    使用return_direct=True参数直接获取SQL查询结果,再手动转换为符合要求的JSON格式,避免LLM输出格式错误:

    # 直接获取SQL查询的原始结果
    raw_result = db_agent.run(question, return_direct=True)
    # 转换为JSON格式的字典列表
    formatted_result = [dict(row) for row in raw_result]
    
  3. 替换为Chat模型提升格式遵循度
    ChatGPT系列模型对格式指令的执行更稳定,替换为ChatOpenAI并适配对话式Prompt:

    llm_1 = ChatOpenAI(openai_api_key=openai_api_key, temperature=0, model="gpt-3.5-turbo")
    

内容的提问来源于stack exchange,提问作者J D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:29:51