perf: 全链路 LLM 提示词优化 + 微信公众号配图改为 base64 内联

- research.py: 提示词增加热点关联/独特观点储备/市场价值判断/平台搜索趋势
- outline.py: 增加反常识洞察/平台推荐优化/每章市场价值产出要求
- writer.py _expand_section: 增加独特观点/热点时效/专业简洁/平台推荐友好要求
- writer.py _optimize_title: 各平台补充搜索热词利用/情绪感召/参考真实爆款语气
- writer.py wechat配图: placeholder.jpg 改为 base64 内联 SVG(带相机图标+提示文案),预览可渲染,复制即用
This commit is contained in:
Yuzhiran Dev
2026-05-18 05:49:50 +08:00
parent 41b0f694ee
commit 39719354fb
3 changed files with 68 additions and 36 deletions
+36 -15
View File
@@ -105,17 +105,26 @@ class Writer:
return content
if HAVE_LLM and len(content) < 150:
logger.info(f"使用 LLM 扩写章节: {section['title']}")
prompt = f"""你是一个真人写作者,正在写一篇关于「{self.topic['title']}」的文章。现在写「{section['title']}」这一节。
prompt = f"""你是一个真人写作者+行业观察者,正在写一篇关于「{self.topic['title']}」的文章。现在写「{section['title']}」这一节。
笔记要点:
{content}
要求(逐条对照):
要求(逐条对照,每一条都不能跳过):
### 热点与时效
- **引用2025-2026年最新数据/事件/政策/行业报告**,禁用过时数据
- 体现当前国内外在讨论什么、最新的趋势变化
- 每个论点尽量配一个真实发生的最新案例
### 独特观点
- 有自己的判断和立场,拒绝"车轱辘话""正确废话"
- 至少提供一个"大多数人没想到"的角度
- 宁可尖锐,也不要平庸
### 价值
- 回答读者一个具体问题或解决一个困惑
- 每个论点配真实案例或数据,不写空话
- **所有数据必须使用2025-2026年最新数据**,禁用过时数据
- 结束时读者要有「学到了」的感觉
- 每段回答一个"所以呢?"——读者看完能带走什么
- 结束时读者要有「学到了+想转发」的感觉
### 真人感
- 用「你」或「我们」视角,不要用「我」
@@ -128,9 +137,14 @@ class Writer:
- 自然融入1-2个目标搜索词,不生硬堆砌
- 第一句包含核心关键词
### 长度
### 专业与简洁
- 语言精准,不注水,不为了字数凑内容
- 200-400字,写到点子上就停
### 平台推荐友好
- 节奏不能平,要有起承转合
- 结尾要让人有点赞/收藏/转发的冲动
直接输出段落正文。"""
try:
expanded = call_llm(prompt, temperature=0.6, max_tokens=1500)
@@ -279,11 +293,13 @@ class Writer:
要求:
- 有信息量:一看就知道能解决什么问题
- 含知乎搜索关键词(SEO
- 含知乎搜索关键词(SEO,利用知乎搜索联想热词
- 带数字或对比最好(「3个方法」「从…到…」)
- 20字以内
- 参考知乎真实高赞标题,不要套路句式
- 参考知乎真实高赞标题风格,不要套路句式
- 避免「如何…」废句式、「XXX指南/手册/全攻略」
- 有观点、有态度,不是中性描述
- 直击目标读者痛点或好奇心
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
@@ -295,10 +311,12 @@ class Writer:
要求:
- 制造好奇心和点击欲,让人觉得不点开会错过
- 包含微信搜索关键词(微信SEO
- 包含微信搜索关键词(微信SEO,利用搜一搜热门词
- 口语化,不要书面腔
- 不要感叹号堆砌,不要「重磅/震惊/紧急」
- 字数15-25字最佳
- 有情绪感召力:共鸣/好奇/焦虑/期待
- 参考近期10万+标题的语气节奏
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
@@ -310,12 +328,13 @@ class Writer:
要求:
- 20字以内
- 采用爆款模式:数字+结果/痛点+方案/反常识观点
- 包含小红书搜索关键词(SEO
- 带1个emoji点缀
- 有场景感/结果感
- 采用爆款模式:数字+结果/痛点+方案/反常识观点/对比式
- 包含小红书搜索关键词(SEO,利用搜索下拉热词
- 带1个精准emoji点缀,不要三个起堆
- 有场景感/结果感/获得感
- 不要「必看/收藏/码住」
- 像真实用户写的,不是运营写的
- 参考小红书搜索热榜标题风格
- 直接输出3个标题选项,每行一个,不要输出思考过程
生成 3 个选项,每行一个。""",
@@ -354,8 +373,10 @@ class Writer:
# WeChat: insert image placeholder at start of body
if platform == "wechat":
img_tag = '<p><img src="placeholder.jpg" alt="配图" style="width:100%;max-width:1080px;border-radius:8px;"></p>\n'
# Insert after <h1> if present, else prepend
img_svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1080" height="600" viewBox="0 0 1080 600" style="width:100%;max-width:1080px;border-radius:8px;background:#f0f2f5"><rect width="1080" height="600" fill="#f0f2f5"/><g transform="translate(540,260)" text-anchor="middle" font-family="-apple-system,BlinkMacSystemFont,sans-serif"><circle cx="0" cy="-20" r="40" fill="#d0d5dd"/><path d="M-25,10 L-10,10 L-5,0 L5,0 L10,10 L25,10 L25,60 L-25,60 Z" fill="#d0d5dd"/><circle cx="0" cy="10" r="15" fill="#fff"/><text y="80" font-size="18" fill="#98a2b3">点击替换配图(建议 1080×600</text></g></svg>'
import base64
img_b64 = 'data:image/svg+xml;base64,' + base64.b64encode(img_svg.encode('utf-8')).decode('ascii')
img_tag = f'<p><img src="{img_b64}" alt="配图" style="width:100%;max-width:1080px;border-radius:8px;"></p>\n'
h1_end = html_content.find('</h1>')
if h1_end != -1:
html_content = html_content[:h1_end + 5] + '\n' + img_tag + html_content[h1_end + 5:]