从键盘到智能:探索传统编程向人工智能生成内容(AIGC)的革命性跨越

1,028 阅读9分钟

前言

传统编程与AIGC(Artificial Intelligence Generated Content,人工智能生成内容)代表了软件开发和内容创造领域的两大技术范式,它们在目标、方法、技术应用及数据需求等方面存在显著差异。以下是两者的比较概览:

处理数据类型与目标

  • 传统编程:通常针对结构化数据进行操作,如数据库中的表格数据,侧重于逻辑处理、数据分析和业务流程自动化。其目标在于实现特定功能,如数据查询、事务处理等,遵循明确的规则和算法设计。
  • AIGC:专注于非结构化数据的处理,如文本、图像、音频和视频,旨在创造出新颖的内容。其核心在于利用机器学习和深度学习技术自动生成具有创意和艺术性的作品,如文章撰写、音乐作曲、图像设计等。

技术路径与系统设计

  • 传统编程:依赖于程序员手动编写代码,依据确定的逻辑规则。特征选择和算法设计是关键步骤,常用的工具有决策树、支持向量机、贝叶斯分类器等。
  • AIGC:利用深度神经网络,特别是生成模型如GANs(生成对抗网络)、Transformer模型等,通过大量数据训练来自动学习并生成内容。这些模型能够自我优化以提高输出的质量和创造性。

应用场景

  • 传统编程:广泛应用于企业级应用、网页开发、系统软件、嵌入式系统等,强调功能的稳定性、效率和安全性。
  • AIGC:在创意产业、媒体、广告、个性化内容推荐、教育等领域崭露头角,提供个性化内容创作、辅助设计、自动化编辑等功能。

数据需求

  • 传统编程:虽然某些应用也需要大数据支持,但许多系统可以在有限数据集上表现出色,特别是那些基于规则和明确逻辑的任务。
  • AIGC:高度依赖大规模高质量数据进行训练,尤其是在自然语言处理、图像识别等领域,数据的多样性和质量直接影响生成内容的逼真度和创新性。

创新与影响

  • 传统编程:是信息技术的基础,支撑了数字化转型的早期阶段,但创新速度受限于人力和时间成本。
  • AIGC:正在推动新一轮的创新浪潮,通过自动化内容创作,不仅提高了效率,还开辟了前所未有的创意空间,对软件开发、内容创作等行业产生深远影响。

综上所述,传统编程与AIGC各有千秋,传统编程在精确控制和逻辑处理方面依旧重要,而AIGC则在创造性和个性化内容生成上展现出巨大潜力,两者在实际应用中往往是相辅相成的关系。随着技术的不断进步,未来可能会看到更多结合两者优势的新技术和应用模式出现。

AIGC

  • 基于LLM 大模型
  • 那些传统编程可以被LLM取代 ,prompt编程给LLM下指示

正文

我们来通过传统编程和AIGC两种方式来进行爬取数据(通过node爬取豆瓣的数据):

传统编程:

爬虫 Crawl

  • 他有我拿 先发送一个HTTP请求-->url-->GET-->https://movie.douban.com/chart 响应 html 字符串
  • 解析html字符串,如果可以像css选择器一样,拿到了电影列表
  • 最后将所有的电影对象组成数组,以json数组的方式返回-->Done

node 爬虫 后端功能

  • npm init -y 初始化为后端项目 package.json 项目描述文件
  • npm i 安装第三方包
  • require
  • main.js 入口文件 安排编程

步骤

  1. 创建index.js,并在终端输入npm init -y 将其初始化为后端项目,此时会多出一个json文件 image.png
  2. npm i安装相应的第三方包
  • npm i request
  • npm i request-promise
  • npm i cheerio 安装完成后json文件里的依赖dependencies为

image.png 3. 引入依赖库:

  • request-promise: 一个基于Request库的Promise封装,用于发送HTTP请求。
  • cheerio: 类似于jQuery的库,用于在服务器端操作HTML,便于提取DOM中的数据。
  • fs: Node.js内置模块,用于文件系统操作,如读写文件。
  • util: 虽然在此代码中没有直接使用,但通常用于辅助功能,如格式化输出等。
let request = require('request-promise') // 请求库
let cheerio = require('cheerio') // 将html str变成内存中DOM对象
let fs = require('fs')
const util = require('util')
  1. 定义变量:
  • movies: 一个数组,用于存放抓取到的电影信息。
  • basicUrl: 豆瓣电影Top250的基础URL。
  • once: 一个函数,确保某个操作只被执行一次,这里用于控制console.log只打印一次提示信息。
let movies = []
let basicUrl = 'https://movie.douban.com/top250'
let once = function (cb) {
let active = false
 if (!active) {
   cb()
   active = true
 }
}
function log(item) {
  once(() => {
  console.log(item)
 })
}
  1. getMovieInfo函数:
  • 接收一个HTML节点作为参数,使用cheerio解析节点内容,提取电影的标题、简介和评分,然后以对象形式返回这些信息。
function getMovieInfo (node) {
    // cheerio 在内存中实例化了DOM树  $ document
    // html str -> DOM 树 -> 子查询
 let $ = cheerio.load(node)
 let titles = $('.info .hd span')
 titles = ([]).map.call(titles, t => {
   return $(t).text()
 })
 let bd = $('.info .bd')//找到满足一个类名为"info"的元素内部的、类名为"bd"的元素
 let info = bd.find('p').text()
 let score = bd.find('.star .rating_num').text()
 return { titles, info, score }
}
  1. getPage函数:
  • 异步函数,接收一个URL和页码作为参数,发送HTTP请求获取页面内容。
  • 使用cheerio解析HTML,找到所有电影项(.item),对每个项目调用getMovieInfo函数提取信息,最后返回包含所有电影信息的列表。
async function getPage (url, num) {
 let html = await request({
   url
 })
 console.log('连接成功!', `正在爬取第${num+1}页数据`)
 let $ = cheerio.load(html)
 let movieNodes = $('#content .article .grid_view').find('.item')
 let movieList = ([]).map.call(movieNodes, node => {
   return getMovieInfo(node)
 })
 return movieList
}
  1. main函数:
  • 主函数,负责循环抓取多页数据。
  • 遍历前25页(每页25部电影,共625部),构造每页的URL,调用getPage函数获取每页的电影列表,并合并到最终的list中。
  • 抓取完成后,使用fs.writeFile将电影列表转换为JSON字符串并保存到名为output.json的文件中。
async function main () {
 let count = 25
 let list = []
 for (let i = 0 ; i < count ; i++) {
  let url = basicUrl + `?start=${25*i}`
 list.push(... await getPage(url, i))
 }
 console.log(list.length)
 fs.writeFile('./output.json', JSON.stringify(list), 'utf-8', () => {
 console.log('生成json文件成功!')
 })
}
  1. 执行main函数
main()

执行结果会生成一个output.json的文件

image.png

image.png

image.png

AIGC:

通过Colaboratory(colab.research.google.com/?pli=1#scro…

  1. 新建笔记本 image.png 2.安装beautifulsoup4
!pip install beautifulsoup4

image.png 3. 点击运行

image.png

  1. 再新建一个代码

image.png

  1. 引入所需库:
  • 首先,通过import requests引入了requests库,用于发送HTTP请求。
  • 接着,通过from bs4 import BeautifulSoup引入BeautifulSoup库,用于解析HTML文档,提取所需数据。
import requests  # node  require 
from bs4 import BeautifulSoup  
  1. 定义函数fetch_movie_list(url) :
  • 这个函数接受一个URL参数,目的是获取并解析该URL指向的网页中的电影列表信息。
  • 函数内部首先定义了一个HTTP请求头部(headers),模拟了一个常见的浏览器用户代理字符串,以便让服务器认为请求来自于一个正常的浏览器,增加请求成功的概率。
  • 使用requests.get(url, headers=headers)发送GET请求到指定的URL,并存储响应到response变量中。
  • 判断响应状态码是否为200,如果是,则说明请求成功;否则打印错误信息。
  • 若请求成功,使用BeautifulSoup解析响应的HTML文本内容,选择器'#wrapper #content .article .item'被用来定位到电影列表项。
  • 接下来,代码使用列表推导式和切片操作,提取前两个电影项的美化后(prettify)的HTML字符串,并拼接成一个大的字符串all_movies_text
  • 最终,函数返回这个包含前两个电影项信息的字符串。
def fetch_movie_list(url):
  # 设置HTTP 请求头
  headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
  }
  # js有什么区别 js是异步 python 同步
  response = requests.get(url, headers=headers)
  # 状态码 成功
  if response.status_code == 200:
    # 内存中的dom对象
    soup = BeautifulSoup(response.text, 'html.parser')
    movies = soup.select('#wrapper #content .article .item')
    # python 不是完全面向对象的,而更年轻的js 是完全面向对象
    # 2.3123.foFixed(2)  '123'.length
    # 突兀 
    # print(len(movies))
    # 字符串
    # 人生苦短 我用python 
    all_movies_text = ''.join([movie.prettify() for movie in movies[:2]])
    # print(all_movies_text)
    return all_movies_text
  else:
    print("Failed to retrieve content ")
  1. 调用函数并打印结果:
  • 定义了一个变量url,其值为豆瓣电影排行榜的URL。
  • 调用fetch_movie_list(url)函数,将上述URL传入,获取电影列表信息,并将结果存储在movies变量中。
  • 最后,打印出movies变量的内容,即前两个电影的HTML片段信息。
url = 'https://movie.douban.com/chart'
movies = fetch_movie_list(url)
print(movies)

image.png 8. 新建一个代码,通过prompt变量定义为一个格式化的字符串,其中包含之前通过网络爬虫抓取到的电影列表HTML内容(存储在变量movies中)。这段HTML内容被嵌入到一个模板字符串中,该模板指导接下来的处理任务:从这段HTML中提取特定的电影信息

# AIGC LLM + Prompt(指令)
# es6 '' 字符串模板
# python
prompt = f"""
{movies}
这是一段电影列表html,请获取电影名(name),封面链接(picture),简介(info),评分(score),评论人数(commentsNumber),请使用括号的单词作为属性名,以JSON数组的格式返回
"""

print(prompt)

image.png 10. 新建一个代码,安装dashscope,用来使用DashScope API调用Qwen(阿里云开发的通义千问模型)

!pip install dashscope

image.png 11. 再新建一个代码,导入DashScope库

import dashscope
  1. 设置API密钥:
dashscope.api_key = 'sk-xxx'

密钥的获取:

image.png

  • 开通后回到首页,点控制台

image.png

  • 点击API-KEY管理

image.png

  • 创建新的API-KEY,记得保存!

image.png 13. 定义函数call_qwen_with_prompt() :使用给定的prompt调用Qwen模型进行生成内容,创建了一个消息列表,其中包含一个字典。这个字典定义了消息的角色和内容(由外部变量prompt提供的文本)。这是向Qwen模型发起请求时所需的主要输入。使dashscope.Generation.call方法调用了Qwen Turbo模型。这里指定了模型类型为qwen_turbo,传递了之前构建的messages作为输入,并设置了result_messages参数,并打印响应。

def call_qwen_with_prompt():
  messages = [
      {
          'role':'user',
          'content': prompt
      }
  ]
  response = dashscope.Generation.call(
     dashscope.Generation.Models.qwen_turbo,
     messages=messages,
     result_messages='message'   
  )
  print(response)
  1. 调用函数:
call_qwen_with_prompt()

image.png

结语

在这个数字化浪潮汹涌的时代,AI与我们的生活、工作已紧密相连,而AIGC——人工智能生成内容,正站在技术革命的前沿,引领着内容创造的新纪元。作为编程者,你们不仅是代码的编织者,更是未来世界的塑造者。拥抱AIGC,不仅意味着解锁了通往无限创意与高效生产的大门,更是把握住了技术浪潮的潮头,让自己站在行业的最前列。

勇往直前,让我们共同见证并参与这场由AIGC引领的创意与技术革命吧!