欢迎来到AI应用课程的基础能力构建阶段!本项目包含4个渐进式实验,帮助你掌握与AI模型进行可靠、可控、可验证交互的核心技术。
通过这4个实验,你将学习:
# 安装 Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# 启动 Ollama 服务
ollama serve
# 下载 Qwen3-8B 模型(新开一个终端)
ollama pull qwen3:8b
ollama pull qwen3:8b# 检查 Ollama 是否运行
curl http://localhost:11434/api/tags
# 应该返回包含 qwen3:8b 的模型列表
# 进入项目目录
cd ai-course-labs
# 安装依赖
pip install -r requirements.txt
# 运行所有实验的测试
pytest grader/ -v
# 运行单个实验的测试
pytest grader/test_lab1.py -v
pytest grader/test_lab2.py -v
pytest grader/test_lab3.py -v
pytest grader/test_lab4.py -v
# 查看详细错误信息
pytest grader/test_lab1.py -v --tb=short
# 查看测试输出的详细信息
pytest grader/ -v -s
ai-course-labs/ ├── grader/ # 测评系统 │ ├── fixtures.py # 共享测试夹具(Ollama健康检查) │ ├── test_lab1.py # 实验1测评脚本 │ ├── test_lab2.py # 实验2测评脚本 │ ├── test_lab3.py # 实验3测评脚本 │ └── test_lab4.py # 实验4测评脚本 │ ├── student_code/ # 学生代码目录 │ ├── lab1/main.py # 实验1:你的实现代码 │ ├── lab2/main.py # 实验2:你的实现代码 │ ├── lab3/main.py # 实验3:你的实现代码 │ └── lab4/main.py # 实验4:你的实现代码 │ ├── requirements.txt # Python依赖 ├── pytest.ini # Pytest配置 └── README.md # 本文件
目标:实现文本分类功能,返回 Pydantic 模型实例
文件位置:student_code/lab1/main.py
需要实现:classify_text() 函数
任务要求:
关键要求:
TextClassification 实例(包含 category, confidence_score, keywords)实现提示:
# 当前状态:raise NotImplementedError("请实现 classify_text 函数")
# 你需要:
# 1. 设计包含5个类别的prompt
# 2. 使用 httpx.post() 调用 Ollama API (http://localhost:11434/api/generate)
# 3. 使用 "format": "json" 参数强制JSON输出
# 4. 用 json.loads() 解析响应
# 5. 用 TextClassification.model_validate() 验证并创建实例
测试运行:
pytest grader/test_lab1.py -v
测试用例:
目标:实现支持多会话隔离的对话系统
文件位置:student_code/lab2/main.py
需要实现:chat_with_memory() 函数
任务要求:
关键要求:
实现提示:
# 当前状态:raise NotImplementedError("请实现 chat_with_memory 函数")
# 你需要:
# 1. 初始化 SESSION_HISTORY[session_id] = []
# 2. history_length = len(history) # 在保存新消息前计算
# 3. 构建包含历史的prompt
# 4. 调用Ollama API并保存结果到SESSION_HISTORY
数据结构建议:
SESSION_HISTORY = {
"session_001": [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!..."},
]
}
测试运行:
pytest grader/test_lab2.py -v
测试用例:
目标:使用 LangChain 的 ConversationBufferMemory 管理会话
文件位置:student_code/lab3/main.py
需要实现:
chat_with_langchain_memory() 函数:使用 LangChain Memory 进行对话get_memory_summary() 函数:获取会话历史摘要任务要求:
关键要求:
ConversationBufferMemory 管理历史实现提示:
# 需要安装和导入:
# from langchain_core.prompts import PromptTemplate
# from langchain_community.llms import Ollama
# 对于ConversationBufferMemory和LLMChain:
# - 新版LangChain可能需要自己实现兼容层
# - 或者查找新版本的等效API
# - 参考LangChain官方文档
# 提示:
# 1. 检查 session_id 是否存在对应的 Memory,不存在则创建
# 2. 创建 Ollama LLM 实例
# 3. 创建 PromptTemplate(包含历史上下文)
# 4. 创建 LLMChain,连接 Prompt、LLM 和 Memory
# 5. 运行链并获取响应
# 6. 返回响应和 memory_variables
LangChain 示例:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="history",
return_messages=False
)
测试运行:
pytest grader/test_lab3.py -v
测试用例:
目标:使用 LangChain 链生成广告文案
文件位置:student_code/lab4/main.py
需要实现:generate_ad() 函数
任务要求:
关键要求:
PromptTemplate 定义模板(包含 {product} 和 {feature})LLMChain 连接 Prompt 和 LLM实现提示:
# 当前状态:raise NotImplementedError("请实现 generate_ad 函数")
# 你需要:
# 1. 创建包含{product}和{feature}的PromptTemplate
# 2. 创建Ollama LLM实例
# 3. 创建LLMChain连接prompt和llm
# 4. 调用chain.run()或chain.predict()
# 5. 返回包含ad_copy, word_count, template_used的字典
LangChain 示例:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
template = "为产品 {product} 创作广告,特性:{feature}"
prompt = PromptTemplate(
input_variables=["product", "feature"],
template=template
)
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run(product="智能手表", feature="心率监测")
测试运行:
pytest grader/test_lab4.py -v
测试用例:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 测试全部 SKIP | Ollama 未启动 | 运行 ollama serve,确认端口 11434 监听 |
| 模型未找到 | qwen3:8b 未下载 | 运行 ollama pull qwen3:8b |
| 返回类型错误 | 未使用 Pydantic 模型 | 检查函数返回值类型 |
| JSON 解析失败 | Prompt 设计不当 | 在 Prompt 中明确要求输出纯 JSON |
| 会话状态混乱 | 全局变量使用错误 | 检查字典键是否为 session_id |
| 超时错误 | 模型响应慢 | 减小 max_tokens 或简化 Prompt,尝试使用更小模型 |
| LangChain导入错误 | 版本不兼容 | 查阅最新LangChain文档找到新API,或实现简单兼容层 |
关于LangChain版本: LangChain更新较快,如果遇到导入错误:
JSON解析失败:
"format": "json" 参数每个实验文件都包含 if __name__ == "__main__" 测试代码,可以直接运行:
# 调试实验1
python student_code/lab1/main.py
# 调试实验2
python student_code/lab2/main.py
# 调试实验3
python student_code/lab3/main.py
# 调试实验4
python student_code/lab4/main.py
# 显示打印输出
pytest grader/test_lab1.py -v -s
# 显示完整错误堆栈
pytest grader/test_lab1.py -v --tb=long
# 只运行失败的测试
pytest grader/test_lab1.py -v --lf
每个实验的测试用例都有明确的权重:
总体要求:
pytest grader/ -v 查看整体结果完成实验后,建议撰写实验报告,包含:
当你看到以下输出时,恭喜你完成了所有实验!
======================== test session starts ========================= ... grader/test_lab1.py::TestLab1::... PASSED [...] grader/test_lab2.py::TestLab2::... PASSED [...] grader/test_lab3.py::TestLab3::... PASSED [...] grader/test_lab4.py::TestLab4::... PASSED [...] ======================== XX passed in XX.XXs =========================
祝学习愉快! 🚀
如有疑问,请参考设计文档或联系助教。