尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Phi-3-Mini-128K赋能QT桌面应用:开发跨平台AI辅助设计工具

Phi-3-Mini-128K赋能QT桌面应用:开发跨平台AI辅助设计工具 Phi-3-Mini-128K赋能QT桌面应用开发跨平台AI辅助设计工具最近在捣鼓一个挺有意思的项目想给设计师和开发者朋友们做个趁手的工具。你有没有过这样的经历脑子里有个界面或者组件的草图但把它变成可运行的代码或者想找个设计灵感中间总得折腾半天。要么是打开网页去搜图要么是手动敲代码总觉得不够流畅。正好现在有不少小巧又强大的模型可以在本地跑起来比如Phi-3-Mini-128K。我就琢磨着能不能把它和经典的QT桌面开发框架结合起来做一个完全运行在你电脑上的AI辅助设计工具。你画个草图或者用文字描述一下想法工具就能给你生成设计建议甚至直接吐出可用的代码片段。整个过程都在本地不用担心隐私也不依赖网络。今天我就来分享一下把这个想法落地的全过程从怎么把模型服务搭起来到如何用QT做个漂亮的界面再到两者之间怎么“说上话”最后打包成一个在Windows和Linux上都能直接用的软件。1. 项目构想与核心价值这个工具的核心想法很简单让创意到实现的路径更短。它瞄准的是那些需要快速原型设计、寻找灵感或者希望自动化部分编码工作的场景。想象一下这些使用画面场景一界面原型设计。产品经理在工具的画布上随手勾画了一个登录框的布局点击生成工具不仅给出了几种美观的色彩搭配和字体建议还附上了一份对应的QT Widgets布局代码。场景二图标灵感生成。设计师需要为一个“设置”功能设计图标但暂时没有灵感。他在文本框输入“一个齿轮和扳手结合的、线条简洁的、科技感的图标”工具立刻生成了几张不同风格的草图供他参考。场景三代码片段补全。开发者在编写一个QT表格组件需要实现某个特定排序功能。他描述需求后工具直接提供了一段包含信号槽连接的C代码片段他可以直接复制粘贴并微调。这个工具的价值在于提升效率将构思、搜索、尝试的时间大幅压缩快速获得可落地的备选方案。激发灵感当思路卡壳时AI可以提供意想不到的角度和组合打破思维定式。降低门槛对于不擅长前端UI代码或设计软件的人可以用更自然的方式绘图、描述来表达需求。隐私与离线所有处理均在本地完成敏感的设计稿和业务描述无需上传至云端安全可控。要实现它我们需要解决三个核心问题一个在后台默默工作的模型服务、一个友好交互的桌面界面以及连接这两者的“桥梁”。2. 技术架构与组件选型整个工具可以看作是两个相对独立又紧密协作的部分。下面这张图清晰地展示了它们是如何协同工作的graph TD subgraph “前端 (QT C 应用)” A[用户界面] -- B[草图绘制/文本输入] B -- C[请求封装] C -- D[本地通信客户端] D -- E{接收响应} E -- F[解析与展示] F -- G[设计建议/代码片段] end subgraph “后端 (Python 模型服务)” H[本地通信服务端] -- I[请求解析] I -- J[调用 Phi-3-Mini-128K] J -- K[结果生成] K -- L[响应封装] L -- H end D -- HTTP/WebSocket/Socket -- H H -- JSON 响应 -- E style A fill:#e1f5fe style H fill:#f1f8e9后端模型服务Python这是工具的“大脑”。我们选择Phi-3-Mini-128K主要是看中它在较小参数规模下保持了不错的推理能力并且对内存和算力要求相对友好适合在个人电脑上部署。我们将使用类似FastAPI或Flask的轻量级框架来搭建一个HTTP服务或者为了更低的延迟采用直接的进程间通信IPC。这个服务负责接收前端的请求调用模型进行推理然后将生成的文本设计描述、代码等返回。前端桌面应用QT C这是工具的“脸面”和“手脚”。QT框架的成熟度、丰富的UI组件库以及强大的跨平台能力一次编写编译到多个系统是它不二的选择。我们将用QT Creator来设计主界面主要包含一个绘图画布区域可以用QGraphicsView实现。一个文本输入框用于描述需求。几个按钮生成、清除、导出等。一个区域用于展示模型返回的结果可能是图文混排。前后端通信桥梁这是确保“大脑”和“手脚”协调工作的“神经系统”。由于两者都在同一台机器上我们优先考虑高效、简单的通信方式本地HTTP后端启动一个本地服务器如127.0.0.1:8000前端使用QT的QNetworkAccessManager发起HTTP POST请求。这种方式通用、简单易于调试。WebSocket如果需要实现更实时、双向的通信比如生成进度推送可以考虑WebSocket。QT提供了QWebSocket类。本地SocketTCP/Unix Domain Socket这是更底层、开销更小的方式。对于高频或大数据量的内部通信性能优势明显。QT的QTcpSocket或QLocalSocket可以胜任。在这个项目中我们将以本地HTTP通信作为主要示例因为它最直观也足够满足大多数场景。3. 后端模型服务搭建首先我们来让模型的“大脑”转起来。这里假设你已经配置好了Python环境。第一步准备模型与环境我们使用transformers库来加载和运行Phi-3-Mini模型。创建一个新的Python虚拟环境是个好习惯。# 创建并激活虚拟环境 (可选) python -m venv phi3_env source phi3_env/bin/activate # Linux/macOS # phi3_env\Scripts\activate # Windows # 安装核心依赖 pip install torch transformers --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本调整 pip install fastapi uvicorn pydantic第二步编写模型服务脚本创建一个名为model_server.py的文件。这个脚本会启动一个FastAPI应用提供一个简单的生成接口。from fastapi import FastAPI, HTTPException from pydantic import BaseModel from transformers import AutoTokenizer, AutoModelForCausalLM import torch import asyncio # 定义请求数据模型 class GenerationRequest(BaseModel): prompt: str # 用户输入的文本描述 max_length: int 200 temperature: float 0.7 # 初始化模型和分词器这里以CPU为例有GPU会更快 print(正在加载模型这可能需要几分钟...) model_name microsoft/Phi-3-mini-128k-instruct tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float32, # 根据硬件调整如 torch.float16 device_mapauto, # 自动分配设备 trust_remote_codeTrue ) print(模型加载完毕) app FastAPI() app.post(/generate) async def generate_text(request: GenerationRequest): try: # 准备模型输入 messages [{role: user, content: request.prompt}] inputs tokenizer.apply_chat_template( messages, tokenizeTrue, add_generation_promptTrue, return_tensorspt ) inputs inputs.to(model.device) # 生成文本 with torch.no_grad(): outputs model.generate( inputs, max_new_tokensrequest.max_length, temperaturerequest.temperature, do_sampleTrue, ) # 解码并清理输出 generated_text tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokensTrue) return {generated_text: generated_text} except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: import uvicorn # 在本地 8000 端口启动服务 uvicorn.run(app, host127.0.0.1, port8000)第三步启动与测试服务在终端运行这个脚本python model_server.py看到“模型加载完毕”和Uvicorn启动的日志后服务就就绪了。你可以用curl命令或者浏览器访问http://127.0.0.1:8000/docsFastAPI自动生成的交互文档来测试接口。例如用curl测试curl -X POST http://127.0.0.1:8000/generate \ -H Content-Type: application/json \ -d {\prompt\:\设计一个简洁的蓝色登录按钮上面有白色文字SIGN IN。\}服务会返回一段JSON里面包含了模型生成的设计描述或代码建议。4. QT前端界面开发与通信现在我们来构建工具的“脸面”。使用QT Creator创建一个新的Widgets Application项目。第一步设计主界面在QT Designer里拖拽组件构建一个简单的界面。主要包含QGraphicsView或QPainter实现的绘图区域用于草图。QTextEdit用于输入文本描述。QPushButton如“生成设计”、“清除画布”。QTextBrowser或另一个QTextEdit用于显示模型返回的结果。将界面保存为mainwindow.ui。然后我们编写逻辑代码。第二步实现绘图与通信逻辑在mainwindow.cpp和mainwindow.h中我们需要实现绘图事件捕获以及最重要的——与后端HTTP服务的通信。首先在头文件中声明必要的槽slot和成员变量// mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QNetworkAccessManager #include QNetworkReply #include QJsonObject #include QJsonDocument QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); private slots: void on_generateButton_clicked(); // 点击生成按钮的槽函数 void onNetworkReplyFinished(QNetworkReply *reply); // 网络请求完成的槽函数 private: Ui::MainWindow *ui; QNetworkAccessManager *networkManager; // 用于HTTP通信 void sendRequestToModel(const QString prompt); // 发送请求的函数 }; #endif // MAINWINDOW_H接着在源文件中实现这些功能。这里的关键是使用QNetworkAccessManager来发起POST请求。// mainwindow.cpp #include mainwindow.h #include ui_mainwindow.h #include QJsonObject #include QJsonDocument #include QNetworkRequest #include QMessageBox #include QDebug MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , networkManager(new QNetworkAccessManager(this)) // 初始化网络管理器 { ui-setupUi(this); // 连接信号与槽当网络请求完成时调用处理函数 connect(networkManager, QNetworkAccessManager::finished, this, MainWindow::onNetworkReplyFinished); // 连接按钮点击信号假设按钮的objectName是 generateButton connect(ui-generateButton, QPushButton::clicked, this, MainWindow::on_generateButton_clicked); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_generateButton_clicked() { // 1. 获取用户输入的文本描述 QString textPrompt ui-textInputEdit-toPlainText().trimmed(); // 2. (可选) 这里可以加入获取草图数据并转换为文本描述的代码 // 例如可以将画布上的简单图形如矩形、线条描述出来拼接成prompt。 // QString sketchDescription describeSketch(); // textPrompt sketchDescription; if(textPrompt.isEmpty()) { QMessageBox::warning(this, 提示, 请输入设计描述或绘制草图。); return; } ui-resultDisplay-setText(正在生成请稍候...); ui-generateButton-setEnabled(false); // 防止重复点击 // 3. 发送请求到模型服务 sendRequestToModel(textPrompt); } void MainWindow::sendRequestToModel(const QString prompt) { // 构造请求URL确保后端服务正在运行 QUrl url(http://127.0.0.1:8000/generate); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); // 构造JSON请求体 QJsonObject json; json[prompt] prompt; json[max_length] 300; json[temperature] 0.8; QJsonDocument doc(json); QByteArray data doc.toJson(); // 发起POST请求 networkManager-post(request, data); } void MainWindow::onNetworkReplyFinished(QNetworkReply *reply) { ui-generateButton-setEnabled(true); // 重新启用按钮 if (reply-error() QNetworkReply::NoError) { // 读取并解析返回的JSON数据 QByteArray response_data reply-readAll(); QJsonDocument jsonResponse QJsonDocument::fromJson(response_data); QJsonObject jsonObj jsonResponse.object(); if(jsonObj.contains(generated_text)) { QString result jsonObj[generated_text].toString(); ui-resultDisplay-setText(result); } else { ui-resultDisplay-setText(错误未收到有效回复。); } } else { // 处理网络错误 QString errorMsg QString(请求失败: %1).arg(reply-errorString()); qDebug() errorMsg; ui-resultDisplay-setText(连接模型服务失败请检查服务是否启动。); QMessageBox::critical(this, 网络错误, errorMsg); } reply-deleteLater(); // 清理reply对象 }这样一个基本的“描述-生成-显示”流程就实现了。你可以在此基础上扩展草图识别功能例如使用OpenCV简单处理画布图像并生成描述文本再与用户输入合并发送给模型。5. 跨平台部署与打包我们的目标是让这个工具能在Windows和Linux上都能方便地使用。这意味着不仅要处理好代码的跨平台编译还要解决模型和Python环境的打包问题。QT应用的跨平台编译QT本身是跨平台的你需要在目标平台上安装QT和相应的编译套件如MinGW for Windows, g for Linux。在项目根目录下使用qmake或CMake来生成构建文件然后编译。通常你可以直接使用QT Creator它提供了不同套件Kits的选择一键切换编译目标。打包Python后端与模型这是跨平台部署的难点。我们不能要求用户也去配Python环境、装依赖、下模型。解决方案是将整个Python解释器、依赖库和模型文件一起打包。使用PyInstaller打包服务在开发机上将model_server.py及其依赖打包成一个独立的可执行文件。pip install pyinstaller # 注意打包transformers模型需要处理一些隐藏导入和资源文件 pyinstaller --onefile --name AI_Design_Assistant_Server \ --hidden-importtransformers.models.phi3 \ --add-data 你的模型缓存路径;. \ # Windows用;Linux用: model_server.py注意直接打包包含大模型的脚本可能会生成巨大的可执行文件。更常见的做法是将模型文件作为外部资源在运行时从相对路径加载。这需要修改model_server.py中的模型加载路径为相对路径如./models/phi-3-mini-128k。组织项目结构最终分发的文件夹可能长这样AI_Design_Assistant/ ├── AI_Design_Assistant.exe # Windows QT主程序 ├── AI_Design_Assistant_Server.exe # Windows 模型服务程序 ├── models/ # 模型文件目录 │ └── phi-3-mini-128k/ ├── lib/ # 可能需要的动态库 └── start.bat / start.sh # 启动脚本编写启动脚本因为我们需要先启动后端服务再启动前端QT应用。可以写一个简单的批处理Windows或Shell脚本Linux来自动化这个过程。start.bat(Windows):echo off start /B AI_Design_Assistant_Server.exe timeout /t 5 /nobreak NUL # 等待服务启动 AI_Design_Assistant.exestart.sh(Linux):#!/bin/bash ./AI_Design_Assistant_Server SERVER_PID$! sleep 5 ./AI_Design_Assistant kill $SERVER_PID 2/dev/null # 可选关闭前端后也结束后端部署注意事项路径问题在代码中所有文件路径如加载模型、配置文件都应使用相对路径或通过QCoreApplication::applicationDirPath()获取可执行文件所在目录来构造绝对路径。端口冲突确保后端服务使用的端口如8000在目标机器上未被占用或者在代码中实现端口检测与自动切换。权限问题在Linux下确保启动脚本和可执行文件有运行权限 (chmod x)。6. 总结走完这一趟一个雏形初具的、跨平台的AI辅助设计工具就诞生了。整个过程最核心的其实不是某个高深的技术点而是如何让不同的技术组件本地模型、桌面框架顺畅地协同工作。把Phi-3-Mini这样的模型集成到QT应用里最大的收获是体验到了“本地智能”的便捷和安全感。你不用开一堆网页不用等网络响应所有交互都在指尖和本地计算中完成这种流畅感是云端服务很难比拟的。当然本地部署也会受限于你电脑的算力生成复杂内容时可能需要一点耐心。在开发过程中通信机制的选择比如这里用的HTTP直接影响了工具的响应速度和使用体验。而跨平台打包尤其是处理好Python环境和模型文件是让工具真正能交付给他人使用的关键一步这里面的坑不少但踩过之后也就通了。这个工具目前还只是个起点。你可以沿着很多方向去丰富它比如加入更智能的草图识别、支持更多模型切换不同能力的“大脑”、集成代码高亮和一键复制功能甚至做成插件体系。希望这个分享能给你带来一些启发动手试试把你天马行空的想法也变成桌面上的一个实用工具吧。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
返回列表