Bootstrap

让AI给你写代码,初体验(二)-写一个flask应用

这里我们准备让AI做一个稍微复杂一点任务,写一个前后应用,具体:
前台用html输入股票代码,后台通过akshare的接口程序获取该股票的实时价格,然后返回显示在html

我们先用AI对话看一下,AI会给我们什么编码建议
在这里插入图片描述
在这里插入图片描述
AI建议并不出乎我们意外,一个简单的flask应用即可,后续我们就要修改AI编程的主程序,实现以下几个功能
1 以正则表达式提取,python、html以及可能js程序
2 将这些程序安排在合适的位置,例如html就放在templates目录下,js放在static目录下,py程序放在server的程序下
3 考虑到不是一次可以生成,需要支持多个版本
因此对程序做出修改

from http import HTTPStatus
import dashscope
import re
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role
import random
import time
# 存文件,按时间和随机数生成版本号
def saveCode(programmingName, content_list):
    # 生成版本号
    global code_file
    now_time = time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime())
    i = random.randint(1, 100)

    codeFile = ""

    match programmingName:
        case "python":
            python_path = "/home/cfets/gitea/pyWebTest1/example/server/"
            code_file = python_path + "pyTest_" + now_time + '_' + str(i) + ".py"

        case "html":
            html_path = "/home/cfets/gitea/pyWebTest1/example/templates/"
            code_file = html_path + "htmlTest_" + now_time + '_' + str(i) + ".html"

        case "javascript":
            js_path = "/home/cfets/gitea/pyWebTest1/example/static/"
            code_file = js_path + "script_" + now_time + '_' + str(i) + ".js"

    # 保存至文件
    if code_file != "":
        try:
            content=content_list[0]
            with open(code_file, 'w') as f:
                f.write(content)
        except Exception as e:
            print('Error: %s' % e)


# 正则提取py、html和js文件
def extractCode(replyMessages):
    # i = random.randint(1, 1000)
    python_content = re.findall(r'```python(.*?)```', replyMessages, re.DOTALL)
    saveCode("python", python_content)

    html_content = re.findall(r'```html(.*?)```', replyMessages, re.DOTALL)
    saveCode("html", html_content)

    js_content = re.findall(r'```javascript(.*?)```', replyMessages, re.DOTALL)
    saveCode("javascript", js_content)




# AI对话
def conversation_mutual():
    messages = []

    while True:
        message = input('user:')
        messages.append({'role': Role.USER, 'content': message})
        whole_message = ''
        responses = Generation.call(Generation.Models.qwen_max, messages=messages, result_format='message', stream=True,
                                    incremental_output=True)
        print('system:', end='')
        for response in responses:
            if response.status_code == HTTPStatus.OK:
                whole_message += response.output.choices[0]['message']['content']
                print(response.output.choices[0]['message']['content'], end='')
            else:
                print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                    response.request_id, response.status_code,
                    response.code, response.message
                ))
        print('\n')
        # 触发存储
        extractCode(whole_message)

    print()
    messages.append({'role': 'assistant', 'content': whole_message})

if __name__ == '__main__':
    conversation_mutual()

在项目中建一个子项目example,作为flask的文件夹,server,static和templates文件分别对应到AI给出代码提取的文件夹
在这里插入图片描述
现在可以尝试一下,回到一开始AI对话,我们仔细看,就会发现AI生成的代码,有不少缺陷,仅列举比较严重的错误
1) 比如后端py程序,倾向于按代码(symble值)获取代码,但我们知道akshare库接口不支持这种方式,需要获得全部行情后再按代码筛选
2) 比如直接运行本地的html会出现跨域的问题,需要在server端运行html,flask需要补充一个跳转

所以,给到AI的需求要比较准确、完整,有可能还需要限制技术路径。 然后执行上述程序,我们给出的需求是
请使用python开发web程序,前端html支持输入股票代码,后端程序利用最新akshare库东财市场数据接口获取全市场行情,然后筛选获取前端输入股票代码的最新价,反显给前端,并且能够通过localhost:5000/index的方式,跳转访问前台网页

看看AI编程的效果
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

看一下编码的效果:

  1. 落地后的python
    在这里插入图片描述

  2. 落地后的html
    在这里插入图片描述
    效果还可以,python存在一些问题,返回值应该是中文而不是英文,我们尝试让AI纠正一下

于是告知AI: stock_df = ak.stock_zh_a_spot_em() 返回值是中文,请修改这部分
我们看看效果
在这里插入图片描述
AI修改了刚才的错误,但是同时AI又把HTML生成了一遍,有点画蛇添足
在这里插入图片描述
但不管怎么样,获得了相对正确的代码。 我们看看第二次落地代码
这是python(看名字的版本时间)
在这里插入图片描述
这是html
在这里插入图片描述
尝试执行,我们手工把python程序改成flaskServer.py 放到example子项目的根目录,再把html文件改成index.html,仍然放在templates目录下

在这里插入图片描述

先启动flask
在这里插入图片描述
然后在浏览器输入 localhost:5000/
跳转到页面,在输入600031,可以看到其最新价格13.75
在这里插入图片描述
至此我们可以总结一下:
AI编码并不是是个绣花枕头,也并不是传统编码方式的一个延续(通过IDE拖拉拽改补),而是可以把文字定义的需求,转化为用户想要的代码,甚至是帮助用户搭一个简单框架。

同时,AI编码并不能取代程序员,而是程序员工作方式和重点会有所改变,就像汽车取代马车,交通工具和相关技术的升级,但并不使得人类进入玄学的领域…

但是仅仅是初体验,还有许多问题要解决,比如对基本相似的输入,AI给出的结果并不稳定,其次到目前位置还不能摆脱,全模式转换,也就是针对一个需求,每次几乎前后台一起生成,尚且不支持,补充需求,对指定文件实现局部修改等等…

当然这并不是不能做到,后面我们会尝试,让AI对特定文件实现特定需求的编码实现,比如在现有前后台应用增加一个功能,而不涉及代码基本不变…

;