万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

news2024/11/27 10:14:07

用AI+dify完成前后端开发+数据处理和数据清洗。

  • 引言
  • 数据获取和数据处理
  • dify构建workflow进行数据清洗
  • 前端页面构建和前后端交互
  • 总结

引言

AI时代对开发人员的加强是非常明显的,一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践,全程使用AI写代码+dify构建工作流快速完成一个获取每日热点新闻的前后端开发以及数据处理、数据清洗的任务,全程不需要我们自己动手写代码,仅跟AI聊天实现

我们来理清一下步骤:
1、点击每日新闻按钮
2、自动获取每日新闻信息
3、用LLM获取到标题、概要、作者、新闻链接
4、用dify + LLM 清洗和处理数据,获取新闻概要内容和新闻标签
5、给前端返回作者、标题、新闻链接、新闻概要内容和新闻标签
6、展示在页面上,并且点击可以跳到对应新闻页面

最后效果:
在这里插入图片描述

数据获取和数据处理

从网上搜索一下头条的每日推荐新闻的接口,我们的每日新闻来源就从这里获取。实际处理可以换成自己需要的接口并进行处理,让模型编码。
在这里插入图片描述
其实就是很简单地发送一个请求,对应代码:

fetch('http://is.snssdk.com/api/news/feed/v51/')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    console.log('Success:', data);
  })
  .catch(error => {
    console.error('Error:', error);
  });

粘贴代码观察一下结果
在这里插入图片描述
观察获取到的数据很明显我们只需要url source title abstract这四个字段,分别是对应的链接地址,作者,标题,摘要,做一下数据处理,让模型编码。
在这里插入图片描述
模型帮助我们在前面代码的基础上仅提取了我们需要的部分字段,获取的代码:

fetch('http://is.snssdk.com/api/news/feed/v51/')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    // 处理数据
    const articles = data.data.map(item => {
      const content = JSON.parse(item.content);
      return {
        url: content.url,
        source: content.source,
        title: content.title,
        abstract: content.abstract
      };
    });

    // 输出提取的内容
    console.log('Extracted Data:', articles);
  })
  .catch(error => {
    console.error('Error:', error);
  });

处理完之后就是比较简单的我们想要的数据了。
在这里插入图片描述
现在的数据只有链接标题还有一些没意义的摘要(实际上只是截取的文章前面部分),我们需要阅读前,模型就已经帮我们大致总结了一下内容以及对新闻进行了对应的打标签,这个就需要我们通过模型去完成了,我们下面用dify的工作流去完成这件事。

dify构建workflow进行数据清洗

接下来我们来做数据清洗,我希望对标题进行对应的改写,且我需要模型帮我总结内容和对内容打标签。通过dify搭建工作流(注意这里可以使用别的工具,并不一定依赖dify)。
在这里插入图片描述
使用的Prompt如下,注意我们Prompt里面需要精确提到 背景(激活参数)、任务(明确目标)、输出需求(明确要求)、例子(明确要求):

你是一名专业的记者,我从新闻网站API请求到了数据,你需要帮我对这条数据进行内容的总结和标签分类。内容总结应该在200字以内输出到模版变量<S>中,标签分类给出三个,每个标签在五个字以内,标签之间用','隔开,输出到模版变量<T>中,你仅需要输出模版内容。

# 例子
输入:

  {
    source: '国际新说',
    title: '新能源未来在何处?',
    abstract: '最近几年新能源的发展非常迅速,那么未来新能源会往哪一方面发展呢?让我们一起来探讨一下'
  }

输出:

【国际新说】新能源未来在何处?(科技、新能源、发展)

近年来,新能源技术快速发展,引发了对未来发展方向的广泛讨论。文章探讨了新能源可能的发展趋势。


# 模版
【source】title (<T>)
<S>

看看结果。
在这里插入图片描述
在这里插入图片描述
可以看到,输入我们刚才整理好的数据已经可以完成标题改写 + 打标签 + 内容总结了

现在我们可以使用我们刚才提取的数据,结合dify的这个工作流去完成总结文章内容 + 给文章打标签的功能。接下来只需要直接调用dify生成对应的接口,让模型帮我们接口,注意跟模型描述详细的接口需求。

这个是DIFY的接口文档
在这里插入图片描述
让模型编码
在这里插入图片描述
后端代码,主要就是调用了dify生成的接口,然后处理了一下输出:

const apiKey = 'YOUR_KEY';
const apiUrl = 'https://api.dify.ai/v1/workflows/run';
const batchSize = 2;

fetch('http://is.snssdk.com/api/news/feed/v51/')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    // 处理数据
    const articles = data.data.map(item => {
      const content = JSON.parse(item.content);
      return {
        url: content.url,
        source: content.source,
        title: content.title,
        abstract: content.abstract
      };
    });

    // 发送请求并收集结果
    const results = [];
    const sendBatchRequests = (batch) => {
      const requests = batch.map(article => {
        const requestBody = {
          inputs: {
            message: JSON.stringify(article)
          },
          response_mode: 'blocking',
          user: 'api-user'
        };

        return fetch(apiUrl, {
          method: 'POST',
          headers: {
            'Authorization': apiKey,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(requestBody)
        })
        .then(response => {
          if (!response.ok) {
            throw new Error(`Request failed with status ${response.status}`);
          }
          return response.json();
        })
        .then(result => {
          if (result.data && result.data.outputs && result.data.outputs.text) {
            results.push(result.data.outputs.text);
          }
        })
        .catch(error => {
          console.error('Error:', error);
        });
      });

      return Promise.all(requests);
    };
    
    // 限制调用速率
    const processArticlesInBatches = async (articles) => {
      for (let i = 0; i < articles.length; i += batchSize) {
        const batch = articles.slice(i, i + batchSize);
        await sendBatchRequests(batch);
      }
    };

    return processArticlesInBatches(articles).then(() => results);
  })
  .then(results => {
    console.log('All results:', results);
  })
  .catch(error => {
    console.error('Error:', error);
  });

看看结果。
在这里插入图片描述
这时候清洗其实已经完成了,不过为了让整个过程更自动化和可视化,我们再用一个前端页面来展示。

前端页面构建和前后端交互

我们已经成功完成了数据处理和清洗,接下来简单地构建一下前端页面和前后端交互,注意key换成自己的,让AI编码。
在这里插入图片描述
后端代码,主要是做成了端口形式,将数据按格式返回给前端:

// server.js
import express from 'express';
import fetch from 'node-fetch';
import cors from 'cors';

const app = express();
const port = 3000;
const apiKey = 'Bearer app-xxx';
const apiUrl = 'https://api.dify.ai/v1/workflows/run';
const batchSize = 2;

app.use(cors());

app.get('/get-daily-news', async (req, res) => {
  try {
    const response = await fetch('http://is.snssdk.com/api/news/feed/v51/');
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    const data = await response.json();

    // 处理数据
    const articles = data.data.map(item => {
      const content = JSON.parse(item.content);
      return {
        url: content.url,
        source: content.source,
        title: content.title,
        abstract: content.abstract
      };
    });

    // 发送请求并收集结果
    const results = [];
    const sendBatchRequests = (batch) => {
      const requests = batch.map(article => {
        const requestBody = {
          inputs: {
            message: JSON.stringify(article)
          },
          response_mode: 'blocking',
          user: 'api-user'
        };

        return fetch(apiUrl, {
          method: 'POST',
          headers: {
            'Authorization': apiKey,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(requestBody)
        })
        .then(response => {
          if (!response.ok) {
            throw new Error(`Request failed with status ${response.status}`);
          }
          return response.json();
        })
        .then(result => {
          if (result.data && result.data.outputs && result.data.outputs.text) {
            results.push({
              text: result.data.outputs.text,
              url: article.url
            });
          }
        })
        .catch(error => {
          console.error('Error:', error);
        });
      });

      return Promise.all(requests);
    };

    const processArticlesInBatches = async (articles) => {
      for (let i = 0; i < articles.length; i += batchSize) {
        const batch = articles.slice(i, i + batchSize);
        await sendBatchRequests(batch);
      }
    };

    await processArticlesInBatches(articles);
    res.json(results);
  } catch (error) {
    console.error('Error:', error);
    res.status(500).json({ error: 'Internal Server Error' });
  }
});

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

前端代码,没什么好说的就是点击按钮然后获取新闻资讯接口数据,处理一下输出展示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>每日新闻</title>
<style>
  .news-item {
    border: 1px solid #ccc;
    padding: 10px;
    margin-bottom: 10px;
    margin-top: 10px;
    border-radius: 5px;
  }
</style>
</head>
<body>
<h1>每日新闻</h1>
<button id="getNewsBtn">获取每日新闻</button>
<div id="newsResults"></div>
<script>
    document.getElementById('getNewsBtn').addEventListener('click', async () => {
        try {
            const response = await fetch('http://localhost:3000/get-daily-news');
            if (!response.ok) {
            throw new Error(`Network response was not ok: ${response.status}`);
            }
            const results = await response.json();

            const newsResultsDiv = document.getElementById('newsResults');
            newsResultsDiv.innerHTML = '';
            results.forEach(result => {
            // 去除 ```符号
            const cleanedText = result.text.replace(/```/g, '');
            // 创建超链接
            const link = document.createElement('a');
            link.href = result.url;
            link.target = '_blank';
            link.innerHTML = cleanedText.replace(/\n/g, '<br>'); // 将文本内容替换为带有换行符的HTML
            const paragraph = document.createElement('p');
            paragraph.appendChild(link);
            const newsItem = document.createElement('div');
            newsItem.classList.add('news-item');
            newsItem.appendChild(paragraph);
            newsResultsDiv.appendChild(newsItem);
            
            });
        } catch (error) {
            console.error('Error:', error);
        }
    });
</script>
</body>
</html>

来看看最后效果。在这里插入图片描述
点击后会跳到新闻页面,这样我们整个项目就完成了。

总结

全程不需要自己写一行代码,我们就完成了前后端开发和数据处理、数据清洗,效率提升肉眼可见。实际上这也是未来的趋势,在AI的加持下,我们每一个人的能力都会被无限放大,早日尝试并习惯高效使用AI才能帮助我们在新时代的变革中保持竞争力。

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

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

相关文章

模板和静态文件

模板和静态文件 1、templates模板2、静态文件2.1、static目录2.2、引用静态文件 1、templates模板 "templates"目录用于存放模板文件&#xff0c;通常是用于动态生成页面的文件。 在app01目录下创建templates文件夹&#xff0c;html文件均保存在templates中 在urls.p…

Linux的hadoop集群部署

1.hadoop是一个分布式系统基础架构,主要解决海量数据额度存储与海量数据的分析计算问题 hdfs提供存储能力,yarn提供资源管理能力,MapReduce提供计算能力 2.安装 一:调整虚拟机内存,4G即可 二:下载安装包 网址:https://mirrors.aliyun.com/apache/hadoop/common/hadoop-3.4.0/…

【文心智能体 AI大师工坊】『​​​​​​​人间夸夸机』情感类智能体开发调优全过程详解

&#x1f680;『人间夸夸机』点击前往体验&#xff1a;https://snhoio.smartapps.baidu.com/?_swebScene3611000000000000 最近参加了百度文心智能体平台AI大师工坊&#x1f389;活动&#xff0c;在这个活动中&#xff0c;我利用文心平台提供的各种插件、大模型等工具&#xf…

Linux内核USB3.0驱动框架分析--USB主机控制器hcd驱动分析

一&#xff0c;概述 usb主机控制器驱动一般以platform的形式将驱动注册进内核&#xff0c;&#xff0c;因此我们需要从前面一篇文章的框图说起。主要分析下图中橙色部分的内容。 二&#xff0c;usb主机控制器相关函数 2.1 usb_create_hcd 我们来看一下usb_create_hcd函数&a…

如何成为 Rust 核心贡献者?Rust 开发的核​​心是什么?Rust 重要技术专家揭秘

10 月 17 - 18日&#xff0c;由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会&#xff0c;本次活动邀请了 60 多位国际开源专家&#xff0c;汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…

图像增强论文精读笔记-Kindling the Darkness: A Practical Low-light Image Enhancer(KinD)

1. 论文基本信息 论文标题&#xff1a;Kindling the Darkness: A Practical Low-light Image Enhancer 作者&#xff1a;Yonghua Zhang等 发表时间和期刊&#xff1a;2019&#xff1b;ACM MM 论文链接&#xff1a;https://arxiv.org/abs/1905.04161 2. 研究背景和动机 现有…

C++入门基础知识110—【关于C++ if...else 语句】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C if...else 语句的相关内容&#xff01…

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)

好久没写SD了&#xff0c;今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程&#xff08;引合和見積&#xff08;询价和报价&#xff09;&#xff09; - 数据流的概念&#xff0c;主要就是后传票可以参照前传票&#xff0c;以实现数据的流动&#xff0c;减少输入 - Co…

PHP游泳馆会员管理系统-计算机毕业设计源码86627

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于游泳馆会员管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了游泳馆会员管理系统&#xff0c;它彻底改…

二分查找法 ← Python实现

【二分查找法】 ★ 二分查找&#xff0c;是一种效率较高的查找方法。但是&#xff0c;二分查找要求元素按关键字有序排列。 ★ 二分查找每一次查找都使查找范围缩小一半&#xff0c;与顺序查找相比&#xff0c;很显然会提高查找效率。为了标记查找过程中每一次的查找区间&#…

自动猫砂盆真的有必要吗?买自动猫砂盆不看这四点小心害死猫。

现在越来越多铲屎官选择购买自动猫砂盆来代替自己给猫咪铲屎&#xff0c;可是自动猫砂盆真的有必要吗&#xff1f;要知道&#xff0c;在现在忙碌的生活中&#xff0c;有很多人因为工作上的忙碌而不小心忽视了猫咪&#xff0c;猫咪的猫砂盆堆满粪便&#xff0c;要知道猫砂盆一天…

windows如何设置右键新建文档

1. windows如何设置右键新建文档 文章目录 1. windows如何设置右键新建文档1.1. 注意注意注意1.2. 参考资料1.3. 注册列表中各项的意思1.4. 右键新建文档1.4.1. 新建文件夹快捷键1.4.2. 新建txt文件快捷键1.4.3. 新建Word文档快捷键1.4.4. 新建PowerPoint文档快捷键1.4.5. 新建…

Linux基础(五):linux目录配置

1.Linux系统目录 不同的Linux发布版本的目录都是类似的&#xff0c;这是因为Linux系统的目录配置有一个大概的标准——Filesystem Hierarchy Standard&#xff08; FHS&#xff09;。FHS规定了目录有4种交互形态&#xff1a; ①可分享的&#xff1a; 可以分享给其他系统挂载使…

【优选算法】(第三十五篇)

目录 验证栈序列&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 N叉树的层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 验证栈序列&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;L…

校园网网页认证设备限制环境下基于OpenWRT的路由器选型与解决方案

校园网环境下基于OpenWRT的路由器选型与解决方案 网页认证(锐捷认证)解除校园网设备限制,路由器选型和解决方案 openwrt 我们学校校园网一个账号只能登录两台设备&#xff0c;多了直接就退出联网状态&#xff0c;然后校园网是基于锐捷认证进行认证的&#xff0c;然后通过ment…

【closerAI ComfyUI】爹妈都认不出的美女模糊照片,这个高清放大模型竟然能还原出来!这个AI模型我给满分

兄弟们&#xff0c;太离谱了&#xff0c;大家都知道FLUX模型的牛逼&#xff0c;现在基于FLUX的生态越发成熟&#xff0c;但一张模糊到五官都不能辨认的图片&#xff0c;通过AI模型的计算&#xff0c;竟然能还原出来。当然&#xff0c;这里我们的测试是过于极端。一般模糊一点的…

SpringCloud网关聚合knife4j方案

微服务开发中想将Spring-Cloud-Gateway网关聚合knife4j&#xff0c;形成一个统一入口方便查阅的开发辅助接口文档&#xff0c;并且将Swagger抽取成一个公共模块&#xff0c;那么我们可以参考以下的做法 约定&#xff1a; Java Version&#xff1a;11.0.24 Spring Boot&#xff…

一探究竟:全能型人体存在传感器如何革新全屋智能生活

如今&#xff0c;全屋智能家居已蔚然成风&#xff0c;亲历过个性化智能家居配置的用户无不深知传感器在其联动逻辑中扮演的关键角色。市场上主流的传感器类型多为移动监测型&#xff0c;此类设备通过探测区域内是否存在人员活动来触发相应的自动化操作。尽管它们在众多应用场景…

实用软件分享

文章路径 Pfolg_Source/实用软件记录.md at main Pfolg/Pfolg_Source (github.com)https://github.com/Pfolg/Pfolg_Source/blob/main/%E5%AE%9E%E7%94%A8%E8%BD%AF%E4%BB%B6%E8%AE%B0%E5%BD%95.md 注 这篇文章水的不得了&#xff0c;但我花了半小时来水……

谷歌-BERT-第四步:模型部署

1 需求 需求1&#xff1a;基于gradio实现大模型的WEB UI交互界面 2 接口 3 示例 import gradio as gr from transformers import *classifier pipeline("text-classification", model"./model", tokenizer"./model")gr.Interface.from_pipel…