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
相关产品推荐
相关产品推荐

