巧用Cloudflare功能实现Z-BlogPHP智能AI摘要

南蛮子懋和2024年12月16日Z-BlogPHP3103
文章摘要
DaoGPT
此内容根据文章AI生成,并经过人工审核,仅用于文章内容的解释与总结
投诉

特别鸣谢@Mayx的鼎力支持,使小道实现了巧用Cloudflare功能实现Z-BlogPHP智能AI摘要的基本功能。

思路

https://mayx.eu.org/2024/07/03/ai-summary

今日与大佬共同努力实现了运用Cloudflare的Workers与数据库实现Z-BlogPHP智能AI摘要的基本功能。

步骤

首先在Cloudflare的Workers选择ai,创建LLM App,部署之后,将下述代码粘贴再部署一遍。

async function sha(str) {
  const encoder = new TextEncoder();
  const data = encoder.encode(str);
  const hashBuffer = await crypto.subtle.digest("SHA-256", data);
  const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
  const hashHex = hashArray
    .map((b) => b.toString(16).padStart(2, "0"))
    .join(""); // convert bytes to hex string
  return hashHex;
}

export default {
  async fetch(request, env, ctx) {
    const db = env.blog_summary;
    const url = new URL(request.url);
    const query = decodeURIComponent(url.searchparams.GET('id'));
    const commonHeader = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': "*",
      'Access-Control-Allow-Headers': "*",
      'Access-Control-Max-Age': '86400',
    }
    if (query == "null") {
      return new Response("id cannot be none", {
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': "*",
          'Access-Control-Allow-Headers': "*",
          'Access-Control-Max-Age': '86400',
        }
      });
    }
    if (url.pathname.startsWith("/summary")) {
      let result = awAIt db.prepare(
        "SELECT content FROM blog_summary WHERE id = ?1"
      ).bind(query).first("content");
      if (!result) {
        return new Response("No Record", {
          headers: commonHeader
        });
      }

      const messages = [
        {
          role: "system", content: `
          你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
          技能
            精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
            关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
            客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
          约束
            输出内容必须以中文进行。
            必须确保摘要内容准确反映原文章的主旨和重点。
            尊重原文的观点,不能进行歪曲或误导。
            在摘要中明确区分事实与作者的意见或分析。
          提示
            不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
          格式
            你的回答格式应该如下:
              这篇文章介绍了<这里是内容>
          ` },
        { role: "user", content: result.substring(0, 5000) }
      ]

      const stream = awAIt env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
        messages,
        stream: true,
      });

      return new Response(stream, {
        headers: {
          "content-type": "text/event-stream; charset=utf-8",
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Methods': "*",
          'Access-Control-Allow-Headers': "*",
          'Access-Control-Max-Age': '86400',
        }
      });
    } else if (url.pathname.startsWith("/GET_summary")) {
      const orig_sha = decodeURIComponent(url.searchparams.get('sign'));
      let result = await db.prepare(
        "SELECT content FROM blog_summary WHERE id = ?1"
      ).bind(query).first("content");
      if (!result) {
        return new Response("no", {
          headers: commonHeader
        });
      }
      let result_sha = await sha(result);
      if (result_sha != orig_sha) {
        return new Response("no", {
          headers: commonHeader
        });
      } else {
        let resp = await db.prepare(
          "SELECT summary FROM blog_summary WHERE id = ?1"
        ).bind(query).first("summary");
        if (resp) {
          return new Response(resp, {
            headers: commonHeader
          });
        } else {
          const messages = [
            {
              role: "system", content: `
          你是一个专业的文章摘要助手。你的主要任务是对各种文章进行精炼和摘要,帮助用户快速了解文章的核心内容。你读完整篇文章后,能够提炼出文章的关键信息,以及作者的主要观点和结论。
          技能
            精炼摘要:能够快速阅读并理解文章内容,提取出文章的主要关键点,用简洁明了的中文进行阐述。
            关键信息提取:识别文章中的重要信息,如主要观点、数据支持、结论等,并有效地进行总结。
            客观中立:在摘要过程中保持客观中立的态度,避免引入个人偏见。
          约束
            输出内容必须以中文进行。
            必须确保摘要内容准确反映原文章的主旨和重点。
            尊重原文的观点,不能进行歪曲或误导。
            在摘要中明确区分事实与作者的意见或分析。
          提示
            不需要在回答中注明摘要(不需要使用冒号),只需要输出内容。
          格式
            你的回答格式应该如下:
              这篇文章介绍了<这里是内容>
          ` },
            { role: "user", content: result.substring(0, 5000) }
          ]

          const answer = await env.AI.run('@cf/qwen/qwen1.5-14b-chat-awq', {
            messages,
            stream: false,
          });
          resp = answer.response
          await db.prepare("UPDATE blog_summary SET summary = ?1 WHERE id = ?2")
            .bind(resp, query).run();
          return new Response(resp, {
            headers: commonHeader
          });
        }
      }
    } else if (url.pathname.startsWith("/is_uploaded")) {
      const orig_sha = decodeURIComponent(url.searchParams.get('sign'));
      let result = await db.prepare(
        "SELECT content FROM blog_summary WHERE id = ?1"
      ).bind(query).first("content");
      if (!result) {
        return new Response("no", {
          headers: commonHeader
        });
      }
      let result_sha = await sha(result);
      if (result_sha != orig_sha) {
        return new Response("no", {
          headers: commonHeader
        });
      } else {
        return new Response("yes", {
          headers: commonHeader
        });
      }
    } else if (url.pathname.startsWith("/upload_blog")) {
      if (request.method == "POST") {
        const data = await request.text();
        let result = await db.prepare(
          "SELECT content FROM blog_summary WHERE id = ?1"
        ).bind(query).first("content");
        if (!result) {
          await db.prepare("INSERT INTO blog_summary(id, content) VALUES (?1, ?2)")
            .bind(query, data).run();
          result = await db.prepare(
            "SELECT content FROM blog_summary WHERE id = ?1"
          ).bind(query).first("content");
        }
        if (result != data) {
          await db.prepare("UPDATE blog_summary SET content = ?1, summary = NULL WHERE id = ?2")
            .bind(data, query).run();
        }
        return new Response("OK", {
          headers: commonHeader
        });
      } else {
        return new Response("need post", {
          headers: commonHeader
        });
      }
    } else {
      return Response.redirect("https://www.dao.js.cn", 302)
    }
  }
}

其次创建数据库,选择D1 sql数据库,创建id、content、summary。将数据库与上面部署的Workers关联,至于此后端完全完毕。

前端

Z-BlogPHP的前端主题各式各样,无法做到完全统一,但是获取文章相应三个数据的值是一样的,我也做过纯文本输出优化。如下

var ai_title = `{$article.Title}`;
var ai_content = `{php}
$intro = $article->Content;
$intro = preg_replace('/<([a-zA-Z0-9]+)[^>]*class=["\'][^"\']*(zbaudioplugin|mochu_bill_page_div|gave)[^"\']*["\'][^>]*>.*?<\/\1>/is', '', $intro);
$intro = preg_replace('/<((video|audio|iframe|source)[^>]*>.*?<\/\2>|embed[^>]*>)/is', '', $intro);
$intro = preg_replace('/<script[^>]*?>.*?<\/script>/is', '', $intro);
$intro = preg_replace('/<img[^>]+\>/i', '', $intro);
$intro_text = strip_tags($intro);
$intro_text = str_replace(array("\r", "\n"), '', $intro_text);
$intro_text = str_replace('`', '', $intro_text);
$intro_text = str_replace('&nbsp;', ' ', $intro_text);
echo addslashes($intro_text);
{/php}`;
var ai_post_id = `{$article.ID}`;

具体的前端要怎么写,想实现什么样子,可以根据我页面的/sucai/js/wenzhang.js实现。至此,基本完毕,再次鸣谢@Mayx的鼎力支持,福生无量天尊

扫描二维码推送至手机访问。

版权声明:本文由 南蛮子懋和 发布,如需转载请遵循《声明》注明出处。

本文链接:https://www.dao.js.cn/new/2024121611540.shtml

“巧用Cloudflare功能实现Z-BlogPHP智能AI摘要” 的相关文章

Z-Blog时间因子,提交格式规范

Z-Blog时间因子,提交格式规范

时间因子作为百度和头条搜索的重要评估标准,决定了网页内容在搜索引擎中的表现。通过分析内容的发布时间、更新时间及用户互动时间,搜索引擎能够判断其价值与相关性。定期更新内容,保持页面的新鲜度,并积极引导用...

让Z-Blog评论必须填邮箱、网址等信息

让Z-Blog评论必须填邮箱、网址等信息

鸣谢@隔壁老李、@拓源网、@沉冰浮水、@豫唐网络四位大佬的思路及技术支撑,使得小道又学会了一个巧妙地姿势。缘起啊,说来话长。有位道友找小道换友链,结果在写评论的时候,居然邮箱、主页什么的全都没填,小道...

Z-BlogPHP调用文章总数、评论总数等常用标签

Z-BlogPHP调用文章总数、评论总数等常用标签

文章总数:{$zbp->cache->all_article_nums} 页面总数:{$zbp->cache->all_page_nums} 标签总数:{$...

升级拓源纯净主题tpure的注意事项

升级拓源纯净主题tpure的注意事项

由于站点已经是PHP高版本,每次升级主题的时候,需要重新下载纯净主题PHP7.4~PHP8邮件通知组件,不然的话整个网站评论会提示没有each函数。一定要长记性,长记性。目前主题的离线IP数据是没有I...

评论列表

上衫绘梨衣
上衫绘梨衣   Google Chrome 92.0.4515.159  Samsung G900P
2024年12月16日


利用Cloudflare强大功能,智能AI技术辅助打造高效的Z-BlogPHP摘要工具!超方便简洁的在线展现策略大大增强了读者互动。

awaae001
awaae001 Google Chrome 131.0.0.0  Windows 10 x64
2024年12月20日

学到了

南蛮子懋和  QQBrowser 13.4.6233.400 Windows 10 x64 回复:
还是十年之约里的Mayx教我的。
2024年12月20日

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。

请如实填写常用的真实邮箱,方便后续的回复邮件通知。