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

Langchain SQLDatabaseChain生成SQL格式错误致BigQuery报错求助

解决SQLDatabaseChain生成带代码块标记的SQL导致BigQuery语法错误的问题

你使用LangChain的SQLDatabaseChain结合Gemini模型生成SQL时,模型返回的SQL被包裹在```sql和```标记中,直接执行会触发BigQuery语法错误:

Syntax error: Unexpected identifier ``` at [1:1]

以下是两种可行的修复方案:

方案1:自定义SQL输出解析器清理标记

通过自定义输出解析器,在执行SQL前自动去除模型输出中的代码块标记:

from langchain.schema import BaseOutputParser

class CleanSQLParser(BaseOutputParser):
    def parse(self, text: str) -> str:
        cleaned_text = text.strip()
        # 去除开头的代码块标记
        if cleaned_text.startswith("```sql"):
            cleaned_text = cleaned_text[6:]
        elif cleaned_text.startswith("```"):
            cleaned_text = cleaned_text[3:]
        # 去除结尾的代码块标记
        if cleaned_text.endswith("```"):
            cleaned_text = cleaned_text[:-3]
        return cleaned_text.strip()

# 创建db_chain时指定自定义解析器
db_chain = SQLDatabaseChain.from_llm(
    llm=llm, 
    db=db,
    verbose=True,
    use_query_checker=True,
    sql_output_parser=CleanSQLParser()
)

方案2:修改提示词让模型返回纯SQL

从根源上调整Prompt,明确要求模型仅输出纯SQL语句,不添加任何代码块标记:

from langchain.prompts import PromptTemplate

# 自定义Prompt,强调返回无格式的纯SQL
CUSTOM_PROMPT = PromptTemplate(
    input_variables=["input", "table_info", "top_k"],
    template="""给定输入问题,生成语法正确的{dialect}查询语句。
注意:仅返回纯SQL语句,不要添加代码块标记、解释或任何额外文本。

问题:{input}
表信息:{table_info}
Top K: {top_k}
SQL查询:"""
)

# 使用自定义Prompt创建db_chain
db_chain = SQLDatabaseChain.from_llm(
    llm=llm, 
    db=db,
    verbose=True,
    use_query_checker=True,
    prompt=CUSTOM_PROMPT
)

推荐优先尝试方案2,它能直接避免模型生成多余标记,减少后续处理步骤。

内容的提问来源于stack exchange,提问作者Nitesh Addagatla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:35:09