最近在指导几位同学做毕业设计发现“校园网络”这个方向虽然经典但每年都有不少同学在选题和技术实现上踩坑。要么选题撞车要么技术栈选得过于复杂导致后期难以维护。正好最近在研究 AI 辅助开发就尝试用大模型结合轻量框架搭建了一个能智能推荐选题并生成原型代码的小系统感觉对提升毕设效率帮助很大这里把思路和实现过程分享一下。1. 背景痛点为什么需要 AI 辅助每年毕业季计算机专业的学生在“校园网络”这个方向上普遍会遇到几个头疼的问题选题重复度高很多同学想到的就是“校园网计费系统”、“宿舍网络管理”缺乏新意导致开题报告千篇一律指导老师也审美疲劳。技术选型盲目看到别人用 Spring Boot自己也跟着用但对 Java 生态不熟光搭建环境就耗去一周。或者盲目追求微服务、容器化把一个简单的管理系统做得异常复杂。原型验证周期长确定选题后从设计数据库表、搭建后端框架、写基础 CRUD 接口到做出一个能演示的界面往往需要一两周。这段时间很容易消磨热情也压缩了后期实现核心功能的时间。架构设计混乱由于前期缺乏规划代码结构随意后期添加功能时牵一发而动全身可维护性差。这些问题本质上都是“信息差”和“经验不足”导致的。AI特别是大语言模型恰好擅长信息整合和模式化代码生成可以用来弥合这个差距。2. 技术选型对比如何让 AI 更好地“理解”需求要让 AI 帮我们生成选题和代码首先得让它“理解”我们的领域——“校园网络”。这里有几个技术路径可选直接调用大模型 API如 OpenAI GPT-4、国内大模型优点最简单直接无需复杂框架上手快。对于生成描述性文本如选题背景、功能介绍和基础代码片段非常有效。缺点缺乏“记忆”和“知识库”能力。每次对话都是独立的难以基于我们提供的“校园网络”领域知识进行深度推理和推荐。需要精心设计 Prompt 来引导。使用 LangChain优点它是一个强大的框架擅长将大模型与外部工具、数据源连接起来。我们可以用它来构建一个“智能体”Agent让 AI 按照我们设定的步骤如先分析关键词再查询知识库最后生成代码工作。非常适合构建复杂的、多步骤的 AI 应用。缺点学习曲线较陡对于只想快速生成一个毕设原型的场景来说可能有点“杀鸡用牛刀”。其链式调用也可能带来额外的延迟。使用 LlamaIndex优点专精于数据索引和检索。如果我们有大量的优秀毕设文档、网络工程案例作为知识库LlamaIndex 可以高效地帮我们从海量资料中检索出与“校园网络”最相关的信息提供给大模型作为生成参考从而让选题推荐更精准、更独特。缺点同样需要准备和构建知识库增加了前期工作量。核心优势在检索对于纯代码生成任务优势不明显。我们的选择考虑到毕业设计辅助系统的目标是轻量、快速启动我们选择“直接调用大模型 API 精细化的 Prompt 工程”作为核心方案。这样既能利用大模型的强大生成能力又避免了复杂框架带来的学习成本和部署负担。我们通过设计结构化的 Prompt来模拟一个“领域专家”的思考过程。3. 核心实现从关键词到可运行原型整个系统的流程很简单用户输入一个模糊的方向如“校园网络管理”系统通过大模型提炼关键词、生成差异化选题并为选定的选题生成一个可运行的最小可行原型MVP代码。第一步通过 Prompt 工程提取领域关键词我们不是让 AI 天马行空地想象而是引导它从一个“校园网络工程师”的视角思考。下面是一个示例 Prompt你是一个经验丰富的校园网络架构师。请根据“校园网络”这个主题深入思考其基础设施、常见服务、管理挑战和安全需求提炼出20个具体的技术或功能关键词。 要求关键词应具体、可落地为软件功能模块例如802.1X认证、流量分析与限速、DHCP地址管理、无线AP漫游优化、网络故障自愈、宿舍子网隔离、上网行为审计、校园网计费策略、IPv6过渡方案、网络拓扑自动发现等。 请直接输出关键词列表用中文逗号分隔。通过这样的 Prompt我们能得到一批高质量、具体的关键词这些词将成为生成差异化选题的“素材库”。第二步生成差异化选题有了关键词下一步是组合创新。我们再次设计 Prompt让 AI 基于关键词组合生成新颖的选题基于以下校园网络关键词[802.1X认证 流量分析与限速 DHCP地址管理 无线AP漫游优化 宿舍子网隔离 上网行为审计]。 请生成3个新颖的、适合作为本科毕业设计的“校园网络”相关选题。 每个选题需包含 1. 选题名称 2. 核心解决的问题1-2句 3. 主要技术栈建议后端、前端、数据库 4. 创新点简述AI 可能会生成诸如《基于流量特征识别的宿舍异常上网行为实时检测系统》、《融合认证与计费的校园网无线AP智能负载均衡方案》这样的选题有效避免了同质化。第三步生成 Flask SQLite 最小可行原型选定一个选题后最关键的一步是生成可运行的代码骨架。我们以《校园网设备准入与拓扑发现系统》为例要求 AI 生成一个 Flask 后端原型。我们的 Prompt 需要非常详细明确要求代码风格和结构请为《校园网设备准入与拓扑发现系统》生成一个最小可行原型MVP的后端代码。 使用 Python 的 Flask 框架和 SQLite 数据库。 要求 1. 遵循 Clean Code 原则有清晰的模块划分如 app.py, models.py, routes/。 2. 实现设备Device的增删改查CRUD基础API。 3. 设备模型应包含字段id (主键), ip_address, mac_address, device_name, device_type (如 router, switch, pc), first_seen, last_seen, status (online, offline)。 4. 包含一个简单的拓扑发现模拟接口访问时随机更新一批设备的状态。 5. 代码需包含必要的注释和简单的错误处理。 6. 提供一个 requirements.txt 文件清单。 请直接输出完整的代码文件结构及每个文件的内容。4. 完整代码示例带注释以下是根据上述 Prompt 可能生成的一个简化版代码示例我对其进行了整理和优化使其更符合生产规范。项目结构campus_network_mvp/ ├── app.py # 应用主入口 ├── models.py # 数据模型定义 ├── routes/ │ ├── __init__.py │ └── device_routes.py # 设备相关API路由 ├── database.py # 数据库初始化与连接 └── requirements.txt1.requirements.txt文件Flask2.3.3 Flask-SQLAlchemy3.0.52.database.py- 数据库配置from flask_sqlalchemy import SQLAlchemy # 创建 SQLAlchemy 实例在 app.py 中与 Flask app 绑定 db SQLAlchemy()3.models.py- 定义数据模型from datetime import datetime from database import db class Device(db.Model): 网络设备数据模型 __tablename__ devices id db.Column(db.Integer, primary_keyTrue) ip_address db.Column(db.String(15), nullableFalse, uniqueTrue) # IPv4 地址 mac_address db.Column(db.String(17), nullableFalse, uniqueTrue) # MAC地址 device_name db.Column(db.String(80), nullableTrue) device_type db.Column(db.String(20), nullableFalse) # 设备类型 first_seen db.Column(db.DateTime, defaultdatetime.utcnow) last_seen db.Column(db.DateTime, defaultdatetime.utcnow, onupdatedatetime.utcnow) status db.Column(db.String(10), defaultoffline) # 在线状态 def to_dict(self): 将模型对象转换为字典便于JSON序列化 return { id: self.id, ip_address: self.ip_address, mac_address: self.mac_address, device_name: self.device_name, device_type: self.device_type, first_seen: self.first_seen.isoformat() if self.first_seen else None, last_seen: self.last_seen.isoformat() if self.last_seen else None, status: self.status }4.routes/device_routes.py- 设备管理APIfrom flask import Blueprint, request, jsonify from models import Device, db from datetime import datetime # 创建蓝图方便模块化管理 device_bp Blueprint(device, __name__, url_prefix/api/devices) device_bp.route(/, methods[GET]) def get_all_devices(): 获取所有设备列表 devices Device.query.all() return jsonify([device.to_dict() for device in devices]) device_bp.route(/int:device_id, methods[GET]) def get_device(device_id): 根据ID获取单个设备详情 device Device.query.get_or_404(device_id) return jsonify(device.to_dict()) device_bp.route(/, methods[POST]) def create_device(): 创建设备设备准入 data request.get_json() # 基础数据校验 if not data or not data.get(ip_address) or not data.get(mac_address): return jsonify({error: Missing required fields (ip_address, mac_address)}), 400 # 防止重复添加 if Device.query.filter_by(ip_addressdata[ip_address]).first(): return jsonify({error: Device with this IP already exists}), 409 new_device Device( ip_addressdata[ip_address], mac_addressdata[mac_address], device_namedata.get(device_name), device_typedata.get(device_type, unknown), statusdata.get(status, offline) ) db.session.add(new_device) db.session.commit() return jsonify(new_device.to_dict()), 201 device_bp.route(/int:device_id, methods[PUT]) def update_device(device_id): 更新设备信息 device Device.query.get_or_404(device_id) data request.get_json() # 使用 get 方法避免 KeyError只更新提供的字段 device.device_name data.get(device_name, device.device_name) device.device_type data.get(device_type, device.device_type) device.status data.get(status, device.status) device.last_seen datetime.utcnow() # 更新最后可见时间 db.session.commit() return jsonify(device.to_dict()) device_bp.route(/int:device_id, methods[DELETE]) def delete_device(device_id): 删除设备 device Device.query.get_or_404(device_id) db.session.delete(device) db.session.commit() return jsonify({message: Device deleted successfully}), 200 device_bp.route(/simulate-discovery, methods[POST]) def simulate_topology_discovery(): 模拟网络拓扑发现随机更新一批设备状态 import random all_devices Device.query.all() if not all_devices: return jsonify({message: No devices to update}), 404 updated_devices [] for device in random.sample(all_devices, min(5, len(all_devices))): # 随机选最多5台设备 device.status random.choice([online, offline]) device.last_seen datetime.utcnow() updated_devices.append(device.id) db.session.commit() return jsonify({message: fSimulated discovery completed, updated_device_ids: updated_devices})5.app.py- 应用主文件from flask import Flask from database import db from routes.device_routes import device_bp def create_app(): 应用工厂函数便于配置和测试 app Flask(__name__) # 配置数据库URI和关闭追踪修改提升性能 app.config[SQLALCHEMY_DATABASE_URI] sqlite:///campus_network.db app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False # 初始化数据库 db.init_app(app) # 注册蓝图 app.register_blueprint(device_bp) # 创建数据库表仅在首次运行或数据库不存在时 with app.app_context(): db.create_all() app.route(/) def index(): return {message: Campus Network Device Management API is running.} return app if __name__ __main__: app create_app() app.run(debugTrue, host0.0.0.0, port5000)5. 生成代码的安全性及性能考量AI 生成的代码提供了一个起点但直接用于生产环境是不够的我们必须审视其安全性和性能。安全性加固SQL 注入防护上述代码使用了 SQLAlchemy ORM其查询构造器能有效防止 SQL 注入。关键点绝对不要让用户输入直接参与 SQL 字符串拼接。输入验证示例中只做了基础的非空检查。在生产环境中必须对ip_address、mac_address进行格式校验对device_type、status进行枚举值校验防止无效或恶意数据。认证与授权当前 API 是完全开放的。毕设中应添加基础的 JWT Token 认证或 Session 管理确保只有管理员能进行增删改操作。敏感信息不要将数据库文件campus_network.db提交到代码仓库。应通过.gitignore忽略并使用环境变量配置数据库连接。性能优化冷启动延迟使用 SQLite 本身启动很快。如果使用更重的 ORM 特性或连接远程数据库首次请求会有延迟。可以考虑在应用启动时进行“预热”如建立连接池。并发请求处理Flask 默认是同步的并发能力有限。对于毕业设计级别的访问量足够。如果模拟高并发测试可以考虑使用gunicorn等 WSGI 服务器配合多 worker 进程。数据库查询当设备数据量大时Device.query.all()会成为性能瓶颈。应实现分页查询使用paginate并仅为必要的字段建立索引。6. 生产环境避坑指南将 AI 生成的代码用于实际项目还需要注意以下几点模型“幻觉”校验AI 可能会生成不存在的库如虚构的flask_network_tools或错误的 API 用法。务必对生成的代码进行逐行审查特别是依赖库和核心逻辑。运行pip install -r requirements.txt并执行简单测试是必须的步骤。依赖管理示例中的requirements.txt固定了版本这是好习惯。建议使用pip freeze requirements.txt来精确管理环境。对于学生推荐使用venv或conda创建独立的虚拟环境避免污染系统 Python。代码结构与业务逻辑AI 生成的代码结构是标准的但业务逻辑如拓扑发现模拟非常简陋。学生需要在此基础上填充真实的业务逻辑例如使用nmap库进行真实的网络扫描或集成 SNMP 协议获取设备信息。错误处理与日志生成的代码通常只包含基础错误处理。应增加更全面的 try-catch 块并集成日志系统如 Python 内置的logging模块方便调试和运维。前后端联调AI 通常只生成后端代码。学生需要自己开发或寻找一个简单的前端如 Vue/React 单页应用或简单的 HTML 页面来调用这些 API完成系统闭环。总结与思考通过这个实践我们可以看到 AI 辅助开发在毕业设计前期选题、架构设计、基础代码搭建能发挥巨大作用将学生从重复劳动中解放出来更专注于核心创新点和业务逻辑的实现。然而这也引出一个值得思考的问题AI 生成内容如何与课程教学目标对齐如果学生只是复制粘贴生成的代码那么教学目标中“培养分析问题、解决问题和工程实现能力”就会大打折扣。我认为合理的做法是定位为“高级脚手架”引导学生将 AI 视为一个强大的助手用来生成那些模式固定、但又繁琐的基础代码。重点考核学生对生成代码的理解、修改、优化和扩展能力。强调“改造而非照搬”在毕设要求中明确要求学生必须对 AI 生成的原型进行至少三处有意义的改进或重构例如添加一个复杂的新功能、优化数据库查询性能、引入一个未使用的技术组件等。关注设计过程答辩时不仅看最终成品更要关注学生的设计文档、技术选型对比为什么用 Flask 而不用 Django、以及他们是如何利用 AI 并克服其局限性的过程性报告。最后我强烈建议读者动手尝试改造上面的示例代码。比如尝试将 SQLite 数据库更换为 PostgreSQL 或 MySQL。为设备管理 API 添加完整的用户认证和角色权限如管理员、普通用户。实现一个真实的、定时的网络拓扑发现功能。为系统添加一个简单的 Web 前端界面。在这个过程中你会更深刻地理解 AI 辅助开发的边界在哪里以及如何让它真正为你所用而不是被它所用。希望这篇笔记能为你开启一个高效的毕设之旅。