问答

怎么把公众号文章转成干净文本,放进 RAG 知识库?

简短回答

先用公众号历史文章接口列出文章(每 10 篇 $0.04),再逐篇调用文章详情(每篇 $0.02),拿到纯文本正文和标题、公众号、发布时间。300 篇的号一共 $7.20,Markdown 头信息和切块由你自己加。

做一个回答行业问题的内部助手,它读过什么决定了它能答成什么样,而国内很多行业内容都在公众号里。把一个号导进 RAG 知识库分两步:用公众号历史文章列出文章,再把每个链接交给公众号文章详情。详情接口返回保留了段落的纯文本正文,外加标题、公众号、作者署名和发布时间,引用出处需要的信息都齐了。

正文是什么样的

文章的 HTML 被还原成文字:段落和小标题各占一行,脚本和样式全部去掉,正文里的图片不保留(封面图地址放在 images 里),表格会被压成几行文字。拿来做向量化正合适。要是你需要原样排版、图片在原位,这个接口就不对路,看文末的其他办法。

费用

任务 调用 费用
1 个号,300 篇 列表 30 次 + 详情 300 次 {{cost:wechat_mp.accounts.articles.list30+wechat_mp.articles.get300}}
10 个号,各取最新 50 篇 列表 50 次 + 详情 500 次 {{cost:wechat_mp.accounts.articles.list50+wechat_mp.articles.get500}}
同事随手丢来的链接,1,000 篇 详情 1,000 次 $20.00

已删除的文章返回 not_found,不收费。

从链接到 Markdown 文件

import os, pathlib, requests

API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
OUT = pathlib.Path("kb/wechat"); OUT.mkdir(parents=True, exist_ok=True)

def save(url):
    body = requests.get(API + "/v1/wechat_mp/articles/get", headers=H, timeout=90,
                        params={"url": url, "view": "full"}).json()
    if body["code"] != "ok":
        print("跳过", url, body["code"]); return
    a = body["data"]["item"]
    header = (f"---\ntitle: {a['title']!r}\naccount: {a['author']['name']!r}\n"
              f"published: {a['published_at']}\nsource: {a['url']}\n---\n\n")
    (OUT / f"{a['id']}.md").write_text(header + f"# {a['title']}\n\n" + a["text"], encoding="utf-8")

save("https://mp.weixin.qq.com/s/xxxxxxxx")

按空行切块,每块 300 到 800 个汉字,每一块的元数据里都带上标题和原文链接,模型回答时才能注明出处。

建知识库时容易踩的坑

  • 转载重复。 很多号会转别人的文章。加 view=full 后,ext.copyright 和 ext.source_url 能帮你认出转载,入库前去重,免得同一篇文章在检索里占好几个位置。
  • 更新。 每周跑一次历史文章接口,只取库里还没有的链接。
  • 版权。 用于内部研究,保留原文链接,不要把整篇文章原样输出给用户。
  • 文本不可信。 文章是外人写的,提示词里要讲清楚:检索到的段落是资料,不是指令。

其他办法

wechat-article-exporter 这类开源导出工具能把文章连图片一起存成 HTML 或 Markdown,做存档、离线阅读更合适,前提是你提供一个公众号后台登录。只有几篇的话,直接复制粘贴进笔记工具也行。如果是你自己的号,微信官方接口能直接返回文章内容。跨平台的研究流程可以看内容研究。

更新于