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

