CourseDesignTemplate/README.md

725 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Python程序设计课程设计
## 🎯 课程概述
**课程主题**:基于 DeepSeek API + Streamlit 的 AI 应用开发
**课程理念**
> 在 AI 时代代码可以生成Bug 可以修复,文档可以自动撰写——
>
> **但判断什么值得做、为结果负责、理解用户真实需求、在约束中做取舍,这些能力永远属于你。**
本课程通过 AI 代码编辑器(如 Cursor、Windsurf进行 **Vibe Coding**,让学生体验"用自然语言编程"的全新开发方式。但更重要的是,在这个过程中**思考人与 AI 的协作边界**,培养 AI 时代真正不可替代的能力。
**技术栈**
- 🐍 **Python 3.14+** (2026 Stable)
-**uv** (极速 Python 项目管理)
- 🤖 **DeepSeek API** + **PydanticAI** (Agent 框架)
- 🎨 **Streamlit** (Data Apps) / **Chainlit** (Chatbots)
- 🛠️ **Cursor / Windsurf** (AI 代码编辑器)
---
## 📅 课程安排
| 日期 | 内容 | 形式 |
|:---:|:---:|:---:|
| **第1天** | 课程讲解与演示 | 教师授课 |
| **第2天** | 自主开发 | 学生自学 |
| **第3天** | 中期答疑 | 集中答疑 |
| **第4天** | 自主开发 | 学生自学 |
| **第5天** | 项目展示与评审 | 成果展示 |
---
## 🛠️ 第0天环境预备 (Day 0)
> [!IMPORTANT]
> **请在正式上课前完成以下准备**。这能让你在第一天直接进入"Vibe Coding"状态,而不是卡在安装软件上。
### 1. 软件安装清单
- **Code Editor**: 推荐 [Cursor](https://cursor.com) (自带 AI) 或 VS Code + Windsurf 插件, [TRAE CN](https://www.trae.cn)。
- **Python 3.14+**: 访问 [python.org](https://www.python.org/downloads/) 下载。
- **uv**: 极速 Python 包管理器 (比 pip 快 10-100 倍)。
- Mac/Linux: `curl -LsSf https://astral.sh/uv/install.sh | sh`
- Windows: `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"`
### 2. 验证环境
在终端 (Terminal) 输入以下命令,看到版本号即成功:
```bash
python --version # 应显示 Python 3.14.x
uv --version # 应显示 uv 0.x.x
```
---
## 📚 第1天课程讲解与演示3学时
### 1.1 课程导入30分钟
#### 什么是 Vibe Coding
- **定义**:一种"以人为本、AI 为器"的编程范式。开发者专注于**意图描述**和**结果验收**,而将代码实现、调试细节交由 AI 辅助完成。
- **核心逻辑**"描述你想要什么,而不是告诉计算机怎么做"。
- **演示**:用自然语言在 3 分钟内创建一个完整应用。
#### 为什么要学 Python 基础?(The "Why" in AI Era)
很多同学会问:*"既然 AI 能写代码,我为什么还要学基础语法?"*
> **即使是法拉利,也需要懂驾驶原理的赛车手。**
在 Vibe Coding 中,你需要具备**两种核心能力**才能驾驭 AI
1. **准确描述 (Prompting)**: 你需要懂一点术语 (如 "List", "Loop", "Function") 才能精准指挥 AI。
2. **验证结果 (Auditing)**: AI 会犯错 (幻觉)。你需要能读懂代码,判断它是不是在"一本正经地胡说八道"。
**重点掌握:**
* **0-Based Indexing**: 为什么计算机从 0 开始数数?(因为偏移量的概念)。
* **逻辑控制**: `if`, `for`, `while` 是所有程序的骨架。
* **函数思维**: 把大问题拆解成小模块 (Input -> Process -> Output)。
#### AI 时代,什么能力真正属于你?
> **AI 能做的事越来越多:** 语法查询、代码生成、Bug 修复、文档撰写、测试创建、架构建议、代码重构...
>
> **但这些能力永远属于你:**
> - 🎯 **判断什么值得做** —— 选题的眼光和价值判断
> - 📋 **为结果负责** —— 代码能跑不等于问题解决
> - 👥 **理解真实需求** —— 用户要的不是功能,是解决方案
> - ⚖️ **在约束中取舍** —— 时间、资源、技术的平衡
> - 🤝 **与人协作** —— 包括与 AI 协作
本课程不只是教你用 AI 写代码,更是让你**体验和思考这些不可替代的能力**。
#### AI 代码编辑器介绍
- **Cursor**[https://cursor.com](https://cursor.com)
- **Windsurf**[https://codeium.com/windsurf](https://codeium.com/windsurf)
- **TRAE CN**[https://www.trae.cn](https://www.trae.cn)
- **核心模式**
- **Approve/Reject**:人是最终的决策者。
- **Context Awareness**:如何让 AI "看见"你的整个项目。
### 1.2 Vibe Coding 快速上手:新手四步法 (The 4-Step Loop)
对于 0 基础的新手,不要试图一次性写出完美代码。请遵循 **"D-P-R-I"** 循环:
1. **Define (定义)**:用一句话说清楚你要做什么。
**"写个程序"*
**"写一个倒计时器,要有开始/暂停按钮,时间到了会弹窗提示"*
2. **Prompt (提示)**:扮演产品经理,给 AI 下指令。
* **公式**`角色 + 任务 + 限制条件`
* *例:"你是一个 Python 专家。请用 Streamlit 写一个 番茄钟应用。要求:界面简洁,背景是黑色,使用 Session State 记录时间。"*
3. **Review (审查)**AI 写完后,不要盲目运行。
* **一眼定真**:代码里有没有显然的红色波浪线 (报错)
* **结构检查**:有没有 `import`?有没有主函数?
4. **Iterate (迭代)**:运行 -> 报错 -> 把报错扔给 AI。
* *"Vibe Coding 的精髓不在于一次写对,而在于快速试错。"*
* **黄金法则**:如果 AI 连续改 3 次还没修好,**停下来**!这通常意味着你的 Prompt 逻辑有问题,或者方向错了。
### 1.3 技术栈讲解60分钟
#### ⚡ 2026 现代 Python 工作流 (uv)
我们将告别繁琐的 `pip` 和虚拟环境配置,使用 Rust 编写的 **uv** 作为唯一工具。
**核心三步走 (The 3-Step Vibe)**:
1. **初始化 (Init)**: 创建一个干净的"代码工作台"。
```bash
uv init my-ai-app
cd my-ai-app
```
2. **添加工具 (Add)**: 就像给手机装 App 一样简单。
```bash
uv add streamlit chainlit openai python-dotenv
```
3. **运行 (Run)**: 一键启动,无需担心环境冲突。
```bash
uv run main.py
```
### 1.3.0 核心概念补课: DeepSeek 与 API
#### 🦄 什么是 DeepSeek?
DeepSeek 是 2026 年最耀眼的 **开源 AI 模型**
* **代码天才**: 它的 Coding 能力在 2026 年稳居第一梯队,甚至超过了许多闭源模型。
* **性价比之王**: API 价格极低(几乎是免费的),非常适合学生党和初创项目。
* **开源精神**: "Open Weights" 让它成为全球开发者的宠儿。
#### 🔌 什么是 API (Application Programming Interface)?
想象你在去一家餐厅吃饭:
* **你 (User)**: 想要吃饭(比如"生成一段代码")。
* **厨房 (LLM)**: 大厨负责做饭(生成内容),但你不能直接冲进厨房。
* **服务员 (API)**: 你把菜单Prompt给服务员服务员把需求传给厨房再把菜端给你。
**API 就是那个"服务员"**。它让你的 Python 代码能优雅地和远端的 AI 大脑对话。
#### 💡 为什么要用 LLM API
1. **稳定性**: 网页版 ChatGPT 可能会封号、会变慢API 则是为工业级应用设计的,稳定可靠。
2. **可集成 (Embeddable)**: 你不能把网页版 ChatGPT 塞进你的 Excel 里,但 API 可以。你可以把 AI 的"大脑"装进任何 APP、网页或脚本中。
3. **自动化 (Automation)**: 网页版一次问一个问题API 可以写个循环,一分钟处理 1000 个 Excel 表格。
#### DeepSeek API 快速入门 (主流推荐)
DeepSeek API 完全兼容 OpenAI SDK这意味着你可以直接使用最成熟的生态工具。
**方式一:使用 OpenAI SDK (标准用法)**
适合:简单对话、流式输出、不需要强类型约束的场景。
```python
# 1. 安装库
# uv add openai python-dotenv
import os
from openai import OpenAI
# .env 文件像一个保险箱,用来存放 API Key 等敏感信息,防止你把它上传到 GitHub 上被人盗用。
from dotenv import load_dotenv
# 加载当前目录下的 .env 文件内容到环境变量中
load_dotenv()
client = OpenAI(
# 从环境变量中读取 Key更加安全
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
# 非流式调用 (一次性返回)
response = client.chat.completions.create(
model="deepseek-chat", # 或 deepseek-reasoner (R1)
messages=[
# System Role: 给 AI 设定"人设"或"岗位职责",它会始终遵守。
{"role": "system", "content": "你是一个金牌销售,说话极其有煽动性。"},
# User Role: 真实用户的输入。
{"role": "user", "content": "把这支钢笔卖给我。"}
],
# Temperature (温度): 控制 AI 的"创造力"。
# 0.0 = 极其严谨、固定 (像个机器人),适合写代码、数学题。
# 1.0 = 标准创造力 (默认)。
# 1.5+ = 脑洞大开、放飞自我 (可能胡说八道),适合写诗、头脑风暴。
temperature=1.3
)
print(response.choices[0].message.content)
# 流式调用 (像 ChatGPT 打字机效果)
stream = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个诗人。"},
{"role": "user", "content": "写一首关于Python的十四行诗"}
],
temperature=1.3,
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
```
**方式二:使用 PydanticAI (进阶 Agent 开发)**
适合:需要**结构化输出** (JSON)、工具调用 (Tool Calling)、类型安全保障的现代 Agent 开发。
```python
# 1. 安装库
# uv add pydantic-ai pydantic
import os
from dotenv import load_dotenv
from pydantic import BaseModel, Field
from pydantic_ai import Agent
# 加载环境变量 (确保 .env 文件中有 DEEPSEEK_API_KEY)
load_dotenv()
# 定义你期望的输出结构 (Schema)
class MovieScript(BaseModel):
title: str = Field(description="电影标题")
genre: str = Field(description="流派,如科幻、悬疑")
characters: list[str] = Field(description="主要角色名单")
plot_twist: str = Field(description="意想不到的结局反转")
# 初始化 Agent (2026 最佳实践: 使用 Short-hand 语法)
# PydanticAI 会自动识别 'deepseek:deepseek-chat' 并从环境变量加载 API Key
agent = Agent(
'deepseek:deepseek-chat',
output_type=MovieScript,
system_prompt="你是一个好莱坞金牌编剧,擅长写出人意料的剧本。"
)
# 运行 Agent
result = agent.run_sync('写一个关于程序员穿越到20年前的微电影剧本')
# 直接获取结构化数据 (IDE会有智能提示)
print(f"🎬 标题: {result.output.title}")
print(f"🎭 类型: {result.output.genre}")
print(f"🎭 角色: {result.output.characters}")
print(f"🤯 反转: {result.output.plot_twist}")
```
> [!TIP]
> **为什么要用 PydanticAI**
> 相比手动解析 JSON 字符串PydanticAI 能自动处理重试、验证错误,并给你完美的 IDE 代码提示 (Autocomplete)。这是开发复杂 AI 应用的终极武器。
#### Streamlit vs Chainlit
- **Streamlit**: 适合构建 **数据仪表板**、**工具类应用** (如 Excel 处理、图表分析)。
- **Chainlit**: 适合构建 **聊天机器人**、**多轮对话 Agent** (自带优美的聊天界面)。
**Streamlit 示例 (数据应用)**:
```python
import streamlit as st
st.title("数据分析看板")
st.line_chart([1, 5, 2, 6])
```
**Chainlit 示例 (对话应用)**:
```python
import chainlit as cl
@cl.on_message
async def main(message: cl.Message):
# 这里调用 DeepSeek API
await cl.Message(content=f"你说了: {message.content}").send()
```
#### 🌐 Context7: 跨越 AI 的知识断层 (The Documentation Bridge)
在 Vibe Coding 中你可能会遇到这样一个尴尬场景AI 写得头头是道,代码运行却满屏爆红。
**1. LLM 的阿喀琉斯之踵 (The Limitations)**
* **知识截止 (Knowledge Cutoff)**: AI 的记忆停留在训练结束那一刻。它不知道昨天发布的 `PydanticAI 2.0` 有什么新特性,也不知道 `Streamlit` 刚废弃了哪个旧接口。
* **一本正经的胡说 (Hallucination)**: 当 AI 不知道某个库的用法时,它倾向于"猜"一个看起来合理的函数名(例如臆造一个 `st.make_it_beautiful()`),导致代码根本跑不通。
**2. 为什么必须用 Context7 MCP?**
* **实时获取**Context7 是一个直接连接官方文档的管道。它能抓取最新的 API 定义和代码示例。
* **对症下药**:使用 Context7你的 AI 助手可以先"查字典"(阅读最新文档),再"写作文"(生成代码)。
* **2026 开发标配**:对于本课程使用的 `PydanticAI`、`Streamlit` 等更新极快的现代化框架,**不查文档直接写的代码,可用性几乎为零**。
> [!TIP]
> **最佳实践**
> 在 Cursor 中,当你使用较新的库时,请在 Prompt 中显式要求:
> *"使用 Context7 查阅最新的 PydanticAI 文档,然后帮我写..."*
#### 🚀 为什么追求"Using the Edge" (Why Cutting-Edge Matters)
本课程特意选择了 `uv`, `PydanticAI` (2025/2026), `Python 3.14` 等最新技术栈,而非传统的 `pip``LangChain`。这并非为了"赶时髦",而是基于 **AI 时代的生存法则**
1. **为 AI 而生 (AI-Native)**:
* **Old Way**: 旧框架(如 Django是为人写的文档冗长配置复杂。
* **New Way**: 新框架(如 PydanticAI天然支持 Type Hint 和 Schema 生成,这种"强类型"代码是 AI 最容易理解和生成的语言,能显著减少 AI 的幻觉和 Bug。
2. **极速迭代 (Velocity)**:
* **uv** 比 pip 快 100 倍。在 Vibe Coding 中,你的灵感转瞬即逝,工具不应该成为等待的瓶颈。
3. **拥抱变化 (Future-Proofing)**:
* AI 领域一周的更新量等于过去一年。掌握 2026 年的 Best Practices意味着你拥有最先进的生产力工具而不是在学习即将被淘汰的技术。
> **Simple is Better**: 你会发现,最先进的工具往往也是最简单的。没有复杂的 `requirements.txt` 和虚拟环境路径地狱,只有一个 `uv add`。
### 1.4 动手实践:三个"最小可运行"示例 (MVP Hands-on)
接下来的 45 分钟,请跟随老师在你的电脑上运行这三个示例。这是你迈向 Vibe Coding 的第一步。
> [!NOTE]
> **准备工作**
> 确保你已经初始化了项目并填入了 Key
> ```bash
> mkdir day1-demo
> cd day1-demo
> uv init
> uv add openai python-dotenv streamlit chainlit
> # 创建 .env 文件并填入: DEEPSEEK_API_KEY=sk-xxxxxx
> ```
#### 示例 A: Hello AI (CLI 脚本)
**目标**:理解 OpenAI SDK 的最基本调用方式。
**文件**`main.py`
```python
import os
from openai import OpenAI
from dotenv import load_dotenv
# 1. 加载环境变量 (.env)
load_dotenv()
api_key = os.getenv("DEEPSEEK_API_KEY")
if not api_key:
print("❌ 错误:未找到 DEEPSEEK_API_KEY请检查 .env 文件")
exit()
# 2. 初始化客户端
client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")
# 3. 发送请求
print("🤖 AI 正在思考...")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个赛博朋克风格的诗人。"},
{"role": "user", "content": "用两句话描述代码的魅力。"},
],
stream=False
)
# 4. 输出结果
print("\n" + "="*30)
print(response.choices[0].message.content)
print("="*30 + "\n")
```
**运行**
```bash
uv run main.py
```
#### 示例 B: 魔法文案生成器 (Streamlit)
**目标**:不写 HTML/CSS用 Python 5分钟构建可视化的 AI 应用。
**文件**`app_gui.py`
```python
import streamlit as st
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")
# 1. 页面配置
st.set_page_config(page_title="魔法文案生成器", page_icon="✨")
st.title("✨ 魔法文案生成器")
# 2. 左侧侧边栏
with st.sidebar:
st.header("配置")
style = st.selectbox("选择风格", ["文艺风", "幽默风", "硬核科技风", "发疯文学"])
length = st.slider("字数限制", 50, 200, 100)
# 3. 主界面输入
theme = st.text_input("你想写关于什么主题的文案?", placeholder="例如:周五下班、喝咖啡、新发型")
# 4. 按钮与 AI 调用
if st.button("🪄 生成文案"):
if not theme:
st.warning("请先输入主题!")
else:
with st.spinner("AI 正在榨干脑汁..."):
try:
prompt = f"请用{style}写一段关于'{theme}'的朋友圈文案带Emoji{length}字以内。"
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}]
)
result = response.choices[0].message.content
st.success("生成成功!")
st.markdown(f"### 📝 结果:\n{result}")
except Exception as e:
st.error(f"发生错误:{e}")
```
**运行**
```bash
uv run streamlit run app_gui.py
```
#### 示例 C: 会聊天的猫 (Chainlit)
**目标**:构建像 ChatGPT 一样的对话界面,支持流式输出 (Streaming)。
**文件**`app_chat.py`
```python
import chainlit as cl
import os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com")
@cl.on_message
async def main(message: cl.Message):
# 1. 准备消息历史
# (注意:实际项目中需要维护 st.session_state 或 cl.user_session 来保留上下文,这里仅演示单轮回复)
msg_history = [
{"role": "system", "content": "你是一只高冷的猫,说话句尾要带'喵'。"},
{"role": "user", "content": message.content}
]
# 2. 创建回复消息容器
msg = cl.Message(content="")
await msg.send()
# 3. 调用 AI 并流式(stream)接收
stream = client.chat.completions.create(
model="deepseek-chat",
messages=msg_history,
stream=True
)
for chunk in stream:
if token := chunk.choices[0].delta.content:
await msg.stream_token(token)
# 4. 完成更新
await msg.update()
```
**运行**
```bash
uv run chainlit run app_chat.py -w
```
### 1.5 项目要求说明15分钟
#### 项目选题(任选其一或自拟)
| 难度 | 项目名称 | 服务对象/场景 | 解决的真实问题/价值 |
|:---:|:---|:---|:---|
| ⭐⭐ | AI 写作助手 | 学生/自媒体 | 写作与润色提效,输出更顺畅 |
| ⭐⭐ | 智能单词本 | 英语学习者 | 释义+例句,降低背词与造句门槛 |
| ⭐⭐ | AI 任务拆解教练 | 学习/入职 | 把目标拆成可执行步骤与提醒 |
| ⭐⭐⭐ | 会议纪要助手 | 团队会议 | 自动要点/待办提炼,减少遗漏 |
| ⭐⭐⭐ | 代码解释与修复 | 编程学习者 | 逐行讲解+修复建议,缩短排错时间 |
| ⭐⭐⭐ | 产品需求澄清助手 | PM/开发 | 拆解模糊需求→可执行条目 |
| ⭐⭐⭐ | 学习笔记整理 | 学生/职场 | 将笔记结构化,生成概要/测验题 |
| ⭐⭐⭐⭐ | 智能知识库问答 | 企业/课程 | 自有文档精准问答,减少人工答疑 |
| ⭐⭐⭐⭐ | AI 数据洞察仪表盘 | 中小团队 | 上传表格自动生成洞察与可视化 |
| ⭐⭐⭐⭐ | AI 面试官 | 求职者 | 简历定制问答,练习反馈与改进建议 |
| ⭐⭐⭐⭐⭐ | 多 Agent 决策工作坊 | 方案评审 | 多角色视角辩论,生成决策要点 |
> 💡 **选题思考**:不只是"我能做什么",更要思考"这个项目**对谁有价值**?解决什么**真实问题**"
#### 🚀 从 0 到 1如何开始(Starter Kit)
面对空白的代码编辑器感到迷茫?请按以下步骤操作:
**Step 1: 只要写出 README.md你就完成了一半**
不要急着写代码。先用自然语言在 `Project_Design.md` (或草稿纸) 上写下:
1. **一句话描述**:我的应用叫什么?它是给谁用的?
2. **核心功能**:它*必须*有的 3 个功能是什么?(MVP)
3. **交互流程**:用户打开 App -> 点击什么 -> 看到什么?
**Step 2: 让 AI 写第一行代码**
把Step 1的内容喂给 Cursor/Windsurf
> *"我正在开发一个[项目名]。请阅读我的设计思路:[粘贴你的描述]。请帮我生成项目结构,并创建最基础的 app.py 框架。"*
**Step 3: 最小可行性验证**
* 生成的代码能跑吗?(Run it)
* 界面上能看到按钮吗?(See it)
* 如果报错,直接把报错信息截图或复制给 AI。
> **记住**:你是在搭建积木,不是在烧制砖块。先搭出轮廓,再修饰细节。
---
## 🔧 第2天自主开发
### 建议学习路线
```
上午:环境搭建 + 熟悉工具
├── 安装 Python、Cursor/Windsurf
├── 申请 DeepSeek API Key
├── 运行第一天的示例代码
└── 熟悉 AI 编辑器的操作Composer/Chat 模式)
下午:开始项目开发
├── 确定项目选题
├── 用自然语言描述项目需求Project Requirements
├── 让 AI 生成初始代码框架
└── 运行调试,迭代优化
```
### Vibe Coding 技巧
#### 1. 上下文管理Context
AI 不是神,它需要知道你的代码、你的报错、你的意图。
- **@Files**:在 Cursor 中使用 `@` 引用相关文件。
- **Paste Error**:直接粘贴报错信息,不要只说"报错了"。
#### 2. 有效的 Prompt 模板
```markdown
角色:你是一个 Python 专家。
任务:创建一个 [项目类型],使用 [技术栈]。
功能需求:
1. [功能1]
2. [功能2]
约束条件:
- 代码简洁,有注释
- 使用 Streamlit 的 sidebar 布局
```
#### 3. 常见问题排查
- **Streamlit 页面频繁刷新?** -> 检查是否把初始化代码放在了循环里,或者没用 `st.session_state`
- **API 报错 401** -> 检查 API Key 是否正确,环境变量是否生效。
### 学习资源
- 📚 **Streamlit 文档**[docs.streamlit.io](https://docs.streamlit.io)
- 🤖 **DeepSeek API**[platform.deepseek.com](https://platform.deepseek.com)
- 📺 **教程**B站搜索 "Streamlit 入门" 或 "Cursor 教程"
---
## ❓ 第3天中期答疑
### 答疑内容
- ✅ 项目选题确认
- 🐛 疑难 Bug 攻关
- 🏗️ 架构设计与优化建议
### 常见问题解决方案表
| 问题分类 | 现象描述 | 解决方案核心 |
|:---|:---|:---|
| **环境** | `ModuleNotFoundError` | 运行 `pip install <库名>` |
| **API** | `402 Payment Required` | 账户余额不足,需充值 |
| **API** | 回复中断/不完整 | 检查 `max_tokens` 设置,或上下文超长 |
| **Streamlit** | 变量一点按钮就重置 | **必须**使用 `st.session_state` 存储变量 |
| **Streamlit** | 运行无反应 | 确保命令是 `streamlit run app.py` 而不是 `python app.py` |
### 中期检查清单
- [ ] 选题已定,核心功能跑通
- [ ] 理解核心代码逻辑(能给别人讲清楚)
- [ ] 无论是 Git 还是手动备份,确保代码有存档
- [ ] 能清晰回答:**我的项目为谁解决了什么问题?**
---
## 🔧 第4天自主开发
### 建议工作重点
- **完善功能**处理边界情况如用户输入为空、API 请求失败)。
- **美化界面**:使用 `st.columns` 排版,添加 Emoji优化提示语。
- **准备展示**:开始思考演示流程,准备 README。
> [!TIP]
> **加分项**
> - 💾 **数据持久化**:对话不丢失(存本地 JSON 或 SQLite
> - 📱 **响应式**:手机端打开也好看。
> - 📊 **可视化**:用图表直观展示数据。
---
## 🎤 第5天项目展示与评审
### 展示形式
- **时间**:每组 (2-3人) **5分钟**
- **内容**PPT/文档介绍 (1min) + 实机演示 (4min) + 心得分享 (2min)。
### 评分标准(总分 100
| 维度 | 分值 | 核心考量 |
|:---|:---:|:---|
| **功能完成度** | 25 | 核心功能由无 Bug流程跑通 |
| **创意与体验** | 20 | 界面美观,交互顺滑,解决痛点 |
| **技术实现** | 20 | 代码结构清晰,错误处理完善 |
| **展示表现** | 10 | 表达清晰,演示流畅 |
| **开发心得** | 15 | **(重要)** 对 AI 协作的真实思考与反思 |
| **学习态度** | 10 | 课堂与答疑的参与度 |
> **难度系数**
> 基础项目 (⭐⭐) 系数 ×1.0;挑战项目 (⭐⭐⭐⭐) 系数 ×1.1。
> *鼓励挑战,但也尊重将简单事情做到极致。*
---
## 📦 提交要求
### 1. 提交材料
1. **源代码**:完整项目文件夹。
2. **README.md**:项目说明文档。
3. **依赖文件**:包含 `pyproject.toml``uv.lock` (确保别人可以用 `uv sync` 还原你的环境)。
4. **开发心得**Markdown 格式,**不少于 500 字**。
### 2. README.md 模板
```markdown
# [项目名称]
## 简介
这句话介绍你的项目是做什么的,解决了什么问题。
## 如何运行
1. 安装依赖:`uv sync`
2. 配置 Key复制 `.env.example``.env` 并填入 Key。
3. 运行:`uv run streamlit run app.py`
## 功能列表
- [x] 功能 A
- [ ] 功能 B (待开发)
```
### 3. 📝 开发心得(必填,>500字
**请围绕以下核心问题撰写:**
1. **选题思考**:为什么做这个?解决了谁的痛苦?
2. **AI 协作体验**
- 第一次用 AI 写代码的感觉?
- 哪个 Prompt 让你直呼"牛逼"?哪个让你想砸键盘?
- AI 生成的 Bug 你是怎么解的?
3. **自我反思**
- 离开 AI我还能写出这个吗
- AI 时代,我作为程序员的核心竞争力到底是什么?
> 💡 **真情实感最重要**。我们不想看套话,想看你的真实挣扎与顿悟。
---
## 🔗 附录:环境配置指南
### 1. 基础环境
- **Python**: 推荐 3.14+ (2026 Stable)
- **依赖管理**: **uv** (强烈推荐,替代 pip/venv)
- **编辑器**: 推荐 Cursor 或 VS Code + Windsurf 插件。
### 2. 项目初始化 (使用 uv)
```bash
# 1. 安装 uv (MacOS/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
# 2. 初始化项目
mkdir my-ai-app
cd my-ai-app
uv init
# 3. 添加依赖
uv add streamlit chainlit openai python-dotenv
# 4. 运行应用
uv run streamlit run app.py
# 或
uv run chainlit run app.py -w
```
### 3. API Key 管理示例 (`.env`)
不要把 Key 写死在代码里!
```python
# .env 文件
DEEPSEEK_API_KEY=sk-xxxxxxx
```
```python
# app.py
import os
# uv add python-dotenv
from dotenv import load_dotenv
load_dotenv() # 加载 .env
api_key = os.getenv("DEEPSEEK_API_KEY")
```
---
## 🌟 结语
> **代码是 AI 写的没关系,**
>
> **但选题是你定的,需求是你理解的,取舍是你做的,结果是你交付的,成长是你自己的。**
祝大家在 **Vibe Coding** 中找到属于自己的价值!🚀