自建 Llama 3.3 70B 做营销:Docker + Ollama + 4 个真正值回票房的 Prompt
目录
三月的某个周三早上,一个客户打开笔记本电脑,盯着上个月的 OpenAI 账单说:"我们花了 11,400 美元做工单分类。"这篇文章就是因为这句话才有的。
那个团队把 Zendesk 上的每一张工单都丢给 gpt-4o-mini(一种便宜版的大模型)来打分类和情感标签。每月 12,000 张工单,输入端 $0.95/百万 token、输出端 $2.80/百万 token。再加上广告文案改写、meta description 生成,以及一堆"丢给 GPT 跑一下"的活儿,月账单就奔着五位数去了。他们问我:"我们是不是该自己跑模型?"
答案跟营销技术里大多数问题一样:看情况。对大部分团队答案是"不该"。但对一小撮具体的工作,答案是"该",而且成本账算下来会让老板直接拍板。这篇文章是那次谈话的展开版——硬件现实、真正的 Docker Compose 文件、四个能直接用的 prompt,以及一份坦诚的"别折腾"清单。
先看硬件现实
Llama 3.3 70B(Meta 在 2024 年 12 月 6 日发布,性能打到老的 405B 模型水平)是一个 70B 参数的大语言模型(LLM, Large Language Model)。全精度 FP16(16 位浮点,模型权重能用的最高精度)需要大约 140 GB 的显存(VRAM, GPU 上的视频内存)。你没有这个量级。几乎没人有。给单台工作站走的实际路径是 Q4_K_M 量化(Quantization)——一种把每个权重压到大约 4 位的压缩技术,会损失一点质量但能把模型文件压到 42-43 GB。
光是这样,24 GB 的消费级显卡也塞不下。现实中有三条硬件路径:
| 配置 | 量化 | 显存/内存 | 吞吐 (tok/s) | 成本(美元) |
|---|---|---|---|---|
| 2x RTX 3090(二手) | Q4_K_M | 48 GB VRAM | 8-15 | $1,400-1,800 |
| 1x A100 80GB PCIe(二手) | Q4_K_M | 80 GB VRAM | 18-25 | $8,000-11,000 |
| Mac Studio M2 Ultra 192GB | Q4_K_M | 192 GB 统一内存 | 15-20 | $5,500-8,000 |
| 1x RTX 4090 24GB | 部分卸载 | 24 GB VRAM + 64 GB RAM | 4-8 | $1,800-2,200 |
| 4x RTX 4090 | Q4_K_M | 96 GB VRAM | 20-30 | $7,000-8,500 |
几个数字要划重点。RTX 4090 是当下最流行的显卡,单卡跑不了 Q4_K_M 精度的 Llama 3.3 70B。你可以做部分卸载(partial offload)——把 80 层中的约 25 层推到 24 GB 显卡上,剩下的在系统内存里跑——但你只会看到 4-8 tokens/秒,聊天用还行,跑 10,000 行的批量任务就痛苦了。单张 A100 80GB 或者两张二手 3090 才是下面要讲的营销场景的甜点。
纯 CPU 推理(不靠 GPU 加速、只用主处理器跑)技术上能跑。1-3 tokens/秒。别试。
真正的 Docker Compose 文件
2025 年本地跑 Llama 3.3 70B 最主流的方式是 Ollama——一个把 llama.cpp(CPU/GPU 推理引擎)包成 OpenAI 兼容 API(HTTP 接口,调用方式跟 OpenAI 一样)的开源工具。Ollama 能跑成单个二进制程序,也能跑在 Docker 里。对营销团队想要一个稳定、崩了能自愈的部署来说,Docker 是正确答案。
下面是最小可生产化的 Compose 文件。它把 Ollama API 只暴露给同一个 Docker 网络里的其他容器——如果要走公网,你应该在前面套一层反向代理(reverse proxy,一台专门处理鉴权、限流和 HTTPS 的 web 服务器)。
yaml# docker-compose.yml
services:
ollama:
image: ollama/ollama:0.5.7
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434" # 用反向代理的话删掉这一行
volumes:
- ollama_models:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 5
start_period: 90s # 首次启动要拉模型,可能很慢
volumes:
ollama_models:两个容易踩的细节。第一,nvidia 下面的 count: all 让容器看到主机上所有 GPU——如果你想留一张卡干别的活儿,改成 count: 1。第二,start_period: 90s 关键,第一次启动容器时它要从 Hugging Face 拉模型权重(也就是下载训练好的参数文件),Llama 3.3 70B 是 43 GB,如果 health check 30 秒就触发,会把容器标成 unhealthy,Docker 会在下载到一半时把它重启。
容器起来之后,拉模型:
bashdocker exec -it ollama ollama pull llama3.3:70b-instruct-q4_K_M模型文件就坐在磁盘上了。API 在线。从网络里任何其他机器:
bashcurl http://your-host:11434/api/generate -d '{
"model": "llama3.3:70b-instruct-q4_K_M",
"prompt": "Classify this support ticket into one of: billing, bug, feature_request, how_to, other. Reply with only the category name. Ticket: my export to CSV is broken since the update",
"stream": false
}'响应会是一个 JSON,里面有 response 字段(模型的答案),还有一个 stats 块记录 token 数和 tokens/秒。A100 80GB 上 50 token 的生成大概能跑到 20 tok/s。
4 个让成本账反转的营销工作
大部分团队不该自建的原因是,云端 API(OpenAI、Anthropic 这种按 token 收费的远程 LLM 服务)在小流量下确实便宜,流量上去之后就成了别人的基础设施问题。gpt-4o-mini $0.15/百万输入 token 这个价格,每天只处理 200 张工单根本不叫钱。但下面三种情况出现任意一种,账就开始翻:
- 量大到每 token 的成本开始扎眼。 五位数月账单是触发点。
- 数据不能离开你的内网。 医疗、金融、法律、GDPR 或 HIPAA(美国健康数据隐私法)管辖下任何带 PII(个人身份信息——姓名、邮箱、电话)的场景。
- 任务对实时性不敏感。 1 万行的批量任务自建机器跑 4 小时跑完可以接受。客户实时等的 1 万行批量任务就不行。
下面四个 prompt 至少命中上面一条,这些都是我实际在用的:
Prompt 1:批量工单分类
上面提到的那个客户团队每月过 12,000 张 Zendesk 工单做分类。API 账单 $11,400 是因为他们用 gpt-4o(不是 mini)保准确度,而且抽的是结构化字段——分类、情感、产品线、客户级别信号——不只是打个标签。
Ollama 版本用 /api/chat 端点配结构化系统 prompt:
textSYSTEM:
You are a support-ticket classifier. For each ticket, output a JSON object with exactly these fields:
- "category": one of [billing, bug, feature_request, how_to, account, other]
- "sentiment": one of [positive, neutral, negative, angry]
- "product_area": one of [dashboard, api, mobile, billing, integrations, other]
- "tier_signal": one of [enterprise, smb, self_serve, unknown]
- "needs_human": boolean — true if the ticket contains words from [legal, lawyer, gdpr, lawsuit, cancel, refund, chargeback, urgent, escalation]
Output only the JSON. No prose, no markdown.
USER:
Classify this ticket:
"I just realized we've been double-charged for the API plan this month and the dashboard doesn't show the new usage limits. I'm the admin for a 40-seat account. Need this resolved before our board meeting Friday."Llama 3.3 70B Q4_K_M 在 A100 上的实际输出:
json{"category":"billing","sentiment":"negative","product_area":"billing","tier_signal":"enterprise","needs_human":true}gpt-4o 上每张工单约 $0.018。自建 Llama 3.3 70B($0.13/度电、约 20 tok/s)只算电费的话约 $0.0007/张。每月 12,000 张工单,API 端 $216/月。自建端是电费 + 硬件折旧——A100 80GB $10,000 摊 36 个月是 $231/月 + 约 $8 电费。光这一个任务就要 30 个月回本,还没算下面另外两个任务。
Prompt 2:私密竞品情报摘要
这是营销团队不管什么价格都不会过公网 API 的一类。竞品情报是你三个最直接对手的 SEO 拆解、季度财报电话会议、Glassdoor 评价、专利申请。输出是销售团队用的 battle card。输入是"一旦泄露就是灾难"的东西。
模型不用多聪明。够用、不外传就行。Llama 3.3 70B Q4_K_M 在结构化摘要上大致是 gpt-4o-mini 的水平,够用。
Prompt:
textSYSTEM:
You are a competitive analyst. Read the following 4 sources about [Competitor X] and produce a battle card with these sections:
1. "Positioning" — one sentence on how they describe themselves
2. "Pricing model" — what we know, what's rumored, what we don't know
3. "Recent moves" — last 90 days, with source citation
4. "Vulnerabilities" — claims their customers complain about
5. "Our counter" — one sentence on how we beat them on this
If a section has no evidence in the sources, write "insufficient data" — do not invent.
USER:
Source 1: [G2 reviews, last 90 days, 47 reviews, attached]
Source 2: [Their Q3 earnings call transcript, attached]
Source 3: [Ahrefs organic keyword overlap with our site, attached]
Source 4: [Three Glassdoor reviews from former AE (Account Executive) and SE (Sales Engineer) roles, attached]整条流水线在 Docker 容器里跑。什么都不出这个盒子。输出进 Notion 数据库。没有第三方审计问题,因为根本没有第三方。
Prompt 3:凌晨批量生成 SEO meta description
这是走量的活儿。一个中等规模的电商站有 10,000 个产品页。每个都要一个 155 字符以内的独立 meta description。用 gpt-4o-mini 跑($0.15/M 输入 + $0.60/M 输出)一次约 $7.50。用自建 Llama 3.3 70B 在 A100 上 ~20 tok/s 跑 10,000 条要 6 小时左右,电费约 $0.80。凌晨 1 点开跑,早上起来 CSV 就出来了。
逐行 prompt:
textSYSTEM:
You write meta descriptions for SEO. Rules:
- 140-155 characters including spaces
- Include the target keyword once, naturally
- No quotation marks, no em-dashes, no emoji
- End with a soft call-to-action verb (discover, shop, learn, compare, find)
- Do not start with the brand name
USER:
URL slug: /products/leather-laptop-sleeve-15-inch-brown
Product name: Heritage Leather Sleeve — 15"
Target keyword: leather laptop sleeve 15 inch
Existing H1: Premium Full-Grain Leather, Tailored Fit输出样例:
text"Hand-stitched full-grain leather laptop sleeve sized for 15-inch MacBooks and ultrabooks. Discover a slim, durable carry that ages beautifully."这里真正吃时间的不是 LLM 成本本身,是工程量。从 CMS(内容管理系统——存你网站内容的后台数据库)拉产品数据、每 200 条一批批处理、结果写回去、记录失败——这些是大头,LLM 成本 $0.80 还是 $7.50 你都要写这段代码。一旦流水线建好,LLM 这行账可以压到接近零。
Prompt 4:PII 脱敏的邮件列表清洗
每个营销团队都有这么一份。8 万行的列表,来自一场活动、一次收购、一个合作伙伴——满是重复、过时的职位、一人多个邮箱、还有不少带姓名和电话的行你要大规模群发。法务希望在进营销自动化平台前把 PII 都抹掉。营销团队想把列表清洗加分群。两件事可以一趟跑完。
模型干两件事:PII 检测 + 记录归一化。Llama 3.3 70B 在结构化 prompt 下两件都能干:
textSYSTEM:
You are a list-cleaning assistant. For each row, output a JSON object with:
- "email": canonical form (lowercased, gmail dots removed if applicable)
- "first_name": the part before the @ in the email if no name field
- "company": clean company name, strip "Inc", "LLC", "Ltd" unless required
- "title": normalized to one of [Founder, CEO, CTO, CMO, VP Marketing, Director Marketing, Marketing Manager, Other Marketing, Other]
- "pii_flags": array of strings from [phone, address, ssn_pattern, credit_card_pattern, dob]. Empty array if none.
- "redacted_row": the original row with all PII fields replaced by "[REDACTED]"
Output only JSON.
USER:
Row to clean:
{"name":"Sarah Johnson","email":"Sarah.Johnson@gmail.com","company":"Acme Inc.","title":"VP, Marketing","phone":"415-555-0123","signup_date":"2024-03-15"}输出:
json{
"email":"sarahjohnson@gmail.com",
"first_name":"Sarah",
"company":"Acme",
"title":"VP Marketing",
"pii_flags":["phone"],
"redacted_row":{"name":"Sarah Johnson","email":"sarahjohnson@gmail.com","company":"Acme Inc.","title":"VP, Marketing","phone":"[REDACTED]","signup_date":"2024-03-15"}
}这活儿过托管 LLM 等于让 8 万行客户 PII 过 OpenAI 或 Anthropic 的 API。就算他们有数据处理承诺,也是 CISO(首席信息安全官)想从风险登记表里划掉的一段话。自建意味着数据不出内网。成本量级跟 Prompt 3 一样。
回本账,直白算
一台 A100 80GB 工作站(翻新)大概 $9,000-11,000。加服务器级主板、128 GB 系统内存、一块 NVMe SSD(高速固态硬盘)放模型、1000W 电源、4U 机箱:全配齐 $13,000-15,000。摊 36 个月:$360-420/月。
A100 持续推理的功耗:~250-300W 平均,24/7 跑夜间任务的话,$0.13/度电大概 $30-45/月。加上机器其他部分算 $50。
托管(colocation,把硬件寄到数据中心托管)或者有合适散热的办公室:$0-200/月,看你手头有什么。
现实月成本:$400-700。
这个成本下,模型"免费"到每月大约 5000 万生成 token。再多你就被 GPU 卡住了(受限于 GPU 处理 token 的速度),得加第二台机器。上面那四个任务加起来,每月大概产出 500 万-1500 万 token,离上限还远。
跟 gpt-4o-mini 的回本点,上面这些工作负载下大概在每月 800 万-1200 万 token。跟 gpt-4o 的回本点更接近 300 万-500 万。诚实的结论:如果你的月 API 账单在 $1,000 以下,自建是玩票。$5,000 以上、数据又有任何敏感性,这场对话值得开。
什么时候你绝对别折腾
有些活儿,你继续付 API 钱就行。下面这些情况,自建是错答案:
- 月总 token 量不到 500 万。 API 比电费便宜。
- 任务需要前沿模型。 Llama 3.3 70B Q4_K_M 大致是
gpt-4o-mini级别。如果你的活儿要 Claude Opus 或o1级别的推理,自建答不了——等更牛的开源权重模型(open-weight model,即训练好的参数公开可下载的模型)出来。 - 工程团队小、没人想管基础设施。 自建是半个岗位:OS 升级、驱动升级、模型升级、监控。团队里没人想干这个的话,六个月内你会从 API 迁出去又迁回来。
- 任务对延迟敏感、不能接受排队。 一个用户在等聊天机器人响应,要亚秒级。一张 GPU 上单用户跑自建 70B 20 tok/s 还行;三个并发用户就顶不住了。API 在多用户延迟上永远赢。
- 需要多模态(文本 + 图像 + 音频)。 Llama 3.3 70B 只支持文本。多模态自建是另一场更难的仗。
基本上永远别自建的两类:短的临时文案生成(一天 50 次以内直接用 API)、以及任何必须用绝对最强模型的任务。上面那四个任务是长尾——靠量、靠隐私、或者两者兼有把账翻过来。
一个务实的起点
如果算下来你的团队该上,不要一开始就上 70B。在同一台硬件上先跑小一点的模型——llama3.1:8b 或者 qwen2.5:14b——先把 Docker、网络配置、监控、批量任务编排跑通。吃掉你时间的是这些。从 8B 换到 70B 就是 docker exec 里的一行命令。真正花一个月才能搞定的,是跑模型的那套基础设施。
A100 找靠谱翻新商买二手,要 12 个月保修。要 80GB 版,40GB 版装不下 Llama 3.3 70B 的完整 Q4_K_M。从第一天就上 Prometheus(采集系统指标的开源监控工具)和 Grafana(把指标画成图表的开源仪表盘)——你要从一开始就能看到 tokens/秒、显存利用率、请求队列深度,别等第三次莫名其妙的宕机了才想起来。头三周的活儿跟 API 并行跑一遍,然后 diff 输出。diff 出来才能告诉你自建模型对这个活儿够不够用。
API 账户别关。你绝对会遇到自建模型干不好的活儿,正确做法是"这一条丢给 Claude,剩下 12,000 条丢给本地机器"。目标不是删掉 API。目标是别再为机房里一台工作站就能干完的活儿付五位数账单。