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

如何让LangChain仅生成符合BigQuery语法的SQL查询?

解决LangChain SQLDatabaseChain生成BigQuery无效语法的方案
  • 精准强化提示词的BigQuery语法约束
    把BigQuery的核心语法规则明确写入提示词,避免模型模糊判断。示例:

    PROMPT = """你需要生成仅适用于BigQuery的SQL查询语句,从sales数据集获取所需信息。严格遵循以下规则:
    1. 字符串常量使用单引号,禁止用双引号
    2. 日期时间函数使用BigQuery专属的CURRENT_TIMESTAMP()、DATE()、DATETIME(),禁止使用NOW()、SYSDATE()等其他数据库函数
    3. 数组处理使用UNNEST()函数,不要用其他数据库的数组展开语法
    4. 分区表查询需符合BigQuery分区过滤规则,避免全表扫描
    5. 仅返回可直接在BigQuery中执行的完整SQL语句,不要添加任何额外解释"""
    
  • 指定数据库方言为BigQuery
    初始化SQLDatabase时明确指定dialect为bigquery,让LangChain的SQL生成逻辑适配BigQuery语法:

    from langchain.sql_database import SQLDatabase
    from langchain.chains import SQLDatabaseChain
    
    # 初始化BigQuery数据库连接,指定dialect
    db = SQLDatabase.from_uri(
        "bigquery://your-project-id/your-dataset",
        dialect="bigquery"
    )
    # 创建SQLDatabaseChain
    chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
    
  • 添加BigQuery语法预校验环节
    在执行生成的SQL前,通过BigQuery的dry run功能校验语法有效性,无效则触发模型重新生成:

    from google.cloud import bigquery
    
    def validate_bigquery_sql(sql):
        client = bigquery.Client()
        job_config = bigquery.QueryJobConfig(dry_run=True, use_query_cache=False)
        try:
            client.query(sql, job_config=job_config)
            return True
        except Exception as e:
            print(f"语法错误:{e}")
            return False
    
    # 集成到LangChain流程中,先校验再执行
    def run_chain_with_validation(chain, question):
        sql = chain.generate_sql(question)  # 获取生成的SQL
        if validate_bigquery_sql(sql):
            return chain.run(sql)
        else:
            # 重新生成SQL,可加入重试逻辑
            return chain.run(question + " 请生成符合BigQuery语法的SQL,不要出现语法错误")
    
  • 使用SQLCheckerChain修正语法
    利用LangChain内置的SQLCheckerChain自动检查并修正生成的SQL,确保适配BigQuery:

    from langchain.chains import SQLCheckerChain
    
    checker_chain = SQLCheckerChain.from_llm(llm, db=db, verbose=True)
    # 先生成原始SQL,再用检查器修正
    raw_sql = chain.generate_sql(question)
    corrected_sql = checker_chain.run(sql=raw_sql)
    
  • 加入BigQuery示例查询引导
    在提示词中加入1-2个正确的BigQuery查询示例,让模型参考格式生成:

    PROMPT = """请生成仅适用于BigQuery的SQL查询,从sales数据集获取信息。参考以下正确示例:
    示例1:获取2023年销售额
    SELECT DATE_TRUNC(order_date, YEAR) AS year, SUM(total_amount) AS total_sales
    FROM sales.orders
    WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
    GROUP BY year;
    
    示例2:获取Top 5客户
    SELECT customer_id, SUM(total_amount) AS total_spent
    FROM sales.orders
    GROUP BY customer_id
    ORDER BY total_spent DESC
    LIMIT 5;
    
    严格遵循BigQuery语法,仅返回可执行的SQL语句"""
    

内容的提问来源于stack exchange,提问作者Kamran Khan Khilji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:30:20