让AI给你写代码,初体验(三)- AI加上格式化对话,实现对单个文件的修改/保存

news2024/9/21 11:05:24

上一篇中,AI生成web应用初步解决了简单web应用生成,但是存在两方面的问题
1) 无法向AI提供增量需求,特别是一个对话结束之后,只能把全部需求(包括新需求)再描述一遍
2) 无法用AI对存量代码进行修改,代码存在一定的不稳定性
当然解决的思路很简单,只要能让ai能读入单个文件,然后就可以通过对话驱动AI修改代码了,问题在于千问(Qwen)大模型不能读取本地文件… 怎么办,换个思路,读取本地文件根本不需要AI,只需要程序读取后喂给AI即可, 所以对单个文件的修改和保存可以归纳为:
主人: 要求打开本地指定代码
小助手: 打开本地指定代码,并反显
主人:要求结合这段代码和新需求,增加一个功能
小助手: 将这段代码和新需求提交给AI,并反显AI给出的建议
主人: 要求修改
小助手:将修改要求提交给AI,并反显AI给出的建议
主人:要求合并代码
小助手:将合并代码的要求提交AI,并反显
主人: 要求保存代码
小助手:将AI给的代码提取保持
主人:退出对话
小助手:结束对话
实际上我们只要设计一个代理小助手,他要做的事情分为两类,一类是基本确定的事情,可以用格式化对话,正则表达式提取关键信息,形成操作方法,一类是需要转交给AI进行处理的方法,于是做了个小助手程序assist.py(省略 import和 API Key,请自行补充)

class Assistant:
    def __init__(self):
        self.last_content = ""
        self.last_AI_message = ""
        self.python_path = "/home/cfets/gitea/pyWebTest1/example/server/"
        self.html_path = "/home/cfets/gitea/pyWebTest1/example/templates/"
        self.js_path = "/home/cfets/gitea/pyWebTest1/example/static/"

    def setLastContent(self, content):
        self.last_content = content

    def setLastAImessage(self, message):
        self.last_AI_message = message

    def getLastContent(self):
        return self.last_content

    def getLastAImessage(self):
        return self.last_AI_message

    def genAImessage(self, newMsg):
        return newMsg + self.last_content

    # 打开文件
    def openFile(self, programmingName):
        file_suffix = programmingName.split(".")[-1]
        match file_suffix:
            case "py":
                resources_file = self.python_path + programmingName
            case "html":
                resources_file = self.html_path + programmingName
            case "javascript":
                resources_file = self.js_path + programmingName
        try:
            with open(resources_file, "r", encoding="utf-8") as f:
                content = f.read()
                self.setLastContent(content)
        except Exception as e:
            print('Error: %s' % e)
            content = '打开文件失败: %s' % e
        finally:
            return content

    # 保存文件
    def saveFile(self, replyMessages):
        python_content = re.findall(r'```python(.*?)```', replyMessages, re.DOTALL)
        self.saveCode("python", python_content)

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

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

    # 保存文件原子操作
    def saveCode(self, programmingName, content_list):
        # 生成版本号
        code_file = ""
        res_content = ""
        now_time = time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime())
        i = random.randint(1, 100)

        match programmingName:
            case "python":
                code_file = self.python_path + "pyTest_" + now_time + '_' + str(i) + ".py"

            case "html":
                code_file = self.html_path + "htmlTest_" + now_time + '_' + str(i) + ".html"

            case "javascript":
                code_file = self.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)
                    res_content = "保存成功"
            except Exception as e:
                print('Error: %s' % e)
                res_content = '保存失败: %s' % e
        else:
            res_content = "保存失败: 未找到文件类型"

        return res_content

    # 提交AI对话
    def conversation_ask(self, message):
        # 组成对话内容
        ai_message = message + self.last_content
        messages = [{'role': Role.USER, 'content': ai_message}]
        # 提交对话
        responses = Generation.call(Generation.Models.qwen_max, messages=messages, result_format='message', stream=True,
                                    incremental_output=True)

        print('from AI:', end='')
        whole_message = ''

        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')
        messages.append({'role': 'assistant', 'content': whole_message})
        self.setLastAImessage(whole_message)
        return whole_message

Assistant小助手程序主要实现,打开文件、保存文件、提交AI并处理AI回复等功能,注意小助手会hold住前一次的输入内容,以实现打开文件获取内容并向AI提交,并会hold住AI回复的内容以备主人要求保存文件

主程序如下:

# AI对话
def conversation_mutual():
    # 初始化小助手
    assistant = Assistant()

    while True:
        message = input('master:')

        pattern = r'打开(.*?)文件'
        if re.search(pattern, message, re.DOTALL):
            programmingName = re.findall(pattern, message, re.DOTALL)[0]
            content = assistant.openFile(programmingName)
            print('小助手:', end='')
            print(content, end='')
        else:
            pattern = r'保存(.*?)文件'
            if re.search(pattern, message, re.DOTALL):
                assistant.saveFile(assistant.getLastAImessage())
                print('小助手:', end='')
                print('保存完毕', end='')
            else:
                pattern = r'结束(.*?)对话'
                if re.search(pattern, message, re.DOTALL):
                    break
                else:
                    assistant.conversation_ask(message)
        print('\n')


if __name__ == '__main__':
    conversation_mutual()

主程序就是实现了和小助手的格式化对话,即需要
1) 输入:打开XXXX文件,小助手就会打开XXXX文件
2) 输入: 保存文件,小助手就会按预设文件名和路径的提取内容,保存文件
3)输入: 结束对话,小助手就会结束对话

我们看一下效果,执行主程序

看一下修改功能:
1 打开源代码(小助手: 显示的是格式化对话执行结果)
在这里插入图片描述
2 给出修改建议
要求:修改建议,1 ak.stock_zh_a_spot() 请用akshare的ak.stock_zh_a_spot_em()接口替代

可以看到已经修改(from AI: 来自于AI信息的建议)
在这里插入图片描述
3 保存文件: 这是格式化文件操作
在这里插入图片描述
4 修改落地后的文件
在这里插入图片描述
5 然后,我们新增一个功能
要求:新增功能能够通过localhost:5000/index的方式,跳转访问前台网页请, 并合并上次生成的代码,给出完整python文件(最好是加上这段,否则AI可能在代码省略以“原有代码…”表述)
在这里插入图片描述

6 保存文件
在这里插入图片描述

7 文件落地,两个功能都有了
在这里插入图片描述
那么这些修改直接用通义灵码直接在代码中修改是否可行?
用通义灵码生成**“新增路由,用于访问前端网页”**的需求,如下
在这里插入图片描述
感觉有点不是一步到位… 总体上说通义灵码,续写代码,看接口意义和解释非常好,但是要理解一个功能点并直接生成,稍微有点不足。

我觉得可以综合应用,小助手agent方式和通义灵码进行编码,可能更好一些

后续我们会尝试让小助手变得更智能一些,并和更多AI结合,使她的功能更强大

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

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

相关文章

深入学习NumPy库在数据分析中的应用场景

在数据科学与机器学习领域,NumPy(Numerical Python)是一个经常被提及的重要工具。它是Python语言中一个非常强大的库,提供了高性能的多维数组对象以及用于处理这些数组的工具。NumPy不仅仅是一个用于数值计算的库,它还…

Redis第6讲——主从复制模式详解

Redis的读写性能很高,但在面对大规模数据和高发访问的挑战时,单节点的Redis可能无法满足需求,这就引出了Redis集群的概念。本节先介绍一下Redis高可用方案之一的主从复制模式,虽说现在基本不会用这种模式,但是无论是哨…

Web自动化测试平台开发---Automated_platform

一、项目简介 历时一个假期,Automated_platform 第一版完工,是一款基于po模式的自动化测试平台,采用后端技术为DjangoceleryRabbitMQmysql 配置mysql数据库,进行数据迁移后,运行项目后,即可成功访问http://127.0.0.1:8…

单调栈的理解

单调栈的理解 核心代码场景思考 完整代码 单调栈&#xff1a; 单调递增或 单调递减的栈 核心代码 while (!s.empty()&&s.peek()<nums[i]){s.pop(); } s.push(nums[i]);将要放入的元素&#xff0c;与栈内元素依个比较&#xff0c;小于的都出栈&#xff0c;最后将要…

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

Executable and Linkable Format(ELF)

File layout ELF文件有两种视图。程序头表&#xff08;Program Header&#xff09;显示在运行时使用的段&#xff08;Segments&#xff09;&#xff0c;而节头表&#xff08;Section Header&#xff09;则列出了二进制文件的所有节&#xff08;Sections&#xff09;的集合。程…

SCT2633STER:4.5V-60V Vin,3A,高效降压DCDC转换器

•宽输入范围&#xff1a;4.5V-60V •高达3A的连续输出电流 •1.221V1%反馈参考电压 •集成220mΩ高压侧MOSFET •低静态电流为300uA •轻负载下的脉冲跳过模式&#xff08;PSM&#xff09; •最小接通时间100ns •内置12ms软启动时间 •简易内部补偿 •固定频率500KH…

使用Docker搭建一款实用的个人IT工具箱——It-Tools

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

怎么抠图把把人物扣下来?简单快捷的抠图方法

相信很多新手小白在初入设计行业时&#xff0c;对于抠图怎么把人物扣下来都是一头雾水。抠图作为设计中常用的一种技术&#xff0c;能够帮助我们快速提取图片中的某个部分&#xff0c;进行合成或者修改。对于老手来说&#xff0c;抠图或许是再熟悉不过的操作&#xff0c;但对于…

WPF中如何设置自定义控件

1.圆角按钮的设置&#xff1a; 众所周知在WPF中自带有提示信息&#xff0c;当我问创建Button时&#xff0c;点击空格出现如下可选设置 带有小扳手&#x1f527;图标为相应的属性&#xff0c;如果Button有CornerRadius&#xff08;角半径&#xff09;属性就能够直接设置Button实…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值&#xff0c;整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中&#xff0c;修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…

如何用ai智能写作?推荐5款优秀的AI写作神器

写作是件繁琐的事情&#xff0c;也是需要耗费精力和时间的&#xff0c;还好目前有了ai写作神器的出现&#xff0c;帮助我们解决了不少的写作难题。这些AI写作工具不仅可以帮助我们提高写作效率&#xff0c;还能够生成高质量的内容。在本文中&#xff0c;我将向你推荐5款优秀的A…

MATLAB中strel函数用法

目录 语法 说明 任意邻域形状 二维几何邻域形状 三维几何邻域形状 示例 创建正方形结构元素 创建线形结构元素 创建盘形结构元素 创建三维球形结构元素 参数说明 属性 strel函数的功能是形态学结构元素。 语法 SE strel(nhood) SE strel("diamond",r…

BUUCTF AWD-Test1

打开靶场是这个有些简陋的界面。 随便点点&#xff0c;找到这个东西。 看到ThinkPHP&#xff0c;思路瞬间清晰&#xff0c;老熟人了。这个就是ThinkPHP漏洞。根据版本我们去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

Git工具Clone项目报错:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

目录 问题现象&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 今天在项目中使用git工具clone远程库的项目地址时&#xff0c;遇到了如下报错&#xff0c;导致无法克隆项目代码到本地&#xff1a; OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054 解决方法&#…

【从Python基础到深度学习】9.Python 语法基础

一、常量与变量 常量:程序中使用的具体的数、字符。在运行过程中&#xff0c;值无法更改 变量:表示一一个存储单元&#xff0c;其中存储的值可以修改 如&#xff1a;a5,b6 变量命名: 1、只能包含字母、数字、下划线 2、只能以字母、下划线开头 3、不要使用关键字作为变量名称 …

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的&#xff1f; 数据的更新 前言 mvcc 与一个事物的隔离级别有关&#xff0c;未提交读永远读的是当前值&#xff0c;串行化是通过加锁实现&#xff0c;这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…

【YOLO系列】YOLOv9论文超详细解读(翻译 +学习笔记)

前言 时隔一年&#xff0c;YOLOv8还没捂热&#xff0c;YOLO系列最新版本——YOLOv9 终于闪亮登场&#xff01; YOLOv9的一作和v7一样。v4也有他。 他于2017年获得台湾省National Central University计算机科学与信息工程博士学位&#xff0c;现在就职于该省Academia Sinica的…

vue3+ts+vite使用mock数据

安装以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路径下创建mock文件夹 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系统管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

曾桂华:车载座舱音频体验探究与思考| 演讲嘉宾公布

智能车载音频 I 分论坛将于3月27日同期举办&#xff01; 我们正站在一个前所未有的科技革新的交汇点上&#xff0c;重塑我们出行体验的变革正在悄然发生。当人工智能的磅礴力量与车载音频相交融&#xff0c;智慧、便捷与未来的探索之旅正式扬帆起航。 在驾驶的旅途中&#xff0…