利用预测大模型完成办公室饮水机剩余热水量

背景

在每天上班的时候,很多同事都有喝热水的习惯,但是饮水机内的热水量总是比较少的,如何避免等待,高效的接到热水是我接下来要做的事情的动机。

理论基础

  • 在大量真实数据的情况下,可以分析出用水紧张的时间段和用水不紧张的时间段。在用水不紧张的时间去接热水,有热水的可能性比较大。

实现思路与理论基础

  • 每天倒水的时候记录下,当前时间对应的剩余热水量
  • 把历史数据提交给大模型,通过提示词让大模型来总结并预测结果

依赖服务

  • 大模型服务

实现效果

记录数据页面
预测结果页面

实现代码

后台代码
from flask import Flask, render_template, request, redirect, url_for, jsonify
import sqlite3
from datetime import datetime
import requests
app = Flask(__name__)

# 连接到 SQLite 数据库
def connect_db():
    conn = sqlite3.connect('test_data.db')
    return conn

# 创建数据表
def create_table():
    conn = connect_db()
    cursor = conn.cursor()
    cursor.execute('''CREATE TABLE IF NOT EXISTS test_data (
                      id INTEGER PRIMARY KEY,
                      test_date TEXT,
                      test_datetime TEXT,
                      water_level INTEGER,
                      created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
    conn.commit()
    conn.close()

# 插入测试数据
def insert_data(test_date, test_datetime, water_level):
    conn = connect_db()
    cursor = conn.cursor()
    cursor.execute('''INSERT INTO test_data (test_date, test_datetime, water_level)
                      VALUES (?, ?, ?)''', (test_date, test_datetime, water_level))
    conn.commit()
    conn.close()


# 提交测试数据
@app.route('/submit', methods=['POST'])
def submit():
    test_date = request.form['test_date']
    test_datetime = f"{test_date} {request.form['test_time']}"
    water_level = request.form['water_level']
    insert_data(test_date, test_datetime, water_level)
    return redirect(url_for('index'))

# 删除测试数据
@app.route('/delete/<int:id>', methods=['POST'])
def delete(id):
    delete_data(id)
    return redirect(url_for('index'))

# 删除测试数据
def delete_data(id):
    conn = connect_db()
    cursor = conn.cursor()
    cursor.execute('''DELETE FROM test_data WHERE id = ?''', (id,))
    conn.commit()
    conn.close()

# 获取测试数据并按创建时间降序排序
def get_data_by_date_range(start_date, end_date, page, per_page):
    conn = connect_db()
    cursor = conn.cursor()
    offset = (page - 1) * per_page
    cursor.execute('''SELECT * FROM test_data WHERE test_date BETWEEN ? AND ? 
                      ORDER BY created_at DESC LIMIT ? OFFSET ?''',
                   (start_date, end_date, per_page, offset))
    data = cursor.fetchall()
    cursor.execute('''SELECT COUNT(*) FROM test_data WHERE test_date BETWEEN ? AND ?''', (start_date, end_date))
    total = cursor.fetchone()[0]
    conn.close()
    return data, total

# 获取最新的100条test_datetime和water_level数据
def get_latest_100_data():
    conn = connect_db()
    cursor = conn.cursor()
    cursor.execute('''SELECT test_datetime, water_level FROM test_data 
                      ORDER BY created_at DESC LIMIT 100''')
    data = cursor.fetchall()
    conn.close()
    return data

# 首页,显示所有测试数据
@app.route('/')
def index():
    today = datetime.today().strftime('%Y-%m-%d')
    current_time = datetime.now().strftime('%H:%M')
    start_date = request.args.get('start_date', today)
    end_date = request.args.get('end_date', today)
    page = int(request.args.get('page', 1))
    per_page = 5  # 每页显示5条记录
    data, total = get_data_by_date_range(start_date, end_date, page, per_page)
    total_pages = (total + per_page - 1) // per_page
    # 增加序号字段
    data_with_index = [(i + 1 + (page - 1) * per_page, *row) for i, row in enumerate(data)]
    return render_template('index.html', title="饮水机数据记录", data=data_with_index, today=today, current_time=current_time, start_date=start_date, end_date=end_date, page=page, total_pages=total_pages)

# 数据预测页面
@app.route('/predict')
def predict():
    return render_template('predict.html', title="猜一猜")

# 数据预测结果处理
@app.route('/predict_result', methods=['POST'])
def predict_result():
    # 获取最新的100条数据作为提示词
    latest_data = get_latest_100_data()
    prompt = "以下是最近期办公室饮水机时间和剩余热水水量的数据:---\n "
    for entry in latest_data:
        prompt += f"时间: {entry[0]}, 热水水量: {entry[1]}%\n"

    prompt += " 请总结规律并帮我预测时间是:"+datetime.now().strftime("%Y-%m-%d %H:%M") \
              + "的热水水量是多少?你需要严格按照 '预测结果是:当前水量是XXX' 的格式回答,千万不要做任何解释"

    # 定义要发送的 JSON 数据
    data = {
        "model": "llama3-chinese:8b",
        "messages": [
            {
                "role": "system",
                "content": "你是一个高冷的规律总结大师,可以根据提供的数据进行预测结果,不需要做成任何解释"
            },
            {
                "role": "user",
                "content": prompt
            }
        ],
        "options": {
            "temperature": 0.5
        },
        "stream": False
    }

    # 定义目标 URL
    url = "http://192.168.10.70:11434/api/chat"

    print("prompt:"+prompt)
    # 发送 POST 请求,并将 JSON 数据作为请求体发送
    response = requests.post(url, json=data)

    return render_template('predict.html', title="猜一猜", prediction=response.json()['message']['content'])

if __name__ == '__main__':
    create_table()
    app.run(debug=True)


前台代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
    <style>
        .form-section, .list-section {
            padding: 20px;
            border-radius: 8px;
        }
        .form-section {
            background-color: #f8f9fa;
            border: 1px solid #e9ecef;
        }
        .list-section {
            background-color: #ffffff;
            border: 1px solid #dee2e6;
        }
        .navbar {
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <a class="navbar-brand" href="/">饮水机数据记录</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav">
                <li class="nav-item">
                    <a class="nav-link" href="/">首页</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="/predict">猜一猜</a>
                </li>
            </ul>
        </div>
    </nav>

    <div class="container mt-5">
        <div class="row">
            <div class="col-md-4">
                <div class="form-section">
                    <h2 class="mb-4">记录数据</h2>
                    <form action="/submit" method="post">
                        <div class="form-group">
                            <label for="test_date">日期:</label>
                            <input type="date" id="test_date" name="test_date" class="form-control" value="{{ today }}" required>
                        </div>
                        <div class="form-group">
                            <label for="test_time">时间:</label>
                            <input type="time" id="test_time" name="test_time" class="form-control" value="{{ current_time }}" required>
                        </div>
                        <div class="form-group">
                            <label for="water_level">储水量百分比:</label>
                            <select id="water_level" name="water_level" class="form-control" required>
                                <option value="0">0%</option>
                                <option value="20">20%</option>
                                <option value="40">40%</option>
                                <option value="60">60%</option>
                                <option value="80">80%</option>
                                <option value="100">100%</option>
                            </select>
                        </div>
                        <button type="submit" class="btn btn-primary btn-block">提交</button>
                    </form>
                </div>
            </div>
            <div class="col-md-8">
                <div class="list-section">
                    <h2 class="mb-4">已记录数据</h2>
                    <form method="get" action="/" class="mb-4">
                        <div class="form-row">
                            <div class="col">
                                <label for="start_date">开始日期:</label>
                                <input type="date" id="start_date" name="start_date" class="form-control" value="{{ start_date }}" required>
                            </div>
                            <div class="col">
                                <label for="end_date">结束日期:</label>
                                <input type="date" id="end_date" name="end_date" class="form-control" value="{{ end_date }}" required>
                            </div>
                            <div class="col align-self-end">
                                <button type="submit" class="btn btn-secondary btn-block">筛选</button>
                            </div>
                        </div>
                    </form>
                    <table class="table table-bordered">
                        <thead class="thead-light">
                            <tr>
                                <th>序号</th>
                                <th>日期</th>
                                <th>时间</th>
                                <th>储水量百分比</th>
                                <th>操作</th>
                            </tr>
                        </thead>
                        <tbody>
                            {% for row in data %}
                            <tr>
                                <td>{{ row[0] }}</td> <!-- 这里使用序号 -->
                                <td>{{ row[2] }}</td>
                                <td>{{ row[3] }}</td>
                                <td>{{ row[4] }}%</td>
                                <td>
                                    <form action="/delete/{{ row[1] }}" method="post">
                                        <button type="submit" class="btn btn-danger btn-sm">删除</button>
                                    </form>
                                </td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    <nav aria-label="Page navigation">
                        <ul class="pagination justify-content-center">
                            {% if page > 1 %}
                            <li class="page-item">
                                <a class="page-link" href="/?start_date={{ start_date }}&end_date={{ end_date }}&page={{ page - 1 }}">上一页</a>
                            </li>
                            {% endif %}
                            {% if page < total_pages %}
                            <li class="page-item">
                                <a class="page-link" href="/?start_date={{ start_date }}&end_date={{ end_date }}&page={{ page + 1 }}">下一页</a>
                            </li>
                            {% endif %}
                        </ul>
                    </nav>
                </div>
            </div>
        </div>
    </div>
    <script src="{{ url_for('static', filename='js/jquery-3.7.1.min.js') }}"></script>
    <script src="{{ url_for('static', filename='js/bootstrap.js') }}"></script>
</body>
</html>

总结

以上代码并不是完整的代码,可以到 gitee仓库下载。也可以到资源中下载。如果你觉得我的文章对你有帮助,请点赞关注。有任何问题都可以留言给我。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

专业上门预约洗衣洗鞋管理系统一站式解决方案

洗衣洗鞋店管理系统一站式解决方案&#xff0c;不仅运营稳定且功能强大&#xff0c;堪称现代生活中的得力助手。 在这个快节奏的时代&#xff0c;人们对便捷性的渴望愈发强烈。洗衣洗鞋作为日常生活中的一项琐碎事务&#xff0c;也亟需一个高效、省心的解决方案。为此&#xf…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

Java常用工具类、包装类

1、工具类的设计 一般地&#xff0c;把那些完成通用功能的方法分类存放到类中&#xff0c;这些类就叫工具类。 工具类起名&#xff1a;XxxUtil、XxxUtils、XxxTool、XxxTools等&#xff0c;其中Xxx表示一类事物&#xff0c;比如ArrayUtil、StringUtil、JdbcUtil。 工具类存放的…

Windows内核函数 - 创建关闭注册表

在驱动程序的开发中&#xff0c;经常会用到对注册表的操作。与Win32的API不同&#xff0c;DDK提供另外一套对注册表操作的相关函数。首先明确一下注册表里的几个概念&#xff0c;避免在后面混淆。 图1 注册表概念 有5个概念需要重申一下&#xff1a; * 注册表项&#xff1a; 注…

LabVIEW步开发进电机的串口控制程序

LabVIEW步开发进电机的串口控制程序 为了提高电机控制的精确度和自动化程度&#xff0c;开发一种基于LabVIEW的实时、自动化电机串口控制程序。利用LabVIEW软件的图形化编程特性&#xff0c;通过串口实时控制电机的运行参数&#xff0c;实现电机性能的精准控制与评估。 系统组…

实现echarts多图联动效果

实现echarts多图联动效果 文章目录 实现echarts多图联动效果业务场景实现关键api代码示例&#xff08;vue&#xff09; 业务场景 提示&#xff1a;主要是记录一下多个echarts联动效果实现方案 这本来就是echarts本身自带的api&#xff0c;并没有多高级&#xff0c;奈何寻找的过…

Excel表格保护密码遗忘怎么办?三秒钟破解密码,轻松解锁!

在我们的日常工作中&#xff0c;Excel表格是一个非常实用的工具&#xff0c;但在某些情况下&#xff0c;我们可能会遇到密码忘记的问题&#xff0c;或者在尝试打开或删除文件时被锁定。别担心&#xff0c;这里有三个简单的解决方法来帮助您解决问题。 一、尝试默认密码或常见密…

RangeNet++ 检测3D点云语义算法的详细配置和常见问题

配置环境&#xff1a; Ubuntu18.04 GPU&#xff1a;GeForce MX150 驱动&#xff1a;Ubuntu推荐的nvidia-driver-470 Cuda10.1 cudnn7.6.2 TensorRT 5.1.5.0GCC 7.5.0 运行代码&#xff1a; RangeNet 目录 目录 一、环境配置 1. Ubuntu 18.04 安装NVIDIA驱动 &…

网络——多区域OSPF配置(OSPF系列第1篇)

简介 路由协议OSPF全称为Open Shortest Path First&#xff0c;也就开放是的最短路径优先协议&#xff0c;使用链路状态路由算法&#xff0c;isis协议也是使用链路状态路由算法。而RIP协议使用距离矢量路由算法。 区域 为了能够降低OSPF计算的复杂程度&#xff0c;OSPF采用分…

Redis解决缓存一致性问题

文章目录 ☃️概述☃️数据库和缓存不一致采用什么方案☃️代码实现☃️其他 ☃️概述 由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是: 用户使用缓存中的过…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做&#xff1f;《简爱》作为夏洛蒂勃朗特的代表作&#xff0c;不仅是一部经典的爱情小说&#xff0c;也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品&#xff0c;制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

【LeetCode算法】第88题:合并两个有序数组

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;首次想到的解法&#xff1a;定义一个mn长度的辅助数组&#xff0c;从头遍历这两个数组&#xff0c;谁小就放进辅助数组中并且对应往后走&#xff0c;最后使用memcpy函…

VSCode开发Python-Django入门

一、安装配置Python环境及配置Python环境变量 1、python安装包安装后&#xff0c;需要注意pip.exe和pip3.exe的安装&#xff1b; 2、环境变量需要配置两个目录&#xff1b; 3、验证python是否安装成功 通过cmd命令执行&#xff1a;python --version 查看python版本&#xff…

解决 DataGrip 2024.1.3 连接 Tdengine 时timestamp字段显示时区不正确问题

设置中找到该设置&#xff0c;将原来的设置 yyyy-MM-dd HH:mm:ss 修改为: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意&#xff1a;只能修改第一个,修改后提示错误&#xff0c;但是查询数据时能成功格式化时间&#xff0c;修改第二个不生效&#xff0c;可能是 bug 具体格式见: Date…

如何取消公众号的在线客服绑定授权

1&#xff0c;功能设置 2&#xff0c;公众号设置 3&#xff0c;查看详情&#xff0c;取消

2024年新算法-秘书鸟优化算法(SBOA)优化BP神经网络回归预测

2024年新算法-秘书鸟优化算法(SBOA)优化BP神经网络回归预测 亮点&#xff1a; 输出多个评价指标&#xff1a;R2&#xff0c;RMSE&#xff0c;MSE&#xff0c;MAPE和MAE 满足需求&#xff0c;分开运行和对比的都有对应的主函数&#xff1a;main_BP, main_SBOA, main_BPvsBP_SB…

书生·浦语第二期-笔记2

课程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp2 视频地址&#xff1a;轻松玩转书生浦语大模型趣味Demo_哔哩哔哩_bilibili 大模型及InternLM介绍 大模型&#xff1a;人工智能领域中参数数量巨大、拥有庞大计算能力和参数规模的模型 特点&#xff1a…

使用ssh连接ubuntu

一、下载连接工具 常见的连接工具右fianlshell、xshell等等。在本文章中使用的finalshell&#xff0c;工具可以去官网上下载&#xff0c;官网下载。 二、Ubuntu中配置shh 1、使用下面指令更新软件包&#xff08;常用于下载安装或更新软件时使用&#xff0c;更新到最新的安装…

【鸟叔的Linux私房菜】2-主机规划与磁盘分区

文章目录 2.1 Linux与硬件的搭配各硬件设备在Linux的文件名使用虚拟机学习 2.2 磁盘分区磁盘连接方式和设备文件名的关系MBR(MS-DOS)与GPT磁盘分区表MBR(MS-DOS)GPT磁盘分区表 启动流程的BIOS与UEFI启动检测程序BIOS搭配MBR/GPT的启动流程UEFI BIOS搭配 GPT启动的流程 Linux安装…