AI驱动TDSQL-C Serverless 数据库技术实战营-融合智能体与TDSQL-C技术,高效实现二手房数据查询与分析应用

文章目录

    • 什么是TDSQL-C
    • 技术创新
    • 算力服务器与数据库服务器申请与部署
      • 购买 TDSQL-C Mysql Serverless 实例
      • 购买HAI高算力服务器
    • 准备工作
      • 准备数据
      • 下载依赖
    • 案例研发
      • 创建数据库
      • 写入数据
      • 智能体与TDSQL-C 的结合应用
        • 第一步配置llama3.1
        • 第二步代码开发
        • 运行应用
        • 测试应用
      • 总结

什么是TDSQL-C

TDSQL-C MySQL版(TDSQL-C for MySQL)——腾讯云自主研发的新一代云原生关系型数据库,完美融合了传统数据库的成熟经验、云计算的灵活便捷以及新硬件技术的强大性能。它全面兼容MySQL,致力于为用户提供极致弹性的伸缩能力、卓越的性能表现、高度可用的服务、坚如磐石的数据可靠性以及全方位的安全保障。TDSQL-C能够轻松实现超百万QPS的高并发处理能力,支持PB级数据量的分布式智能存储,以及Serverless模式的秒级自动伸缩,助力企业快速推进数字化转型,迈向业务发展的新高度。

技术创新

本篇博客 我们基于 TDSQL-C Mysql ServerlessHAI llama 大模型结合,实现自然语言操作数据库并进行统计分析功能,开启大模型应用时代。

主要实现思路:

算力服务器与数据库服务器申请与部署

购买 TDSQL-C Mysql Serverless 实例

  1. 访问腾讯云官网申请 TDSQL-C Mysql 服务器, 点击链接 进行访问, 如下图所示,点击立即选购

  1. 选购

如下图所示,选购我们所需的Serverless

  1. 设置数据库密码与配置信息

按照上述操作完成之后点击立即购买即可

购买HAI高算力服务器

  1. 点击链接 访问腾讯云 HAI 官网,如下图所示点击立即使用

  1. 点击新建按钮,新建服务器(费用会在新建服务器并使用后才开始计费)

  1. 根据配置需求选择算力服务器

  1. 查看 HAI算力服务器的 llama对外端口

检查是否已经默认开放 6399端口,如果没有开放的话需要手动点击端口配置在入站规则中添加协议端口

配置完成之后可以在浏览器中输入 ip:6399 进行访问,查看浏览器页面中是否有 ollama is running 的输出, 如果有输出的话,则表示此时的配置没有问题,外部链接是可以访问的。

准备工作

准备数据

如下图所示我们准备的是南京二手房的部分csv数据, 目前准备了1000条数据,用于我们本次的测试使用

下载依赖

如下图所示在终端输入指令,下载所需的依赖

pip install openai 
pip install langchain 
pip install langchain-core 
pip install langchain-community 
pip install mysql-connector-python 
pip install streamlit 
pip install plotly 
pip install numpy
pip install pandas
pip install watchdog
pip install matplotlib
pip install kaleido

好啦到目前为止,我们前期的环境准备工作就已经完成了, 接下来我们进入项目开发阶段

案例研发

创建数据库

  1. 如下图所示在我们创建好的TDSQL-C的集群列表页面点击开启外网访问

  1. 登录tdsql-c 或者通过Navicat 来链接TDSQL-C

  1. 创建一个数据库命名 mysqlflex

  1. 执行sql语句创建数据表,代码如下:
 CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY,community_name VARCHAR(255),location_area VARCHAR(100),total_price DECIMAL(10, 2),unit_price DECIMAL(10, 2),house_type VARCHAR(100),floor_level VARCHAR(100),built_area DECIMAL(10, 2),house_structure VARCHAR(100),inside_area DECIMAL(10, 2),building_type VARCHAR(100),orientation VARCHAR(50),construction_structure VARCHAR(100),decoration_status VARCHAR(100),elevator_ratio VARCHAR(50),has_elevator VARCHAR(50),property_years TEXT,listing_time DATE,transaction_ownership VARCHAR(100),last_transaction DATE,house_usage VARCHAR(100),house_age VARCHAR(100),property_ownership VARCHAR(100),mortgage_info VARCHAR(255),house_certificate_backup VARCHAR(255)
);

sql 语句执行完成之后创建如下图所示的数据表

写入数据

如下图是我们项目的目录结构:

接下来我们通过读取csv 数据将其写入到TDSQL-C 中,代码如下:


# 数据库连接信息
config = {'user': 'root','password': 'your_password’,'host': 'bj***************com','database': 'mysqlflex','port':24863,'raise_on_warnings': True
}# CSV文件路径
file_path = '南京二手房数据集.csv'def insert_csv_data_to_db(config, file_path):# 创建连接creatConnector = mysql.connector.connect(**config)# 获取游标cursor = creatConnector.cursor()try:# 读取csv 数据, 并将数据插入到数据库with open(file_path, mode='r', encoding='utf-8') as csv_file:reader = csv.DictReader(csv_file)rows = list(reader)  # 将CSV行转换为列表,以便批量插入# 定义SQL插入语句模板query_template = """INSERT INTO test_table (id,community_name,location_area,total_price,unit_price,house_type,floor_level,built_area,house_structure,inside_area,building_type,orientation,construction_structure,decoration_status,elevator_ratio,has_elevator,property_years,listing_time,transaction_ownership,last_transaction,house_usage,house_age,property_ownership,mortgage_info,house_certificate_backup) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,)"""# 将每行数据转换成元组格式,并处理空字段values_tuples = []for row in rows:# 将空字符串转换为Nonevalues = [None if value == ''  or value == '暂无数据' else value for value in row.values()]values_tuples.append(tuple(values))# 打印前几个元组进行调试# print(values_tuples[:5])cursor.executemany(query_template, values_tuples)# 提交事务creatConnector.commit()except mysql.connector.Error as err:print(f"Database error: {err}")except Exception as e:print(f"An error occurred: {e}")finally:# 关闭游标cursor.close()# 关闭连接creatConnector.close()if __name__ == '__main__':# 调用函数执行插入操作insert_csv_data_to_db(config, file_path)

执行代码后查看数据是否插入到数据库,如下图所示

登录TD-SQL-C 查看数据

智能体与TDSQL-C 的结合应用

到目前为止我们已经将数据导入到数据库了, 接下来我们将会正式体验基于大语言模型与LangChain的智能应用构建

第一步配置llama3.1

在项目文件下创建config.yaml文件 , 并编写hai 和TDSQL-C 的基本链接信息, 如下图所示

第二步代码开发

代码开发部分完整代码如下, 需要注意的是 , 代码中我已经将读取csv 的数据写入到数据库部分写成函数模式,在构建项目的过程中该部分代码不会执行, 如果需要执行该部分代码则直接调用insert_csv_data_to_db 函数即可

import csv
from langchain_community.utilities import SQLDatabase
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
import streamlit as st
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import yaml
import mysql.connector
from decimal import Decimal
import plotly.graph_objects as go
import plotly
import pkg_resources
import matplotlib
# Streamlit app code
import streamlit as st
import mysql.connector
import csv# 数据库连接信息
config = {'user': 'root','password': 'Ruo*****','host': 'bj-************ncentcdb.com','database': 'mysqlflex','port': 24863,'raise_on_warnings': True
}def insert_csv_data_to_db(config, file_path):# 创建连接creatConnector = mysql.connector.connect(**config)# 获取游标cursor = creatConnector.cursor()try:# 读取csv 数据, 并将数据插入到数据库with open(file_path, mode='r', encoding='utf-8') as csv_file:reader = csv.DictReader(csv_file)rows = list(reader)  # 将CSV行转换为列表,以便批量插入# 定义SQL插入语句模板query_template = """INSERT INTO test_table (id,community_name,location_area,total_price,unit_price,house_type,floor_level,built_area,house_structure,inside_area,building_type,orientation,construction_structure,decoration_status,elevator_ratio,has_elevator,property_years,listing_time,transaction_ownership,last_transaction,house_usage,house_age,property_ownership,mortgage_info,house_certificate_backup) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""# 将每行数据转换成元组格式,并处理空字段values_tuples = []for row in rows:# 将空字符串转换为Nonevalues = [None if value == '' or value == '暂无数据' else value for value in row.values()]values_tuples.append(tuple(values))# 打印前几个元组进行调试# print(values_tuples[:5])cursor.executemany(query_template, values_tuples)# 提交事务creatConnector.commit()except mysql.connector.Error as err:print(f"Database error: {err}")except Exception as e:print(f"An error occurred: {e}")finally:# 关闭游标cursor.close()# 关闭连接creatConnector.close()yaml_file_path = 'config.yaml'with open(yaml_file_path, 'r') as file:config_data = yaml.safe_load(file)# 获取所有的已安装的pip包
def get_piplist(p):return [d.project_name for d in pkg_resources.working_set]# 获取llm用于提供AI交互
ollama = ChatOllama(model=config_data['hai']['model'], base_url=config_data['hai']['base_url'])db_user = config_data['database']['db_user']
db_password = config_data['database']['db_password']
db_host = config_data['database']['db_host']
db_port = config_data['database']['db_port']
db_name = config_data['database']['db_name']# 获得schema
def get_schema(db):schema = mysql_db.get_table_info()return schemadef getResult(content):global mysql_db# 数据库连接mysql_db = SQLDatabase.from_uri(f"mysql+mysqlconnector://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")# 获得 数据库中表的信息# mysql_db_schema = mysql_db.get_table_info()# print(mysql_db_schema)template = """基于下面提供的数据库schema, 根据用户提供的要求编写sql查询语句,要求尽量使用最优sql,每次查询都是独立的问题,不要收到其他查询的干扰:{schema}Question: {question}只返回sql语句,不要任何其他多余的字符,例如markdown的格式字符等:如果有异常抛出不要显示出来"""prompt = ChatPromptTemplate.from_template(template)text_2_sql_chain = (RunnablePassthrough.assign(schema=get_schema)| prompt| ollama| StrOutputParser())# 执行langchain 获取操作的sql语句sql = text_2_sql_chain.invoke({"question": content})print(sql)# 连接数据库进行数据的获取# 配置连接信息conn = mysql.connector.connect(host=db_host,port=db_port,user=db_user,password=db_password,database=db_name)# 创建游标对象cursor = conn.cursor()# 查询数据cursor.execute(sql.strip("```").strip("```sql"))info = cursor.fetchall()# 打印结果# for row in info:# print(row)# 关闭游标和数据库连接cursor.close()conn.close()# 根据数据生成对应的图表print(info)template2 = """以下提供当前python环境已经安装的pip包集合:{installed_packages};请根据data提供的信息,生成是一个适合展示数据的plotly的图表的可执行代码,要求如下:1.不要导入没有安装的pip包代码2.如果存在多个数据类别,尽量使用柱状图,循环生成时图表中对不同数据请使用不同颜色区分,3.图表要生成图片格式,保存在当前文件夹下即可,名称固定为:图表.png,4.我需要您生成的代码是没有 Markdown 标记的,纯粹的编程语言代码。5.生成的代码请注意将所有依赖包提前导入,6.不要使用iplot等需要特定环境的代码7.请注意数据之间是否可以转换,使用正确的代码8.不需要生成注释data:{data}这是查询的sql语句与文本:sql:{sql}question:{question}返回数据要求:仅仅返回python代码,不要有额外的字符"""prompt2 = ChatPromptTemplate.from_template(template2)data_2_code_chain = (RunnablePassthrough.assign(installed_packages=get_piplist)| prompt2| ollama| StrOutputParser())# 执行langchain 获取操作的sql语句code = data_2_code_chain.invoke({"data": info, "sql": sql, 'question': content})# 删除数据两端可能存在的markdown格式print(code.strip("```").strip("```python"))exec(code.strip("```").strip("```python"))return {"code": code, "SQL": sql, "Query": info}# 构建展示页面
import streamlit# 设置页面标题
streamlit.title('智能体与TDSQL-C 的结合应用之二手房信息查询')
# 设置对话框
content = streamlit.text_area('请输入想查询的信息', value='', max_chars=None)
# 提问按钮 # 设置点击操作
if streamlit.button('提问'):# 开始ai及langchain操作if content:# 进行结果获取result = getResult(content)# 显示操作结果streamlit.write('AI生成的SQL语句:')streamlit.write(result['SQL'])streamlit.write('SQL语句的查询结果:')streamlit.write(result['Query'])streamlit.write('plotly图表代码:')streamlit.write(result['code'])# 显示图表内容(生成在getResult中)streamlit.image('./图表.png', width=800)
运行应用

如下图所示在终端执行命令 streamlit run tdsqlAitest.py 来启动应用

访问链接在浏览器中效果如下图所示

测试应用

接下来我们输入查询一下数据库中每个小区的房屋总价 来测试应用

注意我们点击提问的时候,执行的操作如下:

  1. 连接SQL并执行SQL操作,获取查询结果
  2. 基于大语言模型生成PLOTLY图表代码并执行
  3. 生成Plotly图表并在Web中展示

效果如下图所示

总结

本篇博客中,我们成功从无到有构建了基于LangChain的Text2SQL服务,这一创新性进展的关键步骤包括:

  1. 成功对接了Llama3.1大型模型;
  2. 构建了SQL-Chain,将数据库架构信息导入大型语言模型;
  3. 构建了User-Chain,用于将用户的查询需求传递给模型,并生成相应的SQL查询语句。

我认为,这一成就标志着人工智能与数据库领域的深度融合,实现了划时代的突破。它不仅大幅提升了生产力,也为智能科技在未来的应用打开了新的可能性。展望未来,我们将继续探索智能科技在更多领域的创新应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献笔记 - Ground effect on rotorcraft unmanned aerial vehicles: a review

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者,文献的引用格式如下,原文更有价值 摘要—— 收集和讨论小型多旋翼无人机受地面效应的影响,…

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点: 1、JavaWeb常见安全及代码逻辑; 2、目录遍历&身份验证&逻辑&JWT; 3、访问控制&安全组件&越权&三方组件; 演示案例: JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…

第一个maven web工程(eclipse)

1、点击file--》new--》Maven Project,如下: 2、直接next,如下 3、搜索web原型,如下 4、填写项目的坐标,如下 5、创建完成后,需要自己补一个文件夹,名称为java,如下: …

C++进阶|多态知识点详解及经典面试题总结

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数的重写/覆盖 2.3 虚函数重写的⼀些其他问题 2.4 override 和 final关键字 2.5 重载/重写/隐藏的…

IDEA全局搜索快捷键ctrl+shift+f失效问题解决

目录 一、搜狗输入法 二、windows输入法 其实就是与输入法快捷键冲突了,一般用的最多的就是windows自带输入法和搜狗输入法,我们只需要把两个输入法的快捷键取消即可解决。 一、搜狗输入法 二、windows输入法 “设置”-“日期和时间”,选择…

Elasticsearch——介绍、安装与初步使用

目录 1.初识 Elasticsearch1.1.了解 ES1.1.1.Elasticsearch 的作用1.1.2.ELK技术栈1.1.3.Elasticsearch 和 Lucene1.1.4.为什么不是其他搜索技术?1.1.5.总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3.Elasticsearch 的一些概念1.3.1.文档和字…

【中级通信工程师】终端与业务(三):电信业务

【零基础3天通关中级通信工程师】 终端与业务(三):电信业务 本文是中级通信工程师考试《终端与业务》科目第三章《电信业务》的复习资料和真题汇总。终端与业务是通信考试里最简单的科目,有效复习通过率可达90%以上,本文结合了高频考点和近几…

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程,从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的,例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

Windows安装openssl开发库

1 下载openssl安装包并安装 下载网址: https://slproweb.com/products/Win32OpenSSL.html 下载对应的安装版本。 双击安装包,一路下一步完成安装。注意:1.安装路径不要有空格; 2. 建议不要把DLL拷贝到系统路径。 2 编辑代码 …

什么是Node.js?

为什么JavaScript可以在浏览器中被执行? 在浏览器中我们加载了一些待执行JS代码,这些字符串要当中一个代码去执行,是因为浏览器中有JavaScript的解析引擎,它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

数据结构之链表(1),单链表

目录 前言 一、什么是链表 二、链表的分类 三、单链表 四、单链表的实现 五、SList.c文件完整代码 六、使用演示 总结 前言 本文讲述了什么是链表,以及实现了完整的单链表。 ❤️感谢支持,点赞关注不迷路❤️ 一、什么是链表 1.概念 概念:链…

19、网络安全合规复盘

数据来源:5.网络安全合规复盘_哔哩哔哩_bilibili

精密制造的革新:光谱共焦传感器与工业视觉相机的融合

在现代精密制造领域,对微小尺寸、高精度产品的检测需求日益迫切。光谱共焦传感器凭借其非接触、高精度测量特性脱颖而出,而工业视觉相机则以其高分辨率、实时成像能力著称。两者的融合,不仅解决了传统检测方式在微米级别测量上的局限&#xf…

【C++】入门基础知识-1

🍬个人主页:Yanni.— 🌈数据结构:Data Structure.​​​​​​ 🎂C语言笔记:C Language Notes 🏀OJ题分享: Topic Sharing 目录 前言: C关键字 命名空间 命名空间介…

使用 Llama-index 实现的 Agentic RAG-Router Query Engine

前言 你是否也厌倦了我在博文中经常提到的老式 RAG(Retrieval Augmented Generation | 检索增强生成) 系统?反正我是对此感到厌倦了。但我们可以做一些有趣的事情,让它更上一层楼。接下来就跟我一起将 agents 概念引入传统的 RAG 工作流,重新…

凌晨1点开播!Meta Connect 2024开发者大会,聚焦Llama新场景和AR眼镜

作者:十九 编辑:李宝珠 北京时间 9 月 26 日凌晨 1 点,Meta Connect 2024 开发者大会即将举行,马克扎克伯格将聚焦 AI 和元宇宙,向大家分享 Llama 模型的更多潜在应用,并介绍 Meta 最新产品 AR 眼镜和 Meta…

OceanBase云数据库战略实施两年,受零售、支付、制造行业青睐

2022年OceanBase推出云数据库产品OB Cloud,正式启动云数据库战略。两年来OB Cloud发展情况如何,9月26日,OceanBase公有云事业部总经理尹博学向记者作了介绍。 尹博学表示,OB Cloud推出两年以来,已服务超过700家客户,客…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…

理解Java引用数据类型(数组、String)传参机制的一个例子

目录 理解Java引用数据类型(数组、String)传参机制的一个例子理解样例代码输出 参考资料 理解Java引用数据类型(数组、String)传参机制的一个例子 理解 引用数据类型传递的是地址。用引用类型A给引用类型B赋值,相当于…

Linux(含麒麟操作系统)如何实现多显示器屏幕采集录制

技术背景 在操作系统领域,很多核心技术掌握在国外企业手中。如果过度依赖国外技术,在国际形势变化、贸易摩擦等情况下,可能面临技术封锁和断供风险。开发国产操作系统可以降低这种风险,确保国家关键信息基础设施的稳定运行。在一…