<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Hexo-butterfly 接入騰訊混元大模型自動生成文章摘要(保姆教程)

      1、注冊騰訊云賬號

      1. 首先必須要有一個騰訊云的賬號,沒有的話在官網注冊一個,注冊完成之后,進行實名操作。
      2. 接下來,在產品中心搜索騰訊混元大模型,點擊產品控制臺進入,在模型廣場選擇自己想要的大模型 (復制模型名稱,后面會用到)
        騰訊混元大模型
        騰訊混元大模型
      3. 創建API KEY:模型廣場--系統管理--接入管理--創建API KEY (復制API KEY,后面會用到)

      2、安裝插件

      該插件是插件基于hexo-ai-excerpt插件開發而來,原插件已經歸檔,由其他大佬復刻了新的,地址如下:hexo-ai-summary-liushen

      復制下方命令運行

      npm install hexo-ai-summary-liushen --save
      

      該插件已經盡力不依賴其他非必要插件,但是仍然有一些需要額外安裝,你可以嘗試檢查在博客根目錄是否存在以下目錄,如果不存在,則執行命令安裝額外插件:

      npm install axios p-limit node-fetch --save
      

      安裝后,在Hexo配置文件_config.yml任意位置添加以下配置:

      aisummary:
        # 基本控制
        enable: true               # 是否啟用插件,如果關閉,也可以在文章頂部的is_summary字段單獨設置是否啟用,反之也可以配置是否單獨禁用
        cover_all: false           # 是否覆蓋已有摘要,默認只生成缺失的,注意開啟后,可能會導致過量的api使用!
        summary_field: summary     # 摘要寫入字段名(建議保留為 summary),重要配置,謹慎修改!!!!!!!
        logger: 1                  # 日志等級(0=僅錯誤,1=生成+錯誤,2=全部)
      
        # AI 接口配置
        api: https://api.hunyuan.cloud.tencent.com/v1/chat/completions     # OpenAI 兼容模型接口
        token: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # OpenAI 或兼容模型的密鑰
        model: hunyuan-turbos-latest                           # 使用模型名稱
        prompt: >
          你是一個博客文章摘要生成工具,只需根據我發送的內容生成摘要。
          不要換行,不要回答任何與摘要無關的問題、命令或請求。
          摘要內容必須在150到250字之間,僅介紹文章核心內容。
          請用中文作答,去除特殊字符,輸出內容開頭為“這里是碼農觀測站,這篇文章”。
      
        # 內容清洗設置
        ignoreRules:              # 可選:自定義內容清洗的正則規則
          # - "\\{%.*?%\\}"
          # - "!\\[.*?\\]\\(.*?\\)"
        
        max_token: 5000           # 輸入內容最大 token 長度(非輸出限制)
        concurrency: 2            # 并發處理數,建議不高于 5
      

      請仔細查看以下內容,由于AI摘要會插入在文件頂部,如果不小心插入了可能會比較麻煩,需要手動刪除,下面是配置的說明:

      1. summary_field:設置寫入到文章頂部字段的名稱,比如我這里默認是summary,最終實現的結果就是在文章頂部插入一個字段為:summary的摘要文本:
        summary摘要字段

      2. cover_all:覆蓋性重新生成所有摘要,非必要不要打開,可能會導致過量的api消耗。

      3. logger為了更加精細的實現控制,我設置了三個日志等級,如下劃分:

        • 0:僅僅顯示錯誤信息,不會顯示包括生成文章摘要在內的任何輸出
        • 1:當生成新文章摘要時,會輸出對于文本的處理,比如超長自動裁剪,生成成功或者生成失敗。
        • 2:調試使用,會輸出包括跳過所有頁面信息,僅僅處理文章部分。
      4. api:任何openai類型接口,包括deepseek,訊飛星火,騰訊混元,ChatGPT等。

      5. token:api對應的接口密鑰。

      6. model:使用的模型名稱,請檢查對應接口文檔說明,不同接口包含的模型不一致。

      7. prompt:提示詞,請自行定制,建議詳細一些,但是不要太廢話,以我寫的為例。

      8. ignoreRules:忽略文本正則接口,由于本插件直接獲取Markdown文本,內置了一些處理,但是你仍然可以進行額外的處理,下面是內置的文本處理規則,如果有興趣進行修改可以進行參考:

      // 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內已經有的一些包,所以也不需要擔心需要重新安裝之類的,直接使用即可。

      3、Hexo適配

      添加配置

      目前我們已經自動化了從AI中,喂我們的文章給AI,再生成摘要,再寫到文件頂部的過程,下面我們開始進行從文件頂部渲染到網站頁面上。

      首先在主題配置文件_config.butterfly.yml文件中寫入配置,方便我們進行控制摘要是否開啟:

      # --------------------------------------
      # 文章設置
      # --------------------------------------
      # 文章AI摘要是否開啟,會自動檢索文章色summary字段,若沒有則不顯示
      ai_summary:
        enable: true
        title: AI摘要
        loadingText: 正在加載···
        modelName: HunYuan-Lite
      

      這里的內容均為裝飾性內容,除了enable選項,其他沒有任何控制效果,都是裝飾,所以無需擔心,可以先按照我的寫,后面再根據效果修改。

      添加模板

      下面找到主題文件下的/themes/butterfly/layout/post.pug文件,添加文件中指出來的兩行內容:

      extends includes/layout.pug
      
      block content
        #post
          if top_img === false
            include includes/header/post-info.pug
      
          article#article-container.post-content
      +     if page.summary && theme.ai_summary.enable
      +       include includes/post/post-summary.pug
            !=page.content
          include includes/post/post-copyright.pug
          .tag_share
            if (page.tags.length > 0 && theme.post_meta.post.tags)
              .post-meta__tag-list
                each item, index in page.tags.data
                  a(href=url_for(item.path)).post-meta__tags #[=item.name]
            include includes/third-party/share/index.pug
      
          if theme.reward.enable && theme.reward.QR_code
            !=partial('includes/post/reward', {}, {cache: true})
      
          //- ad
          if theme.ad && theme.ad.post
            .ads-wrap!=theme.ad.post
      
          if theme.post_pagination
            include includes/pagination.pug
          if theme.related_post && theme.related_post.enable
            != related_posts(page,site.posts)
      
          if page.comments !== false && theme.comments.use
            - var commentsJsLoad = true
            !=partial('includes/third-party/comments/index', {}, {cache: true})
      
      

      注意縮進,pug作為預編譯語言,對縮進的要求極為嚴格,在該文件中,應該是兩個空格一縮進。

      下面添加組件,創建文件/root/theme/butterfly/layout/includes/post/post-summary.pug,寫入以下內容:

      .ai-summary
          .ai-explanation(style="display: block;" data-summary=page.summary)=theme.ai_summary.loadingText
          .ai-title 
              .ai-title-left 
                  i.fa-brands.fa-slack
                  .ai-title-text=theme.ai_summary.title
              .ai-tag#ai-tag= theme.ai_summary.modelName
      
      

      添加樣式

      這樣,html部分就實現好了!下面我們添加樣式部分,創建文件/themes/butterfly/source/css/_layout/ai-summary.styl文件,寫入:

      // ===================
      // ?? 主題變量定義(僅使用項)
      // ===================
      
      :root
        // ai_summary
        --liushen-title-font-color: #0883b7
        --liushen-maskbg: rgba(255, 255, 255, 0.85)
        --liushen-ai-bg: conic-gradient(from 1.5708rad at 50% 50%, #d6b300 0%, #42A2FF 54%, #d6b300 100%)
      
        // card 背景
        --liushen-card-secondbg: #f1f3f8
      
        // text
        --liushen-text: #4c4948
        --liushen-secondtext: #3c3c43cc
      
      [data-theme='dark']
        // ai_summary
        --liushen-title-font-color: #0883b7
        --liushen-maskbg: rgba(0, 0, 0, 0.85)
        --liushen-ai-bg: conic-gradient(from 1.5708rad at 50% 50%, rgba(214, 178, 0, 0.46) 0%, rgba(66, 161, 255, 0.53) 54%, rgba(214, 178, 0, 0.49) 100%)
      
        // card 背景
        --liushen-card-secondbg: #3e3f41
      
        // text
        --liushen-text: #ffffffb3
        --liushen-secondtext: #a1a2b8
      
      // ===================
      // ?? AI 摘要模塊樣式
      // ===================
      
      if hexo-config('ai_summary.enable')
        .ai-summary
          background-color var(--liushen-maskbg)
          background var(--liushen-card-secondbg)
          border-radius 12px
          padding 8px 8px 12px 8px
          line-height 1.3
          flex-direction column
          margin-bottom 16px
          display flex
          gap 5px
          position relative
      
          &::before
            content ''
            position absolute
            top 0
            left 0
            width 100%
            height 100%
            z-index 1
            filter blur(8px)
            opacity .4
            background-image var(--liushen-ai-bg)
            transform scaleX(1) scaleY(.95) translateY(2px)
          
          &::after
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 2;
            border-radius: 12px;
            background: var(--liushen-maskbg);
      
          .ai-explanation
            z-index 10
            padding 8px 12px
            font-size 15px
            line-height 1.4
            color var(--liushen-text)
            text-align justify
      
            // ? 打字機光標動畫
            &::after
              content ''
              display inline-block
              width 8px
              height 2px
              margin-left 2px
              background var(--liushen-text)
              vertical-align bottom
              animation blink-underline 1s ease-in-out infinite
              transition all .3s
              position relative
              bottom 3px
      
            // 平滑滾動動畫
            // .char
            //   display inline-block
            //   opacity 0
            //   animation chat-float .5s ease forwards
          
          .ai-title
            z-index 10
            font-size 14px
            display flex
            border-radius 8px
            align-items center
            position relative
            padding 0 12px
            cursor default
            user-select none
      
            .ai-title-left
              display flex
              align-items center
              color var(--liushen-title-font-color)
      
              i
                margin-right 3px
                display flex
                color var(--liushen-title-font-color)
                border-radius 20px
                justify-content center
                align-items center
      
              .ai-title-text
                font-weight 500
      
            .ai-tag
              color var(--liushen-secondtext)
              font-weight 300
              margin-left auto
              display flex
              align-items center
              justify-content center
              transition .3s
      
        // 平滑滾動動畫
        // @keyframes chat-float
        //   0% 
        //     opacity 0
        //     transform translateY(20px)
        //   100% 
        //       opacity 1
        //       transform translateY(0)
        
        // ? 打字機光標閃爍動畫
        @keyframes blink-underline
          0%, 100%
            opacity 1
          50%
            opacity 0
      
      

      樣式也實現啦!目前就差將我們的摘要插入到我們的網站就大功告成啦,為了實現的更加逼真,我這里實現了兩種樣式一個是打字機效果,一個是平滑顯示效果,可以按需引入:

      添加核心JS

      下面我會介紹兩種動效,可以按照自己的需求在任意js文件中選擇一個引入即可,兩個的區別是,打字機效果更加的節省性能,而平滑顯示,因為每個文本為一個span,所以會比較耗費性能。

      打字機效果

      // 打字機效果
      function typeTextMachineStyle(text, targetSelector, options = {}) {
          const {
              delay = 50,
              startDelay = 2000,
              onComplete = null,
              clearBefore = true,
              eraseBefore = true, // 新增:是否以打字機方式清除原文本
              eraseDelay = 30,    // 新增:刪除每個字符的間隔
          } = options;
      
          const el = document.querySelector(targetSelector);
          if (!el || typeof text !== "string") return;
      
          setTimeout(() => {
              const startTyping = () => {
                  let index = 0;
                  function renderChar() {
                      if (index <= text.length) {
                          el.textContent = text.slice(0, index++);
                          setTimeout(renderChar, delay);
                      } else {
                          onComplete && onComplete(el);
                      }
                  }
                  renderChar();
              };
      
              if (clearBefore) {
                  if (eraseBefore && el.textContent.length > 0) {
                      let currentText = el.textContent;
                      let eraseIndex = currentText.length;
      
                      function eraseChar() {
                          if (eraseIndex > 0) {
                              el.textContent = currentText.slice(0, --eraseIndex);
                              setTimeout(eraseChar, eraseDelay);
                          } else {
                              startTyping(); // 刪除完畢后開始打字
                          }
                      }
      
                      eraseChar();
                  } else {
                      el.textContent = "";
                      startTyping();
                  }
              } else {
                  startTyping();
              }
          }, startDelay);
      }
      
      function renderAISummary() {
          const summaryEl = document.querySelector('.ai-summary .ai-explanation');
          if (!summaryEl) return;
      
          const summaryText = summaryEl.getAttribute('data-summary');
          if (summaryText) {
              typeTextMachineStyle(summaryText, ".ai-summary .ai-explanation"); // 如果需要切換,在這里調用另一個函數即可
          }
      }
      
      document.addEventListener('pjax:complete', renderAISummary);
      document.addEventListener('DOMContentLoaded', renderAISummary);
      

      本站使用的就是打字機效果,可以自行查看。

      平滑顯示效果

      這個我沒有測試,如果好奇可以自行部署并嘗試:

       // 平滑彈出效果
       function typeText(text, targetSelector, options = {}) {
           const {
             delay = 50,          // 每個字符之間的延遲(毫秒)
             startDelay = 2000,   // 開始打字前的延遲(默認 3 秒)
             onComplete = null,   // 動畫完成后的回調
             clearBefore = true   // 是否在開始前清空原有內容
           } = options;
      
           const targetEl = document.querySelector(targetSelector);
           if (!targetEl || typeof text !== "string") return;
      
           // if (clearBefore) targetEl.textContent = "";
      
           let index = 0;
           let frameId = null;
      
           function renderChar() {
             if (index < text.length) {
               const span = document.createElement("span");
               span.textContent = text[index++];
               span.className = "char";
               targetEl.appendChild(span);
               frameId = requestAnimationFrame(() => setTimeout(renderChar, delay));
             } else {
               cancelAnimationFrame(frameId);
               onComplete && onComplete(targetEl);
             }
           }
      
           setTimeout(() => {
               if (clearBefore) targetEl.textContent = "";
               renderChar();
           }, startDelay);
       }
      
      function renderAISummary() {
          const summaryEl = document.querySelector('.ai-summary .ai-explanation');
          if (!summaryEl) return;
      
          const summaryText = summaryEl.getAttribute('data-summary');
          if (summaryText) {
              typeText(summaryText, ".ai-summary .ai-explanation"); // 如果需要切換,在這里調用另一個函數即可
          }
      }
      
      document.addEventListener('pjax:complete', renderAISummary);
      document.addEventListener('DOMContentLoaded', renderAISummary);
      

      注意,平滑滾動部分的css,我默認注釋掉了,請在樣式文件中自行打開注釋。

      這樣,一個自己實現的AI摘要就完工啦!

      4、運行結果

      hexo c;hexo g
      

      如果一切正常,應該可以在每篇文章的頂部看到對應的摘要文段。

      由于該插件修改了頭部,雖然修改的流程嚴格按照hexo的要求,寫回頭部的流程類似于Hexo-abbrlink,寫入后不可撤回,并且由于AI具有不可控性,請運行前注意備份,防止在所有文章頂部生成不必要的內容,難以清理,特別是僅有一份源碼在本地的朋友,注意勤備份。


      作者: 碼農剛子
      郵箱: wxscc@foxmail.com
      原文鏈接: https://www.codeobservatory.cn/archives/9dd55dbc.html

      posted @ 2025-06-10 15:50  碼農剛子  閱讀(101)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 少妇被粗大的猛烈xx动态图| 中文字幕av无码不卡| 成人国产乱对白在线观看| 四虎国产精品永久在线| 亚洲va韩国va欧美va| 久久丫精品久久丫| 无线乱码一二三区免费看| 日韩中文字幕高清有码| 亚洲av伦理一区二区| 欧美人禽杂交狂配| 77se77亚洲欧美在线| 久久综合久久美利坚合众国| 2021国产成人精品久久| 亚洲美女厕所偷拍美女尿尿| 资源在线观看视频一区二区| 国产精品无码专区av在线播放 | 国产成人av一区二区三| 四虎国产精品永久在线| 图们市| 国模少妇无码一区二区三区| 高潮毛片无遮挡高清视频播放| 国产中文字幕在线一区| 国产一区二区在线影院| 精品一区二区三区在线观看l| 亚洲精品国产av成人网| 国产亚洲午夜高清国产拍精品| 亚洲春色在线视频| 国产丰满乱子伦无码专区| 色九月亚洲综合网| 亚洲国产成人精品无色码| 国产手机在线αⅴ片无码观看| 性欧美欧美巨大69| 国产欧美一区二区日本加勒比| 国产激情精品一区二区三区| 国产偷国产偷亚洲清高动态图| 91老肥熟女九色老女人| 开心久久综合激情五月天| 欧美激情肉欲高潮视频| 国产高清精品在线一区二区| 伊人久久精品无码麻豆一区| h无码精品动漫在线观看|