软件工程第一次作业

软件工程课程开篇随笔:自我梳理与学习展望

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16716
这个作业的目标 完成 HuggingFace API 调用实践、GitHub 个人主页搭建,梳理个人技能树与课程学习规划,熟悉博客园 Markdown 写作规范
学号 102401635

一、HuggingFace API 调用实践

本次调用的模型为 XLabs-AI/flux-RealismLora,这是基于 Flux 模型微调的真实感图像生成 LoRA 模型,擅长生成贴近真实世界光影与质感的高清图像。

1.1 API 密钥获取

在 Hugging Face 官网注册账号后,进入 Settings → Access Tokens 页面,创建一个具有 Read 权限的 API Token,命名为 flask-api,用于后续后端代码中的鉴权调用。

HuggingFace Access Tokens

1.2 目标模型确认

在 Hugging Face 模型库中搜索并确认目标模型 XLabs-AI/flux-RealismLora,该模型基于 FLUX.1-dev 微调,专注于照片级真实感图像生成,支持 Text-to-Image 推理调用。

flux-RealismLora 模型页面

1.3 前后端实现代码

后端接口(Python + Flask)

使用 Flask 搭建轻量后端,封装 Hugging Face Inference API 调用逻辑,接收前端传来的提示词,调用模型生成图像并以 base64 格式返回。

from flask import Flask, request, jsonify
from huggingface_hub import InferenceClient
import base64
import io
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

# 替换为自己的 HuggingFace API Token
HF_TOKEN = "hf_xxxxxxxxxxxxxxxxxxxxxxxx"
MODEL_ID = "XLabs-AI/flux-RealismLora"

client = InferenceClient(token=HF_TOKEN)

def generate_image(prompt):
    try:
        image = client.text_to_image(
            prompt,
            model=MODEL_ID
        )
        buf = io.BytesIO()
        image.save(buf, format="PNG")
        img_b64 = base64.b64encode(buf.getvalue()).decode("utf-8")
        return {"code": 200, "image": img_b64}
    except Exception as e:
        return {"code": 500, "msg": str(e)}

@app.route("/api/generate", methods=["POST"])
def api_generate():
    body = request.get_json()
    prompt = body.get("prompt", "").strip()
    if not prompt:
        return jsonify({"code": 400, "msg": "提示词不能为空"})
    return jsonify(generate_image(prompt))

if __name__ == "__main__":
    print("后端服务已启动: http://127.0.0.1:5000")
    app.run(host="127.0.0.1", port=5000, debug=True)

前端交互页面(HTML + JS)

单页交互界面,包含提示词输入框、生成按钮和图像展示区域,支持用户输入自定义提示词并触发生成。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>HuggingFace Flux 图像生成演示</title>
    <style>
        body { font-family: sans-serif; background: #f5f5f5; padding: 40px; }
        .container { max-width: 800px; margin: 0 auto; background: #fff;
                     border-radius: 12px; padding: 40px; box-shadow: 0 2px 12px rgba(0,0,0,0.08); }
        h1 { text-align: center; margin-bottom: 30px; }
        textarea { width: 100%; min-height: 100px; padding: 12px; border: 1px solid #ddd;
                   border-radius: 8px; font-size: 14px; margin-bottom: 20px; }
        button { width: 100%; padding: 14px; background: #4a90d9; color: #fff;
                 border: none; border-radius: 8px; font-size: 16px; cursor: pointer; }
        button:hover { background: #357abd; }
        .result { margin-top: 30px; }
        .result img { width: 100%; border-radius: 8px; }
    </style>
</head>
<body>
    <div class="container">
        <h1>HuggingFace Flux 图像生成演示</h1>
        <textarea id="prompt" placeholder="请输入提示词...">photorealistic portrait of a young woman with freckles, soft window light, shallow depth of field, 8k, ultra detailed, cinematic lighting</textarea>
        <button onclick="generate()">生成图像</button>
        <div class="result">
            <h2>生成结果</h2>
            <img id="resultImg" style="display:none;">
        </div>
    </div>
    <script>
        async function generate() {
            const prompt = document.getElementById('prompt').value.trim();
            if (!prompt) { alert('请输入提示词'); return; }
            const res = await fetch('http://127.0.0.1:5000/api/generate', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ prompt })
            });
            const data = await res.json();
            if (data.code === 200) {
                const img = document.getElementById('resultImg');
                img.src = 'data:image/png;base64,' + data.image;
                img.style.display = 'block';
            } else {
                alert('生成失败: ' + data.msg);
            }
        }
    </script>
</body>
</html>

启动后端服务后,在浏览器中打开前端页面,输入提示词点击生成,即可调用 Flux 模型生成图像。

前端交互页面

1.4 调用结果与提示词优化过程

提示词设计思路

目标是生成贴近真实世界的图像,因此提示词围绕「具体主体 + 光影质感 + 画质参数」三个维度构建,明确场景主体、环境氛围、画质要求,避免模糊笼统的描述。

  • 初始提示词: a cute rabbit sitting on the floor

    问题:场景过于简单,生成的图像偏卡通风格,真实感不足,毛发纹理和光影细节缺失。

    初始生成效果(卡通兔子)

  • 优化后提示词: photorealistic portrait of a young woman with freckles, soft natural window light, shallow depth of field, 8k resolution, ultra detailed skin texture, cinematic lighting, film grain

    补充了主体细节、光影条件、画质与质感描述,大幅提升画面真实度与氛围感。

    优化后生成效果(真实感人像)

此外,还尝试了校园场景的生成,提示词为 cinematic shot of a young asian male student walking on autumn campus path, golden hour, backpack, falling leaves, photorealistic, 8k,画面呈现出秋天校园街道的电影感氛围。

校园场景生成效果

调用效果

后端控制台成功返回 200 状态码,前端页面正常加载生成的图像,画面呈现出真实的光影质感,皮肤纹理、环境光的细节都较为自然,符合真实世界的视觉效果。

1.5 调用步骤总结

  1. 在 Hugging Face 官网注册账号并创建访问令牌,获取 API 密钥。
  2. 确认目标模型 XLabs-AI/flux-RealismLora 支持 Inference API 调用。
  3. 编写 Python 后端,封装 API 请求逻辑,提供 HTTP 接口给前端调用。
  4. 编写前端页面,实现提示词输入、生成交互与结果展示。
  5. 启动后端服务,打开前端页面,输入提示词测试生成效果,优化提示词直至达到预期。

1.6 体验与心得

通过本次 API 调用实践,熟悉了 Hugging Face 模型推理 API 的调用规范与鉴权方式,也体会到了 AI 生成模型中提示词工程的重要性——精准的场景与细节描述是输出高质量结果的关键。同时,前后端分离的简单交互实现,也让我对"模型能力封装为接口、前端负责交互"的开发模式有了更直观的理解。过程中遇到了模型排队加载、请求超时的情况,了解到了公有推理 API 的资源限制特性,后续如果需要稳定生成,可以考虑本地部署模型或者使用付费推理端点。


二、GitHub 个人主页搭建

本次选择方案一:创建个人资料自述文件,搭建 GitHub 个人主页。新建一个与 GitHub ID 同名的仓库 kwndl108,在仓库根目录的 README.md 中撰写个人介绍、技能评估、兴趣方向与未来规划。

个人主页包含以下内容:

  • 自我介绍:福州大学计算机科学技术专业学生,兴趣爱好踢足球,在校认真完成各学期课程学习与实验作业。
  • 专业能力与自我评估:已掌握 C/C++ 编程、计算机基础理论、Git/GitHub 基础操作,能够独立完成课程实验。
  • 研究兴趣方向:希望深耕 C++ 方向,学习底层开发相关知识。
  • 未来三年发展规划:【如 README 中有则保留,如没有请补充一段】
  • 联系方式:GitHub、博客园链接。

GitHub 个人主页


三、技能树梳理与课程学习展望

3.1 技能树与技术偏好、自我评估

已具备的专业知识与能力

  1. C/C++ 编程能力:可以完成基础代码编写、调试,理解面向对象基础思想,能够完成课程实验、课后作业代码编写。
  2. 计算机基础理论:掌握计算机组成原理、操作系统等计算机专业基础课程概念。
  3. 版本控制工具:熟悉 Git、GitHub 基础操作,能够完成仓库创建、提交版本等基础版本控制工作。
  4. 课程实践能力:可以独立完成学校各学期布置的课程实验与课程作业,能按照要求完成课内编程任务。

感兴趣的技术方向

希望深耕 C++ 方向,学习底层开发相关知识。

目前欠缺的能力

  1. 缺少真实项目实战经验,没有独立完成完整的个人项目,代码大多局限于课内实验。
  2. 工程化开发能力不足,不熟悉大型项目的编码规范、项目架构设计。
  3. 对软件工程完整流程(需求分析、项目设计、测试、版本迭代)理解比较浅显。
  4. 技术知识面广度不足,很多知识点停留在课本理论,缺少落地实践。

3.2 代码量统计与规划

  1. 截至目前代码量:代码主要来自校内课程实验、课程作业,累计代码量约 2000 行左右,以 C/C++ 练习代码为主。
  2. 完成本学期课程后期望达到的代码量:希望本学期结束累计代码量达到 5000 行以上。除课内作业外,额外做小型练习项目,持续写代码积累实战经验。

3.3 本课程最期待学习的知识与收获

期待学习的知识

  1. 软件工程完整开发流程:需求分析、概要设计、详细设计、软件测试、项目迭代维护。
  2. 规范的工程化编码习惯、项目文档编写方法。
  3. 团队协作开发模式,如何使用工具完成多人协同开发。
  4. 软件项目管理、版本管理的实战方法。

希望获得的收获

  1. 摆脱单纯写练习题的思维,学会从工程角度思考软件项目。
  2. 掌握完整项目开发的思路,可以独立完成小型完整项目。
  3. 学会写规范的项目文档,提升团队协作能力。
  4. 补齐工程开发短板,为后续实习、求职打下基础。

3.4 AI 生成学习指南与分析

本次选择 AI 工具生成软件工程课程学习指南,内容如下:


软件工程课程入门学习指南

一、课程学习核心目标

软件工程不是单纯写代码,核心是学习如何高质量、可维护、可协作地开发软件。学习重点是流程、规范、文档、团队协作,而不只是语法。

二、分阶段学习计划

阶段1:理论基础(前半学期)

  1. 掌握软件生命周期:可行性分析、需求分析、概要设计、详细设计、编码、测试、维护。
  2. 理解常见开发模型:瀑布模型、敏捷开发、Scrum。
  3. 重点练习:需求文档、UML图、概要设计文档的阅读与编写。

阶段2:实践工具与工程规范(中期)

  1. 熟练 Git 版本控制,掌握分支、合并、提交规范。
  2. 学习编码规范,命名、注释、代码结构,避免"能跑就行"的坏习惯。
  3. 学习软件测试基础:单元测试、黑盒测试、白盒测试概念。

阶段3:项目实战(后半学期)

  1. 尽量参与小组项目,体验团队分工。
  2. 完整走完一个小型项目:写需求→做设计→编码→测试→写文档。
  3. 复盘项目遇到的问题,总结经验。

三、学习建议

  1. 不要只背概念,理论一定要结合小项目练习。
  2. 重视文档,软件工程中文档和代码同等重要。
  3. 多阅读优秀开源项目的结构,学习别人的工程化思路。
  4. 遇到问题优先思考工程层面,不只是调试代码bug。

对这份学习指南的分析

合理之处

  1. 指南抓住软件工程课程核心:软件工程重点是流程、文档、协作,不是单纯写代码,纠正很多同学只看重编码的误区。
  2. 划分学习阶段,从理论→工具→实战,学习路径逻辑通顺,贴合大学软件工程课程教学节奏。
  3. 重点强调 Git、文档、小组项目,正好对应我们课程的作业与实践要求,对课程学习有指导意义。

不足

  1. 这份指南偏向通用理论,缺少针对 C++ 方向的实践建议,没有结合我个人的技术栈。
  2. 缺少学习资源、练习小项目的具体例子,比较宏观。

对我个人的帮助

这份指南可以当作我的学习大纲。我会参考这份指南,在课程学习中重点重视文档编写、项目流程,同时结合我自己 C++ 的技术方向做实践。对于里面提到的不足,我会自己补充小型练习项目,把理论落地到代码实践中。


四、作业说明

本次作业全程使用 Markdown 格式编写,已将博客园编辑器切换为 Markdown 编辑器模式,提交时附上后台编辑页面截图。后续每次作业都会严格遵循要求,在正文最前置入作业信息表格,统一写作规范。
image

posted @ 2026-09-10 19:04  kwndl  阅读(20)  评论(0)    收藏  举报