软件工程第一次作业

从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. 目前欠缺的能力

  1. 软件工程规范:不熟悉需求分析、项目设计、单元测试、代码规范、团队协作开发流程。
  2. 后端进阶知识:数据库、接口设计、异常处理、项目部署知识薄弱。
  3. 代码工程化能力:只会写零散小脚本,不会把代码拆分成模块,缺少项目架构思维。
  4. 测试能力:不会写单元测试,没有对程序做稳定性测试的习惯。

4. 技术偏好与最希望学习的知识

我对 Web 全栈和 AI 应用的结合感兴趣,希望能做出完整可用的小工具,而不只是零散的脚本。

最希望学习的是软件工程的工程化方法:从需求分析到设计、编码、测试、交付的完整流程,以及如何把代码拆分成模块、写出可维护的项目结构。


二、代码量与本学期目标

项目 估计或目标
截至目前累计代码量 约 5,000 行
本学期希望新增 约 3,000 行
完成本学期课程后的累计目标 约 8,000 行

三、我对软件工程课程的期待

最期待学习的内容

  1. 软件工程整套开发流程:需求分析、概要设计、详细设计、测试、项目交付。
  2. 团队项目协作方法:使用 Git 进行多人协同开发。
  3. 软件测试方法:学会为代码编写测试用例,减少 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. 实际操作步骤

  1. Hugging Face 注册个人账号,进入 Settings → Access Tokens,创建一个 Fine-grained Token,并授予调用 Inference Providers 推理服务的权限,复制保存(只显示一次)。

  2. 在项目根目录创建 .env 文件,写入 HF_TOKEN=hf_你的Token;将 .env 加入 .gitignore,博文中不展示令牌值。

  3. 安装依赖:pip install gradio huggingface_hub python-dotenv pillow

  4. 运行 python app.py 启动服务,浏览器自动打开 http://127.0.0.1:7860

  5. 在页面中填写正向提示词和负向提示词,设置分辨率、步数、guidance_scale 和 seed,点击"生成图片"。

  6. 接口返回后,后端自动保存 PNG 图片和 JSON 记录到 outputs/ 目录,前端显示生成结果与调用状态。

image

83e2b997-a72c-47f1-96cd-beed052705d5

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 返回并保存的原始图片:

flux_20260911_133841_879989

下图为前端页面的展示截图:

13c25650-1254-481f-942b-70d75712241e

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. 方案选择

我选择的是方案二。

d265fa24-8b57-425e-a3b2-d92d931856bc

58d7b17a-1c5f-48ba-8aad-988e7769ef10


六、AI 生成的软件工程课程学习指南与我的分析

1. AI 工具与任务

本次使用的 AI 工具为 DeepSeek。我提供了个人背景(Python 基础、Web 开发入门、缺少工程化经验)和希望加强的能力,请它生成一份简要的软件工程课程学习指南。

2. AI 生成的简要学习指南

软件工程课程学习指南

  1. 课前预习:每次上课前,通读教材对应章节,标记不懂概念,提前了解需求分析、软件生命周期、UML 图等基础概念。

  2. 课堂学习:认真听讲,重点理解软件开发流程,记录案例;积极参与课堂讨论,理解团队开发的痛点。

  3. 课后练习

    • 掌握工具:Git 版本控制、Markdown 文档、绘图工具(绘制 UML 用例图、类图)
    • 每章节完成课后习题,巩固理论知识点。
  4. 项目实践:小组合作完成课程项目,完整走完从需求、设计、编码、测试到交付的全过程。

  5. 阶段性复盘:每 2 周复盘一次,整理笔记,总结项目遇到的问题。

  6. 拓展学习:阅读工程实践博客,学习代码规范,了解真实企业软件开发流程。

3. 合理性与对我的帮助

合理性:这个指南整体框架合理,覆盖了课前预习、课堂学习、课后练习、项目实践、复盘,抓住软件工程课程核心——理论 + 小组项目实践,推荐的 Git、UML、Markdown 工具也正是课程作业必备工具,贴合课程要求。

局限性:AI 指南比较通用,没有针对个人基础定制。比如我 Python 基础尚可,但软件测试、UML 绘图薄弱,这份指南没有针对我的短板给出侧重训练方案;缺少时间规划,没有划分每周任务,只给了大方向。

对我的帮助:可以当作基础学习大纲,用来规划学习节奏。但我需要在这份指南基础上,增加专项练习:多练习 UML 画图、主动练习单元测试,重点练习小型 Web 项目的工程化拆分,弥补我薄弱点。


七、Markdown 编辑

博客园已完成申请与开通,新建随笔页面中选择的是 Markdown 编辑器

448f2d36-1ce0-4a99-8557-71c5b611b27e

posted @ 2026-09-11 16:37  _code_yuan  阅读(15)  评论(0)    收藏  举报