
3 步让 Java 应用用自然语言查 SQL 数据库LangChain4j 实战【免费下载链接】langchain4jLangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM providers and vector stores, and makes implementing tool calling (including MCP support), agents and RAG easy. It integrates seamlessly with enterprise Java frameworks like Quarkus and Spring Boot.项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j业务同事天天在群里催上周华东区销售额是多少分析师排着队写 SQL需求积压到第三周还没消化。LangChain4j 提供了一个实验性模块让 Java 应用直接用自然语言查数据库——你输入一句中文问题它翻译成 SELECT 并执行把结果带回来。 最小可运行代码5 行搞定自然语言查库先别管原理把东西跑起来。假设你已有一个 PostgreSQL 连接池和一个 ChatModel 实例SqlDatabaseContentRetriever retriever SqlDatabaseContentRetriever.builder() .dataSource(myDataSource) .chatModel(openAiChatModel) .maxRetries(2) .build(); ListContent results retriever.retrieve(Query.from(上个月销售额最高的客户是谁));就这么几行。retrieve传入一句自然语言返回的Content里包含执行了哪条 SQL 查询结果 CSV。不填sqlDialect和databaseStructure也能跑——它会自动从DataSource的DatabaseMetaData里读方言名和建表 DDL。 机制拆解元数据进、SQL 出的 4 步流水线一句上个月销售额最高的客户是谁是怎么变成SELECT ... ORDER BY amount DESC LIMIT 1的输入组装。构造SqlDatabaseContentRetriever时如果没手动传databaseStructure它会遍历DataSource下所有表通过DatabaseMetaData拉取列名、类型、主键、外键和注释拼成一段CREATE TABLE ...风格的 DDL 文本。同时取getDatabaseProductName()作为方言标识。这两样东西连同用户问题一起填进提示模板组成 SystemMessage UserMessage。LLM 生成 SQL。chatModel.chat(messages)被调用模型基于数据库结构输出一条查询语句。如果返回的是带sql围栏的代码块clean()方法会把围栏剥掉只留纯 SQL 文本。SELECT 校验。生成的 SQL 交给 JSqlParser 做语法解析CCJSqlParserUtil.parse。解析成功且语句类型是Select实例才放行解析失败或类型不是 SELECT比如 DELETE、UPDATE、DROP TABLE直接返回空列表SQL 到不了数据库。这一步是防呆LLM 就算被诱导生成了写操作也过不了这一关。执行与重试。SQL 通过Statement.executeQuery执行结果集被格式化成表头 数据行的 CSV 文本。如果执行抛异常列名拼错、表不存在错误信息会回传给 LLM让它带着上次生成的 SQL 和报错一起修正。maxRetries控制最多修正几轮默认 0 意味着只试一次。️ 只读连接怎么配SELECT 校验能挡住什么源码 Javadoc 里有一句加粗警告Do not ever use this in production——不是吓你是设计约束。JSqlParser 做的是什么级别的判断语句类型白名单。DROP、DELETE、UPDATE、INSERT、CREATE的解析结果都不是Select子类会被拦下。模块的集成测试专门构造了 Drop table with orders、Delete customer with ID1、Insert new customer、Update email 四类对抗性输入执行后校验表数据哈希不变。它挡不住什么带副作用函数的 SELECT某些数据库支持、子查询里绕出信息泄露、SELECT ... INTO变体。所以第二道防线必须落在数据库层给这个模块单独建一个数据库用户只授予SELECT权限。PostgreSQL 示例GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;不要复用应用主连接的用户不要给这个用户USAGE以外多余权限上线前跑一遍对抗性查询确认写操作全部被数据库拒掉权限不足报错而不是被代码吞掉⚙️ 4 个参数什么时候动参数默认行为什么时候才需要动它dataSource必填换库时换其他场景不动sqlDialect自动取DatabaseProductName产品名冗长或含误导信息时手动填比如直接写 MySQLchatModel必填追求更低延迟或更低 token 成本时换小模型maxRetries0不重试列名复杂、模型偶尔拼错字段时设 12还有一个隐藏参数databaseStructure不填就把全库所有表暴露给 LLM。如果你的库有几百张表手动传只包含业务相关表的 DDL能显著降低 token 消耗和幻觉概率。适用边界哪些场景能用哪些不能适合内部数据探索工具、业务人员自助查询面板、运营报表的自然语言入口、BI 系统的辅助查询层。共同特征是低频、只读、容错空间大——查错了重来一次就行。不适合高并发实时写入场景它本质是串行 LLM 调用 数据库查询单条延迟在秒级需要精确行级权限控制的系统它感知不到行级策略直接对公网暴露的 APILLM 输出不可完全信任攻击面太大。模块源码路径experimental/langchain4j-experimental-sql类上标注了ExperimentalAPI 可能随版本变动升级前留意 changelog。【免费下载链接】langchain4jLangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM providers and vector stores, and makes implementing tool calling (including MCP support), agents and RAG easy. It integrates seamlessly with enterprise Java frameworks like Quarkus and Spring Boot.项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考