72.高级RAG-sql检索器

内容参考于:图灵AI大模型全栈

sql检索器

它没办法做到跟向量检索一样进行语意匹配,它只能做到把自然语言转成sql语法

它的做法:

1.创建数据库连接

2.告诉大模型连接的数据库表结构样子

3.再把用户的问题给大模型,然后大模型会自己找需要数据库什么表,什么字段

架构图:我们的问题是xxx有没有招聘的岗位

0.首先调用NLSQLTableQueryEngine(sql的查询引擎)

1.然后拿着表(可以传递多个)信息,通过SQL Alchemy,通过表名、表字段、字段类型、主键/外键等作为上下文,也就是把表的简介作为上下文

2.通过Prompt构造器拼接成一个提示词

3.然后让大模型生成sql语句,然后执行sql语句,拿到sql语句执行之后的结果

4.再跟提示词进行拼接,再让大模型进行回答有哪些岗位

MySql数据:

mysql 复制代码
-- ============================================
-- MySQL招聘信息表 建表语句 & 示例数据
-- 覆盖城市:济南、青岛、烟台、潍坊、临沂、济宁、威海
-- ============================================

-- 1. 建表
DROP TABLE IF EXISTS `zp`;
CREATE TABLE `zp` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `job_title` VARCHAR(100) NOT NULL COMMENT '职位名称',
  `company_name` VARCHAR(100) NOT NULL COMMENT '公司名称',
  `city` VARCHAR(20) NOT NULL COMMENT '所在城市',
  `address` VARCHAR(200) NOT NULL COMMENT '详细地址',
  `salary_range` VARCHAR(50) DEFAULT NULL COMMENT '薪资范围',
  `experience_required` VARCHAR(30) DEFAULT NULL COMMENT '经验要求',
  `education_required` VARCHAR(20) DEFAULT NULL COMMENT '学历要求',
  `job_description` TEXT NOT NULL COMMENT '职位简介',
  `publish_date` DATE DEFAULT NULL COMMENT '发布日期',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_city` (`city`),
  KEY `idx_company` (`company_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='MySQL招聘信息表';

-- 2. 插入示例数据(共21条,每城市3条)
INSERT INTO `zp` 
  (`job_title`, `company_name`, `city`, `address`, `salary_range`, `experience_required`, `education_required`, `job_description`, `publish_date`)
VALUES
-- ==================== 济南 ====================
('MySQL高级DBA', '山东浪潮云计算有限公司', '济南', '济南市历下区浪潮路1036号浪潮科技园S01楼', '20K-35K', '5-10年', '本科', 
 '负责公司核心业务MySQL数据库集群的架构设计、性能调优与故障排查;主导MySQL高可用方案建设,参与数据库自动化运维平台开发;要求精通MySQL主从复制、MGR、分库分表等技术。', '2026-07-28'),

('MySQL数据库开发工程师', '中创软件工程股份有限公司', '济南', '济南市历下区舜华路1号齐鲁软件园创业广场A座', '12K-20K', '3-5年', '本科',
 '参与金融级系统的数据库设计与开发;负责复杂SQL优化、存储过程编写、数据迁移方案制定;要求熟练掌握MySQL索引原理、执行计划分析及性能调优方法。', '2026-07-25'),

('MySQL运维工程师', '济南山大地纬软件股份有限公司', '济南', '济南市高新区舜泰路1号山大地纬大厦', '10K-18K', '1-3年', '本科',
 '负责生产环境MySQL数据库的日常运维、备份恢复、监控告警;协助开发团队进行SQL审核与优化;熟悉Linux系统及Shell脚本编写,有MySQL主从、读写分离运维经验优先。', '2026-07-20'),

-- ==================== 青岛 ====================
('MySQL数据库架构师', '青岛海尔卡奥斯工业互联网平台', '青岛', '青岛市崂山区海尔路1号海尔信息园', '30K-50K', '10年以上', '本科',
 '负责工业互联网平台数据库整体架构规划与演进;设计海量时序数据存储方案,主导MySQL分布式集群建设;要求具备大型互联网公司数据库架构经验,精通TiDB、MySQL生态技术栈。', '2026-07-30'),

('MySQL DBA工程师', '青岛海信网络科技股份有限公司', '青岛', '青岛市崂山区株洲路151号海信创智谷', '15K-25K', '3-5年', '本科',
 '负责智慧城市项目MySQL数据库的部署、监控、备份与性能优化;处理线上数据库故障,保障业务连续性;要求熟悉MySQL 8.0新特性,有MHA、Orchestrator等高可用工具使用经验。', '2026-07-26'),

('MySQL开发工程师', '青岛银行科技支行', '青岛', '青岛市市南区香港中路68号华普大厦', '13K-22K', '3-5年', '本科',
 '参与银行核心系统数据库设计,负责SQL编写与性能优化;制定数据库开发规范,参与数据安全与合规建设;要求有金融行业数据库开发经验,熟悉MySQL事务机制与锁机制。', '2026-07-22'),

-- ==================== 烟台 ====================
('MySQL数据库工程师', '烟台东方电子股份有限公司', '烟台', '烟台市莱山区经济技术开发区长江路178号', '10K-18K', '1-3年', '本科',
 '负责电力调度系统MySQL数据库运维与优化;参与数据库迁移升级项目,编写自动化运维脚本;要求熟悉MySQL体系结构,具备良好的问题排查能力。', '2026-07-24'),

('MySQL高级开发工程师', '烟台杰瑞网络科技有限公司', '烟台', '烟台市莱山区澳柯玛大街9号杰瑞工业园', '14K-22K', '3-5年', '本科',
 '负责电商平台数据库架构设计与优化;设计分库分表方案,解决高并发场景下的数据存储瓶颈;要求精通MySQL索引优化、慢查询分析,有ShardingSphere使用经验优先。', '2026-07-21'),

('MySQL运维DBA', '烟台张裕集团信息中心', '烟台', '烟台市芝罘区大马路56号张裕集团总部', '9K-15K', '1-3年', '大专',
 '负责企业ERP及CRM系统MySQL数据库日常运维;保障数据安全与备份策略执行;要求熟悉Linux操作系统,掌握MySQL基础运维技能,有一定的Shell/Python脚本能力。', '2026-07-18'),

-- ==================== 潍坊 ====================
('MySQL数据库开发', '潍坊歌尔股份有限公司IT部', '潍坊', '潍坊市高新区东方路268号歌尔光电园', '11K-18K', '3-5年', '本科',
 '参与智能制造MES系统数据库设计与开发;优化生产数据查询性能,设计数据归档方案;要求熟练使用MySQL,有制造业信息化项目经验优先。', '2026-07-27'),

('MySQL DBA', '潍坊潍柴动力信息科技公司', '潍坊', '潍坊市高新区福寿东街197号潍柴动力科技园', '16K-28K', '5-10年', '本科',
 '负责集团核心业务系统MySQL数据库架构设计与运维管理;建设数据库监控告警体系,推动数据库自动化运维;要求精通MySQL高可用架构,有大规模集群管理经验。', '2026-07-23'),

('MySQL中级开发工程师', '潍坊万声通讯实业有限公司', '潍坊', '潍坊市奎文区东风东街5166号天马大厦', '8K-14K', '1-3年', '本科',
 '负责呼叫中心系统数据库设计与开发;编写复杂SQL语句与存储过程;要求熟悉MySQL索引原理,具备SQL优化能力,有Java开发背景优先。', '2026-07-19'),

-- ==================== 临沂 ====================
('MySQL数据库工程师', '临沂新程金锣肉制品集团IT部', '临沂', '临沂市兰山区金锣科技园金锣一路1号', '9K-15K', '1-3年', '本科',
 '负责集团ERP及供应链系统MySQL数据库运维;处理日常数据库问题,优化慢查询;要求熟悉MySQL主从复制,有Linux运维基础,能编写Shell脚本。', '2026-07-25'),

('MySQL开发工程师', '临沂临工智能信息科技有限公司', '临沂', '临沂市经济技术开发区临工路126号', '10K-17K', '3-5年', '本科',
 '参与工程机械物联网平台数据库开发;设计设备数据存储方案,优化大数据量查询性能;要求精通MySQL查询优化,有InnoDB存储引擎深入理解。', '2026-07-22'),

('MySQL运维工程师', '临沂商城电子商务有限公司', '临沂', '临沂市兰山区双岭路与宏大路交汇临沂商城电商产业园', '7K-12K', '1-3年', '大专',
 '负责电商平台MySQL数据库日常运维与监控;保障数据库稳定运行,处理故障与性能问题;要求掌握MySQL基础运维技能,熟悉Docker容器化部署优先。', '2026-07-17'),

-- ==================== 济宁 ====================
('MySQL DBA工程师', '济宁山推工程机械股份有限公司', '济宁', '济宁市高新区327国道58号山推国际事业园', '11K-18K', '3-5年', '本科',
 '负责企业核心系统MySQL数据库的运维与优化;建设数据库备份容灾体系;要求精通MySQL高可用方案,有制造业数据库运维经验优先。', '2026-07-26'),

('MySQL数据库开发', '济宁辰欣药业股份有限公司信息部', '济宁', '济宁市高新区同济路1号辰欣药业科技园', '8K-14K', '1-3年', '本科',
 '参与医药ERP系统数据库设计与开发;编写存储过程、触发器,优化业务SQL;要求熟悉MySQL事务与锁机制,有医药行业信息化经验优先。', '2026-07-23'),

('MySQL中级DBA', '济宁中国电信山东分公司', '济宁', '济宁市任城区火炬路29号电信大厦', '12K-20K', '3-5年', '本科',
 '负责电信计费系统MySQL数据库运维与性能优化;参与数据库迁移与升级项目;要求熟悉MySQL集群架构,有运营商行业数据库运维经验优先。', '2026-07-20'),

-- ==================== 威海 ====================
('MySQL高级DBA', '威海三角轮胎股份有限公司IT中心', '威海', '威海市环翠区青岛中路56号三角轮胎总部', '15K-25K', '5-10年', '本科',
 '负责集团数字化转型项目数据库架构设计;建设MySQL高可用集群,制定数据安全策略;要求精通MySQL性能调优,有大型企业DBA经验。', '2026-07-29'),

('MySQL开发工程师', '威海光威复合材料股份有限公司', '威海', '威海市环翠区科技路212号光威科技园', '10K-16K', '3-5年', '本科',
 '参与MES生产管理系统数据库设计与开发;优化生产数据查询性能,设计报表数据方案;要求熟练掌握MySQL,有制造业系统开发经验优先。', '2026-07-24'),

('MySQL运维工程师', '威海北洋电气集团股份有限公司', '威海', '威海市环翠区火炬路159号北洋大厦', '8K-14K', '1-3年', '本科',
 '负责智慧园区项目MySQL数据库运维;搭建监控告警体系,处理日常运维问题;要求熟悉MySQL主从架构,有Linux运维经验,掌握Python脚本编写优先。', '2026-07-21');

-- 3. 查询验证
-- SELECT city, COUNT(*) AS 岗位数量 FROM zp GROUP BY city ORDER BY 岗位数量 DESC;

效果图:

代码:上方的步骤看着很多,但是代码被LLamaIndex封装的写起来很简单,这个检索器只有当数据表很规范才可以使用,比如字段说明是地址,但是实际的值是其它乱七八糟的内容,这就不规范,这就没办法使用

python 复制代码
from sqlalchemy import create_engine

from llama_index.core import SQLDatabase
from llama_index.core.query_engine import NLSQLTableQueryEngine
from base_llm import llm, embed_model


# MySQL连接
engine = create_engine(
    # mysql的意思是目标数据库是 MySQL 数据库
    # pymysql的意思是指定我们的Python连接Mysql数据库时使用的驱动包
    # ://的意思是分隔符,表示协议结尾
    # root:root的意思是 用户名:密码
    # @的意思是用来分割账号密码与数据库服务地址的特殊符号
    # localhost的意思是本机,它是代表127.0.0.1这个ip地址,也可以不写localhost直接写IP地址
    # /rag的意思是要连接的myslq数据库名字
    "mysql+pymysql://root:root@localhost/rag"
)

# 数据库连接
sql_database = SQLDatabase(engine)

# Query Engine,sql查询引擎
query_engine = NLSQLTableQueryEngine(
    # 数据库连接
    sql_database=sql_database,
    # 设置表信息,只需要写表名
    tables=["zp"],
    llm=llm,
    # 针对表的描述信息,有多少个表就需要写多少个描述信息
    context_query_kwargs={
            "zp": "存储招聘岗位信息,包括城市、岗位名称、公司等"
        },
    # 当表多了之后, 需要问题匹配表
    embed_model=embed_model,
    # 值为True可以展示细节,可以查看生成的sql
    verbose=True,
)


question = '济南有那些岗位?'
response = query_engine.query(question)

print("\n回答:")
print(response)

print("\nSQL:")
print(response.metadata)

相关推荐
Lumi_Peak2 小时前
Claude思考了42秒,我的代码质量直接提升了一个档次
python·claude
m沐沐2 小时前
【机器学习】DBSCAN聚类算法——原理、参数调优与实战
人工智能·python·深度学习·算法·机器学习·聚类·dbscan
jnrjian3 小时前
psql 执行多个 sql 文件
数据库·sql
LinuxGeek10243 小时前
Kylin-Server-V11、openEuler-22.03和openEuler-24.03适配原生rpm的MySQL 8.4.11版本正式发布
大数据·mysql·kylin
梅孔立3 小时前
推荐一个 Python 开源项目:AI 模板填充 + Markdown 转 Word,面向 Aspose 模板引擎的效率神器
人工智能·python·开源
码农小韩3 小时前
AIAgent应用开发——大模型理论基础与应用(七)
python·学习·ai·大模型·agent
CodeLinghu3 小时前
LangSmith Evaluate实战评估Agent
人工智能·python·语言模型·llm
起司喵喵4 小时前
推荐一款基于 Python 和 Rust 开发的跨平台 GUI 自动化库!
python·rust·自动化
过期的秋刀鱼!4 小时前
学习曲线-过拟合和欠拟合要做什么以及原因
人工智能·python·深度学习·算法·机器学习·模型评估
Yolanda_20224 小时前
Python学习-第九部分-错误处理与异常处理
开发语言·python·学习