软件工程第一次作业
从API调用开始学习软件工程
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 2026秋软件工程个人作业(第一次) |
| 这个作业的目标 | 梳理个人技术技能,明确学习短板;制定软件工程课程学习目标;借助 AI 生成学习指南并评估,建立工程化开发思维;体验 Hugging Face FLUX 模型 API 与前端交互开发,搭建 GitHub 个人主页。 |
| 学号 | 102401526 |
一、自我评估
我是计算机科学与技术专业的大三学生,目前以就业为目标,关注 Web 全栈开发和 AI 应用开发两个方向。平时喜欢把 AI 能力嵌入自己写的小工具里,比如这次的图片生成网页。
1. 已具备的专业知识与能力
| 能力方向 | 已有知识与实践 |
|---|---|
| Python 基础编程 | 掌握变量、循环、函数,能独立编写简单脚本,如 Flask 简易 Web 页面、调用 API 的小程序,能看懂基础代码并调试简单 bug |
| HTML / CSS 基础 | 可以写简单静态网页,理解前端布局,能内嵌页面样式,实现基础页面展示 |
| Git 基础 | 了解版本控制的基本概念,知道提交、保存代码的作用,能简单使用命令 |
| Markdown 语法 | 能够使用 Markdown 写文档、表格、标题,完成博客作业编写 |
2. 感兴趣的技术方向
- Web 全栈开发:搭建后端服务,搭配前端页面开发,制作小型网站应用。
- AI 应用开发:让AI更好地服务软件开发。
3. 目前欠缺的能力
- 软件工程规范:不熟悉需求分析、项目设计、单元测试、代码规范、团队协作开发流程。
- 后端进阶知识:数据库、接口设计、异常处理、项目部署知识薄弱。
- 代码工程化能力:只会写零散小脚本,不会把代码拆分成模块,缺少项目架构思维。
- 测试能力:不会写单元测试,没有对程序做稳定性测试的习惯。
4. 技术偏好与最希望学习的知识
我对 Web 全栈和 AI 应用的结合感兴趣,希望能做出完整可用的小工具,而不只是零散的脚本。
最希望学习的是软件工程的工程化方法:从需求分析到设计、编码、测试、交付的完整流程,以及如何把代码拆分成模块、写出可维护的项目结构。
二、代码量与本学期目标
| 项目 | 估计或目标 |
|---|---|
| 截至目前累计代码量 | 约 5,000 行 |
| 本学期希望新增 | 约 3,000 行 |
| 完成本学期课程后的累计目标 | 约 8,000 行 |
三、我对软件工程课程的期待
最期待学习的内容
- 软件工程整套开发流程:需求分析、概要设计、详细设计、测试、项目交付。
- 团队项目协作方法:使用 Git 进行多人协同开发。
- 软件测试方法:学会为代码编写测试用例,减少 bug。
希望获得的收获
掌握工程化思维,不再只写一次性脚本;学会规范地设计、开发、维护一个完整小型软件项目,具备小组合作开发软件的能力。
四、Hugging Face API:用 FLUX 生成真实世界图像
1. 实验目标与实现方式
本次使用作业指定的 XLabs-AI/flux-RealismLora,生成一张贴近真实世界的图像,并通过前端页面实现提示词输入、提交生成、展示图片和查看调用记录。
实际请求通过 Hugging Face Inference Providers 路由访问 fal-ai 的 FLUX LoRA 推理服务,使用 huggingface_hub 提供的 InferenceClient 发起调用,费用从 Hugging Face 账户余额扣除。
交互流程为:
Gradio 前端输入提示词 → 本地 Python 后端 → Hugging Face 推理路由(fal-ai)→ 获取结果并保存图片 → 前端展示图片与调用记录。
前端使用 Gradio 搭建界面,后端使用 Python。Hugging Face 令牌只保存在本地 .env 中,不写进代码或公开仓库。
项目结构如下:
软件工程作业1/
├── app.py # Gradio 前端 + API 调用后端,实现图像生成交互页面
├── requirements.txt # Python 依赖清单
├── .env # HF_TOKEN 配置文件(不提交到 Git)
├── .gitignore # Git 忽略规则,保护密钥不被上传
└── outputs/ # 生成的图片和不含 Token 的 JSON 调用记录
2. 实际操作步骤
-
在 Hugging Face 注册个人账号,进入 Settings → Access Tokens,创建一个 Fine-grained Token,并授予调用 Inference Providers 推理服务的权限,复制保存(只显示一次)。
-
在项目根目录创建
.env文件,写入HF_TOKEN=hf_你的Token;将.env加入.gitignore,博文中不展示令牌值。 -
安装依赖:
pip install gradio huggingface_hub python-dotenv pillow。 -
运行
python app.py启动服务,浏览器自动打开http://127.0.0.1:7860。 -
在页面中填写正向提示词和负向提示词,设置分辨率、步数、guidance_scale 和 seed,点击"生成图片"。
-
接口返回后,后端自动保存 PNG 图片和 JSON 记录到
outputs/目录,前端显示生成结果与调用状态。
3. API 调用核心代码
下面是后端 generate_image() 的核心请求逻辑节选。token 由后端从 .env 读取,record 保存本次请求的完整参数与状态;完整程序还包含记录落盘、异常处理和耗时统计。
MODEL_ID = "XLabs-AI/flux-RealismLora"
PROVIDER = "fal-ai"
def generate_image(prompt, negative_prompt, width, height, steps, guidance_scale, seed):
token = os.getenv("HF_TOKEN")
client = InferenceClient(provider=PROVIDER, api_key=token)
parameters = {
"width": width, "height": height,
"num_inference_steps": steps,
"guidance_scale": guidance_scale,
"seed": seed,
}
if negative_prompt:
parameters["negative_prompt"] = negative_prompt
image = client.text_to_image(
prompt=prompt,
model=MODEL_ID,
**parameters,
)
image.save(image_path)
return image, status_text, str(image_path)
前端界面使用 Gradio 的 Blocks 搭建,左侧为输出区(图片、状态、下载),右侧为输入区(提示词、参数、生成按钮)。关键布局代码:
with gr.Blocks(
title="FLUX 写实图像生成",
theme=gr.themes.Soft(primary_hue="teal", secondary_hue="emerald", neutral_hue="stone"),
css=CSS,
) as demo:
with gr.Row(equal_height=False):
with gr.Column(scale=6): # 左:输出区
output_image, status, download
with gr.Column(scale=5): # 右:输入区
prompt, negative_prompt, parameters, generate_button
4. 提示词设计思路
写实图像的提示词需要覆盖 主体、环境、光照、镜头、质感 五个维度,才能让模型输出"像相机拍出来的"照片,而不是插画或 3D 渲染。
本次最终采用的提示词围绕"城市街边行人"展开:
| 设计要素 | 具体描述 | 用意 |
|---|---|---|
| 主体与场景 | 城市街边、行人自然行走 | 明确场景,贴近日常 |
| 环境细节 | 普通城市环境、自然阴影 | 建立真实空间感 |
| 光照 | 自然日光 | 追求自然、克制的摄影效果 |
| 摄影视角 | Sony A7M4、35mm 镜头、f/2.8、街拍 | 用具体器材参数引导模型出片 |
| 质感强化 | hyperrealistic、photorealistic、8K、sharp focus、natural color | 强化真实照片质感 |
实际用于调用的提示词为:
Street scene, pedestrians walking on city roadside, natural daylight,
realistic skin texture, natural shadow, ordinary urban environment,
shot on Sony A7M4, 35mm lens, f/2.8, street photography,
hyperrealistic, photorealistic, 8K, ultra detailed, sharp focus,
natural color, real world photo, no artificial rendering
负向提示词(通用防"假"):
cartoon, anime, painting, illustration, ugly, deformed, blurry,
mutated, extra limbs, bad anatomy, unrealistic skin, render, CGI,
watermark, text
负向提示词的核心是 排除所有非照片风格(卡通、插画、3D 渲染)和 排除低质量瑕疵(畸形、模糊、水印)。
5. 真实调用成功记录
| 项目 | 实际记录 |
|---|---|
| 调用时间 | 2026-09-11 13:38:41,UTC+8 |
| 模型 | XLabs-AI/flux-RealismLora |
| 服务提供方 | fal-ai,经 Hugging Face 路由 |
| 本地最终状态 | success |
| 本地记录耗时 | 11.3 秒(包含推理请求及图片保存处理,非纯模型推理时长) |
| 图像尺寸 | 768 × 1024 |
| 随机种子 | 12345 |
| 推理步数 | 30 |
| guidance_scale | 2.0 |
| 实际生成图片数 | 1 |
本地 JSON 原始记录如下,未包含令牌:
{
"status": "success",
"requested_at": "2026-09-11T13:38:41+08:00",
"model": "XLabs-AI/flux-RealismLora",
"provider": "fal-ai",
"prompt": "Street scene, pedestrians walking on city roadside, natural daylight, realistic skin texture, natural shadow, ordinary urban environment, shot on Sony A7M4, 35mm lens, f/2.8, street photography, hyperrealistic, photorealistic, 8K, ultra detailed, sharp focus, natural color, real world photo, no artificial rendering",
"parameters": {
"width": 768,
"height": 1024,
"num_inference_steps": 30,
"guidance_scale": 2.0,
"seed": 12345,
"negative_prompt": "cartoon, anime, painting, illustration, ugly, deformed, blurry, mutated, extra limbs, bad anatomy, unrealistic skin, render, CGI, watermark, text"
},
"elapsed_seconds": 11.3,
"output": "outputs\\flux_20260911_133841_879989.png"
}
运行控制台输出:
[SUCCESS] model=XLabs-AI/flux-RealismLora provider=fal-ai size=768x1024 seed=12345 elapsed=11.30s output=flux_20260911_133841_879989.png
6. 生成结果与前端截图
下面是本次 API 返回并保存的原始图片:
下图为前端页面的展示截图:
7. 观察结果与提示词修改
最开始我直接用简单的语言描述提示词并且没有使用负向提示词,然后生成的图片与我所预期的相差甚远,于是我借助ai生成了更为具体的提示词并且加上了负向提示词,最后终于终于生成出令我满意的成果。
实际使用的提示词就是我修改过后的,最开始的过于简单我就没有放出来。
8. 调用体验
这次实践中,我印象最深的是以下几点:
-
提示词比想象中更重要。FLUX 对提示词的响应很敏感,加入镜头参数(35mm lens)和质感词(realistic skin texture)后,"假照片感"明显降低。
-
负向提示词不可或缺。没有 negative prompt 时很容易出现 CGI 感或画质感,加上之后画面更干净。
-
guidance_scale 不宜过高。写实模型设 2.0 ~ 4.0 比较合适,太高会让画面变得生硬。
-
Hugging Face Inference Providers 很方便。不需要自己部署模型,一行
InferenceClient(provider="fal-ai")就能调用云端推理,适合快速原型验证。 -
记录比口头描述更可靠。保存提示词、参数、状态和原图,才能说明到底调用了什么、得到了什么;后续修改也有比较依据。
-
常见坑:虚拟环境。系统 Python 没装 gradio 会报
ModuleNotFoundError,必须用.venv里的 Python 启动。
五、GitHub 个人主页
1. 方案选择
我选择的是方案二。
- 个人主页链接:点击访问我的Github个人主页
六、AI 生成的软件工程课程学习指南与我的分析
1. AI 工具与任务
本次使用的 AI 工具为 DeepSeek。我提供了个人背景(Python 基础、Web 开发入门、缺少工程化经验)和希望加强的能力,请它生成一份简要的软件工程课程学习指南。
2. AI 生成的简要学习指南
软件工程课程学习指南
-
课前预习:每次上课前,通读教材对应章节,标记不懂概念,提前了解需求分析、软件生命周期、UML 图等基础概念。
-
课堂学习:认真听讲,重点理解软件开发流程,记录案例;积极参与课堂讨论,理解团队开发的痛点。
-
课后练习:
- 掌握工具:Git 版本控制、Markdown 文档、绘图工具(绘制 UML 用例图、类图)
- 每章节完成课后习题,巩固理论知识点。
-
项目实践:小组合作完成课程项目,完整走完从需求、设计、编码、测试到交付的全过程。
-
阶段性复盘:每 2 周复盘一次,整理笔记,总结项目遇到的问题。
-
拓展学习:阅读工程实践博客,学习代码规范,了解真实企业软件开发流程。
3. 合理性与对我的帮助
合理性:这个指南整体框架合理,覆盖了课前预习、课堂学习、课后练习、项目实践、复盘,抓住软件工程课程核心——理论 + 小组项目实践,推荐的 Git、UML、Markdown 工具也正是课程作业必备工具,贴合课程要求。
局限性:AI 指南比较通用,没有针对个人基础定制。比如我 Python 基础尚可,但软件测试、UML 绘图薄弱,这份指南没有针对我的短板给出侧重训练方案;缺少时间规划,没有划分每周任务,只给了大方向。
对我的帮助:可以当作基础学习大纲,用来规划学习节奏。但我需要在这份指南基础上,增加专项练习:多练习 UML 画图、主动练习单元测试,重点练习小型 Web 项目的工程化拆分,弥补我薄弱点。
七、Markdown 编辑
博客园已完成申请与开通,新建随笔页面中选择的是 Markdown 编辑器。








浙公网安备 33010602011771号