news 2026/10/6 7:06:26

DeepSeek批量生成标题的Prompt工程:从框架到脚本的完整实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek批量生成标题的Prompt工程:从框架到脚本的完整实践

简介:针对新媒体运营者与内容创作者在日常标题创作中效率低、创意枯竭的痛点,这份22页的PDF系统梳理了基于DeepSeek批量生成10万+标题的Prompt工程方法。资源从DeepSeek的核心原理与Prompt工程基础讲起,逐步展开构建批量标题生成策略、Python代码实现、模型参数调优与反馈迭代,并通过科技、美食、旅游等案例展示完整落地流程,同时涵盖合规性、数据安全等注意事项。包体为单个PDF文件,大小1.96MB,目录结构清晰,从引言到结论共十章,适合希望快速掌握DeepSeek实战技巧、提升新媒体内容生产效率的读者查阅与按步骤实践。该资源目前已有108人学习,内容完整、图表文字正常,可作为新媒体运营技能进阶的实用参考。

1. 一页纸说清:DeepSeek批量生成标题,到底在解决什么问题

你把一个选题关键词丢给 DeepSeek,它一口气回你一百个标题,翻来覆去能用的没几个——这不是模型不行,是你的 prompt 没把“什么是好标题”讲清楚。所谓 DeepSeek 批量生成 10万+ 标题的 prompt 工程,本质是把老编辑写标题的经验拆成可重复调用的模板、变量和约束,让模型在稳定格式下持续产出接近人类水准的候选标题池。它解决的不是“量大”,而是“每一条都值得被点开”的胜率问题。这个方向适合新媒体运营、MCN 内容策划、电商详情页文案,以及任何想搭内容中台的团队:把找标题的时间从一下午压到十分钟,把标题同质化的问题按流程消灭。下面我会直接给你能抄走的 prompt 框架、调用脚本和五个高频坑。

2. 为什么批量化生成标题这事,在 DeepSeek 上成立

2.1 从“逐条问”到“批量喂”:模型输出机制决定了哪些玩法能复用

先想清楚一个前提:标题生成不是让模型“凭空想”,而是让它在约束里做选择题。DeepSeek 这类模型在长上下文、结构化输出和 API 成本三个维度上,都适合批量标题生产线。它支持很长的 system prompt,你可以把角色设定、平台规则、禁用词表、示例标题一次性塞进去;它兼容 OpenAI 格式的接口,意味着你用 openai 库就能调,脚本迁移成本低;开源权重和本地部署选项让数据不出内网也可以跑,这对很多内容团队的素材保密要求很关键。

批量生成的稳定性,不是靠“运气”,而是靠约束。绝大多数人翻车,是因为把 prompt 当成一句话需求:“帮我写 20 个标题。”模型拿到这种输入,只能调用它记忆里的高频标题模式,产出的东西当然同质化。正确做法是让模型在每一轮都面对同一套“坐标系”:身份、任务、质量标准、输出格式、示例锚点,五个槽位缺一不可。这个坐标系一旦固定,批量生成就只是循环调用接口,而不是重复跟模型讨价还价。

一个最基础的调用长这样,注意 base_url 指向 DeepSeek 官方 API 地址;如果你本地部署了模型,把 base_url 换成你部署服务的地址就行,脚本其他部分不用动。

from openai import OpenAI client = OpenAI( api_key="your-deepseek-api-key", # 从开放平台获取,注意不要泄漏到仓库 base_url="https://api.deepseek.com", # 本地部署时换成 http://localhost:8000/v1 ) resp = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一位有8年经验的新媒体标题编辑,擅长用具体细节和情绪张力写标题。"}, {"role": "user", "content": "围绕'打工人午餐'这个主题,生成8条标题,每条不超过25个字。"} ], temperature=1.3, max_tokens=512 ) print(resp.choices[0].message.content)

这里 temperature 我故意给到 1.3,因为标题生成需要一点发散性;如果跑出来的内容开始飘、不贴题,就往下调到 0.9。max_tokens 给 512 是为了给 8 条标题留足空间,按每条标题 30 字估算,加上标点和换行,512 token 是安全的。如果你一次要 20 条,建议把 max_tokens 提到 1024。

2.2 基础 prompt 框架:先让单条标题能打,再谈量

批量生成之前,你必须先打磨出一个“单条标题也敢发朋友圈”的 prompt。这里给出一版我常用的结构化框架,它把好标题的经验拆成了四块:身份、任务、质量标准、示例锚定。注意,示例锚定是很多人漏掉的,它直接决定模型输出的文风下限。

BASE_PROMPT = """ # 身份 你是深耕{platform}平台的内容编辑,擅长用具体细节、反常识结论和情绪张力写标题。 # 任务 根据给定的主题“{theme}”,写出{count}条标题,每条不超过{max_len}个字。 # 质量标准 1. 每条标题必须包含至少一个具体数字、具体场景或明确对象,禁止只有空洞形容词。 2. 优先使用疑问句、对比句或反常识结论。 3. 禁止出现“震惊”“重磅”“定了”“速看”等被用烂的强情绪词。 4. 文风接近以下示例: - {example1} - {example2} # 输出格式 每行一条标题,不要编号,不要解释,不要前后缀。 """

调用时用 format 填充变量,例如 theme 传“打工人午餐”,example1 传“月薪8000的打工人,午餐只配吃外卖吗”,example2 传“我花30块改造公司楼下便利店便当,同事以为我带了私厨”。模型看到这两个示例后,会不自觉地靠拢那个叙事节奏。质量标准里写“禁止空洞形容词”比写“要有吸引力”有效得多,因为负面清单比正向要求更容易被执行。

这套框架的价值在于可复用。换平台就换 platform 和 example,换选题就换 theme,不需要重写 prompt。我在实际使用中,会把 BASE_PROMPT 存成一个独立的 py 文件,其他脚本统一 import,避免在多个脚本里复制粘贴导致改一处漏一处。

2.3 结构化输出与 JSON 约定:让标题进入表格,而不是留在聊天窗口

批量生成一旦上了规模,聊天窗口 100 条、500 条是翻不过来的,必须让输出变成机器可读的结构。做法是在 prompt 里强制输出 JSON 数组,再用代码解析入库。这里有一个血泪坑:模型偶尔会在 JSON 外面包一层 Markdown 代码块,或者在开头写“好的,以下是”之类的废话。所以解析时不能直接 json.loads,要先做一次容错清理。

import json import re def parse_titles(raw: str) -> list[str]: """从模型输出中解析出标题列表,兼容常见的杂讯情况。""" if not raw: return [] # 去掉可能的 Markdown 代码块围栏 raw = raw.strip() raw = re.sub(r"^```(?:json)?\s*|\s*```$", "", raw, flags=re.MULTILINE) # 截取第一个 [ 到最后一个 ] 之间的内容 start = raw.find("[") end = raw.rfind("]") if start != -1 and end != -1 and end > start: raw = raw[start:end + 1] try: data = json.loads(raw) if isinstance(data, list): return [str(item).strip() for item in data if str(item).strip()] except json.JSONDecodeError: # 模型输出不是合法 JSON 时,退回按行切分 return [line.strip(" -•\n") for line in raw.splitlines() if line.strip()] return []

这段代码的思路是:先剥掉代码块围栏,再截取数组区域,最后才交给 json.loads;如果 JSON 解析失败,退回按行切分,至少保证人工还能在表格里看到结果。参数上要注意,JSON 数组里的标题如果有换行符,parse 后要记得做清洗,比如去掉内部的换行,否则入库后 Excel 会很难看。我在实际项目里,还会在 parse 之后加一步去重,这个放到第 5 章展开。

3. 批量生成的核心 prompt 工程:把“写标题”拆成变量、模板和约束

3.1 领域变量注入:没有素材时,先建一张素材表

很多人让模型批量生成标题,结果越跑越空,原因是 prompt 里没有任何领域素材。模型只能从自己的预训练记忆里捞高频词,捞来捞去就是“提升效率”“改变自己”“职场进阶”这些大词。要打破这个循环,你必须给 prompt 注入领域变量——不是一句话,而是一张表。

变量例子说明
platform公众号 / 小红书 / 抖音决定标题的字数上限和语气
theme打工人午餐核心选题,尽量具体到场景
audience25-35岁一线城市白领影响情绪词和身份代入方式
hot_words月薪8000、便利店、带饭从热搜和评论区收集的具体词
pain_point外卖贵、没时间、吃腻了决定标题的情绪落点
example1 / example2上面两个示例决定文风的下限
count10每轮生成条数,建议 8-12
max_len25按平台和剩余字数来

这张表本质上是把老编辑脑子里的“我懂这个选题”翻译成模型能读的变量。hot_words 不要用“内卷”“焦虑”这类大词,要用“月薪8000”“便利店 30 块便当”这种具体名词。pain_point 是引发点击的引信,一条标题如果既没有具体对象也没有情绪指向,它就只是一句正确的废话。

填充变量的方法也很简单:每接到一个新选题,先用半个小时去抖音评论区、小红书搜索联想词、公众号看一看里扒 20 个高频词,填进表里。这个动作比调 prompt 参数更影响最终质量。没有素材表之前,我生成 100 条标题能用的不到 10 条;补上素材表之后,可用率能稳定到 40% 左右。

3.2 标题模板公式:从热点关键词到点击钩子的排列组合

标题工程里有一个认知误区:以为模板公式会限制创造力。事实上,模板公式是给模型看的“脚手架”,不是给读者看的成品。常见且有效的标题公式就那么几类,我平时会在 prompt 里同时给模型提供这组公式,让它每轮从不同公式出发:

公式类型结构示例
数字反差具体数字 + 反常识结论月薪 8000 的她,午饭只花 5 块
身份代入目标人群 + 痛点场景带饭的打工人,冰箱里藏着一个江湖
悬念问答设问 + 部分信息遮蔽便利店的 30 块便当,为什么比外卖干净
前后对比过去状态 vs 现在状态从顿顿外卖到一周带饭 4 天,我只改了 3 件事
干货清单数字 + 收益承诺打工人 10 分钟备好 3 天午餐的清单
反常识结论推翻默认认知别带饭了,你缺的不是饭是午休

这组公式在 prompt 里的表达方式,不是写“请使用以上公式”,而是把每个公式搭配一个具体示例塞进 quality 标准里。模型对示例的模仿能力远强于对抽象指令的理解。我一般会在 BASE_PROMPT 里加一句“参考以下公式和示例,每条标题尽量使用不同的切入角度”,然后把表格里的示例逐个贴进去。

如果你想让模型组合得更“花”,可以写一个简单的函数,把主题词、数字、人群、痛点、公式类型做一次笛卡尔积,产出一批“半成品标题骨架”,再让 DeepSeek 基于这些骨架改写。这个做法的好处是,模型不会跑偏到它自己记忆里的通用标题,因为骨架已经提供了具体名词和结构。

def build_title_seeds(theme, audience, pain_point, hot_words): """用变量组合生成一批标题骨架,供模型改写。""" seeds = [] for word in hot_words: seeds.append(f"{audience},{pain_point},{word}成了唯一的安慰") seeds.append(f"{theme},从{word}开始改变") seeds.append(f"{word}看似不起眼,却治好了{audience}的{pain_point}") return "\n".join(f"- {seed}" for seed in seeds)

这里参数 hot_words 是列表,比如["便利店 30 块便当", "隔夜冰箱味", "带饭被同事围观"];pain_point 是“外卖贵、没时间”。注意,骨架不需要写完整,它只是给模型提供具体意象。调用时把 build_title_seeds 的返回结果放进 user prompt 的最后一句:“请基于以下骨架完成标题,不要偏离骨架中的具体名词。”

3.3 去 AI 味与去重:用替换词表和语义指纹过滤车轱辘话

批量生成的另一个隐蔽问题,是模型会不自觉使用它的习惯性表达:“首先”“其次”“总之”“让我们一起”这类连接词不在标题里出现,但它会把标题写成“关于……的几点思考”或者“为什么……?答案出乎意料”。这些读起来就有 AI 味。我的办法是建一张禁用词表,直接写进 prompt 的负面清单,同时在后处理里再做一次过滤。

BANNED_WORDS = ["首先", "其次", "总之", "让我们", "在当今", "真正的", "竟然", "原来", "一切", "彻底"] def filter_titles(titles: list[str]) -> list[str]: """过滤掉命中禁用词或长度异常的标题。""" result = [] for title in titles: if len(title) > 40 or len(title) < 6: continue # 超出平台字数上限,或短到没有信息量 if any(word in title for word in BANNED_WORDS): continue if title.endswith(("吗?", "?")): # 疑问句保留,但连续三条都是问句会显得单调,这里交由人工判断 pass result.append(title) return result

参数上,字数上限我按公众号标题经验折中取 40 字;小红书可以放得更宽,抖音则要更短,你在实际使用中应该按 platform 变量传进来。BANNED_WORDS 是动态表,每个季度根据模型新的输出习惯补词。做这一层过滤之后,标题的可用率还会再往上走一截。

去重比过滤更棘手。字符串完全一致的去重没意义,因为模型输出“月薪8000的打工人午餐花费不到5块”和“月薪8000的打工人,午餐居然不到5块”在语义上是同一条。简单做法是抽关键词做指纹:只保留数字、名词和核心动词,忽略连接词和标点。你可以用 python 的 difflib 做两两相似度,但数据量一大就太慢;更实用的方法是把每条例标题里的数字和人称词提取出来作为指纹键,键相同就视为重复。

import re def title_fingerprint(title: str) -> str: """提取数字、人名/身份词、核心名词作为指纹。""" nums = re.findall(r"\d+", title) words = re.findall(r"[\u4e00-\u9fa5]{2,4}", title) core = [w for w in words if w not in {"一个", "一种", "真的", "彻底", "终于"}] return "|".join(nums[:2] + core[:3])

指纹相同的标题放到一个列表里,每轮只保留一条。这个方案有误差,但它的价值在于快,能让你在 500 条结果里快速筛掉明显的换皮重写。更严格的语义去重要靠向量嵌入,那属于进阶玩法,第 6 章我会给一个轻量版思路。

4. 端到端流水线:从素材表到标题库的实现脚本

4.1 准备素材 CSV:给脚本喂什么,脚本就回你什么

这一章落地一套可以跑的流水线。第一步是把素材整理成 CSV,列名和 BASE_PROMPT 的变量保持一致,这样脚本读取后可以直接格式化 prompt。我给一个最小可用的表结构:theme、platform、audience、pain_point、hot_words、count、max_len、examples。其中 hot_words 和 examples 是长文本,你可以用竖线|分隔多个值,脚本读进来再 split。

操作上不要直接在 Excel 里手工维护这份表,我一般用飞书多维表格或腾讯文档建一个共享表,让选题编辑每天往里面填新 row。脚本定时拉取未处理的行,跑完后把生成结果回写。这一步虽然听起来繁琐,但它决定了标题库能不能持续更新,而不是一次性玩具。

以下代码是脚本的素材读取部分,它会把 CSV 里每一行素材变成一个字典,并记录该行是否已经生成过结果,方便断点续跑。

import csv def load_assets(csv_path: str) -> list[dict]: """读取素材表,hot_words 和 examples 字段用 | 分割。""" rows = [] with open(csv_path, "r", encoding="utf-8-sig") as f: reader = csv.DictReader(f) for row in reader: if row.get("status") == "done": continue # 已生成过的行,跳过 row["hot_words_list"] = row.get("hot_words", "").split("|") row["examples_list"] = row.get("examples", "").split("|") rows.append(row) return rows

注意读取时用utf-8-sig编码,否则你用 Excel 存的中文 CSV 第一列会出现乱码。状态列status是给断点续跑用的,初始为空字符串,跑成功后写入done。这个设计能避免脚本中途网络中断后,已生成的素材行又被重复请求一遍。

4.2 批量请求与重试策略:把脚本稳定跑过夜

素材准备好之后,就是循环调用。下面这个脚本是完整的主流程:对每一行素材请求一次模型接口,解析结果,过滤禁用词,再写入一张总表。你可以直接另存为generate_titles.py修改参数使用。

import csv import json import time import random from openai import OpenAI from prompt_template import BASE_PROMPT, build_title_seeds from title_utils import parse_titles, filter_titles, title_fingerprint client = OpenAI( api_key="your-deepseek-api-key", base_url="https://api.deepseek.com" ) def request_with_retry(messages, max_retries=5): """带指数退避的重试请求,避免瞬时网络错误打断整批任务。""" for attempt in range(max_retries): try: resp = client.chat.completions.create( model="deepseek-chat", messages=messages, temperature=1.2, max_tokens=1024, top_p=0.9, timeout=60 ) return resp.choices[0].message.content except Exception as e: print(f"第{attempt + 1}次请求失败: {e}") time.sleep(min(2 ** attempt, 30)) return None def process_row(row: dict) -> list[str]: theme = row["theme"] platform = row["platform"] audience = row["audience"] pain_point = row["pain_point"] hot_words = row.get("hot_words_list", []) examples = row.get("examples_list", []) count = int(row.get("count", 10)) max_len = int(row.get("max_len", 25)) prompt_text = BASE_PROMPT.format( platform=platform, theme=theme, count=count, max_len=max_len, example1=examples[0] if examples else "", example2=examples[1] if examples else "" ) seeds = build_title_seeds(theme, audience, pain_point, hot_words) full_prompt = prompt_text + "\n# 参考骨架\n" + seeds messages = [ {"role": "system", "content": "你是标题生成器,只输出JSON数组。"}, {"role": "user", "content": full_prompt} ] raw = request_with_retry(messages) if raw is None: return [] return filter_titles(parse_titles(raw))

这个脚本里三个参数值得细说。temperature=1.2是我在标题生成场景里调出来的平衡点:低于 0.9 标题同质化明显,高于 1.4 又容易跑题到“无厘头”方向。top_p=0.9用来对候选词做一次截断,防止模型在概率分布的低概率区域采样到太生僻的词。timeout=60是为了避免极端情况下的长连接把整批任务卡住,失败后由重试逻辑接管。

4.3 结果落库与导出:给运营同事一台“标题榨汁机”

请求成功后,需要把结果汇总到一张总表。这里我会用两个文件:一个.jsonl用于记录原始返回,方便排查问题;一个.csv用于给运营同事筛选。JSONL 的好处是每行一条记录,追加写入效率高,而且不会因为中途退出把整个文件搞坏。

def append_results(filename: str, rows: list[dict]): """以追加方式写入JSONL,每行一个素材+生成结果。""" with open(filename, "a", encoding="utf-8") as f: for row in rows: f.write(json.dumps(row, ensure_ascii=False) + "\n") # 主流程示例记录 records = [] for asset in load_assets("assets.csv"): titles = process_row(asset) if titles: for t in titles: records.append({ "theme": asset["theme"], "platform": asset["platform"], "title": t, "fingerprint": title_fingerprint(t), "created_at": time.strftime("%Y-%m-%d %H:%M:%S") }) asset["status"] = "done" # 每处理完一行,立刻追加写入,避免内存越积越多 append_results("title_library.jsonl", records) records.clear() time.sleep(random.uniform(0.5, 1.5)) # 温和限速

为什么要 sleep 0.5 到 1.5 秒?因为批量任务一旦跑起来,接口速率限制和并发配额会变成新的瓶颈。官方 API 对并发有配额限制,超出会返回 429;本地部署的模型则可能因为显存或者推理引擎配置而排队。用随机 sleep 的原因是为了避免所有请求落在同一个时间点,形成一个尖峰。这段逻辑不复杂,但它是决定脚本能否“跑过夜”的关键。

导出 CSV 时,我会按 fingerprint 再做一次全局去重,然后输出一个带序号、平台、标题、主题、指纹列的表格,运营同事直接在 Excel 里筛选即可。到这里,一套从素材表到标题库的流水线就跑通了。

5. 五个高频坑与排查路径:先别急着投流量

5.1 输出重复与“车轱辘话”:prompt 里的“不要重复”为何失效

现象:一轮生成 10 条标题,有 5 条只是换了数字,“3 个方法”变“5 个技巧”,读起来全是同一个句子骨架。

原因:模型在概率空间里倾向于回到高频模式。你在 prompt 里写“不要重复”,它理解的是一个抽象要求,但实际采样时仍然会沿着概率最高的路径走。负面指令对生成模型的约束力很弱,这是模型机制决定的,不是玄学。

解决:第一,把 temperature 提高到 1.2 以上,让采样分布更分散。第二,在 prompt 里指定“第 1 条用疑问句,第 2 条用数字反差,第 3 条用身份代入”这种逐条约束,把发散变成显式指令。第三,在后处理里用 fingerprint 做一遍去重,指纹相同的只保留一条。三者配合之后,重复率能从肉眼可见降到可接受范围。

5.2 风格漂移:生成几百条后“新对话怎么承接上一个对话”才是真问题

现象:前 50 条标题风格正常,到第 200 条时开始出现“赋能”“抓手”“闭环”这类词,甚至开始像汇报工作。

原因:批量任务被塞进同一个长会话里,早期对话内容污染了后续生成。更常见的是,你和模型聊了半天别的,又来生成标题,它会下意识沿用前面的语气。

解决:让一个 session 只做一件事。批量脚本本身就是每次请求独立会话,不存在这个问题;但你在聊天界面手工操作时,一定要先开新对话,再把标题生成 prompt 重新粘贴一遍。这里有个实用技巧:把新对话的 system prompt 设为“你是标题生成器,只输出JSON数组”,然后把你之前生成的 20 条标题作为 few-shot 示例塞进去,让模型知道“现在的任务是承接这批标题的风格继续写,而不是重新发明一个风格”。这比在旧对话里顺手追加一句“继续生成”要稳定得多。我在维护标题库时,会在素材表里加一列 last_style_ref,存最近 20 条标题的全文,每次新任务前把它回填进 prompt。

5.3 格式漂移与 JSON 解析失败:模型偶尔不听话怎么办

现象:prompt 明明要求只输出 JSON 数组,模型却在开头写了“好的,以下是为您生成的标题”,结尾还加一句“希望这些对您有帮助”。更闹心的是,有时它把标题用 Markdown 的列表符号包起来。

原因:模型在训练时被强化了“礼貌对话”的模式,即使 system prompt 要求纯输出,这种惯性也偶尔会冒出来。

解决:这问题不要靠改 prompt 根治,因为即使命中率 95%,批量跑一万条也会有 500 条格式异常。正确做法是接受它,然后在解析层兜底。第 2 章的 parse_titles 已经做了围栏剥离和数组截取,能覆盖绝大多数情况。你还可以在代码里加一个统计接口:如果一批结果的解析失败率超过 10%,就暂停任务,把原始文本 dump 进日志文件,人工看一眼是不是 prompt 被意外改了。我用这个日志文件排查过两次问题,一次是转义字符把 JSON 引号搞坏了,一次是温度参数被别的任务改低导致输出缩成了“好的”。

5.4 标题“空、大、泛”:模型记住了模板,但不理解你的选题

现象:生成结果全是大词堆砌:“提升人生质量的 7 个秘诀”“如何成为一个高效的人”“职场人的自我修养”。这些标题扔到哪个平台都不会有人点。

原因:prompt 里没有素材变量,模型只能用自己记忆里的通用高频词。标题没有具体场景、具体数字、具体对象,自然就没有画面感和信任感。

解决:返回本章第 3 节的素材表,检查 hot_words 和 pain_point 是否填了具体内容。我给自己定了一个规则:一条素材如果拿不出三个具体名词,就不允许进入标题生成队列。没有“便利店 30 块便当”这种细节,模型只能生产“高质量生活方式”这种正确的废话。如果素材表已经填完整但还是空,那就是 prompt 里的质量标准和示例没有形成合力,你需要把示例改成更接近目标平台的真实爆款标题,让模型照猫画虎。

5.5 批量导出不等于批量发布:标题库是候选池,不是发稿清单

现象:团队按脚本生成了一批标题,筛选后直接替换掉原有标题批量发布,结果账号内容被判低质,流量比以前还差。

原因:标题工程解决的是“候选”问题,不是“发布”问题。平台的内容分发逻辑会综合看点击率、完读率、互动率,标题诱导性太强而内容跟不上,反而拉低账号权重。批量发布本身也违反内容平台的正常运营节奏,机器会识别出同一时段的高频低差异更新。

解决:把标题库定位为“弹药库”,每篇内容由人工从中选 3 条做 A/B 测试,先投小流量看数据再放量。我在团队里落地的方法是,标题库 CSV 增加两列:a_bucket 和 ctr_7d。每周从库里挑 10 条分别投放到两个低流量渠道,七天之后把点击率回填,算法选出的高潜标题再作为正式标题位使用。这套流程数据量不大,但对标题质量的提升是实打实的。

6. 进阶:给标题池装一个“评分器”,用阅读数据反向喂 prompt

批量生成只是第一步,真正的分水岭在于你有没有建立“反馈闭环”。我现在的做法是,把标题库里的候选标题定期交给 DeepSeek 按四个维度打分:点击动机、信息密度、情绪强度、可信度,每一项 1 到 5 分,最后返回一个总分和一句推荐理由。

def build_scoring_prompt(title: str, platform: str) -> str: return f""" 你是资深新媒体主编。请为下面这条标题打分,按“点击动机/信息密度/情绪强度/可信度”四个维度各打1-5分,并给出总分和建议。 标题:{title} 平台:{platform} 只输出JSON: {{"click_motivation": 0, "info_density": 0, "emotion": 0, "trust": 0, "total": 0, "comment": "一句话"}} """

我每两周跑一次评分,把 total 低于 12 分的标题直接标记为低潜,把 comment 里提到“数字不够具体”的标题作为 prompt 质量问题的信号回灌到第 3 节的变量表。这样一来,DeepSeek 不仅帮你生成标题,还在帮你做质量的量化筛选。

手动运营时,我还有一个习惯:把真实世界的阅读数据回填到标题库里。公众号后台导出点击率,小红书看曝光与点击比,抖音看 5 秒完播率。每个月抽出数据最好的 30 条标题,把它们作为新的 few-shot 示例注入下一轮的生成任务。这等于用平台投票结果持续校正模型文风,比任何 prompt 理论都管用。

最后说一个我的教训:有一阵我贪多,一次性让模型生成几百条标题,然后复制粘贴到选题会上,被同事一眼看穿是批量产物——倒不是标题写得差,而是十条里有八条用了同一个句式骨架,当时没有跑第 5 节的去重和风格漂移检查就交付了。从那以后,我给自己定了规矩:单批交付不超过 20 条,每一条都要经过过滤、评分和人工抽检三道关。量是手段,不是目的。希望这套从框架、脚本到避坑清单的做法能帮你在 DeepSeek 上把标题生成真正跑起来,少走几步我走过的弯路。祝你早日攒出那个越用越准的标题弹药库。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 7:05:12

CommBase:.NET串口通讯基类设计与工控实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:04:52

Intellij IDEA Debug调试失效原因与6类断点实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:03:50

光模块、光引擎、OCS与FAU:数据中心光互联技术演进深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:03:37

STM32嵌入式开发从入门到进阶:架构、外设与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 7:03:18

共模电感选型不踩坑:高速接口EMI与信号完整性全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华