软件工程第一次作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/15712 |
| 这个作业的目标 | 通过调用 HuggingFace API 生成写实图像并搭建前端交互,掌握用代码调用大模型的基本流程;同时搭建 GitHub 个人主页,梳理个人技能与学习规划 |
| 学号 | 102401334 |
一、HuggingFace API 的调用
1.1 准备工作
- 在 HuggingFace 官网注册账号,并在 Settings → Access Tokens 生成一个 Read 权限的 token。
- 由于
XLabs-AI/flux-RealismLora是一个 LoRA,需叠加在底模black-forest-labs/FLUX.1-dev上,而 FLUX.1-dev 是 gated 模型,因此需先在模型页接受许可。

1.2 调用方案说明
XLabs-AI/flux-RealismLora 本质是一个 LoRA,不能单独调用,需要基于 FLUX.1-dev 底模加载。考虑到本地显卡(8G 显存)难以流畅运行完整的 FLUX.1-dev 模型,本次采用 HuggingFace 云端 Inference API 进行调用:通过 huggingface_hub 库的 InferenceClient,在服务端调用 FLUX.1-dev 生成图像,再由 Flask 提供前端接口实现交互生成。
后端核心代码 app.py:
import os
import time
from flask import Flask, jsonify, render_template, request
from huggingface_hub import InferenceClient
app = Flask(__name__)
# Token 通过环境变量传入,不硬编码进代码,避免泄露
HF_TOKEN = os.environ.get("HF_TOKEN")
MODEL_ID = "black-forest-labs/FLUX.1-dev"
def _get_client() -> InferenceClient:
if not HF_TOKEN:
raise RuntimeError("未设置 HF_TOKEN 环境变量")
return InferenceClient(token=HF_TOKEN)
@app.get("/")
def index():
return render_template("index.html")
@app.post("/generate")
def generate():
data = request.get_json(silent=True) or {}
prompt = (data.get("prompt") or "").strip()
if not prompt:
return jsonify({"error": "提示词不能为空"}), 400
negative_prompt = (data.get("negative_prompt") or "").strip() or None
seed = data.get("seed")
try:
seed = int(seed) if str(seed).strip() not in ("", "None") else None
except (TypeError, ValueError):
seed = None
try:
client = _get_client()
image = client.text_to_image(
prompt=prompt,
model=MODEL_ID,
negative_prompt=negative_prompt,
num_inference_steps=int(data.get("steps") or 28),
guidance_scale=3.5,
height=768,
width=1024,
seed=seed,
)
except Exception as e:
return jsonify({"error": f"生成失败:{e}"}), 500
os.makedirs("static", exist_ok=True)
filename = f"flux_{int(time.time())}.png"
image.save(os.path.join("static", filename))
return jsonify({"image_url": f"/static/{filename}"})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5001, debug=True, use_reloader=False)
独立验证 API 的脚本 test_direct.py:
import os, time
from huggingface_hub import InferenceClient
client = InferenceClient(token=os.environ["HF_TOKEN"])
prompt = ("A photorealistic close-up portrait of an elderly Chinese farmer, "
"deep wrinkles, warm golden-hour side light, 85mm lens, "
"shallow depth of field, ultra detailed skin texture, 8k")
image = client.text_to_image(
prompt=prompt,
model="black-forest-labs/FLUX.1-dev",
negative_prompt="blurry, cartoon, low quality, deformed",
num_inference_steps=28,
guidance_scale=3.5,
height=768, width=1024, seed=42,
)
os.makedirs("static", exist_ok=True)
path = f"static/direct_{int(time.time())}.png"
image.save(path)
print("调用成功:", path)
1.3 前端交互界面
前端使用 Flask 模板 + 原生 HTML/CSS/JS 实现:用户输入提示词、负面提示词、步数、种子,点击"生成"后通过 fetch 请求 /generate 接口,后端调用模型后返回图片并展示。

1.4 提示词设计思路与修改过程
写实图像的关键不是"越美越好",而是加入真实世界的瑕疵,并用镜头/相机参数模拟真实拍摄。
| 提示词片段 | 作用 |
|---|---|
photorealistic close-up portrait |
定调"照片级写实 + 特写",排除绘画/动漫风格 |
elderly Chinese farmer, deeply wrinkled sun-baked skin |
具体主体 + 特征,皱纹、晒黑皮肤是最强的"真实感"锚点 |
warm golden-hour side lighting |
侧光突出皮肤纹理与立体感 |
85mm lens, f/1.8, shallow depth of field |
人像镜头参数,背景虚化,模拟真实拍摄 |
razor-sharp eyes, visible skin pores, fine facial hair |
细节词,毛孔、胡茬这些"不完美"最显真 |
natural imperfections, hyper-detailed, 8k, full-frame DSLR |
画质词 + 自然瑕疵,避免过度磨皮的假脸 |
修改过程:最初的提示词过于笼统(如 a realistic person),生成结果细节缺失、不够真实;逐步加入光线、镜头参数、皮肤细节等关键词后,写实程度明显提升。负面提示词中加入 blurry, cartoon, low quality 进一步抑制了非写实风格。



1.5 API 调用操作步骤
- 注册 HuggingFace 账号,生成 Read 权限的 Access Token。
- 接受 FLUX.1-dev 模型的 gated 许可。
- 安装依赖:
pip install flask huggingface_hub pillow。 - 设置环境变量:
$env:HF_TOKEN = "hf_xxx"。 - 运行
python test_direct.py直接验证 API 调用成功。 - 运行
python app.py启动 Flask 服务,浏览器访问http://127.0.0.1:5001,在前端输入提示词交互生成。
1.6 体验与心得
- 第一次真正"调用大模型",体会到 HuggingFace 把底层模型的复杂度封装成了统一 API,调用门槛大大降低。
- 过程中踩了几个坑:Windows 的 5000 端口被系统保留导致服务起不来(改用 5001 解决);token 不能硬编码进代码(用环境变量解决);gated 模型需先接受许可。
- 提示词对结果影响巨大,写实效果靠"真实瑕疵 + 镜头参数"而非简单堆叠"好看"的形容词。
- 本地 8G 显存跑不动完整 FLUX 模型,学会用云端 API 替代,理解了"算力受限时如何选择调用方式"。
二、GitHub个人主页

三、技能树与自我评估
已具备的能力
- 能力 A:Python + Flask Web 开发 —— 能独立完成简单的后端接口开发,本次作业即用 Flask 搭建了前后端交互的生成服务。
- 能力 B:Java(入门)+ SpringBoot —— 了解面向对象编程思想,能搭建基础的 SpringBoot 项目。
- 能力 C:C/C++ 语言基础 —— 掌握基础语法、指针、结构体等,能编写简单程序。
- 能力 D:调用第三方 API —— 已实践 HuggingFace Inference API 的调用流程。
感兴趣的技术方向
- AI 方向:大模型应用、图像生成、AI 接口调用,是当前最感兴趣、最想深入的方向。
还欠缺的能力
- 前端开发:HTML/CSS/JS 只够做简单页面,缺少完整的前端工程能力。
- 数据库:SQL 基础与数据库设计能力不足。
- 数据结构与算法:熟练度不够,影响解决复杂问题的能力。
- 软件工程规范:需求分析、设计模式、自动化测试等工程化实践欠缺。
- 大型项目协作经验:缺少多人协作、代码评审、版本管理规范的经验。
四、代码量说明
- 截至目前的代码量:约 8000 行(以 Python、Java、C 为主)。
- 完成本学期课程后期望达到的代码量:约 20000 行。通过课程小组项目和持续的 AI 应用实践,期望在代码量和代码质量上都有明显提升。
五、本课程最期待学习的知识与收获
- 最期待学习的知识:软件工程的核心方法论(需求分析、设计、测试、团队协作),以及如何把 AI 工具应用到软件开发流程中。
- 希望获得的收获:完整的项目开发经验、规范的工程习惯、团队协作能力,以及"从需求到交付"的完整流程认知。
六、AI 工具生成的软件工程学习指南及分析
以下指南由 AI 工具(Claude Code)生成:
软件工程课程学习指南
- 知识地图:软件生命周期(需求→设计→编码→测试→维护)、需求工程、软件设计(高内聚低耦合)、编码与实现、软件测试(黑盒/白盒)、项目管理与协作(Git/Scrum)、过程模型(瀑布/迭代/敏捷)。
- 学习路径:第 1-3 周掌握 Git + GitHub;第 4-6 周需求分析与 UML 设计;第 7-10 周小组项目实践;第 11-14 周测试与文档完善;期末交付可运行软件 + 文档。
- 必备工具:Git/GitHub、一个 IDE、Markdown、测试框架、一个 AI 编程助手。
- 学习方法:项目驱动(软件工程是"做"出来的)、重视文档、重视多人协作、善用 AI 但要能看懂并验证其输出。
分析:
- 是否合理:合理。指南覆盖了软件工程的核心内容(生命周期、需求、设计、测试、协作),学习路径按周推进、循序渐进,工具清单也都是实际开发中真正会用到的东西。
- 能否帮助自己:有帮助。其中"项目驱动"和"重视文档、协作"的建议点出了软件工程与普通编程课程的本质区别——重点不在写出代码,而在于用规范的方法、多人协作地交付软件。我会重点实践"项目驱动"这一点,尽早组队做小项目。

浙公网安备 33010602011771号