🚀 Nova的软件工程冒险:解锁GitHub与Hugging Face
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 2026秋软件工程第一次作业 |
| 这个作业的目标 | 完成 GitHub 个人主页搭建、Hugging Face AI 图像生成项目、前后端交互,并记录 Prompt 设计、代码实现、调试过程和学习总结 |
| 学号 | 102402102 |
🎮 Nova的软件工程冒险:从 GitHub 到 AI 图片生成的闯关之旅
任务加载中……
🎯 主线任务:完成软件工程第一次作业
🧑💻 玩家:Nova
🗺️ 当前地图:GitHub / Hugging Face / Flask / Markdown
⭐ 最终目标:做出一个能够真正运行的 AI 图片生成小项目冒险正式开始!
🌟 序章:这次不是“交作业”,而是一场闯关
刚看到这次软件工程作业的时候,我的第一反应是:
“怎么这么多东西?”
GitHub、博客园、Markdown、Hugging Face、API、AI 图片生成、前端、后端……
乍一看,每一个词都像一个新的任务。
但如果把它们拆开来看,其实就像一张游戏地图:
🎮 软件工程冒险地图
【起点】
│
↓
第一关:GitHub
│
↓
第二关:Markdown
│
↓
第三关:Hugging Face
│
↓
第四关:AI模型
│
↓
第五关:Prompt
│
↓
第六关:前后端联动
│
↓
第七关:Debug
│
↓
👑 Boss战
│
↓
🏆 通关!
所以这次,我决定不把它当成一份冷冰冰的作业。
就把它当成 Nova 的第一次软件工程冒险。
🗺️ 第一关:建立自己的“冒险基地”——GitHub
🎯 任务目标
第一关的任务是:
建立自己的 GitHub 个人主页。
根据作业要求,我选择了 Profile README 方案。
简单来说,就是创建一个特殊仓库,然后通过 README.md 来介绍自己。
这其实有点像给自己制作一张:
程序员身份卡。
🧑💻 我的 GitHub 个人主页
我给自己的 README 起了一个比较符合自己风格的开头:
⭐ Nova闪亮登场 ⭐
除了代码,我还有不少“奇奇怪怪”的兴趣
所以我觉得自己比较像:
一边研究代码,一边研究生活的人。
🌳 我的技能树
目前我的技能还没有点满,属于“新手村正在升级”的状态。
🚀 Nova 技能树
│
数据科学与大数据技术
│
┌───────────────────┼───────────────────┐
↓ ↓ ↓
编程 数据 工程
│ │ │
┌─────┼─────┐ │ ┌─────┼─────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓
C Python Java 数据分析 Git Web API
│ │ │
└──────────┬────────┘ │
↓ ↓
AI应用 项目实践
│
┌───────┼───────┐
↓ ↓ ↓
LLM 数据挖掘 算法工程
目前已经掌握的主要是 Python、Java、C、C++ 的基础能力,同时开始接触 Git、GitHub、Hugging Face、Pandas、NumPy 等工具。
📸 任务截图
下面是我的 GitHub Profile README 实际页面:

从截图中可以看到,README 已经成功显示在个人主页中。
这一关:
✅ 通关!
📚 第二关:解锁“程序员文字魔法”——Markdown
GitHub 搞定之后,第二关来到了博客园。
但是老师有一个要求:
必须使用 Markdown 编写博客。
一开始我对 Markdown 的印象就是:
# 标题
**加粗**
- 列表
感觉好像就是给文字加几个符号。
真正用起来之后,我发现 Markdown 对程序员来说还是非常方便的。
例如:
# 一级标题
## 二级标题
**重点内容**
就可以快速形成结构清晰的技术文章。
📝 为什么程序员喜欢 Markdown?
因为它很轻。
不用一直研究字体、字号、排版,只需要关注:
“我到底想表达什么?”
这次博客、GitHub README、以后写项目文档,都可以用到 Markdown。
📸 Markdown 编辑器截图
下面是我在博客园使用 Markdown 编辑器的截图:

截图中可以看到,编辑器已经选择:
编辑器:Markdown
这一关:
✅ 通关!
🤖 第三关:进入 AI 世界——Hugging Face
前两关还算比较平静。
真正的冒险,从这里开始。
因为第三关的任务是:
让自己的程序真正调用 AI 模型。
这时候我接触到了:
Hugging Face。
🎟️ 第一件事:拿到 API Token
要让程序调用 Hugging Face,就需要身份凭证。
于是我创建了 Access Token。

但是这里有一个非常重要的安全问题:
API Token 不能直接写进公开代码。
所以我把 Token 放在:
.env
里面。
项目结构:
NovaSoftwareAdventure/
│
├── .env
├── .gitignore
├── app.py
│
└── templates/
└── index.html
.gitignore:
.venv/
.env
__pycache__/
*.pyc
这样可以避免把自己的 Token 一不小心传到 GitHub。
🧩 第二件事:找到指定模型
本次作业要求使用:
XLabs-AI/flux-RealismLora

这是一个偏写实风格的图像生成模型。
我的目标也很明确:
不要一眼看起来像 AI 图,而是尽量像一张真实相机拍出来的照片。
第三关:
🔓 AI地图解锁!
🖼️ 第四关:召唤 AI 图片——先让它“听懂我”
模型有了。
API 也有了。
那么问题来了:
我要让 AI 生成什么?
我最后选择的主题是:
🍂 秋日下午的公园散步
原因很简单。
我觉得“公园散步”虽然普通,但是特别适合测试真实感。
因为画面里会出现:
- 人物;
- 衣服;
- 树木;
- 落叶;
- 阳光;
- 地面;
- 背景行人;
- 阴影;
- 景深。
这些东西如果处理不好,就很容易出现明显的 AI 感。
所以,我决定:
一点一点调 Prompt。
🧪 第五关:Prompt 炼金术——三次实验
这一关可以说是整个项目最有意思的部分。
因为我第一次真正意识到:
你怎么描述,AI 就会怎么理解。
🧪 实验一:先告诉 AI “我要什么”
第一版 Prompt:
Young Chinese adult, strolling leisurely in the park, relaxed walking posture, loose casual daily clothes, City public park on a sunny day, tree-lined walking path, Fallen leaves on the ground, dappled tree shadows, distant pedestrians blurred in background, Soft dappled sunlight filtering through tree canopy, gentle natural shadow, Natural skin texture, soft fabric wrinkles, realistic leaf and grass texture, subtle fine film grain, 8K, shot on DSLR, 50mm f/1.8 lens, moderate depth of field, Candid documentary photograph, lifelike natural colors, unretouched real-life snapshot

这一版的重点是:
先把场景说清楚。
人物是谁?
在哪里?
天气怎么样?
周围有什么?
照片是什么风格?
🧪 实验二:我要它“更像照片”
第二版继续强化:
- 自然光;
- 皮肤纹理;
- 衣服褶皱;
- 树叶;
- 草地;
- 景深;
- DSLR;
- 胶片颗粒。
因为我发现:
“一个人在公园散步”只能告诉 AI 故事。
而:
“自然皮肤纹理、真实布料褶皱、自然光影、摄影景深”
是在告诉 AI:
“我要的是照片,不是插画。”
🧪 实验三:把细节全部补齐
最后,我把人物、衣服、动作、机位都进一步明确。
最终版本:
A candid photo of a young Chinese man in his early 20s walking casually down a tree-lined path in a city park on a sunny autumn afternoon. He wears a loose light gray cotton t-shirt, beige chinos and carries a gray-green canvas backpack, looking relaxed with a natural unposed stride, shot from behind at a three-quarter angle. Tall plane trees with yellowing leaves line both sides of the path, fallen leaves scattered on the ground, soft dappled sunlight and tree shadows falling across the pavement, a few blurred pedestrians in the mid-distance. Natural skin texture, realistic fabric wrinkles, gentle warm sunlight, moderate depth of field, photorealistic, lifelike natural colors.

这一版终于开始有一种:
“摄影师拿着相机出去拍照”的感觉。
🔬 三次实验对比
| 版本 | 我主要修改了什么 | 我的目的 |
|---|---|---|
| V1 | 人物、地点、天气、环境 | 先建立场景 |
| V2 | 光线、皮肤、衣服、纹理 | 增强真实感 |
| V3 | 人物、服装、姿势、机位、环境 | 减少随机性 |
这三次修改让我真正体会到:
Prompt 不是单纯“写得越长越好”,而是要写得准确。
第五关:
🧪 Prompt 炼金成功!
💻 第六关:把 AI 搬进自己的网页
如果到这里就结束,那其实只是:
“我会使用 AI。”
但是这次作业真正让我感兴趣的是:
我能不能让自己的程序调用 AI?
所以我决定:
自己做一个网页。
🏗️ 我的技术组合
这次项目主要使用:
Python
+
Flask
+
HTML
+
CSS
+
JavaScript
+
Hugging Face API
整个系统的工作流程是:
👤 用户
│
↓
输入 Prompt
│
↓
🌐 前端页面
│
↓
JavaScript 请求
│
↓
🐍 Flask 后端
│
↓
🤗 Hugging Face API
│
↓
XLabs-AI/flux-RealismLora
│
↓
🖼️ 生成图片
│
↓
返回 Base64
│
↓
🌐 前端显示
这时候,我终于感觉:
不是我在打开 AI,而是我自己的程序在使用 AI。
🐍 第七关:后端代码——让程序和 AI 聊起来
核心代码如下:
import os
import base64
from io import BytesIO
from flask import Flask, render_template, request, jsonify
from dotenv import load_dotenv
from huggingface_hub import InferenceClient
load_dotenv()
HF_TOKEN = os.environ.get("HF_TOKEN")
if not HF_TOKEN:
raise RuntimeError(
"没有找到 HF_TOKEN,请检查项目根目录下的 .env 文件。"
)
app = Flask(__name__)
client = InferenceClient(
provider="fal-ai",
api_key=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()
if not data:
return jsonify({
"success": False,
"message": "没有接收到请求数据。"
}), 400
prompt = data.get("prompt", "").strip()
if not prompt:
return jsonify({
"success": False,
"message": "Prompt 不能为空。"
}), 400
print("=" * 60)
print("开始调用 Hugging Face API")
print(f"模型:{MODEL_ID}")
print("正在生成图片,请稍候...")
print("=" * 60)
image = client.text_to_image(
prompt=prompt,
model=MODEL_ID
)
image_buffer = BytesIO()
image.save(
image_buffer,
format="PNG"
)
image_base64 = base64.b64encode(
image_buffer.getvalue()
).decode("utf-8")
print("图片生成成功!")
return jsonify({
"success": True,
"image": f"data:image/png;base64,{image_base64}",
"model": MODEL_ID
})
except Exception as e:
print("=" * 60)
print("图片生成失败")
print(f"错误类型:{type(e).__name__}")
print(f"错误信息:{str(e)}")
print("=" * 60)
return jsonify({
"success": False,
"message": str(e)
}), 500
if __name__ == "__main__":
print("=" * 60)
print("Nova Software Adventure")
print("Hugging Face Image Generation System")
print("=" * 60)
print(f"模型:{MODEL_ID}")
print("地址:http://127.0.0.1:5002")
print("=" * 60)
app.run(
host="0.0.0.0",
port=5002,
debug=True
)
🔍 代码到底在干什么?
第一次看到这些代码的时候可能会觉得:
“好多东西。”
其实拆开以后并没有那么复杂。
第一步:找到 Token
HF_TOKEN = os.environ.get("HF_TOKEN")
从 .env 中拿到 Token。
第二步:连接 Hugging Face
client = InferenceClient(
provider="fal-ai",
api_key=HF_TOKEN
)
相当于告诉程序:
“我要连接 Hugging Face。”
第三步:接收用户 Prompt
prompt = data.get("prompt", "").strip()
网页上输入什么,就把什么交给后端。
第四步:真正调用 AI
image = client.text_to_image(
prompt=prompt,
model=MODEL_ID
)
这一句就是整个项目的核心。
翻译成人话:
“你好 AI,请根据这个 Prompt,用这个模型给我生成一张图片。”
第五步:把图片送回网页
程序把图片转成 Base64:
image_base64 = base64.b64encode(
image_buffer.getvalue()
).decode("utf-8")
然后返回给前端。
于是:
AI 生成的图片终于从后端跑到了网页上。
🌐 第八关:前端启动——网页终于活了
启动 Flask 后,我在浏览器中打开:
http://127.0.0.1:5002
页面主要分成两个部分
用户不需要再打开 Python 文件修改代码。
只需要:
输入自己的图片需求 → 点击生成。
📸 前端运行截图

👑 Boss战:程序突然告诉我——402!
以为终于通关了吗?
没有。
真正的 Boss 在这里。
💥 Boss:402 Payment Required
在后续再次调用 Hugging Face API 时,我遇到了:
402 Payment Required
然后继续往下看:
You have depleted your monthly included credits.
一开始看到这个报错,我的第一反应也是:
“是不是代码又写错了?”
但是仔细看错误信息以后,我发现:
不是。
🔎 Boss战第一阶段:寻找真正的敌人
我开始拆问题:
代码?
↓
Token?
↓
API?
↓
模型?
↓
账户额度?
最后发现:
当前 Hugging Face Inference Provider 的免费额度已经使用完。
也就是说,请求实际上已经走到了服务端,只是当前账户没有足够的可用额度继续生成。
所以这个错误不是:
❌ Prompt 写错
也不是:
❌ Flask 写错
更不是:
❌ Python 语法错误
而是:
账户当前可用额度不足。
🧠 Boss战第二阶段:我学会了看错误信息
这次经历让我意识到一个以前很容易忽略的问题:
Debug 不是看到报错就开始乱改代码。
比如:
| 状态码 | 可以优先考虑 |
|---|---|
| 400 | 请求参数 |
| 401 | 身份认证 |
| 403 | 权限 |
| 404 | 地址 / 资源 |
| 402 | 额度 / 付费 |
| 429 | 请求过于频繁 |
| 500 | 服务端 / 程序异常 |
以前看到错误,我可能会:
“改这里试试。”
“再改那里试试。”
现在我开始学着:
先看错误属于哪一层,再决定改什么。
这可能是这次作业给我的一个非常重要的收获。
🏆 Boss战第三阶段:诚实记录失败
实际开发就是这样:
成功
↓
修改
↓
再次测试
↓
报错
↓
分析
↓
解决
真正的软件工程项目里,不可能每一步都顺利。
所以我认为:
能够把失败记录下来,并且说明为什么失败,也是一种软件工程实践。
📸 API 调用成功记录
在前期测试过程中,我曾经成功完成过模型调用。

🖼️ 最终成果展示

我希望它看起来像:
一个普通的秋日下午,有人拿着相机经过公园,随手记录下的一瞬间。
而不是:
“这是 AI 生成的艺术作品。”
这也是我为什么一直在调整 Prompt 的原因。
🧩 隐藏任务:AI 还能帮我学习什么?
做到这里,我发现:
AI 不只是这次作业的“主角”,也可以成为我的学习助手。
所以我使用 ChatGPT 帮自己整理了一份软件工程学习路线。
🤖 AI 给我的学习地图
软件工程基础
↓
需求分析
↓
软件设计
↓
Git / GitHub
↓
前后端开发
↓
API 调用
↓
测试
↓
Debug
↓
项目实践
↓
文档与总结
我觉得这个路线比较符合我现在的状态。
因为我现在已经有一定编程基础,但比较缺少:
完整项目开发经验。
以前更多是:
学语法
↓
写小题
↓
完成作业
以后我希望慢慢变成:
发现需求
↓
分析问题
↓
设计方案
↓
写代码
↓
测试
↓
Debug
↓
部署
↓
总结
🧠 我的 AI 使用原则
不过我也发现:
AI 给的答案不能直接全部照搬。
比如这次 Flask 项目,如果我只是让 AI:
“给我一份可以运行的代码。”
然后复制粘贴。
那我可能确实很快就能得到程序。
但是如果我不知道:
client.text_to_image()
是什么意思,
也不知道:
前端
↓
Flask
↓
API
↓
模型
↓
图片
是怎么连起来的,
那其实我只是:
复制了一份代码。
所以我现在更希望采用:
自己分析
↓
AI辅助
↓
理解代码
↓
自己运行
↓
自己Debug
↓
总结经验
而不是:
复制
↓
运行
↓
不知道为什么
🎯 隐藏任务:看看自己的“角色面板”
完成这次作业以后,我也重新看了一下自己的能力。
🟢 已经点亮的技能
- Python 基础
- Java 基础
- C / C++ 基础
- Git / GitHub 基础
- HTML / CSS / JavaScript 基础
- Flask 基础
- API 调用
- Hugging Face 基础
- Prompt 设计
- 基础 Debug
🔴 还没有点亮的技能
- 高级 Python / Java
- 复杂项目开发
- 完整系统设计
- 大型项目独立开发
- 高效 Debug
- 软件测试体系
- 项目部署
- 英文技术文档阅读
所以目前我的状态应该是:
🎮 Nova
等级:软件工程新手
│
┌─────────┼─────────┐
↓ ↓ ↓
编程基础 AI应用 项目实践
★★★ ★★☆ ★★☆
│
↓
下一阶段目标
│
↓
🚀 独立完成项目
📊 当前代码量估算:
- 此前所有课程和项目累积约 3000~4000 行有效代码(Python/Java/C 混合)
- 本学期结束后目标:总代码量达到 10000 行,并独立完成一个完整 Web + AI 项目
🎯 本学期最期待学习的内容:
- 软件工程中的需求分析与系统设计方法
- 团队协作与版本控制规范
- 自动化测试与持续集成
- 如何将 AI 模型真正工程化部署
🗺️ 下一张地图:未来三年
这次冒险不会只有这一关。
🧑💻 大三
关键词:
打基础 + 做项目 + 准备升学
计划:
- 学好专业核心课程;
- 提高 Python / Java 能力;
- 学习数据结构与算法;
- 学习数据库;
- 学习软件工程;
- 继续探索 AI 和大数据;
- 积累项目经验;
- 完善 GitHub;
- 为研究生考试做准备。
🎓 大四
关键词:
升学 + 总结
主要任务:
- 准备研究生考试;
- 系统复习专业知识;
- 整理本科项目;
- 完善个人技术作品集;
- 明确未来研究方向。
🚀 研究生阶段
希望继续深入:
- 人工智能;
- 大数据;
- 数据挖掘;
- 机器学习;
- 深度学习;
- AI 工程化;
- 科研与工程实践。
最终希望从:
“会写代码的人”
变成:
“能够发现问题、分析问题、设计方案并完成项目的人”。
🏁 最终关:回到起点,再看这次冒险
如果把这次作业重新看一遍,会发现它其实没有想象中那么复杂。
最开始:
GitHub
Markdown
Hugging Face
API
Flask
Prompt
这些东西看起来各自独立。
但是做完以后,我发现它们其实可以串成一条线:
GitHub
↓
项目
↓
Python
↓
Flask
↓
API
↓
AI模型
↓
Prompt
↓
图片
↓
Debug
↓
博客记录
而这条线,就是我这次真正走过的软件工程实践。
💡 通关心得:我真正学到的不是“怎么生成图片”
如果一定要说这次作业最大的收获,我觉得不是最后生成的那张图片。
而是三个变化。
第一,我开始知道“项目”是什么
以前写代码更多是:
给我一道题 → 我写代码 → 输出答案。
现在开始慢慢变成:
有一个需求 → 我设计一个解决方案 → 再把它实现出来。
第二,我开始学会 Debug
以前看到错误容易慌。
现在至少知道:
先看错误信息,再判断问题在哪一层。
这虽然只是一个很小的变化,但是我觉得非常重要。
第三,我开始理解 AI 应该怎么用
AI 可以:
- 帮我查资料;
- 帮我解释代码;
- 帮我整理思路;
- 帮我发现问题;
- 帮我提供方案。
但是:
真正理解代码的人,必须是我自己。
🎉 通关!
╔══════════════════════════════════════╗
║ ║
║ 🎮 NOVA SOFTWARE ADVENTURE ║
║ ║
║ 🏆 第一章通关 ║
║ ║
║ GitHub ✅ ║
║ Markdown ✅ ║
║ Hugging Face ✅ ║
║ Prompt ✅ ║
║ Flask ✅ ║
║ API ✅ ║
║ Debug ✅ ║
║ ║
║ EXP +1 SOFTWARE ENGINEER ║
║ ║
╚══════════════════════════════════════╝
这次作业让我第一次比较完整地经历了:
从一个想法,到一个能够运行的小型 AI 应用。
它还远远称不上一个复杂的软件项目,我自己的能力也还有很多不足。
但至少我已经开始知道:
代码不是终点。
真正的软件工程,是把:
想法 → 需求 → 设计 → 代码 → 测试 → Debug → 文档
一步一步变成真正能够运行的东西。
🎒 冒险日志:项目技术清单
| 技术 / 工具 | 本次用途 |
|---|---|
| Python | 后端开发 |
| Flask | Web 后端 |
| HTML | 页面结构 |
| CSS | 页面样式 |
| JavaScript | 前端交互 |
| Hugging Face | AI 模型服务 |
| Inference API | 模型调用 |
XLabs-AI/flux-RealismLora |
写实图像生成 |
| Git | 版本控制 |
| GitHub | 代码与个人主页 |
| Markdown | 博客与 README |
| ChatGPT | AI 辅助学习 |
📦 项目背包
NovaSoftwareAdventure/
│
├── .env
│ └── HF_TOKEN
│
├── .gitignore
│
├── app.py
│ └── Flask + Hugging Face API
│
└── templates/
└── index.html
└── 前端页面
🔐 安全提示
本项目使用 Hugging Face API Token。
Token 没有直接写入 Python 源代码,而是放在:
.env
并且:
.env
已经加入:
.gitignore
因此博客和 GitHub 中不会公开真实 Token。
🌌 写在冒险最后
如果说以前的我是在学习:
“怎么写代码。”
那么这次作业让我开始学习:
“怎么把代码变成一个真正的东西。”
这可能就是我第一次接触软件工程真正有意思的地方。
而这只是第一关。
下一张地图,加载中……
Nova's Software Engineering AdventureTo be continued. 🚀


浙公网安备 33010602011771号