用华为云 FunctionGraph + DeepSeek 搭建一个轻量级 AI 文章摘要服务
本文介绍如何基于华为云函数工作流 FunctionGraph 与 DeepSeek 大模型,快速搭建一个"丢进一篇文章链接,自动返回摘要"的轻量 HTTP 服务。全程无需管理服务器,按调用量计费,适合个人开发者和小团队。
一、为什么选这个方案
做内容类产品时经常遇到一个需求:用户没时间读长文,希望系统自动生成摘要。这类需求的典型特点是调用频率不稳定——平时没什么流量,偶尔爆发一下。如果为此专门买一台 ECS 跑常驻服务,大部分时间都在空转浪费钱。
Serverless 架构正好契合这种场景:
- 按需执行:有请求才运行,没有请求不花钱;
- 免运维:不用管操作系统、安全补丁、进程守护;
- 弹性伸缩:突发流量时自动扩容,不会被压垮。
华为云的函数工作流(FunctionGraph)支持触发器模式,其中 HTTP 触发器可以直接暴露一个 URL 给外部调用,配合 DeepSeek 这类高性价比的大模型 API,几行代码就能做出一个可用的 AI 服务。
整体架构非常简单:
用户请求 → FunctionGraph (HTTP 触发器) → 调用 DeepSeek API → 返回摘要 JSON
二、准备工作
开始之前需要准备三样东西:
- 华为云账号,并开通 FunctionGraph 服务(有免费额度,本示例的调用量基本可以白嫖);
- DeepSeek API Key:到 DeepSeek 开放平台创建一个 API Key,充值少量金额即可;
- Python 3.9+ 基础:本文代码用 Python 编写,依赖极少。
三、编写函数代码
FunctionGraph 的 Python 函数入口是一个 handler 函数。下面是完整代码,核心逻辑分三步:解析请求 → 抓取网页正文 → 调用大模型生成摘要。
# -*- coding: utf-8 -*-
import json
import re
import urllib.request
DEEPSEEK_API_KEY = "sk-xxxxxxxx" # 建议放到环境变量中,不要硬编码
def fetch_html(url: str) -> str:
"""抓取目标网页的 HTML"""
req = urllib.request.Request(url, headers={
"User-Agent": "Mozilla/5.0 (compatible; SummaryBot/1.0)"
})
with urllib.request.urlopen(req, timeout=15) as resp:
return resp.read().decode("utf-8", errors="ignore")
def extract_text(html: str) -> str:
"""粗暴地去掉标签,提取正文纯文本(简单场景够用)"""
html = re.sub(r"<script[\s\S]*?</script>|<style[\s\S]*?</style>", "", html)
text = re.sub(r"<[^>]+>", " ", html)
text = re.sub(r"\s+", " ", text).strip()
# 大模型上下文有限,这里截取前 6000 字符
return text[:6000]
def summarize(text: str) -> str:
"""调用 DeepSeek 生成摘要"""
payload = json.dumps({
"model": "deepseek-chat",
"messages": [
{"role": "system",
"content": "你是一个专业的编辑,请把用户给出的文章内容总结成一段不超过 150 字的中文摘要,并提炼 3 个关键词。"},
{"role": "user", "content": text}
]
}).encode("utf-8")
req = urllib.request.Request(
"https://api.deepseek.com/chat/completions",
data=payload,
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}",
},
)
with urllib.request.urlopen(req, timeout=60) as resp:
data = json.loads(resp.read().decode("utf-8"))
return data["choices"][0]["message"]["content"]
def handler(event, context):
try:
body = json.loads(event["body"] or "{}")
url = body.get("url", "")
if not url.startswith("http"):
return {"statusCode": 400,
"body": json.dumps({"error": "缺少合法的 url 参数"})}
text = extract_text(fetch_html(url))
summary = summarize(text)
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"summary": summary}, ensure_ascii=False),
}
except Exception as e:
return {"statusCode": 500,
"body": json.dumps({"error": str(e)})}
几点说明:
- 依赖为零:全部使用 Python 标准库,不需要上传依赖包,直接在线编辑器里粘贴就能跑;
- 正文截取:网页正文提取这里用了最简单的正则方案,生产环境建议接入 readability 类的正文抽取库,或者直接从结构化数据源拿文章内容;
- 密钥安全:
DEEPSEEK_API_KEY应该配置在 FunctionGraph 的环境变量里,而不是写死在代码中。
四、部署步骤
- 登录华为云控制台,进入 FunctionGraph 控制台,点击「创建函数」;
- 选择「事件函数」,运行时选 Python 3.9(或更高版本);
- 在代码编辑区粘贴上面的代码,入口设置为
index.handler; - 在「配置」→「环境变量」中添加
DEEPSEEK_API_KEY,代码里改为os.environ.get("DEEPSEEK_API_KEY")读取; - 内存选 512MB、超时设 90 秒(大模型响应需要一些时间);
- 保存后在「触发器」中添加 HTTP 触发器,认证方式选「无需认证」(测试阶段)或 APIG 签名认证(生产推荐),记下生成的 URL。
部署完成后用 curl 验证一下:
curl -X POST https://xxxx.apigw.xxx.huaweicloud.com/xxx \
-H "Content-Type: application/json" \
-d '{"url": "https://your-blog.com/some-article"}'
返回结果类似:
{
"summary": "本文介绍了基于华为云 FunctionGraph 搭建 AI 摘要服务的完整流程…… 关键词:Serverless、大模型、摘要生成"
}
五、几个实用的优化方向
跑通之后,可以按需迭代:
- 流式返回:如果摘要较长,可以让 DeepSeek 开启 stream 模式,FunctionGraph 结合 WebSocket 触发器实现打字机效果;
- 缓存结果:对同一 URL 的摘要结果做缓存(比如存到云数据库 GeminiDB 或 OBS),避免重复调用大模型浪费 Token;
- 异步化:长文章处理时间可能超过 HTTP 同步等待上限,可以改用「消息队列 + 异步函数」模式,处理完再回调通知;
- 安全加固:公网开放的 HTTP 触发器建议加鉴权(如 APIG 签名或简单 Token 校验),并配置限流,防止被恶意刷量产生费用。
六、成本估算
以每天调用 1000 次、每次输入输出合计约 3000 Token 计算:
- FunctionGraph 费用:基本在免费额度内;
- DeepSeek 费用:按当前定价约每天几毛钱。
相比一台每月几十元还常年空转的 ECS,成本几乎可以忽略,而且不用担心流量高峰。
七、总结
本文用一个不到百行代码的例子,演示了如何在华为云上用 Serverless + 大模型 API 快速构建一个实用的小服务。这个模式的可复制性很强:把「摘要」换成「翻译」「润色」「内容审核」,就是另一个服务了。建议大家动手试一试,欢迎在评论区交流踩坑经验。
作者注:文中示例代码为演示用途,生产环境请务必做好密钥管理与安全防护。
- 点赞
- 收藏
- 关注作者
评论(0)