软工作业1--由实践开始的软工学习
| 这个作业属于哪个课程 | H2026软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 2026秋软件工程个人作业(第一次) |
| 这个作业的目标 | 1.梳理当前自己的技能树,明确未来的发展方向 2.调用huggingface-API,并结合前端接口交互生成贴近现实生活图像 3.创建自己的github主页,填写相关的个人信息 4.使用ai工具生成软件工程课程学习指南,并判断是否合理 |
| 学号 | 102401514 |
由huggingface api调用开启的软件工程实践
一、自我介绍

Hello!大家好!!我叫曾子瑞,是福州大学计算机科学与技术专业的一名大三学生,目前对DA、DS等方向比较感兴趣,希望未来能成为一名数据科学家😇。在课余时间我喜欢弹钢琴、听歌、打游戏(fps moba 种田等等等等)。目前规划是准备升学。
1.当前技能树
- 编程语言:熟悉c/c++、python的语法,能写基本的算法题
- python后端:学习过FastAPI框架,熟悉MYSQL数据库操作
- 数据分析:掌握pandas,numpy语法,Matplotlib绘图以及Tableau可视化工具
2.感兴趣的方向
我对数据分析,数据科学方向比较感兴趣,未来想往这方面学习,成为一名数据科学家。
3.欠缺的能力
- 缺乏项目开发经验,没有实战经历
- 对于学习过的技能掌握的不够熟练,缺乏训练
- 对完整的开发流程不熟悉
4.代码量以及本学期目标
- 目前代码量大概4000-5000行,动手写代码的时间很少,本学期希望能通过项目实战积累开发经验,把自己学过的知识运用到实践中,希望这学期能够累积到10000行代码💪
5.对本学期本课程的期望
- 希望通过软件工程课程的学习,提升自己动手做项目的能力,同时希望系统的了解软件开发的流程架构,建立对完整软件生命周期的全面认知
6.未来的规划
- 未来一年努力争取升学,同时积累自己的项目经历,接着多参加实习再进入社会之前努力多积攒实习经历。然后有空了就学jazz钢琴,我超喜欢这种风格,希望有一天能够即兴演奏🤘
二、Hugging Face API 调用与前端实现
欧克,接下来就进入这次作业的主要内容
1.实现方案
我的实现这个项目整体分为五个部分
- 配置管理: 由于我的程序代码都写在一个文件中,为了防止把密钥直接写进代码,我创建
.env来保存访问令牌,在程序启动时可以直接读取 - 前端交互: 我的前端并没有使用传统的Vue或React,而是通过Gradio的python 组件快速完成页面结构和交互,再用HTML/CSS提升界面美观度
- 后端处理: 后端使用Python实现,通过Gradio将前端输入传给
generate_image()函数--可以调用Hugging Face上的FLUX模型生成图片并返回给前端 - 模型调用: 使用
huggingface_hub.InferenceClient,通过fal-ai推理服务调用XLabs-AI/flux-RealismLora,将文本描述转换为写实图片。 - 结果和异常处理: 模型返回图片后在页面展示生成结果并且将图片保存到
output文件夹中,并且将提示词、参数、耗时、状态等信息记录到JSONL日志中,如果调用失败的话则记录错误并在页面上显示提示。
如下是调用步骤
网页输入正向提示词、负向提示词和生成参数
→ Gradio 按钮触发 generate_image()
→ huggingface_hub.InferenceClient.text_to_image()
→ 通过 fal-ai 推理服务调用 Hugging Face
→ 运行 XLabs-AI/flux-RealismLora 模型
→ 返回 PIL 图片对象
→ 保存为 PNG 图片到 outputs 文件夹
→ 在网页中显示图片和调用状态
→ 将参数、耗时及结果写入 logs/api_calls.jsonl
2.提示词设计与修改
因为我想生成一个贴近我们学生生活的图片,然后我就想到了每个学期最痛苦的期末复习,据此来写了提示词
以下是我的第一版提示词:
A candid documentary photograph of a young East Asian woman buying fresh vegetables at a neighborhood morning market in Shanghai after light rain. Eye-level composition, natural morning light filtered through fabric awnings, authentic skin texture and pores, slightly messy hair, subtle fabric wrinkles, wet asphalt reflections, realistic background pedestrians, shot on a full-frame camera with a 50mm lens at f/2.8, natural depth of field, neutral color grading, unretouched, lifelike, highly detailed, photorealistic
这段提示词包括了主题动作,场景环境,人物细节,光线氛围,画面构图,摄像参数,图像风格以及背景细节,但我发现生成的图片仍让我有些不满意,所以我又在以上基础上加上了如下的负向提示词:
cgi, 3d render, illustration, anime, doll, plastic skin, over-smoothed face, excessive makeup, deformed hands, extra fingers, duplicate people, text, logo, watermark, oversaturated colors, excessive HDR
3.API调用成功截图以及成果展示
-
这是API成功调用并生成图片的记录---包括调用时间、提示词、耗时以及图片保存位置
![fee78cc684be41fe0be3ac3d7937da99]()
-
这是前端页面以及所生成的图片展示
![5b0e86dc85f56b828a0a547d977ca409]()
4.核心代码
- 提交提示词和生成参数
image = client.text_to_image(
prompt=prompt,
negative_prompt=negative_prompt.strip() or None,
width=int(width),
height=int(height),
num_inference_steps=int(steps),
guidance_scale=float(guidance_scale),
seed=int(seed),
model=MODEL_ID,
)
作用: 把正向提示词、负向提示词、图片尺寸、推理步数、引导强度和随机种子提交给 API。
- 指定推理服务和模型
MODEL_ID = "XLabs-AI/flux-RealismennialsLora"
client = InferenceClient(
provider="fal-ai",
api_key=HF_TOKEN,
)
作用: 指定使用 fal-ai 推理服务,并调用 Hugging Face 上的 flux-RealismLora 模型。
- 保存生成图片
filename = (
"flux_"
+ datetime.now().strftime("%Y%m%d_%H%M%S")
+ ".png"
)
output_path = OUTPUT_DIR / filename
image.save(output_path)
作用: 按照当前时间创建唯一文件名,并将生成结果以 PNG 格式保存到 outputs 文件夹。
- 记录 API 调用日志
log_data = {
"status": "success",
"model": MODEL_ID,
"provider": "fal-ai",
"prompt": prompt,
"negative_prompt": negative_prompt,
"width": int(width),
"height": int(height),
"steps": int(steps),
"guidance_scale": float(guidance_scale),
"seed": int(seed),
"output_file": str(output_path),
}
write_log(log_data)
作用: 记录调用状态、模型、提示词、生成参数和图片保存位置,便于后续检查。
- 将结果返回前端
status = (
"API 调用成功\n\n"
f"- 模型:{MODEL_ID}\n"
f"- 推理服务:fal-ai\n"
f"- 文件:{output_path}"
)
return image, status
作用: 将生成的图片和调用状态返回给 Gradio,由网页显示最终结果。
5.体验和心得
通过这次作业,我体验了从界面设计、参数配置到 API 调用和结果保存的完整 AI 应用开发流程。我学会了使用 Gradio 搭建网页、调用 Hugging Face 上的 FLUX 模型,并认识到提示词的具体程度会直接影响生成效果。开发中也遇到了网络访问和 API 调用失败的问题,通过错误提示与日志记录完成了排查。总体来说,这次作业让我更深入地理解了前端交互、后端处理和 AI 模型推理之间的联系,也提升了我的调试和实践能力。
三、Github个人主页建设
我采用了老师提供的第一个教程,创建了与自己用户名一样的公开仓库,并在仓库根目录下编写了README.md文件
我的Github个人主页链接: Sqarxx的个人主页

四、AI 生成的软件工程课程学习指南
我选择 ChatGPT 生成一份简要的软件工程课程学习指南,生成内容如下:
1. 软件工程基础
理解软件工程的目标和软件生命周期:
需求分析 → 设计 → 编码 → 测试 → 部署 → 维护
重点掌握:
- 软件危机
- 软件生命周期
- 软件质量
2. 软件开发模型
常见模型:
- 瀑布模型:按阶段顺序开发
- 敏捷开发:快速迭代、响应需求变化
- 增量模型:分阶段交付功能
- 螺旋模型:强调风险分析
3. 需求分析
需求分为:
- 功能需求:系统需要实现什么功能
- 非功能需求:性能、安全、可靠性等要求
常见需求描述方法:
- User Story
- Use Case
4. UML建模
重点掌握:
- Use Case Diagram:描述用户与系统功能
- Class Diagram:描述类及其关系
- Sequence Diagram:描述对象交互顺序
- Activity Diagram:描述业务流程
5. 软件设计
了解:
- MVC
- 分层架构
- SOLID设计原则
- 常见设计模式
6. 软件测试
主要测试类型:
- Unit Test:单元测试
- Integration Test:集成测试
- System Test:系统测试
- Acceptance Test:验收测试
常见方法:
- 黑盒测试
- 白盒测试
- 等价类划分
- 边界值分析
7. 项目管理与开发工具
重点了解:
- Agile / Scrum
- Git版本控制
- 团队协作
- 风险管理
- CI/CD
- DevOps
8. 推荐学习顺序
软件工程基础
↓
开发模型
↓
需求分析
↓
UML
↓
软件设计
↓
软件测试
↓
Git与项目管理
↓
CI/CD与DevOps9. 考试重点
重点记住以下区别:
- Waterfall vs Agile
- 功能需求 vs 非功能需求
- User Story vs Use Case
- Unit Test vs Integration Test vs System Test
- Verification vs Validation
- CI vs CD
学习时重点理解每个概念的作用、使用阶段和实际应用场景,不要只背定义。
- 我对这份指南的评价:我觉得这份学习指南对我非常有帮助,它结构清晰、内容精炼,涵盖了软件工程的主要知识点和学习顺序,重点突出,很适合快速了解课程框架和进行考前复习。但后面的学习中我还要结合题目和实践进行学习,才能真正掌握软件工程这门课程。
五、总结
通过这次作业我学会了非常多的知识,更重要的是参与了一次真正的实践,收获了很多,我将我在本次作业中学到的东西在下方进行了总结:
- 首先便是通过hugging face api调用这个项目,学会了如何进行前后端交互,如何做一个小项目
- 然后便是进行了一次markdown实操,虽然很早以前我就学习过如何使用markdown,但我一直没有真正实践过,这次作业真正提升了我对这个工具使用的能力,而不是只是了解
- 通过建立github个人主页仓库,我对github这个十分重要的网站更加熟悉,以前只是用它来搜学习资料和项目,这是第一次建设自己的账号
总而言之,我认为在这次作业中我学到了很多,还积累了珍贵的实操经验😃
六、后台编辑页面截图
按照作业要求我将后台编辑页面截图展示

给读者的话
非常感谢大家阅读我的第一篇blog!!!虽然我觉得现在的我写这篇blog还十分青涩,但我相信在不断练习下,未来的我能写出高质量的博客给大家💪




浙公网安备 33010602011771号