这里我们准备让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_filenow_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编程的效果
看一下编码的效果:
-
落地后的python
-
落地后的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对特定文件实现特定需求的编码实现,比如在现有前后台应用增加一个功能,而不涉及代码基本不变…