Hexo安知鱼主题开启AI摘要

这篇文章是一篇教学文章,目的是替代原主题中只能使用洪墨 AI 的摘要功能,通过本教程,你可以使用 OpenAI 和 DeepSeek 等多种 AI 低价甚至免费的实现 AI 摘要功能。如果你有任何问题可以在文章末尾的评论区进行提问,我会尽快回复。

请注意,当你改动任何配置文件前请务必进行备份操作,这是一种保障也是一个良好的运维习惯。

效果图

AI Summary

工作原理

由于主题内置的是洪墨 AI 接口,由于种种原因,有些朋友可能已有使用较为顺手的 AI 工具。故此基础上,我查阅了一些资料写下本文。

本教程实现原理是,通过第三方插件 hexo-ai-summary-liushen 进行摘要的生成控制,然后写入文章的 Front-matter 中,再通过主题自带的 AI 摘要功能将其渲染。

hexo-ai-summary-liushen 插件基于 hexo-ai-excerpt 插件开发而来,原插件已经归档,于是 清羽飞扬 复刻了新的,进行了重构。

实现过程

前置条件

  1. 需主题版本大于 1.1.6 版本;
  2. 执行以下命令安装插件和依赖:
1
npm install hexo-ai-summary-liushen --save
1
npm install axios p-limit node-fetch --save

开启主题自带 AI 摘要功能

完成前置条件后,在安知鱼主题的配置文件(_config.yml)中找到 post_head_ai_description 字段(这里要注意,是安知鱼主题的配置文件,不是 hexo 的配置文件!)。将其修改为如下内容:

1
2
3
4
5
6
7
8
9
10
11
# 文章顶部ai摘要
post_head_ai_description:
enable: true
gptName: Evilrabbit AI
mode: local # 默认模式 可选值: tianli/local
switchBtn: false # 可以配置是否显示切换按钮 以切换tianli/local
btnLink: https://afdian.net/item/886a79d4db6711eda42a52540025c377
randomNum: 1 # 按钮最大的随机次数,也就是一篇文章最大随机出来几种
basicWordCount: 1000 # 最低获取字符数, 最小1000, 最大1999
key: xxxx
Referer: https://xx.xx/

这里的内容多为占位内容,除了 enablemode 选项,其他没有任何控制效果,都是为了占位,所以无需担心,可以先按照我的写,后面再根据效果修改。

将 enable 和 mode 改为 enable: truemode: local 即可。这里的意思是,开启主题自带的文章顶部 AI 摘要,模式选择为本地摘要。

重要提示

由于后续操作会将你文章的所有 description 和 keywords 进行 AI 重写。当你执行至本步骤时,请你务必保存所有文件,并进行全文件夹备份(包括所有文章)。

对比图:

AI Summary Comparison

配置插件

备份完成后,在博客根目录 Hexo 的配置文件(_config.yml)中任何位置添加如下新键值(此时是 Hexo 的配置文件,不是安知鱼主题的配置文件!这二者非常相似。):

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
# 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: ai # 摘要写入字段名(安知鱼官方使用的是“ai”),重要配置,谨慎修改!!!!!!!
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字之间,仅介绍文章核心内容。
请用中文作答,去除特殊字符,输出内容开头为“这里是Evilrabbit,这篇文章”。

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

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

下面是配置的说明:

  1. cover_all:覆盖性重新生成所有摘要,非必要不要打开,可能会导致过量的 API 消耗。

  2. logger:为了更加精细的实现控制,清羽飞扬设置了三个日志等级,如下划分:

    • 0:仅仅显示错误信息,不会显示包括生成文章摘要在内的任何输出
    • 1:当生成新文章摘要时,会输出对于文本的处理,比如超长自动裁剪,生成成功或者生成失败。
    • 2:调试使用,会输出包括跳过所有页面信息,仅仅处理文章部分。
  3. api:任何 OpenAI 类型接口,包括 deepseek,讯飞星火,腾讯混元,ChatGPT 等。

  4. token:API 对应的接口密钥。

  5. model:使用的模型名称,请检查对应接口文档说明,不同接口包含的模型不一致。

    • ChatGPT模型建议:gpt-3.5-turbo
    • DeepSeek 模型建议:deepseek-chat
    • 其余请查询具体官方文档。
  6. prompt:提示词,请自行定制,建议详细一些,但是不要太废话,以清羽飞扬写的为例。

  7. 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;

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

  1. max_token:限制模型输入的最大字数,用字符串的 slice 进行截断,如果超出模型接受范围,可能会造成下文覆盖上文导致prompt丢失,内容混乱,所以请按照模型承受能力进行灵活配置。

  2. concurrency:很多模型会限制并发,所以这里清羽飞扬利用 p-limit 插件实现了并发限制,降低失败请求的概率,经过调查,p-limit应该是hexo内已经有的一些包,所以也不需要担心需要重新安装之类的,直接使用即可。

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

— — 原文参考地址(https://blog.liushen.fun/posts/40702a0d/)[https://blog.liushen.fun/posts/40702a0d/]

验证内容和例外文章

如果一切正常,此时执行 Hexo 三连(hexo cl && hexo g && hexo s)后就可以在每篇文章的顶部看到对应的摘要文字。

但这里我再次提醒:

此操作会将你文章的所有 description 和 keywords 进行 AI 重写。请你务必保存所有文件,并进行全文件夹备份(包括所有文章)。

如果存在例外文章,你不想让其显示 AI 摘要,你可以在文章的 Front-matter 中添加 is_summary: false 进行排除,此时该文章将不显示 AI 摘要。