让博客支持使用 ChatGPT 生成文章摘要是一种什么样的体验?

news2024/11/24 2:36:09

让博客支持使用 ChatGPT 生成文章摘要是一种什么样的体验?

起因

Sakurairo 主题支持了基于 ChatGPT 的 AI 摘要功能,我有点眼红,但是因为那是个主题限定功能,而我用的又是 Argon,遂想着让 Argon 也支持 AI 摘要功能。

截至目前,此功能已经合并到了 argon-theme 主仓库的 dev 分支,pr 现场可参见:#607

开发

和 Sakurairo 相同,我采用了 haozi-team/chatgpt-php 库以对接 OpenAI 接口(顺便给 Argon 添加了 Compose 支持) 。

接下来,在 settings.php 和 inc/fun/post-extra-meta-editor.php 添加了全局和文章单独设置,以允许用户配置 OpenAI 地址,密钥,以及是否需要使用 AI 摘要功能。

最后,在 inc/fun/post.php 和 template-parts/entry/excerpt.php 添加页面样式,就完成了开发。

有关 ChatGPT 部分的核心代码如下:

<?php

use GuzzleHttp\Exception\GuzzleException;
use HaoZiTeam\ChatGPT\V2 as ChatGPTV2;

function argon_generate_chatgpt_client(): ?ChatGPTV2 {

 $apikey  = get_option( "argon_openai_api_key" );
 $baseurl = $GLOBALS["openai_baseurl"];

 if ( ! $apikey || ! isset( $baseurl ) ) {
  return null;
 }

 return new ChatGPTV2( $apikey, $baseurl , model: get_option('argon_ai_model', 'gpt-3.5-turbo'), timeout: 30 );
}

/**
 * @throws Exception|GuzzleException
 */
function argon_generate_article_summary( int $post_id, WP_Post $post ): string {
 $client = argon_generate_chatgpt_client();

 $client->addMessage(
  "You are an article summary generator, ".
  "please generate the summary of the given article ".
  "with provided title and content, ".
  "the language of the summary must equals to the article's mainly used language, ".
  "do not write summary in third person.".
  "system" );
 $client->addMessage( "The title of the article:" . $post->post_title );

 $content = $post->post_content;
 $content = wp_strip_all_tags(apply_filters('the_content', $content));
 $max_content_length = get_option( 'argon_ai_max_content_length', 4000 );
 if ($max_content_length > 0){
  $content = substr($content, 0, $max_content_length);
 }

 $client->addMessage( "The content of the article:" . $content );
 $previous_summary = get_post_meta( $post_id, "argon_ai_summary", true );
 if ( $previous_summary != "" ) {
  $client->addMessage( "The previous summary of the article, please generate the summary similar with the previous one: " . $previous_summary);
 }

 $post_argon_ai_extra_prompt_mode = get_post_meta( $post_id, "argon_ai_extra_prompt_mode", true );
 $post_argon_ai_extra_prompt      = get_post_meta( $post_id, "argon_ai_extra_prompt", true );
 $global_argon_ai_extra_prompt    = get_option( 'argon_ai_extra_prompt', "" );
 switch ( $post_argon_ai_extra_prompt_mode ) {
  case 'replace':
   $client->addMessage( $post_argon_ai_extra_prompt, 'system' );
   break;
  case 'append':
   $client->addMessage( $global_argon_ai_extra_prompt . $post_argon_ai_extra_prompt, 'system' );
   break;
  case 'none':
   break;
  case 'default':
  default:
   $client->addMessage( $global_argon_ai_extra_prompt, 'system' );
   break;
 }

 $result = "";
 foreach ( $client->ask( "Now please generate the summary of the article given before" ) as $item ) {
  $result .= $item['answer'];
 }

 return $result;
}


function argon_on_save_post( int $post_id, WP_Post $post, string $old_status ): void {
// if ( false !== wp_is_post_autosave( $post_id ) || 'auto-draft' == $post->post_status ) {
//  return;
// }

 // If this is a revision, get real post ID.
 $revision_id = wp_is_post_revision( $post_id );

 if ( false !== $revision_id ) {
  $post_id = $revision_id;
 }

 if ( get_option( 'argon_ai_post_summary', false ) == 'false' || get_post_meta( $post_id, "argon_ai_post_summary", true ) == 'false' ) {
  return;
 }
 $update                                 = $old_status === $post->post_status;
 $post_argon_ai_no_update_post_summary   = get_post_meta( $post_id, "argon_ai_no_update_post_summary", true );
 $global_argon_ai_no_update_post_summary = get_option( 'argon_ai_no_update_post_summary', true );
 if ( $update && $post_argon_ai_no_update_post_summary != 'false' && ( $post_argon_ai_no_update_post_summary == 'true' || $global_argon_ai_no_update_post_summary == 'true' ) ) {
  return;
 }

 if ( get_option( 'argon_ai_async_generate', true ) != 'false' ) {
  wp_schedule_single_event( time() + 1, 'argon_update_ai_post_meta', array( $post_id ) );
 } else {
  argon_update_ai_post_meta( $post_id );
 }
}

function argon_update_ai_post_meta( $post_id ): void {
 try {
  $summary = argon_generate_article_summary( $post_id, get_post( $post_id ) );
  update_post_meta( $post_id, "argon_ai_summary", $summary );
 } catch ( Exception|GuzzleException $e ) {
  error_log( $e );
 }
}

add_action( "argon_update_ai_post_meta", "argon_update_ai_post_meta" );
add_action( "publish_post", "argon_on_save_post", 20, 3 );

成品

 

 

总体来说,是非常满足我的需求的,用起来也很方便。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【spring】spring是什么?详解它的特点与模块

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、spring介绍 二、spring的特点&#xff08;七点&#xff09; 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

springcloud 父项目建立(一)

我们开发项目&#xff0c;现在基本都用到maven&#xff0c;以及用父子项目&#xff0c;以及公共模块依赖&#xff0c;来构建方便扩展的项目体系&#xff1b; 首先我们建立父项目 microservice &#xff0c;主要是一个pom&#xff0c;管理module&#xff0c;以及管理依赖&#x…

shell实现多并发控制

背景&#xff1a; 遇到一个业务需求&#xff0c;一个上位机需要向多个下位机传送文件&#xff0c;当前的实现是for循环遍历所有下位机&#xff0c;传送文件&#xff0c;但是此种方法耗时太久&#xff0c;需要优化。因此可以通过并发的方式向下位机传送文件。 这边写一段测试代…

【Vue3 第二十七章】路由和状态管理

一、路由 1.1 服务端路由 与 客户端路由 服务端路由 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果。当我们在一个传统的服务端渲染的 web 应用中点击一个链接时&#xff0c;浏览器会从服务端获得全新的 HTML&#xff0c;然后重新加载整个页面。客户端路…

人机交互学习-2 人机交互基础知识

人机交互基础知识 交互框架作用执行/评估活动周期 EEC四个组成部分七个阶段和两个步骤 执行隔阂&评估隔阂扩展EEC模型四个部分两个阶段 交互形式命令行交互菜单驱动界面基于表格的界面直接操纵问答界面隐喻界面自然语言交互交互形式小结 理解用户信息处理模型信号处理机人类…

“秩序与自由”——超详细的低代码开发B端产品前端页面设计规范

Hi&#xff0c;我们是钟茂林和李星潮&#xff0c;来自万应低代码 UI 设计团队。 编辑搜图 编辑搜图 左&#xff1a;钟茂林 右&#xff1a;李星潮 在过去&#xff0c;B 端应用通常只在企业内部员工中使用&#xff0c;与 C 端产品数以千万计的用户相比显得少之…

Pycharm 配置Django 框架(详解篇)

首先你必须具备pycharm 专业版 / 社区版也可以 打开pycharm专业版 找到在最下方菜单栏找到 Terminal 第二步&#xff1a;检查自己的python版本 python --version 第三步&#xff1a; 寻找和自己python版本匹配的django版本 &#xff08;图片来源&#xff1a; 化雨随风 …

【NLP模型】文本建模(2)TF-IDF关键词提取原理

一、说明 tf-idf是个可以提取文章关键词的模型&#xff1b;他是基于词频&#xff0c;以及词的权重综合因素考虑的词价值刻度模型。一般地开发NLP将包含三个层次单元&#xff1a;最大数据单元是语料库、语料库中有若干文章、文章中有若干词语。这样从词频上说&#xff0c;就有词…

华为OD机试真题 JavaScript 实现【最小传输时延】【2023 B卷 100分】,附详细解题思路

一、题目描述 某通信网络中有N个网络节点&#xff0c;用1到N进行标识。 网络通过一个有向无环图表示&#xff0c;其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i] {u,v,w}&#xff0c;u表示源节点&#xff0c;v表示目的节点&#xff0c;…

C++入门攻略

C补足C语言部分缺陷 1.命名空间&#xff1a;1.1 命名空间namespace关键字1.命名空间中可以定义变量、函数、类型2.命名空间可以嵌套3.相同命名空间共存 1.2 命名空间的使用方式&#xff1a;1.名称加用域作用限定符的方式访问&#xff08;同上&#xff09;2.使用using引入某个空…

现在学大数据还来得及么

种一棵树最好的时机是十年前&#xff0c;其次是现在。如果你想学&#xff0c;那么就一定来的及。 Python 已成利器 在大数据领域中大放异彩 Python&#xff0c;成为职场人追求效率的利器&#xff0c;因为不管什么工作&#xff0c;数据都会是工作的一部分&#xff0c;有数据的…

学习【菜鸟教程】【C++ 继承】

链接 1. 教程原文 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;您不需要重新编写新的…

精通postman教程(一)下载及安装详解

作为一名测试工程师&#xff0c;那么Postman绝对是大伙必备的工具之一。 在这个系列教程中&#xff0c;我将为大伙详细讲解如何使用Postman进行API测试。 今天我将先为大伙介绍Postman的下载安装方法&#xff0c;让你们快速上手这款工具。 一、下载 下载地址&#xff1a;Do…

基于Java学院党员管理系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Java学习笔记(视频:韩顺平老师)4.0

如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 因为作者能力水平有限&#xff0c;欢迎各位大佬指导。 目录 如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 控制结构 顺序 分…

【面试系列】2023金三银四面经

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

深入浅出RTA广告投放

一、RTA诞生背景 广告主在媒体投放广告时&#xff0c;往往需要将数据回传给DSP或媒体平台&#xff0c;供他们进行针对性优化。但是随着很多公司对数据隐私性的重视和保护&#xff0c;导致广告主不能或者不愿意将数据回传给DSP或媒体平台&#xff0c;但这样做又必然导致投放模型…

Lightroom Classic 2023(版本 12.3)主要新增功能

macw发布了Adobe Lightroom Classic 2023(版本 12.3)软件&#xff0c;该版本新增了哪些功能呢&#xff1f;随着小编一起了解一下吧&#xff01; 主要新增功能概述 轻松消除图像中的杂色 借助 AI 支持的降噪功能&#xff0c;可以轻松、有效地消除 RAW 图像中的杂色&#xff0c…

抽象工厂模式(六)

过气的&#xff0c;终究是过气了 上一章简单介绍了工厂方法模式(五), 如果没有看过,请观看上一章 一. 抽象工厂模式 引用 菜鸟教程里面的单例模式介绍: https://www.runoob.com/design-pattern/abstract-factory-pattern.html 抽象工厂模式&#xff08;Abstract Factory Pat…

记Gitlab备份与设置自动备份

今天给Gitlab做了一个备份&#xff0c;并且设置了每天自动备份&#xff0c;记录一下。 一、导出全部项目 由于Gitlab Web页面并没有自动备份的相关设置&#xff0c;只有各个项目有一个“导出项目”功能。为了保证安全&#xff0c;先把所有项目全部使用“导出项目”功能导出一…