软件工程第一次作业
2026秋软件工程个人作业(第一次)
| 这个作业属于哪个课程 | 202601 软件工程(福州大学 - 计算机与大数据学院) |
|---|---|
| 这个作业要求在哪里 | 2026秋软件工程个人作业(第一次) |
| 这个作业的目标 | 完成 Hugging Face API 调用与前端交互、GitHub 个人主页建设,并梳理当前技能树、技术偏好、学习目标以及软件工程课程学习规划 |
| 学号 | 102401502 |
一、Hugging Face API 的调用
本次作业中,我首先在 Hugging Face 官网注册了个人账号,并申请了用于模型调用的 Access Token。随后,我选择了 XLabs-AI/flux-RealismLora 模型进行图像生成实验。该模型能够生成具有较强真实感的图像,因此比较符合本次作业中“生成一张最贴近真实世界图像”的要求。
为了验证 API 是否能够成功调用,我首先使用 Python 编写了测试程序,通过 Hugging Face 提供的接口向模型发送 Prompt,并在本地保存返回的图像结果。运行程序后,终端显示 API 调用成功,并成功生成 result.png 图像文件。
1. API 调用成功记录

2. 模型生成的图像结果
程序成功调用模型后,生成的图片如下。可以看出,图像整体呈现出较强的真实摄影风格,人物、光影以及咖啡馆雨天场景都较符合预期。

3. API 调用的核心代码
我首先编写了一个简单的 Python 测试程序,用于验证 Hugging Face API 是否可以成功调用 Flux 模型。
import os
from huggingface_hub import InferenceClient
print("正在连接 Hugging Face...")
client = InferenceClient(
provider="fal-ai",
api_key=os.environ["HF_TOKEN"]
)
prompt = """
A highly realistic photograph of a cozy coffee shop on a rainy evening,
a young man sitting beside the window reading a book,
natural skin texture, realistic reflections on the wet glass,
warm indoor lighting, 35mm photography,
shallow depth of field, photorealistic, highly detailed
"""
print("正在调用模型:XLabs-AI/flux-RealismLora")
print("正在生成图片,请稍候...")
image = client.text_to_image(
prompt=prompt,
model="XLabs-AI/flux-RealismLora"
)
image.save("result.png")
print("================================")
print("API 调用成功!")
print("图片已保存为 result.png")
print("================================")
通过上述代码,我首先创建了 Hugging Face 的 InferenceClient,并通过环境变量读取自己的 API Token。这样做可以避免直接把 Token 写进程序中,从而降低账号密钥泄露的风险。随后,程序将设计好的 Prompt 发送给 XLabs-AI/flux-RealismLora 模型,并将模型返回的图像保存为 result.png。从终端运行结果可以看到,API 调用过程顺利完成,也证明前期的账号、Token 权限和模型接口配置均正确。
4. 前端交互页面实现
仅仅通过 Python 程序生成图片还不能完全满足本次作业“结合前端接口,实现交互生成”的要求,因此在完成 API 调用测试后,我进一步使用 Flask 搭建了一个简单的 Web 后端,并使用 HTML、CSS 和 JavaScript 编写前端页面。
整个交互过程可以概括为:用户首先在网页输入想要生成的图片描述,然后点击 Generate Image 按钮。JavaScript 会将输入的 Prompt 发送给 Flask 后端,后端接收到请求后再调用 Hugging Face API。模型完成图像生成后,Flask 将生成图片保存在本地 static 文件夹中,并把图片路径返回给前端,最后由网页显示生成结果。
前端页面初始界面如下:

前端页面主要包括一个 Prompt 输入框和一个 Generate Image 按钮。相比在 Python 源代码中直接修改 Prompt,这种方式更加直观,也更接近一个实际软件应用的使用形式。
当输入 Prompt 并点击按钮后,页面会显示“正在生成图片,请稍候……”,随后由 Flask 后端完成模型调用。生成成功后,图片会直接显示在网页中,如下图所示:

从最终结果可以看到,前端、后端以及 Hugging Face API 已经能够正常协同工作,实现了从用户输入文本到生成图像并展示结果的完整流程。
5. Flask 后端核心代码
后端程序使用 Flask 实现,主要负责接收前端发送的 Prompt,并调用 Hugging Face 模型生成图片。核心代码如下:
from flask import Flask, render_template, request, jsonify
from huggingface_hub import InferenceClient
import os
import uuid
app = Flask(__name__)
client = InferenceClient(
provider="fal-ai",
api_key=os.environ["HF_TOKEN"]
)
MODEL_ID = "XLabs-AI/flux-RealismLora"
@app.route("/")
def index():
return render_template("index.html")
@app.route("/generate", methods=["POST"])
def generate():
try:
data = request.get_json()
prompt = data.get("prompt", "").strip()
if not prompt:
return jsonify({
"success": False,
"error": "请输入提示词"
})
image = client.text_to_image(
prompt=prompt,
model=MODEL_ID
)
filename = f"{uuid.uuid4().hex}.png"
filepath = os.path.join("static", filename)
image.save(filepath)
return jsonify({
"success": True,
"image": "/" + filepath.replace("\\", "/")
})
except Exception as e:
return jsonify({
"success": False,
"error": str(e)
})
if __name__ == "__main__":
os.makedirs("static", exist_ok=True)
app.run(debug=True)
6. Prompt 设计思路与修改过程
在本次图像生成过程中,我发现 Prompt 的设计对于最终生成结果有非常明显的影响。最初我只使用了比较简单的描述,例如:
A man reading a book in a coffee shop
使用这种简单 Prompt 时,模型虽然能够正确生成“人物在咖啡馆看书”的基本场景,但是画面整体比较普通,人物皮肤、光线、空间层次以及环境细节都比较有限,仍然能够感受到较明显的人工生成感。
因此,我在第二次调整中加入了更加具体的场景描述,例如 rainy evening、sitting beside the window 和 warm indoor lighting。这样可以明确告诉模型场景发生在雨天傍晚、人物坐在窗边,同时限定室内光线为暖色调。调整后,生成结果中的环境氛围更加明显,窗外雨景和室内灯光之间的关系也更加自然。
在进一步优化时,我加入了 natural skin texture、realistic reflections on the wet glass、35mm photography、shallow depth of field 和 photorealistic 等描述。这些词语不再只是告诉模型“画什么”,而是进一步告诉模型“希望以什么样的摄影方式表现”。其中,natural skin texture 用于增强人物皮肤的自然质感,realistic reflections on the wet glass 用于强化雨天玻璃反射效果,35mm photography 和 shallow depth of field 则用于模拟真实相机摄影中的景深效果。
经过多次修改后,我最终使用的 Prompt 为:
A highly realistic photograph of a cozy coffee shop on a rainy evening,
a young man sitting beside the window reading a book,
natural skin texture,
realistic reflections on the wet glass,
warm indoor lighting,
35mm photography,
shallow depth of field,
photorealistic,
highly detailed
从最终生成结果来看,人物主体更加明确,室内暖光、雨天玻璃以及窗外背景之间的层次更加自然,整体效果也更加接近真实摄影照片。通过这一过程,我认识到 Prompt 的作用并不仅仅是给模型提供一个主题,更重要的是通过人物、环境、光线、材质和摄影方式等多个维度对生成结果进行约束。
7. API 调用体验与心得
通过本次 Hugging Face API 调用实验,我第一次比较完整地经历了从模型接口测试到前端交互应用实现的整个过程。在实验开始之前,我对 API 的理解主要停留在“程序调用远程服务”的概念层面,而实际操作后才发现,其中还包括账号认证、Token 权限、环境变量、模型选择、前后端通信以及异常处理等多个环节。
相比在本地直接部署 Flux 这样的大型图像生成模型,通过 Hugging Face API 调用更加方便,不需要自己准备高性能 GPU,也不需要配置复杂的本地运行环境。只需要完成身份认证并按照接口要求发送请求,就可以使用远程模型完成图像生成。这让我更加直观地理解了云端 AI 服务在实际软件开发中的优势。
与此同时,本次实验也让我意识到,一个能够实际使用的 AI 应用并不是只有模型本身。模型负责生成图像,而前端负责与用户交互,Flask 后端负责接收请求和调用 API,不同部分共同组成了一个完整的软件系统。这一点也让我对后续软件工程课程中系统设计、模块划分和接口设计等内容产生了更强的学习兴趣。
二、GitHub 个人主页搭建
本次作业中,我选择了通过 GitHub Profile README 的方式搭建个人主页。首先,我创建了一个与 GitHub 用户名完全相同的公开仓库 Hyaliiin/Hyaliiin,随后在仓库根目录的 README.md 中编写个人介绍、技术能力、实践经历、自我评估、技术兴趣以及未来发展规划。GitHub 会自动识别这种与用户名同名的特殊仓库,并将 README 内容展示在个人主页中。
最终搭建完成的 GitHub 个人主页如下:

此处替换为你已经上传的 GitHub 个人主页截图链接。
通过本次 GitHub 个人主页搭建,我对 GitHub 的认识也发生了一些变化。过去我更多把 GitHub 理解为代码托管网站,而现在发现它同样可以用于记录个人学习过程、展示项目经历和整理技术能力。一个持续更新的 GitHub 主页不仅可以保存代码,也能够比较清晰地反映一个人的技术成长过程。
三、当前技能树、技术偏好与自我评估
目前我的编程学习主要集中在 Python、C++ 和基础 Web 开发方面。我能够使用 Python 完成一些基本的数据处理、文件操作、第三方库调用和 API 调用,并在本次作业中成功调用 Hugging Face 的 Flux 模型,同时使用 Flask 搭建了简单后端。
最近我开始接触 HTML、CSS、JavaScript 和 Flask,对前后端交互有了初步认识,也对人工智能应用开发、大语言模型、AI Agent 以及 AI 与实际软件系统结合等方向比较感兴趣。
从自我评估来看,我已经具备一定的编程基础和解决问题的能力,但在软件工程方面仍有明显不足,例如需求分析、软件架构、模块划分、代码规范、测试和版本管理等方面经验较少。GitHub 目前主要用于创建仓库、编辑 README 和个人主页,对于分支管理、Pull Request 和多人协作还不熟悉。软件测试也是我后续希望重点提升的能力之一。
四、目前代码量与本学期目标
截至目前,我编写过的代码主要来自课程学习、Python 数据处理、C++ 程序设计以及近期完成的 Web 和 API 实践。如果按照自己实际编写、修改并能够理解的代码进行粗略统计,目前累计代码量大约在 3000~5000 行左右。
不过,这些代码大多数是围绕某个具体任务编写的小型程序或脚本,真正按照完整软件工程流程设计和开发的项目还比较少。因此,我认为代码行数并不能完全代表自己的软件开发能力,更重要的是代码质量、系统设计能力以及项目实践经验。
完成本学期软件工程课程之后,我希望自己的累计代码量能够达到 10000 行以上。但相比单纯增加代码数量,我更希望这些新增代码来自相对完整的软件项目,并能够体现需求分析、模块设计、版本管理、代码规范和测试等软件工程过程。
我希望课程结束以后,自己能够逐渐从“能够编写程序解决具体问题”提升到“能够按照软件工程方法设计和完成一个完整的软件项目”。相比单纯积累代码数量,形成规范的软件开发习惯和项目实践能力对我来说更有意义。
五、对本课程的期待与希望获得的收获
在本课程中,我最期待学习的是一个软件项目从需求提出到最终完成的整个过程。过去我更多关注某一段代码如何实现,而对于软件为什么要这样设计、不同模块之间如何划分、项目开发过程中应该如何协作等内容缺少系统认识。
因此,我希望通过本课程真正理解需求分析、系统设计、编码实现、软件测试、部署以及后期维护之间的关系。尤其希望学习如何在正式开始写代码之前先进行合理的系统设计,而不是像过去一样想到哪里写到哪里。
我也比较期待学习 Git 和团队协作开发。现在我已经能够使用 GitHub 完成一些基础操作,但还没有真正体验多人合作开发同一个项目的过程。我希望通过课程项目学习如何使用分支、如何提交和审核代码、如何解决冲突,以及团队成员之间如何保持项目的一致性。
此外,我还希望建立更加系统的软件测试和代码规范意识。过去我通常把“能够运行”作为程序完成的主要标准,但未来希望能够进一步考虑程序是否可靠、是否容易维护、是否能够应对异常情况。最终,我希望通过这门课程获得的不只是更多编程知识,而是一种更加系统的软件开发思维。
六、使用 ChatGPT 生成的软件工程学习指南
本次我选择 ChatGPT 作为 AI 工具,并向其提出了如下问题:
请为一名具有一定编程基础,但缺少系统软件工程经验的学生生成一份简要的软件工程课程学习指南。
ChatGPT 给出的建议是,首先应该巩固至少一门主要编程语言,保证自己能够独立完成规模较小的程序,同时掌握基本的数据结构、函数、面向对象编程以及异常处理等知识。在已有编程能力的基础上,再进一步学习 Git 和版本管理,理解代码提交、分支、合并以及团队协作的基本过程。
随后,学习重点应该逐渐从“如何写代码”转向“如何开发软件”,理解需求分析、系统设计、编码实现、软件测试、部署和维护之间的关系。在面对复杂任务时,需要学会将系统拆分成多个相对独立的模块,并明确不同模块之间的输入、输出和接口关系。
ChatGPT 还建议重点培养软件测试意识,在编写程序时不仅考虑正常输入,也要考虑错误输入、异常情况以及边界条件。除了单元测试之外,还需要逐步了解集成测试和系统测试,从而保证软件在不同场景下能够稳定运行。
在学习方式方面,ChatGPT 认为完成一个完整项目非常重要。相比单纯阅读软件工程教材,一个真正经历需求分析、系统设计、编码、测试、文档和发布过程的项目,更容易帮助初学者理解软件工程中的各种概念。
最后,在 AI 辅助编程方面,ChatGPT 建议可以利用 AI 解释代码、分析报错、提供开发思路和辅助生成测试代码,但不能把 AI 能够生成程序等同于自己已经掌握相关知识。对于 AI 提供的代码,仍然需要自己阅读、运行、修改和验证。
七、对 AI 学习指南的评价
我认为 ChatGPT 给出的软件工程学习指南总体上比较合理,因为它没有把软件工程简单理解为继续学习更多编程语言,而是强调了软件开发流程、版本管理、系统设计和测试等内容。这一点与我目前的实际不足比较匹配。
其中,我认为“通过一个完整项目学习软件工程”这一建议对我帮助最大。过去我的编程学习往往比较零散,遇到一个问题以后就查资料、写代码,程序得到结果后任务也就结束了。虽然这种方式能够解决问题,但很难形成完整的软件开发能力。
如果能够真正完成一次从需求分析、系统设计、编码到测试和发布的项目,我认为能够更加直观地理解为什么需要模块化、版本控制和软件测试,也能够发现自己在实际开发过程中的不足。
不过,这份学习指南也存在一定局限。ChatGPT 提供的是一套比较通用的学习方案,它并不了解本课程具体的教学进度、课程项目和教师要求,因此真正学习时仍然应该以课程安排为主。
另外,AI 在编程方面确实能够显著提高效率,但如果完全依赖 AI,也可能出现程序已经运行成功,但自己并没有真正理解其中原理的情况。因此,我认为比较合适的使用方式应该是先自己分析问题,再利用 AI 提供思路,最后通过运行、修改和测试真正理解代码。
八、总结
通过本次作业,我完成了 Hugging Face API 调用、Flux 图像生成模型测试、Flask 前后端交互以及 GitHub 个人主页搭建。这些任务虽然规模都不算很大,但是组合在一起之后,让我第一次比较完整地接触到了 API、后端、前端和 GitHub 等不同开发工具之间的关系。
同时,通过整理自己的技能树和不足,我也更加清楚地认识到,目前自己虽然能够利用程序解决一些具体问题,但距离真正的软件工程开发还有较大的提升空间。特别是在系统设计、团队协作、软件测试和项目管理方面,还缺少系统学习和实践经验。
因此,我希望在接下来的软件工程课程中,不只是增加代码量,而是逐渐形成更加规范的软件开发习惯和完整的软件工程思维。最终希望自己在面对一个新的软件开发任务时,不仅能够考虑“这段代码怎么写”,还能够进一步思考“整个软件应该怎么设计、怎么测试、怎么维护,以及怎样让其他人能够继续参与开发”。
九、博客园 Markdown 编辑页面截图
按照作业要求,本篇随笔使用 Markdown 编辑器进行编写。下图为博客园后台编辑页面,可以看到当前编辑器已经设置为 Markdown 模式。

浙公网安备 33010602011771号