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

Langchain create_sql_query_chain输出异常求助:非纯SQL结果

解决create_sql_query_chain返回冗余内容,仅输出纯SQL的方法

以下是几种可靠的解决思路,可直接落地:

  • 使用LangChain内置SQLOutputParser
    利用官方提供的SQL输出解析器,自动过滤冗余格式,提取纯SQL语句:

    from langchain_core.output_parsers import SQLOutputParser
    
    # 初始化解析器
    sql_parser = SQLOutputParser()
    
    # 将解析器串联到查询链后
    chain = create_sql_query_chain(llm, db) | sql_parser
    
    # 调用链直接得到纯SQL
    pure_sql = chain.invoke({"question": "员工总数是多少?"})
    
  • 自定义正则后处理函数
    针对带格式标记的输出,用正则匹配提取核心SQL内容,适配多种冗余格式:

    import re
    
    def extract_pure_sql(raw_output):
        # 匹配带SQLQuery前缀的情况
        prefix_match = re.search(r'SQLQuery:\s*(.*?);', raw_output, re.DOTALL)
        if prefix_match:
            return f"{prefix_match.group(1).strip()};"
        # 匹配带```sql代码块的情况
        code_block_match = re.search(r'```sql\s*(.*?)\s*```', raw_output, re.DOTALL)
        if code_block_match:
            return code_block_match.group(1).strip()
        # 兜底返回处理后的原始内容
        return raw_output.strip()
    
    # 调用原链后执行提取
    raw_result = create_sql_query_chain(llm, db).invoke({"question": "员工总数是多少?"})
    pure_sql = extract_pure_sql(raw_result)
    
  • 严格约束提示词输出规则
    自定义提示词时,明确要求模型仅输出纯SQL,禁止任何额外格式或说明:

    from langchain_core.prompts import PromptTemplate
    
    custom_prompt = PromptTemplate(
        input_variables=["question", "table_info"],
        template="""根据数据库表信息回答用户问题:
    表信息:{table_info}
    用户问题:{question}
    输出要求:仅返回可直接执行的纯SQL查询语句,不得添加任何文字说明、格式标记(如`sql`)或前缀内容。
    """
    )
    
    # 使用自定义提示词创建查询链
    chain = create_sql_query_chain(llm, db, prompt=custom_prompt)
    

内容的提问来源于stack exchange,提问作者Sebastian Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:05:08