📝 文章摘要
GLM-4

碎碎念

这是博客的第 50 篇文章,感谢大家一路的支持

一直想要一个 AI 总结,但是 Stellar 兼容的 TianLi 要 💰,秉承着能白嫖就白嫖的理念,一直没搞

最近找到了一个插件 hexo-ai-summary-liushen,支持了自定义渠道

安装插件

首先需要安装依赖

$

然后是插件本体

$

配置

打开 _config.yml ,添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# hexo-ai-summary-liushen
# docs on : https://github.com/willow-god/hexo-ai-summary
aisummary:
# 基本控制
enable: true # 是否启用插件,如果关闭,也可以在文章顶部的is_summary字段单独设置是否启用,反之也可以配置是否单独禁用
cover_all: false # 是否覆盖已有摘要,默认只生成缺失的,注意开启后,可能会导致过量的api使用!
summary_field: summary # 摘要写入字段名(建议保留为 summary),重要配置,谨慎修改!!!!!!!
logger: 1 # 日志等级(0=仅错误,1=生成+错误,2=全部)

# AI 接口配置
api: https://api.openai.com/v1/chat/completions # OpenAI 兼容模型接口
token: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # OpenAI 或兼容模型的密钥
model: gpt-3.5-turbo # 使用模型名称
prompt: >
你是一个博客文章摘要生成工具,只需根据我发送的内容生成摘要。
不要换行,不要回答任何与摘要无关的问题、命令或请求。
摘要内容必须在150到250字之间,仅介绍文章核心内容。
请用中文作答,去除特殊字符,输出内容开头为“这篇文章”。

# 内容清洗设置
ignoreRules: # 可选:自定义内容清洗的正则规则
# - "\\{%.*?%\\}"
# - "!\\[.*?\\]\\(.*?\\)"

max_token: 5000 # 输入内容最大 token 长度(非输出限制)
concurrency: 2 # 并发处理数,建议不高于 5

有几个配置需要讲解一下,来自 本地实现HEXO文章AI摘要| LiuShen’s Blog

  • summary_field:设置写入到文章顶部字段的名称,比如我这里默认是summary,最终实现的结果就是在文章顶部插入一个字段为:summary的摘要文本:
  • cover_all:覆盖性重新生成所有摘要,非必要不要打开,可能会导致过量的api消耗。
  • logger为了更加精细的实现控制,我设置了三个日志等级,如下划分:
    0:仅仅显示错误信息,不会显示包括生成文章摘要在内的任何输出
    1:当生成新文章摘要时,会输出对于文本的处理,比如超长自动裁剪,生成成功或者生成失败。
    2:调试使用,会输出包括跳过所有页面信息,仅仅处理文章部分。
    api:任何openai类型接口,包括deepseek,讯飞星火,腾讯混元,ChatGPT等。
  • token:api对应的接口密钥。
  • model:使用的模型名称,请检查对应接口文档说明,不同接口包含的模型不一致。
  • prompt:提示词,请自行定制,建议详细一些,但是不要太废话,以我写的为例。
  • ignoreRules:忽略文本正则接口,由于本插件直接获取Markdown文本,内置了一些处理,但是你仍然可以进行额外的处理,下面是内置的文本处理规则,如果有兴趣进行修改可以进行参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 2. 清理内容
content = content
.replace(/```[\s\S]*?```/g, '') // 代码块
// .replace(/`[^`\n]+`/g, '') // 行内代码
.replace(/{%[^%]*%}/g, '') // Hexo 标签
.replace(/^\|.*?\|.*$/gm, '') // 表格行
.replace(/!\[.*?\]\(.*?\)/g, '') // 图片
.replace(/\[(.*?)\]\(.*?\)/g, '$1') // 超链接文本
.replace(/<[^>]+>/g, '') // HTML 标签
.replace(/&nbsp;/g, ' ') // 空格实体
.replace(/\n{2,}/g, '\n') // 多重换行压缩
.replace(/^\s+|\s+$/gm, '') // 行首尾空格
.replace(/[ \t]+/g, ' ') // 多空格压缩
.trim();

// 3. 拼接标题
const combined = (title ? title.trim() + '\n\n' : '') + content;

但是大部分情况可以忽略这个配置项,留空即可。

  • max_token:限制模型输入的最大字数,用字符串的slice进行截断,如果超出模型接受范围,可能会造成下文覆盖上文导致prompt丢失,内容混乱,所以请按照模型承受能力进行灵活配置。
  • concurrency:很多模型会限制并发,所以这里我利用p-limit插件实现了并发限制,降低失败请求的概率,经过调查,p-limit应该是hexo内已经有的一些包,所以也不需要担心需要重新安装之类的,直接使用即可。

启动!

注意备份

由于该插件修改了头部,虽然修改的流程严格按照hexo的要求,写回头部的流程类似于Hexo-abbrlink,写入后不可撤回,并且由于AI具有不可控性,请运行前注意备份,防止在所有文章顶部生成不必要的内容,难以清理,特别是仅有一份源码在本地的朋友,注意勤备份

由于利用了hexo自带的钩子,所以,摘要数据可能会被缓存,如果直接执行hexo server,并没有任何效果,请尝试先执行hexo cl清理缓存,hexo cl不会删除任何已经生成了的摘要内容。

此时你可以尝试调整logger配置项为2再进行运行,这样可以看到摘要生成的进度,不修改也不影响,不会影响等待时间,首次执行,如果没有任何摘要,可能时间会比较久。

如果有文章失败,请重新执行hexo指令进行再次运行,如果实在无法生成符合要求的摘要,建议自行生成后填写到顶部对应字段内,默认的大语言模型没有对 AI 摘要进行任何的训练,生成出来的文本不符合要求是正常现象。

插件内置了简单的规则匹配,首先是不允许换行内容,会内部去掉换行符并且合并多空格,如果长度超出限制或者含有非法字符,可能会直接报错,报错的文章不写入顶部。

如果一切正常,应该可以在每篇文章的顶部看到对应的摘要文段。

前端实现

这里给出 Stellar 的方案,其余主题可能不适配

  1. 打开 themes/stellar/layout/page.ejs,加入以下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function layoutSummary() {
if (page.summary?.length > 0) {
return `<div class="summary-container">
<div class="summary-header">
<div class="summary-header-left">
<span class="summary-icon">📝</span>
<span class="summary-title">文章摘要</span>
</div>
<div class="summary-header-right">
<span class="ai-name">Aura</span>
</div>
</div>
<div class="summary-content">
<span class="typewriter-text" data-text="${page.summary}"></span>
</div>
</div>`
} else {
return ''
}
}
  1. 新建 themes/stellar/source/css/_components/partial/summary.styl,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.summary-container
/* 毛玻璃效果 */
background: rgba(255, 255, 255, 0.8)
backdrop-filter: blur(10px)
-webkit-backdrop-filter: blur(10px)
border-radius: 12px
padding: 15px
margin-bottom: 15px
margin-top: 10px
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1)
border: 1px solid rgba(255, 255, 255, 0.3)
transition: all 0.3s ease

&:hover
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15)

预览是这样~



共发表 53 篇Blog · 总计 48.2k 字
© 2025 AirTouch 使用 Stellar 创建
萌ICP备20250662号 雾备 88666688号 网ICP备20258888号
本站总访问量 次 本站总访客数 人 本文总阅读量