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)

相关推荐
固定资产管理系统软件6 分钟前
商务局RFID固定资产管理系统的应用价值与落地要点解析
大数据·python
lancyu1 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
草莓橙子碗2 小时前
Claude 使用指南
开发语言·python
工具分享2 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI2 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造2 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏2 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念3 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi3 小时前
0103-python相关-函数、文件
python
weipt4 小时前
从ollama到llama.cpp
linux·服务器·llama