| 这个作业属于哪个课程 | 软件工程 |
|---|---|
| 这个作业要求在哪里 | 要求 |
| 这个作业的目标 | 部署API,搭建平台生成图片 |
| 学号 | 102401208 |
一、准备工作
已关注任课老师与助教博客,完成博客园开通,关注了任课老师与助教。
二、huggingface-API的调用及图像生成网页搭建
| 项目 | 内容 |
|---|---|
| 操作系统 | Windows 11 |
| 编程语言 | Python 3.12.10 |
| 主要依赖库 | huggingface_hub、gradio |
| 使用模型 | XLabs-AI/flux-RealismLora |
1.实验原理
在开始作业之前,我希望能将api及token的含义及使用原理了解清楚,因此在查阅ai及有关词条后得到以下结果:
1.1 什么是 API
API(应用程序编程接口)是两个程序之间约定的通信方式。调用 Hugging Face 的图片生成 API 时,只需要向指定地址发送一段文字描述,并携带访问令牌,服务器就会返回一张生成的图片。使用者不需要了解模型内部如何运行。
1.2 什么是 Access Token
Access Token 是访问令牌,相当于用户的身份凭证。服务器通过它判断调用者的身份和权限。
1.3 前端与后端
- 前端:用户直接看到和操作的界面,负责输入和展示。
- 后端:在幕后处理逻辑的程序,负责接收请求、调用接口、返回结果。
在本次作业中,我使用 Gradio 自动生成的网页(含输入框、按钮、图片展示区)作为前端,以Python 代码作为后端。
2、实验步骤
2.1 注册 Hugging Face 账号
访问 huggingface.co 注册并登录。
2.2 创建 Access Token
进入「头像 → Settings → Access Tokens → Create new token」,创建 Fine-grained 类型token,并勾选以下两项权限:
- Make calls to the serverless Inference API
- Make calls to Inference Providers
⭕在第一次创建token时,我误将其选择为Read模式,导致第一次调用失败,返回403。
2.3 搭建 Python 环境
- 安装 Python 3.12。
- 使用 pip 安装依赖库:
pip install huggingface_hub requests pillow gradio
2.4 编写交互式网站(app.py)
在收到作业要求后,我求助了claude该如何调用api并使用该生成模型,最初的方案没有前端接口,仅仅是在命令行中完成整个过程,其中prompt和token是写死在代码中的,如:
PROMPT = "a photorealistic portrait of a young woman, studio lighting, 8k, highly detailed"
每次输入新的prompt都要在代码中修改,非常不方便,因此我希望引入前端接口,能在网页上直接输入prompt,但由于对此不太熟悉,在咨询ai并多次修改后我得到如下代码:
import os
import gradio as gr
from huggingface_hub import InferenceClient
#获取 Token,若为空则提示并退出
TOKEN = os.environ.get("HF_TOKEN", "").strip()
if not TOKEN:
print("错误:未设置 HF_TOKEN,请设置后重试。")
exit(1)
MODEL_ID = "XLabs-AI/flux-RealismLora"
client = InferenceClient(token=TOKEN)
def generate(prompt):
"""输入一段英文描述,返回一张生成的图片"""
if not prompt or not prompt.strip():
raise gr.Error("请先输入图片描述")
try:
image = client.text_to_image(prompt.strip(), model=MODEL_ID)
return image
except Exception as e:
raise gr.Error(f"生成失败: {e}")
with gr.Blocks(title="Flux 图片生成器") as demo:
gr.Markdown("""
# Flux 图片生成器
在左边输入英文描述,点「生成图片」,右边就会出图。
""")
with gr.Row():
with gr.Column(scale=1):
prompt = gr.Textbox(
label="图片描述(建议英文)",
lines=3,
placeholder="a photorealistic portrait of a young woman, studio lighting, 8k",
)
btn = gr.Button("生成图片", variant="primary")
with gr.Column(scale=1):
image = gr.Image(label="生成结果", type="pil")
btn.click(generate, inputs=prompt, outputs=image)
prompt.submit(generate, inputs=prompt, outputs=image)
if __name__ == "__main__":
demo.launch(server_name="127.0.0.1", server_port=7860, inbrowser=True)
在此方案中,prompt可以直接在前端输入,token也是运行前用命令临时设进环境变量,即:
HF_TOKEN = "hf_你的token"
没有网页时,只有会改代码、会跑命令的人能用;在加入前端后,就变成了谁打开网页都能用。技术本身没变,但使用的门槛从会编程降到了会打字,实在令人非常感慨...
2.5 结果:运行并生成图片
第一版由于测试原因没有相关存档,于是只做了两次尝试
第二版prompt:A photorealistic wide-angle view of the vast ocean surface glittering with golden sunlight during sunset, warm golden and amber hues reflecting on the gentle ripples, dramatic sun rays piercing through thin clouds, high contrast, cinematic lighting, 8k, highly detailed.

第三版prompt:Breathtaking golden hour seascape, the setting sun casting brilliant golden and orange shimmering reflections across the calm sea, sparkling highlights on the water texture, warm glow, soft haze near the horizon, deep blue shadows in the waves, hyper-realistic, professional photography, Nikon Z9, 85mm, sharp focus.

二三版生成的图片差不多,苦于次数限制无法尝试相对较短的描述是否会影响图片生成,但可以知道的是在提示词越具体的情况下ai生成的图片会越符合预期一些。
3.总结与收获
让我比较感触的是,当我把原本只能改代码才能运行的脚本,改造成一个带输入框和按钮的网页后,我第一次直观地理解了前端与后端的分工:后端提供能力,前端让这种能力被更多人方便地使用,同一个模型调用,加上一个简单界 面,使用门槛就从"必须会编程"降到了"会打字就行"。我认为,一项技术的价值不仅在于它本身有多强大,也在于能否被真正便捷地使用。
三、随笔
✅ 已掌握的专业知识与能力
- 核心课程基础:数据结构与算法、计算机组成原理、计算机网络
- 编程能力:能熟练使用c/c++,对python有一定基础
- 大模型应用:能把大模型 API 接到真实应用里
- 工程基础:会用 Git 管理代码
🤖 感兴趣的技术方向
- 大模型应用开发(RAG、Agent、多模态)
- 模型选型、微调与推理加速
- AI 与具体业务场景的结合
🤖 欠缺的能力
- 还不能独立完成一个可以落地的项目
- 代码能力还不够熟练
📚 最希望学习哪些知识
- 模型训练的底层原理
- Agent 框架的设计与多智能体协作
- 大模型的工程化部署、成本优化与评测方法
🧭 未来三年发展规划
我的目标是考研,我希望继续优化提升自己的代码能力与专业适配度。
第一年(大三) · 确定目标 + 打好基础
- 确定目标院校和专业方向,了解招生情况、考试科目与往年分数线
- 系统补齐数学基础(高数、线代、概率论)和专业课(数据结构、操作系统等)
第二年(大四) · 全力备考
- 大四上学期全力以赴备考,12 月参加初试
- 次年准备复试,展示自己的项目经历和动手能力
- 认真完成毕业设计,选一个与大模型相关的课题,形成科研能力的初步证明
第三年(研究生第一年) · 从「应用」走向「原理」
- 入学后选定导师和研究方向,系统学习模型训练、微调与算法
- 从「会用大模型」转向「理解大模型」,参与导师课题,争取发表论文
- 把研究方向与工程实践结合,为进入计算机岗位打基础
对本课程的期待
在软件工程课程中,我最期待系统学习的是软件生命周期的完整实践方法,尤其是需求分析、架构设计与团队协作流程。我希望理解如何将模糊的用户需求转化为清晰的技术方案,并掌握版本控制、测试驱动开发与持续集成等工程化工具。同时,我期待通过真实项目案例,学习如何在进度、质量与成本之间做出权衡。我最大的收获期望是建立起工程化视角:不仅写出可运行的代码,更能写出可维护、可扩展、可协作的软件系统。此外,我也希望培养起严谨的文档习惯与代码审查意识,为未来参与项目打下扎实基础。
代码量
截止到目前大约为2000~3000行,大多是课堂实践,小组作业等,在本门课程后希望能够达到5000至6000行。
⭕AI生成的学习指南
下面采用claude生成学习指南:
一、这门课在学什么
软件工程不是教你写代码,而是教你如何有组织、可控地把一个软件「做出来、做好、持续维护」。核心问题只有一个:
当软件规模变大、参与的人变多、需求不断变化时,怎样保证它不失控?
二、核心知识模块
| 模块 | 核心内容 | 一句话理解 |
|---|---|---|
| 1. 软件过程模型 | 瀑布模型、迭代/增量、敏捷(Scrum)、DevOps | 决定「用什么节奏和流程来做软件」 |
| 2. 需求工程 | 需求获取、分析、规格说明、管理 | 先搞清楚「到底要做什么」,是最容易被忽视也最要命的一环 |
| 3. 系统/架构设计 | 架构风格、模块划分、接口设计、UML 建模 | 把需求翻译成「系统长什么样」 |
| 4. 详细设计 | 类图、时序图、设计模式 | 具体到「每个模块内部怎么实现」 |
| 5. 编码与实现 | 编码规范、代码重构、版本管理 | 代码质量不是玄学,是可管理的过程 |
| 6. 软件测试 | 单元测试、集成测试、系统测试、白盒/黑盒 | 用尽量少的成本尽早发现 bug |
| 7. 项目管理 | 进度、成本、质量、风险、人员管理 | 软件工程 = 技术 + 管理,缺一不可 |
| 8. 软件维护 | 维护类型、重构、遗留系统 | 软件 70% 的成本花在维护上 |
| 9. 现代实践 | CI/CD、微服务、容器化、DevOps | 工业界现在实际怎么干活 |
三、建议学习路径
1️⃣理解「过程模型」 → 先建立全局观,知道软件是怎么一步步做出来的
2️⃣吃透「需求工程」 → 需求搞错,后面全白做,这是考试和项目里最容易丢分的点
3️⃣掌握「UML + 设计」 → 画类图、用例图、时序图,能看懂也能画
4️⃣补「测试 + 项目管理」 → 性价比高,考试常考,工作也真用得上
5️⃣动手做一个「完整小项目」→ 把上面的东西串起来,走一遍完整流程
关键原则:软件工程是实践性极强的课,光背概念没有用,一定要用一个项目把它串起来。
四、动手实践建议
最好的学习方式是:用敏捷的方式,完整地做一个小项目,走完一遍全流程。
- 选题:别选太大(一个课程作业管理系统 / 记账 App / 校园二手交易平台即可)
- 完整走一遍:需求分析 → 用例图 → 架构设计 → 类图/时序图 → 编码 → 测试 → 交付
- 用 Git 管理:哪怕只有你一个人,也按提交规范来,养成习惯
- 写文档:需求规格说明书(SRS)、设计文档——这些是软件工程的「交付物」,作业和面试都会看
五、常用工具
| 用途 | 工具 |
|---|---|
| UML 建模 | PlantUML、Draw.io、StarUML |
| 版本管理 | Git + GitHub / Gitee |
| 项目管理 | 看板(Trello / 飞书 / Jira) |
| 测试 | JUnit(Java)/ pytest(Python) |
| CI/CD | GitHub Actions、Jenkins |
六、考试 / 作业高频考点
- ✅ 瀑布模型 vs 敏捷的区别与适用场景(必考)
- ✅ 需求分析里功能需求 vs 非功能需求的区分
- ✅ UML 图:用例图、类图、时序图、活动图的画法与含义
- ✅ 软件测试:黑盒/白盒、等价类划分、边界值分析
- ✅ 耦合与内聚(高内聚低耦合是设计核心)
- ✅ 软件开发过程中的文档体系
七、推荐资源
- 📚 教材:Roger S. Pressman《软件工程:实践者的研究方法》、Ian Sommerville《软件工程》
- 🎬 视频:B 站搜索「软件工程 期末速成」「UML 建模教程」
- 🏆 动手:GitHub 上找一个小型开源项目,读它的 README 和目录结构,感受真实工程的组织方式
💡 一句话总结:软件工程 = 用规范的方法 + 合适的工具 + 有效的管理,把「写代码」变成「做工程」。
我认为这份指南基本覆盖了软件工程课程的核心骨架。划分清晰且贴合工业界实际,对我来说很有价值。学习路径部分提出“用一个小项目把全流程串起来”,并配套了 Git、UML、测试工具和文档要求,这个建议非常务实,因为软件工程光背概念确实没用,必须动手走一遍。
附件:博客编辑截图

浙公网安备 33010602011771号