利用人工智能实现编码自动化的教程

333 阅读7分钟

人工智能(AI)何时能先进到可以编写自己的代码,导致AI的自我扩散,这个问题仍然是科幻小说家们的事情。然而,机器学习(ML)的最新进展使得自动编写代码片段成为可能,甚至通过自动编写 "整行或整个函数就在你的编辑器里 "来帮助程序员,这就是 GitHub的Copilot的承诺 。

俗话说,"好的程序员就是懒的程序员",这也许是使用代码来自动编写代码的完美缩影。这篇文章将帮助你做到这一点,使用Python。

Python的多功能性和易用性,以及由人工智能驱动的API的可用性,为自动化领域的编程提供了无数的可能性。我将向你展示如何使用Python编写一个程序,在短短几步内识别语音输入并生成所需的代码:

  1. 设置语音识别,以便我们可以告诉人工智能为我们写什么
  2. 确保人工智能能够解析语音输入
  3. 编写代码--编写你希望人工智能能够为你处理的程序

都准备好让你的编码生活变得更容易了吗?让我们开始吧。

在你开始之前:安装AI CodeWriter Python环境

为了跟上这篇文章中的代码,你可以下载并安装我们预先建立的AI CodeWriter环境,它包含了Python 3.9的版本和这篇文章中使用的软件包,以及已经解决的依赖关系

为了下载这个随时可用的Python环境,你需要创建一个 ActiveState Platform 账户。只需使用你的GitHub凭证或你的电子邮件地址来注册。注册很简单,它为你解锁了ActiveState Platform的许多好处!

或者你也可以使用我们的 State工具 来安装这个运行时环境。

runtime

对于Windows用户,在CMD提示下运行以下程序,就可以自动下载并安装我们的CLI、State工具以及AI CodeWriter运行 时到一个虚拟环境中。

powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default Pizza-Team/AI-CodeWriter"

对于Linux用户,运行下面的程序来自动下载和安装我们的CLI、State Tool以及 AI CodeWriter运行时 到一个虚拟环境中。

sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default Pizza-Team/AI-CodeWriter

1-接受语音输入的人工智能

现在是21世纪,所以如果我们要告诉人工智能为我们写一些代码,我们就要和它说话!这就是我们要做的。创建我们的自动代码编写器的第一步是确保它能识别我们的语音输入。为了做到这一点,我们将 使用你刚刚安装的AI CodeWriter环境中的库来创建一个 监听 函数。我们可以像这样把这些库和一些标准的 Python 库一起导入:

import speech_recognition as sr
import os

import time

import numpy as np

在这个函数中,我们将使用 SpeechRecognition 库来激活你机器的麦克风,然后将音频转换成字符串形式的文本。当麦克风被激活后,我们可以打印出一个声明以及麦克风听到的文本,这样我们就知道它工作正常了。我还将包括条件语句,以涵盖可能发生的常见错误,如果有太多的背景噪音或对谷歌云语音API的请求失败。

def listen():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("I am listening...")
        audio = r.listen(source)
    data = ""
    try:
        data = r.recognize_google(audio)
        print("You said: " + data)
    except sr.UnknownValueError:
        print("Google Speech Recognition did not understand audio")
    except sr.RequestError as e:
        print("Request Failed; {0}".format(e))
    return data    

请自由发挥 功能,看看谷歌云语音API是如何解释你的声音的。但现在人工智能可以听到我们的声音,我们需要确保它可以解析和解释输入字符串,以便编写我们想要的代码。

2-能解释语音输入的人工智能

我们将需要根据你想要输出的代码来解析输入字符串。有些事情要记住:

  • 要创建一个列表,字符串的格式将需要与你用来创建一个字典或一个函数的格式不同。
  • 我们也要考虑到多种数据类型,这样我们就可以区分字符串 1 和整数 1。这时,我们可以使用一个函数将所有基于文本的数字转换为浮点数。
    • 当谷歌云语音API难以一致解释相同格式的数字时,这一点尤其有用。
def text2float(textnum, numwords={}):
    if not numwords:
        units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
        ]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion"]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units):    numwords[word] = (1, idx)
        for idx, word in enumerate(tens):     numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales):   numwords[word] = (10 ** (idx * 3 or 2), 0)

    current = result = 0
    for word in textnum.split():
        if word not in numwords:
            raise Exception("Illegal word: " + word)

        scale, increment = numwords[word]
        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return float(result + current)

就像Siri、谷歌助理或Alexa一样,陈述事物的方式决定了它被解释的程度。有很多不同的方式可以说,"用数字 5、单词 播放器和数字 7创建一个列表 "或 "写出函数 x平方加1"。任务的一部分是确定关键词列表或函数,然后是该关键词的输入。当然,我们如何解析输入将取决于所使用的关键词。为了使之更容易,我们将假设关键词在字符串的任何输入参数之前。

3-写代码的人工智能

我们的目标是有一个单一的函数来识别关键词,然后将文本字符串引导到另一个函数,以创建关键词所识别的对象。这可以通过一系列的 if 语句 来实现 。关键字的数量是无限的,而且可以根据你的需要进行修改。为了简洁起见,我将说明这一策略的两个例子。

  • 创建一个列表
  • 创建一个多项式函数

因此,我们的 write_code 函数将看起来像这样:

def write_code(data):
    global listening
    data = data.split(" ")
    data = [x.lower() for x in data]
    if "list" in data:
        output = create_list(data)
        listening = False

    if "polynomial" in data:
        output = create_polynomial(data)        
        listening = False
        
    if "stop listening" in data:
        listening = False
        print('Listening stopped')
        
    return listening, output

为了便于处理,我们可以将文本字符串分割成多个字符串(以空格为界),或者将所有内容都变成小写。然后,我们 使用我们选择的两个关键字 listpolynomial进行if 语句 。现在,我们需要创建与每个关键字对应的函数。让我们 从列表开始 。

自动创建一个列表

如前所述,我们希望能够为列表中的每个元素指定数据类型,无论是字符串、整数还是浮点数。人们可能会说

  • "我想要一个包含整数 7 和字符串 篮球的列表 "。

注意,数据类型是在元素之前。因此,我们可以搜索数据类型(即整数)的索引,取下一个元素,并将其转换成数据类型。这就是 text2float 函数的用武之地。我们循环浏览一个相同数据类型的所有元素,将它们添加到一个空列表中,然后转到下一个数据类型。该函数看起来像这样:

def create_list(data):
    l = list()
    if 'integer' in data:
        indices = [i+1 for i, s in enumerate(data) if 'integer' in s]
        for i in indices:
            try:
                l.append(int(data[i]))
            except ValueError:
                l.append(text2float(data[i]))
    if 'float' in data:
        indices = [i+1 for i, s in enumerate(data) if 'float' in s]
        for i in indices:
            l.append(float(data[i]))
    if 'string' in data:
        indices = [i+1 for i, s in enumerate(data) if 'string' in s]
        for i in indices:
            l.append(data[i])
    return l

我使用了整数、浮点和字符串,因为它们是最常见的Python数据类型,但是你可以添加或采用任何其他的数据类型。

自动创建一个多项式函数

对于我们的多项式函数,人们可能会说

  • "创建 二乘以x的平方加四乘以x加七的多项式函数 "

起初,在Python中实现这一点似乎很困难,因为该函数有多个具有不同顺序和不同系数的项。然而,我们可以做一些假设来简化这个问题,这样,唯一需要传达的重要信息就是一个包含系数值的列表。例如,我们可以假设:

  • 系数列表的长度(减去1)对应于最大阶数(即长度3对应于二阶多项式)
  • 系数是按降序排列的(即最后一个系数是常数)。

这意味着我们只需要说明系数,所以前面的语句会变成这样:

  • "创建一个系数为 二四七的多项式函数 "。

一旦我们认识到 系数这个词后面的所有东西都 是一个系数 ,这就更容易实现 了 。一旦我们识别、分离并将系数转换为浮点数,我们就可以使用 numpy poly1d 来创建多项式函数。该函数看起来像这样:

def create_polynomial(data):
    indices = data.index('coefficients') + 1
    coeff_list = data[indices:]
    coeff_list = list(filter((coeff_list[1]).__ne__, coeff_list))
    co_list = list()
    for c in coeff_list:
        try:
            co = float(c)
        except ValueError:
            co = text2float(c)
        co_list.append(co)
    return np.poly1d(co_list)

请注意,谷歌云语音API有将连续的数字解释为一个数字的倾向,所以说明数字之间的任何分隔符(如 "二 破四 破七"),然后过滤掉分隔符 ,会有帮助 。当然,你可能想写其他类型的函数。在这种情况下,你可以给 write_code 函数 添加一个新的关键字 ,并创建一个新的函数。

最后,我们把所有东西放在一起,运行一个while循环:

time.sleep(2)
listening = True
while listening == True:
    data = listen()
    listening, output = write_code(data)

对于一个列表来说,相应的输出看起来是这样的:

I am listening...
You said: create a list with integer three float 1.5 and string basketball
[3, 1.5, 'basketball']


而对于一个多项式函数:

I am listening...
You said: create a polynomial with coefficients 5 - 7 - 6
polyld([5., 7., 6.])


很酷,对吗?

结论--人工智能可以帮助实现编码自动化

"任何需要编码两次的东西都值得自动化 "这句老话在这里得到了改观,我们让我们的人工智能程序为我们自动生成了代码。虽然我们 在 这里 没有完全进入 天网 领域,但这里显示的例程提供了一个很好的例子,说明目前的ML技术如何能够自动完成常见的编码任务。当与你的IDE的自动完成功能以及GitHub的Copilot程序相结合时,代码编写正变得越来越自动化。更少的输入导致更多的编码,这不是一件坏事。好吧,至少在 AI奇点 出现 之前 。在这期间:

  • 你可以在我的 GitHub repo上找到本文中使用的所有代码 。
  • 下载我们的AI CodeWriter环境,并尝试自己将常见的编码任务自动化。