软工第一次作业
软件工程实践第一次作业
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践第一次作业要求 |
| 这个作业的目标 | 完成开发环境与个人主页搭建:注册 GitHub 与博客园账号并加入班级;调用 Hugging Face 的 Flux 模型(XLabs-AI/flux-RealismLora)生成贴近真实世界的图像,并结合前端实现交互生成;梳理个人技能树与三年规划 |
| 学号 | 102401512 |
一、准备工作
1.1 GitHub 账号
- 在 GitHub 官网 注册账号,并完善头像、个人简介等各项信息。
- 我的 GitHub 主页:https://github.com/ren3717
1.2 博客园账号
- 注册博客园账号,设置昵称(实名制)、头像等个人信息,并选择博客皮肤样式(LessIsMore)。
- 已关注任课老师黄兆武、助教李怡涵与焦圣蒙的博客。
- 已加入班级博客 H202601软件工程与软件工程实践,并在班级成员列表中确认实名加入成功。
二、Hugging Face API 调用:用 Flux 模型生成真实感图像
2.1 任务描述
在 Hugging Face 注册账号并获取 API,调用 Flux 模型(模型地址:XLabs-AI/flux-RealismLora)生成一张最贴近真实世界的图像,在调用模型的代码基础上结合前端接口,实现交互生成。
2.2 技术方案
flux-RealismLora 是一个 LoRA 微调模型,不能单独运行,必须挂载在基础模型上使用。最初方案是调用 HF 官方推理 API 的基础模型 black-forest-labs/FLUX.1-dev,通过请求参数 "adapter": "XLabs-AI/flux-RealismLora" 挂载 LoRA。但联调中发现 hf-inference 已于 2026 年弃用 FLUX.1 系列(返回 HTTP 410 deprecated),最终改用 Hugging Face Space 上社区部署的 flux-RealismLora 应用(Gradio API)——模型仍是作业指定的 XLabs-AI/flux-RealismLora,运行在 HF 的 ZeroGPU 上。
- 主用 Space:
DamarJati/FLUX.1-RealismLora(接口/run_lora) - 备用 Space:
prithivMLmods/FLUX-REALISM(接口/run,模型选项flux.1-dev-realism)
2.3 操作步骤
-
在 https://huggingface.co 注册账号并登录
-
右上角头像 → Settings → Access Tokens → Create new token(类型选 Fine-grained,勾选 Make calls to Inference Providers 与 Read access to public gated repos)→ 复制
hf_开头的 token📷 截图 5:Access Token 创建页面(token 已打码)
![alt text]()
-
打开 https://huggingface.co/black-forest-labs/FLUX.1-dev 点击 Agree and access repository 接受许可
-
将 token 填入后端代码 app.py 的
HF_TOKEN变量 -
pip install -r requirements.txt安装依赖后运行python app.py -
浏览器打开 http://127.0.0.1:5000 ,输入提示词、调整参数、点击「生成图像」
-
首次调用需等待 ZeroGPU 排队(约 10~60 秒),生成结果展示在右侧并可下载
2.4 核心代码
后端 Flask 调用 HF Space Gradio API(app.py 关键片段):
from gradio_client import Client
# 带 HF token 认证连接 Space(匿名 ZeroGPU 配额很少)
client = Client("DamarJati/FLUX.1-RealismLora", token=HF_TOKEN)
# 调用 /run_lora 接口:prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale
result = client.predict(
prompt,
3.5, # cfg_scale:引导系数
28, # steps:采样步数
True, # randomize_seed:随机种子
0, # seed
1024, 1024, # width, height
1.0, # lora_scale:LoRA 强度
api_name="/run_lora",
)
img_path, used_seed = result[0], result[1] # 图片路径 + 实际使用的种子
前端 templates/index.html 通过 fetch("/generate") 提交提示词与参数,实时展示生成结果,并用 localStorage 持久化「API 调用记录」面板(时间、提示词、HTTP 状态码、耗时、结果)。
2.5 API 调用成功的记录
实测成功调用记录(2026-09-08):
| 字段 | 值 |
|---|---|
| 目标服务 | https://DamarJati/FLUX.1-RealismLora.hf.space(HF Space Gradio API) |
| 接口 | /run_lora |
| 模型 | XLabs-AI/flux-RealismLora(Space 内置加载) |
| 图片尺寸 | 1024 × 1024 |
| 采样步数 | 28 |
| 引导系数 | 3.5 |
| HTTP 状态码 | 200 |
| 耗时 | 37.62 s |
| 实际随机种子 | 498756648 |
| 保存文件 | static/generated/20260908_225738_632994.webp |
📷 截图 7:前端页面生成成功的完整截图(含结果图与「API 调用记录」面板)
📷 截图 8:「API 调用记录」面板特写
2.6 提示词设计思路与修改过程
一条高质量的写实提示词包含五个要素:主体 + 场景 + 光线 + 镜头参数 + 质感词。
以「老者人像」为例的迭代过程:
| 版本 | 提示词 | 效果与问题 |
|---|---|---|
| 初版 | a realistic photo of an old man |
画面笼统,皮肤有"塑料感",背景杂乱 |
| 第二版 | portrait of an elderly Chinese fisherman, wrinkled skin, silver beard |
主体特征明确,但光线平淡像随手拍 |
| 最终版 | ultra realistic close-up portrait of an elderly Chinese fisherman, deeply wrinkled weathered skin, silver beard, warm golden hour side lighting, shot on Canon EOS R5, 85mm lens, f/1.8, shallow depth of field, film grain, photorealistic, 8k |
黄昏侧光塑造立体感,85mm f/1.8 大光圈虚化背景,film grain 与 photorealistic/8k 强化真实质感 |
设计心得:
- 主体描述越具体越好("fisherman"比"old man"能联想出更多真实细节)
- 镜头参数是"真实感密码"(
85mm lens, f/1.8, shallow depth of field) - 光线决定氛围(
golden hour side lighting比"光线充足"更接近真实摄影) - 质感词收尾(
film grain, photorealistic, 8k) - 群体场景容易失真:生成「大学阶梯教室」场景时,将"二十名左右大学生"改为
a class of university students,并用no anime, no cartoon, no plastic skin显式排除二次元风格
📷 截图 9:最终生成图像(贴近真实世界的一张)特写截图
2.7 排障记录
本次调用共排除了 6 个问题(详见下表),完整过程记录在项目 作业报告.md:
| # | 问题 | 根因 | 解决 |
|---|---|---|---|
| 1 | SSL 连接被重置 | 旧域名 api-inference.huggingface.co 被 DNS 污染(解析到 Facebook IP 段) |
改用 router.huggingface.co 新域名 |
| 2 | Python 直连失败、浏览器正常 | requests 不读 Windows 系统代理 | 代码自动探测注册表系统代理 |
| 3 | HTTP 403 | 未接受 FLUX.1-dev gated 许可 | 通过 ask-access 接口完成许可接受 |
| 4 | HTTP 403 权限不足 | Fine-grained token 未勾选推理权限 | token 设置中勾选 Make calls to Inference Providers |
| 5 | HTTP 410 | hf-inference 弃用 FLUX.1 系列 | 改用 HF Space Gradio API |
| 6 | 接口不统一 / ZeroGPU 配额 | 两个 Space 接口差异大;匿名配额耗尽 | 每个 Space 独立适配函数;带 token 认证 |
2.8 体验与心得
- API 调用门槛低:HF 把复杂模型封装成 HTTP 接口,几十行代码即可调用最先进的生成模型,无需本地 GPU。
- 提示词工程是真正的门槛:模型能力再强,提示词不好输出依然平庸;"主体+光线+镜头参数+质感词"的组合对真实感提升显著。
- API 方案要随平台演进调整:hf-inference 弃用 FLUX.1 是题面没有预料到的情况,最终通过 Space 的 Gradio API 达成同样目标——调用第三方 API 时,平台服务状态本身就是变量,有备选路径的方案(本项目双 Space 容灾)很重要。
- 排障方法论比单个知识点更有价值:六个问题覆盖网络层(DNS/代理)、认证层(token)、授权层(许可/权限)、服务层(模型弃用),"逐层验证、对比实验、读错误信息"的方法论在任何 API 联调中通用。
- Token 安全:Bearer Token 是唯一凭证,必须保管好,截图打码、不提交公开仓库。
三、GitHub 个人主页建设
我采用方案一(个人资料自述文件):新建一个与 GitHub ID 同名的仓库,在仓库根目录 README.md 中撰写个人介绍。GitHub 会自动在个人主页展示该 README。
README 内容包括:自我介绍(兴趣爱好、想分享的经历)、个人成果与技能评估、未来三年发展规划。完整内容如下(该内容已整理为单独的 README.md 文件并上传至 GitHub 仓库):
# 👋 Hello, I'm 任奥辉
福州大学计算机与大数据学院 2024 级计算机科学与技术专业本科生。
对软件工程、Web 开发与人工智能应用充满热情。
## 🎯 关于我
- 兴趣爱好:游戏、足球、科幻小说;喜欢把学到的东西做成小工具分享给同学
- 想分享的经历:大二暑期参加了学校组织的企业实训,第一次完整经历
"需求 → 开发 → 测试 → 上线"的流程,深刻体会到团队协作与版本管理的重要性
## 🛠 技能与成果
- 编程语言:C/C++、Java、Python(熟悉)
- 课程项目:学生信息管理系统(C++/Qt)、简单聊天室(Java Socket)、
基于 Flask 的 AI 图像生成 Web 应用(本次软工实践)
- 工具链:Git/GitHub、VS Code、Linux 基础操作、MySQL 基本使用
- 自我评估:已掌握数据结构与算法、面向对象编程、数据库基本原理;
对 AI 应用开发与前后端协作最感兴趣;最希望学习软件架构设计、
自动化测试与工程化开发流程
## 🗺 未来三年规划
- 大三(本学期):系统学习软件工程方法学,完成课程项目,
积累代码量到 2 万行以上
- 大三下~大四:争取进入互联网企业实习,在真实项目里锻炼工程能力;
大四秋招拿到心仪 offer
- 毕业后第一年:在工作中持续学习架构与工程化,成为能独立负责模块的工程师
四、技能树梳理与自我评估
已具备的专业知识与能力
- 能力 A:程序设计基础。熟练使用 C/C++ 与 Python,Java 可阅读与编写中等规模程序;数据结构与算法课程成绩良好,掌握常见数据结构与基本算法思想,具备 LeetCode 中等题目的解题能力。
- 能力 B:面向对象与数据库。理解封装、继承、多态,完成过 Qt 桌面应用课程设计;掌握 SQL 基本语法与 ER 图设计,能独立完成小型业务系统的表结构设计。
- 能力 C:Web 开发入门。了解 HTTP 协议与前后端交互流程,会用 Flask 搭建带接口的 Web 应用,能编写 HTML/CSS/JavaScript 页面(本次 HF 图像生成作业即为一次完整实践)。
- 能力 D:开发工具链。使用 Git/GitHub 进行版本管理(commit、分支、PR),VS Code 高效编码,Linux 基本命令与服务器环境配置。
感兴趣的技术方向
AI 应用开发、Web 全栈、软件工程方法学(需求分析、设计模式、测试)。
尚欠缺的能力
- 工程化能力:大型项目的模块划分、架构设计经验不足,没接触过 CI/CD、容器化部署
- 代码质量意识:单元测试、代码评审参与少,代码规范性有待加强
- 算法深度:动态规划、图论等高级算法不熟练,竞赛/笔试压力大
- 英语阅读:阅读英文技术文档速度慢,依赖翻译工具
五、代码量统计与目标
- 截至目前代码量:约 5000行(主要来源:C/C++ 课程与数据结构作业约 2000 行、Java/数据库课设约 1000 行、Python 脚本与本次软工作业约 1000 行、其他课程小项目约 1000 行)。
- 本学期课程结束目标:1.5 万行以上。通过软工实践大项目(预计 5000+ 行)与日常刷题、工具脚本积累达成。
六、本课程最期待学习的知识与收获
- 最期待:软件需求分析方法(如何把模糊的用户想法变成可验收的规格说明)、团队协作流程(Git 协作规范、任务分工与进度管理)、测试与质量保障(单元测试、代码评审的实战)
- 希望获得的收获:完整经历一次"从需求到上线"的团队项目开发;建立工程化思维——代码不仅要"能跑",更要"可维护、可协作、可交付";提升文档撰写与表达汇报能力
七、AI 工具生成的软件工程学习指南及其分析
我使用 DeepSeek 生成了一份软件工程课程学习指南,原文如下:
软件工程课程学习指南(DeepSeek 生成)
- 理解软件生命周期:从需求分析、设计、编码、测试到维护,掌握每个阶段的核心活动与交付物。
- 掌握需求工程:学会用例图、用户故事等需求表达工具,多练习把口头需求转成可验证的规格。
- 重视设计模式与架构:掌握常用设计模式(工厂、观察者、单例等),了解 MVC、微服务等架构风格。
- 实践版本控制与协作:熟练使用 Git(分支策略、冲突解决),在团队中实践 PR 评审流程。
- 动手做项目,而不是只看书:软件工程是实践学科,建议以小组项目为主线贯穿学习。
- 学习测试与质量保障:单元测试、集成测试、代码覆盖率的基本概念与实践。
- 定期复盘与文档化:每个阶段写文档并复盘,训练表达与总结能力。
分析:这份指南整体合理。它抓住了软件工程的核心——生命周期、需求、设计、测试、协作,且强调"动手做项目"与"定期复盘",与本课程的实践导向一致。对我有帮助的部分是第 2、5 条:我此前写代码习惯"边写边想需求",导致返工;按需求工程的方法先固定规格再开发,能明显减少无效劳动。不足的是:指南偏向宏观原则,缺少可执行的具体计划(如每周做什么、读什么书),第 4 条对 Git 协作的细节(如冲突处理场景)展开不够,需要我结合课程进度自行细化。
八、作业编写说明
- 本随笔使用 Markdown 编辑器 编写(博客园「设置 → 编辑器」切换为 Markdown)。
- 作业开头已按课程要求附上「课程信息表格」。
📷 截图 11:博客园后台博文编辑页面截图(证明使用 Markdown 编辑器)





浙公网安备 33010602011771号