SQL查询链快速上手指南:从自然语言问题到可执行SQL

📅 发布时间:2026/8/28 23:12:16
SQL查询链快速上手指南:从自然语言问题到可执行SQL
SQL查询链快速上手指南从自然语言问题到可执行SQL【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchain想在数据库里查个数据是不是每次都得先翻表结构、再手写 SQL、跑完还得检查对不对LangChain 的 SQL 查询链create_sql_query_chain就是为这一步设计的把你的自然语言问题发给大模型让它依据数据库的真实表结构生成一条可执行的 SQL再由你自己执行取数。连上数据库和模型十几行代码就能跑通自然语言转 SQL的完整流程。它能做什么三个适合用它的场景自然语言问题变可执行 SQL它的实际作用是替掉手写查询这一步问什么就生成什么。适合经常要临时查数的数据分析师。按数据库方言自动选提示模板sqlite、postgresql、mysql、clickhouse 等共 11 种方言各有专属模板。适合同时维护多种数据库的项目。表范围与返回行数可控限定模型只能看到指定表、给结果行数设上限。适合对权限和查询成本有要求的生产环境。最快的首次查询三步拿到 SQL第一步确认环境里装了langchain-community、langchain-openai、langchain-classic三个包第二步建链第三步invoke。这段代码完成连库、建链、提问的最小闭环from langchain_openai import ChatOpenAI from langchain_community.utilities import SQLDatabase from langchain_classic.chains import create_sql_query_chain db SQLDatabase.from_uri(sqlite:///Chinook.db) llm ChatOpenAI(modelgpt-4o-mini, temperature0) chain create_sql_query_chain(llm, db) print(chain.invoke({question: How many employees are there?}))几个关键参数各一句话from_uri用 SQLAlchemy 连接串指向你的库库类型决定方言。temperature0让输出尽量稳定减少同一问题两种写法。k默认 5写进提示词的最多返回几行用来约束模型别查太多。原理剖析问题到 SQL 之间发生了什么先组装上下文。链入口用RunnablePassthrough.assign补齐两个变量input问题原文末尾拼上\nSQLQuery:和table_info由db.get_table_info()取出的建表语句。这一步相当于把问题 数据库说明书塞给模型如果你传了table_names_to_use说明书里就只出现这几张表。再选模板、调模型。提示模板按db.dialect从内置映射里挑没有匹配的才用通用模板top_k写入限额dialect自动填充。调用时用了llm.bind(stop[\nSQLResult:])——stop 是终止符意思是模型写到 SQL 就必须停看不到执行结果也就编不出假数据。最后抽出纯 SQL。StrOutputParser把消息转成字符串_strip去掉首尾空白整条链的输出就是一行可执行 SQL执行与否完全交给调用方。也就是说早期SQLDatabaseChain一步完成的生成 执行现在拆成了生成与执行两段链只负责生成db.run_sql负责执行。拆开之后SQL 在执行前随时可以检查、改写。进阶技巧按你的场景挑着用想控制返回行数时默认 5 行不一定合适k就是留给你的旋钮chain create_sql_query_chain(llm, db, k20)它只是写进提示词的约束真正的行数取决于模型有没有照做所以别把它当成硬性 LIMIT。想限定模型能看哪些表时只把和问题相关的表放进提示既省 token 又防越权chain.invoke( { question: How many employees per department?, table_names_to_use: [employees, departments], } )想写自己的提示模板时自定义模板必须带input、top_k、table_info三个变量dialect写了会被自动填充from langchain_core.prompts import PromptTemplate template You are a DB expert. Write a {dialect} query, at most {top_k} rows, only the columns you need. Tables: {table_info} {input} prompt PromptTemplate.from_template(template) chain create_sql_query_chain(llm, db, promptprompt)需要排查生成结果时链的输出本身就是 SQL 文本先打印确认、再执行是最稳的姿势sql chain.invoke({question: Top 3 sales reps by revenue?}) print(sql) # 这是生成的 SQL不是查询结果 rows db.run_sql(sql) print(rows)另外如果模型总是把字段含义猜错可以在建SQLDatabase时用from_uri(uri, sample_rows_in_table_info2)让表结构信息里带上每表 2 行样例数据。避坑指南上线前高发的五个问题拿到的是 SQL 字符串没有答案→ 现象打印输出发现是一句 SQL而不是查询结果。 → 原因create_sql_query_chain只负责生成执行被拆到了链外。 → 解决用db.run_sql(sql)执行后再取结果。模型查了不存在的列→ 现象SQL 里出现表结构中没有的字段。 → 原因表太多时模型容易串列或 schema 与线上不一致。 → 解决传table_names_to_use缩小可见表范围并确认 schema 已更新。自定义模板直接报错→ 现象启动时抛Prompt must have input variables。 → 原因模板缺少input、top_k、table_info中任意一个。 → 解决补齐三个变量dialect可选链会自动 partial 进去。get_col_comments 参数报错→ 现象传get_col_commentsTrue后抛 ValueError。 → 原因该参数只支持 postgresql、mysql、oracle 三种方言。 → 解决其他方言去掉该参数改用样例数据或注释文档。同一问题LIMIT 和 TOP 混着用→ 现象换个库生成的限制子句就不对。 → 原因手写模板时没写清各方言的 LIMIT 写法与日期函数。 → 解决优先用内置方言模板自定义时按方言写清限制子句和今天的取法。收尾先跑通生成再谈执行SQL 查询链给你的不是一句最终答案而是一个可检查的中间形态SQL 先落到你手上确认合理再执行出错了改起来也快。建议今天就做一件事不传任何额外参数建一条链把生成出来的 SQL 完整打印一遍——看它写对了多少你就知道下一步该收紧哪里了。【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchain创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考