这个作业属于哪个课程 H202601软件工程与软件工程实践
这个作业要求在哪里 第一次个人作业要求
这个作业的目标 通过搭建个人博客与 GitHub 主页、调用 HuggingFace API 生成图像,初步体验软件工程实践中的工具链使用与大模型能力
学号 052404147

软件工程实践第一次作业——从环境搭建到工具链的完整实践

本次作业我完整走了一遍"注册账号 → 搭建博客与主页 → 调用大模型 API → 生成图像 → 复盘技能树"的流程。下面按五个部分记录我的完成过程与思考。


一、基础筹备与环境搭建

1.1 注册 GitHub 账号

我在 GitHub 官网注册了账号,用户名 QG-LHZ,并完善了头像、昵称(枪的王道)、简介(热爱编程,打羽毛球)、学校(福州大学)等个人信息。GitHub 后续既用于搭建个人主页,也是我今后管理代码仓库的核心工具。

1.2 注册博客园账号并开通博客

  • 在博客园注册账号后,申请开通博客(约 15 分钟审核通过)。

  • 完善了昵称(实名"刘怀正")、头像等个人信息,并设置了博客页面样式。

  • 关注了任课老师 黄兆武、助教 李怡涵焦圣蒙 的博客。

  • 加入班级:H202601软件工程与软件工程实践,使用实名,确认自己出现在班级成员列表中。

1.3 注册 HuggingFace 账号并获取 Access Token

  1. Hugging Face 官网注册账号,用户名 liuhaizheng

5653863befdf714f81cb235641822cba

  1. 进入 Settings → Access Tokens → Create new token,创建一个名为 flux hw 的 token,权限选择 Read(遵循最小权限原则,只读即可满足调用模型的需求,也更安全)。

1.4 本地开发环境

  • 开发环境:PyCharm(Python)

  • 依赖包:flaskhuggingface_hubpillow

  • 安装命令:pip install flask huggingface_hub pillow


二、硬核实操——Hugging Face API 调用

2.1 模型简介

我使用的是 XLabs-AI/flux-RealismLora 模型,这是一个基于 Flux 的真实感 LoRA 模型,专门用于增强图像的照片级真实感。本部分目标:通过 HuggingFace 推理 API 调用该模型,并结合前端接口实现交互式生成

2.2 后端代码(app.py)

采用 Flask 搭建后端,接收前端提示词并调用 HuggingFace 推理 API 生成图像:

import os
import io
from flask import Flask, render_template, request, send_file
from huggingface_hub import InferenceClient

app = Flask(__name__)

# HuggingFace Token(从环境变量读取,避免明文泄露)
HF_TOKEN = os.environ.get("HF_TOKEN", "hf_你的token")

# 初始化推理客户端,指定作业要求的 Flux RealismLora 模型
client = InferenceClient(model="XLabs-AI/flux-RealismLora", token=HF_TOKEN)

@app.route("/")
def index():
    """前端首页"""
    return render_template("index.html")

@app.route("/generate", methods=["POST"])
def generate():
    """接收前端提示词,调用 HuggingFace 推理 API 生成图像"""
    prompt = request.form.get("prompt", "").strip()
    if not prompt:
        return "提示词不能为空!", 400
    try:
        # text_to_image:HuggingFace 推理 API 的文生图接口
        image = client.text_to_image(prompt=prompt)
        # 把生成的图像写入内存,返回给前端显示
        buf = io.BytesIO()
        image.save(buf, format="PNG")
        buf.seek(0)
        return send_file(buf, mimetype="image/png")
    except Exception as err:
        return f"生成失败:{err}", 500

if __name__ == "__main__":
    app.run(debug=True, port=5000)

2.3 前端代码(templates/index.html)

前端提供一个输入提示词的交互页面,通过 fetch 把提示词以 POST 方式发给后端 /generate 接口,再以 Blob 形式接收生成结果并展示:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Flux 真实感图像生成</title>
</head>
<body>
    <h1>Flux 真实感图像生成</h1>
    <p>模型:XLabs-AI/flux-RealismLora</p>
    <textarea id="prompt" placeholder="请输入图片描述(提示词)">
A photorealistic portrait of a Chinese college student reading in a library, soft natural light, warm tone, 4k, highly detailed
    </textarea>
    <button id="btn" onclick="generate()">生成图像</button>
    <div id="status"></div>
    <img id="result" alt="生成结果">

    <script>
        async function generate() {
            const prompt = document.getElementById('prompt').value.trim();
            const status = document.getElementById('status');
            const btn = document.getElementById('btn');
            const img = document.getElementById('result');

            status.textContent = '正在生成,请稍候...';
            btn.disabled = true;
            img.style.display = 'none';

            const formData = new FormData();
            formData.append('prompt', prompt);

            try {
                const res = await fetch('/generate', { method: 'POST', body: formData });
                if (!res.ok) { status.textContent = await res.text(); return; }
                const blob = await res.blob();
                img.src = URL.createObjectURL(blob);
                img.style.display = 'block';
                status.textContent = '生成成功!';
            } catch (err) {
                status.textContent = '请求出错:' + err;
            } finally {
                btn.disabled = false;
            }
        }
    </script>
</body>
</html>

2.4 运行与调用成功记录

在 PyCharm 中运行 app.py,控制台日志如下,说明 Flask 服务成功启动并正确响应了请求:

 * Serving Flask app 'app'
 * Debug mode: on
 * Running on http://127.0.0.1:5000
127.0.0.1 - - [11/Sep/2026 21:31:49] "GET / HTTP/1.1" 200 -

ddcfb9da5a3f4650a46bcf9f615c6399

浏览器打开 < http://127.0.0.1:5000 ,输入提示词后点击"生成图像",页面显示"生成成功!"并返回生成的图像,说明> API 调用链路(前端 → Flask 后端 → HuggingFace 推理 API → 图像回传)整体打通。

5db4526d5476bf2e929ac86b516faf10

b7d35b2a2e3dd6a2c6db6f47bd25f04a

最终生成的图像如下——一位在图书馆阅读的中国大学生,柔和自然光、暖色调,具有较高的照片级真实感:

991ccef42362ff90a47500ce9b760f30

2.5 提示词设计思路与修改过程

最终使用的提示词为:

A photorealistic portrait of a Chinese college student reading in a library, soft natural light, warm tone, 4k, highly detailed

我的设计思路是把提示词拆成几个要素,逐个补充:

要素 内容 作用
风格 photorealistic portrait 指定照片级真实感肖像
主体 a Chinese college student reading 明确人物身份与动作
场景 in a library 明确环境背景
光线 soft natural light, warm tone 营造柔和、温暖的氛围
画质 4k, highly detailed 提升清晰度与细节

修改过程:一开始我倾向于只写一句简单描述(如 "a student reading"),但那样模型会给出内容随机、细节粗糙的结果。于是我逐步补充了"人物身份""具体场景""光线氛围"和"画质要求"这几个维度,最终才得到这张真实感较强、符合预期的图像。这让我直观体会到:对这类真实感文生图模型,提示词的具体程度直接决定生成质量

2.6 体验与心得

  1. 门槛比想象低:借助 huggingface_hubInferenceClient,几行代码就能调用大模型,把复杂的模型推理封装成了简单的函数调用。
  2. 提示词是一种"新语言":同一模型的输出质量差异,很大程度取决于提示词写得是否具体、结构是否完整。
  3. 安全意识:学会了用 Access Token 做身份认证,并意识到 token 不能明文提交、应使用环境变量管理。
  4. 前后端协同:这次实践把"后端调用 AI 能力"与"前端交互"结合起来,让我感受到工程化地把大模型能力产品化的完整链路。

三、个人名片——GitHub 个人主页搭建

3.1 方案选择

我选择了**创建个人资料自述文件(README)**的方案:新建一个与 GitHub ID 同名的仓库,在仓库根目录的 README 中撰写个人介绍。

我的 GitHub 用户名为 QG-LHZ,因此创建了同名仓库 QG-LHZ/QG-LHZ。GitHub 会把这个仓库的 README 自动展示在我的个人主页上。

3.2 主页内容

README 中包含了以下内容:

  • 自我介绍:姓名、学校、专业、兴趣爱好;并附上我担任的学生职务(学院学习部部长、校委会党服副部长、班级文体委员)。

  • 技能与成果:以表格列出我掌握的编程语言、后端、前端、数据/AI 与工具。

  • 自我评估:梳理已掌握的专业知识与能力、感兴趣的技术方向、最希望学习的知识。

  • 未来三年发展规划:明确目标为考研,并说明理由与分阶段规划。

主页展示效果如下:

0c1fe4d8fcffa43722797c9431fbd3a8

个人主页链接:https://github.com/QG-LHZ


四、自我审视——技能树与课程规划

4.1 技能树与技术偏好

已具备的专业知识与能力:

  • 能力 A:Python 编程与 Web 基础——能用 Python 编写脚本,使用 Flask 搭建 Web 服务,使用 urllib / requests 进行网络请求,理解 HTTP 协议中 GET、POST 等方法。

  • 能力 B:版本控制与协作——熟悉 Git 与 GitHub 的基本操作,能用它管理自己的代码仓库。

  • 能力 C:数据与机器学习基础——作为数据科学与大数据专业学生,具备一定的数据处理和机器学习基础,了解大模型 API 的基本调用方式。

感兴趣的技术方向:后端开发与系统架构、人工智能/机器学习与大模型应用开发、Web 前端与移动端。

还欠缺的能力:较大规模项目的工程化组织与设计能力不足;数据库、微服务、容器化等后端进阶技术掌握不够;深度学习与模型微调实操经验较少;高质量代码规范与单元测试习惯尚未养成。

4.2 代码量说明

  • 截至目前的代码量:约 5000 行

  • 本学期课程结束后希望达到的代码量:10000 行以上

我希望通过本学期的课程项目与日常练习,把代码量提升到 10000 行以上,同时重点补足工程能力和代码规范。

4.3 最期待的课程知识与收获

  • 最期待学习的知识:软件工程的全流程方法,包括需求分析、系统设计、测试与项目管理;以及如何把大模型等新工具融入开发流程。

  • 希望获得的收获

    1. 建立工程化交付的意识,而不只是"会写代码";
    2. 掌握 Git / 团队协作等真实工作流;
    3. 通过完整项目提升独立解决问题的能力。

4.4 AI 生成的学习指南及分析

以下是我让 DeepSeek 生成的软件工程课程学习指南:

一、学习目标
软件工程的核心不在于会写几行代码,而在于用工程化的方法系统、可靠地交付软件。

二、核心知识体系

  1. 软件开发流程:需求分析、设计、编码、测试、维护
  2. 经典开发模型:瀑布模型、迭代模型、敏捷开发(Scrum)
  3. 需求工程:如何挖掘、分析和管理需求
  4. 系统设计:架构设计、模块划分、设计模式
  5. 软件测试:单元测试、集成测试、系统测试
  6. 项目管理:团队协作、版本控制(Git)、持续集成

三、实践建议

  1. 用 Git / GitHub 管理每一个练习项目
  2. 学习写单元测试,养成"先测试后编码"的习惯
  3. 参与一个真实的小项目,体会团队协作
  4. 多阅读优秀开源项目的代码

四、学习资源

  • 教材:《软件工程——实践者的研究方法》

  • Git 官方文档、GitHub

  • 敏捷开发相关书籍与文章

我对这份指南的分析

  1. 合理之处:抓住了软件工程的本质是"工程化交付",而不是单纯写代码;覆盖了需求、设计、编码、测试、维护的完整生命周期;给出的实践建议(用 Git、写单元测试、参与项目、读开源代码)具体且可操作。
  2. 不足之处:内容偏宏观,缺少针对本学期课程的具体节奏安排;没有结合我个人的专业背景给出差异化建议;学习资源偏传统,较少提及大模型辅助开发等新工具。

结论:这份指南能帮我建立软件工程的整体认知框架,但具体落地还需要结合课程进度和自己的薄弱项来调整。我会把"用 Git 管理项目""先测试后编码"等建议落实到本次及后续作业中。


五、格式规范与提交

5.1 使用 Markdown 编写

本次作业使用 Markdown 编写。我把博客园的编辑器切换成了 Markdown 编辑器,正文的表格、代码块、列表、图片均通过 Markdown 语法呈现。

5.2 开头信息表格

按照作业要求,我在随笔最前面加上了包含"课程链接、作业要求链接、作业目标、学号"的信息表格(见本文开头)。

5.3 后台编辑页面截图

image