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

