Week1 day1 搭建网页摘要小应用(第一个 LLM 实战项目)
- 使用爬虫抓取网页文本(
fetch_website_contents,定义在scraper.py) - 调用大模型 Chat Completions API(OpenAI 标准接口,你可以无缝替换 DeepSeek)
- 使用「系统提示词 + 用户提示词」标准消息结构,让模型生成网页摘要
- 封装函数实现:输入网址 → 抓取网页 → LLM 生成摘要 → Markdown 渲染展示
核心知识点:
- API 消息固定结构:
[{"role":"system"},{"role":"user"}] system prompt:定义 AI 身份、输出规则;user prompt:传入任务素材- OpenAI SDK 完全兼容架构,DeepSeek、Anthropic、Gemini 大部分可以平滑迁移
- 简易爬虫只能抓取静态网页,JS 渲染网站无法抓取(进阶方案:Selenium,在 community-contributions 文件夹)
重点:所有接口返回读取代码response.choices[0].message.content不需要改动。
二、前置文件
1)scraper.py(同目录必须新建,课程自带爬虫代码)
python
运行
import requests from bs4 import BeautifulSoup def fetch_website_contents(url): response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") return soup.get_text(separator="\n", strip=True)
2).env 文件(项目根目录)
env
# 填入你的DeepSeek密钥
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
3)提前安装依赖
bash
pip install openai python-dotenv requests beautifulsoup4
三、完整可直接运行代码(已改造适配 DeepSeek,替代原版 OpenAI)
复制到你的 ipynb 单元格逐块运行
python
运行
# imports import os from dotenv import load_dotenv from scraper import fetch_website_contents from IPython.display import Markdown, display from openai import OpenAI # 加载.env环境变量 load_dotenv(override=True) api_key = os.getenv('OPENAI_API_KEY') # 校验密钥 if not api_key: print("未找到API key,请检查.env文件!") elif api_key.strip() != api_key: print("密钥首尾存在多余空格,请清理!") else: print("密钥加载成功!") # ========== 唯一改动:接入DeepSeek API ========== openai = OpenAI( api_key = api_key, base_url = "https://api.deepseek.com/v1" ) # 简单连通测试 message = "Hello, GPT! This is my first ever message to you! Hi!" messages = [{"role": "user", "content": message}] response = openai.chat.completions.create(model="deepseek-v4-flash", messages=messages) print(response.choices[0].message.content)
python
运行
# 测试网页抓取 ed = fetch_website_contents("https://edwarddonner.com") print(ed[:500]) # 打印前500字符预览
python
运行
# 定义提示词 system_prompt = """ 你是一位毒舌助手,分析网页内容,输出简短、风趣犀利的摘要,忽略导航栏无关文本。 使用Markdown格式输出,不要用代码块包裹,直接返回markdown文本。 """ user_prompt_prefix = """ 以下是网页原文内容。 请生成网页简短摘要。 如果包含新闻、公告信息,则一并总结。 """ # 构造标准消息结构 def messages_for(website): return [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt_prefix + website} ]
python
运行
# 核心函数:输入url返回摘要 def summarize(url): website = fetch_website_contents(url) response = openai.chat.completions.create( model = "deepseek-v4-flash", messages = messages_for(website) ) return response.choices[0].message.content # 封装函数,markdown美化输出 def display_summary(url): summary = summarize(url) display(Markdown(summary))
python
运行
# 运行测试 display_summary("https://edwarddonner.com") # display_summary("https://cnn.com") # display_summary("https://anthropic.com")
四、关键注意事项(避坑)
- ❌ 不要使用
deepseek-reasoner(R1),后续课程 Agent 工具调用不兼容;固定使用deepseek-v4-flash - 网页抓取限制:React、Vue 等 JS 动态网站(openai.com)抓不到正文,需要 Selenium
- Jupyter 特性:修改
system_prompt/ 函数代码后必须重新运行单元格,内存才会更新 - 如果你想换回原版 OpenAI,只需要删除
base_url="https://api.deepseek.com/v1",模型名改回gpt-4.1-mini
五、课后练习代码模板(课程留给你自主拓展)
python
运行
# 练习:邮件自动生成主题 # Step 1: Create your prompts system_prompt = """ 你是邮箱助手,根据邮件正文,生成简短、贴切的邮件标题。 只输出标题,不要多余内容。 """ # 粘贴邮件正文 email_content = """ 这里粘贴邮件文本 """ # Step 2: Make the messages list messages = [ {"role":"system", "content":system_prompt}, {"role":"user", "content":email_content} ] # Step 3: Call LLM response = openai.chat.completions.create( model="deepseek-v4-flash", messages=messages ) # Step 4: print the result print("推荐邮件标题:", response.choices[0].message.content)

浙公网安备 33010602011771号