免费高效,告别Copilot的理由......

2024-08-26 11:07:09 浏览数 (2)

前言

2021年GitHub首次公开介绍它们开发的一款 AI 代码补全工具(有点小贵), 并在2022年面向公众发布, 那时国内程序员就都在互相传哎呀程序员要被取代啦....那么显然不会取代任何程序员, 官方给出的定位就是 通过AI技术辅助编程人员提高编程效率。‌该服务最初包含一个补全工具, 当软件开发人员输入代码时, 软件能够给出一些代码补全建议, 帮助用户更快地完成编码工作. 那么 Github 的先驱下国内的 AI 助手相继出现,为国内程序员谋取福利加快开发效率解放机械效能. 当时我也是狠狠的拿下了进行使用初步感受确实很舒服但是有时候因为网络问题就会很慢当然就要开那玩意(因为我是白piao"秦始皇"的), 既然如此我何不使用国内不用花 "米" 速度又快, 就在今年 3 月份腾讯云发布了自己的 AI 助手使用 " 4 1 1 " 产品策略 打造腾讯云 AI 代码助手. 我已经使用了好几个月了我觉得可以脱离 copilot 了免费的还是舒服的.

如下图公司电脑安装的各大 ai 助手, 经过我这几个月开发当中的时候还是觉得腾讯云 AI 的好用相应很快, 能够快速检索到我的想法百分之六十, 也可以很快的学习到你的代码风格,那么极速来试试腾讯云 AI 代码助手 !!!

腾讯云AI代码助手简介

腾讯云 AI 代码助手是由腾讯云自研的一款开发编程提效辅助工具, 开发者可以通过插件的方式将 AI 代码助手安装到编辑器中辅助编程工作(VS Code 或者 JetBrians 系列 IDE);而 AI 代码助手插件将提供:自动补全代码、根据注释生成代码、代码解释、生成测试代码、转换代码语言、技术对话等能力。通过腾讯云 AI 代码助手, 开发者可以更高效地解决实际编程问题, 提高编程效率和代码质量。

理论上 AI 代码助手不限制任何类型的代码语言, 甚至对于中文内容得输入, 都能进行自动补全。

分类

支持的语言

前端

HTML、JavaScript、CSS、Vue、React、Bootstrap 等。

后端

JavaScript (Node.js)、Python、Java、C#、Ruby、PHP 等。

客户端

Java、Kotlin、Swift、Objective-C、C# 等。

其他

C 、Go、Rust、TypeScript、Shell、PowerShell、R、MATLAB、Perl、Lua 等。

腾讯云 AI 代码助手 致力于打造工程化的新体验

采用 4 1 1 的策略进行打造腾讯云 AI 助手

分别的顺序是 4 (应用场景)、1 (训练平台) 、 1 (数据看板)

‘ 4 ’ 表示四个应用场景

  • 代码补全
  • 技术对话
  • 单元测试
  • 代码诊断

1 (训练平台)

  • 基于训练平台作为底座无论是公有云场景还是私有化场景都将基于改平台进行训练和推理不断的优化

1 (数据看板)

  • 根据数据看板可以对 AI 代码助手进行及时的反馈、优化

数据隐私/安全性

腾讯云提供数据隐私,你的代码是安全且私有的财产, 我们将根据隐私声明遵循负责任的做法, 以确保你的代码片段不会被用于其他用户的建议回答.

开启编码安装 AI 代码助手 - 公测中

官方插件支持 IDE 版本要求

IDE

最低版本要求

Visual Studio Code

1.84

IntelliJ IDEA

2022.2

PyCharm

2022.2

GoLand

2022.2

Clion

2022.2

PhpStorm

2022.2

Android Studio

Flamingo | 2022.2.1

我们直接前往自己趁手的开发工具进行快速安装如下:

Visual Studio Code

打开插件市场

已安装 Visual Studio Code 的情况下,左侧导航上点击扩展

搜索“腾讯云 AI 代码助手”

在插件市场中搜索框中输入“腾讯云 AI 代码助手”,并搜索

点击安装

在搜索结果中点击“Install”

Visual Studio Code 对话快捷指令

在对话输入框中,输入 / 或 @ 调用预置的快捷指令:

  • /clear:清空当前会话。
  • /comments:为所选的代码添加文档注释。
  • /newNotebook:创建一个新的 Jupyter 笔记本。
  • /explain:解释所选代码的工作原理。
  • /fix:针对所选代码中的问题提出修复方案。
  • /tests:为所选代码生成单元测试。
  • /nameVariable:变量命名。
  • @vscode:询问 VS Code。
  • @terminal:询问如何在终端中执行某些操作。
  • @workspace:询问您的工作空间,将自动引用当前代码。

JetBrains IDEs

打开插件市场

已安装 JetBrains IDEs 的情况下,文件菜单下点击设置

搜索“腾讯云 AI 代码助手”

点击“插件”,进入插件市场,搜索“腾讯云 AI 代码助手

点击安装

在搜索结果中点击“安装”

JetBrains 对话快捷指令

在对话输入框中,输入 / 或 @ 调用预置的快捷指令:

  • /comments:为所选的代码添加文档注释。
  • /explain:解释所选代码的工作原理。
  • /fix:针对所选代码中的问题提出修复方案。
  • /tests:为所选代码生成单元测试。
  • /clear:清空当前会话。
  • @workspace:询问您的工作空间,将自动引用当前代码。

上面的快捷指令我就不介绍了意思都已经很明确了简简单单, 里面的原理也是设置了一个 Prompt 角色

体验代码补全

安装完毕后我们进行体验腾讯云 AI 助手

这里我提前编写好我想要的需求代码, 助手是否能够识别到? 直接进行换行

代码补全出来了使用 Tab进行采用补全代码, 觉得需求还未结束继续回车补全代码

助手会自动去检索系统当中的代码, 生成规范的补全代码, 我在 User 类当中使用了 lombok 的 builder 建造者它也就按照进行补全.

最后就按照你的业务进行衍生

可以假想这是段业务代码其中某个类需要进行赋值多个属性你是不是得要一个个的去 set 这样就很麻烦, 如果使用腾讯 AI 代码助手只需提供需求让它来做是不是很方便一秒 Tab

比如下面我要下載一审批单那么我直接翻译好对应的英文接着打一个 Javadoc

可以看到助手直接帮我生成了我想要的,根据当前项目的代码风格来生成,我并没有表面这个 Javadoc 是下载某某单的意思自动学习了我的代码风格,我认为这是非常好用的一点

体验腾讯 AI 助手对话

对话模式就好比网页版本的 gpt 在之前我们可能得要复制代码到页面里面操作来回折腾切换页面也很麻烦, 腾讯助手内置 IDEA 插件可以非常方便的将代码贴入

比如我要编写一个使用 Java 实现 Git 提交 (故意说的不精确), 可以看到 不仅仅是提供代码 腾讯助手将 idea 的步骤也输出了出来

如果觉得代码输出的内容全部都可以使用可以直接创建代码文件

可以看见腾讯云 AI 助手在我的工作区新建了一个代码文件内容就是输出出来的代码如果有问题我们也就小改这个功能还是很方便.

对话功能按钮

在上面我们看到了对话当中的代码块出现了四个功能按钮,我们分别来看看

  • 1、进行代码比对, 根据你当前选的和腾讯 AI 助手输出的代码进行对比, 会调用 IDEA 内置的 Git Diff 对比器
  • 2、复制代码块,这倒是很常见的功能
  • 3、插入代码, 根据你选择的区域或者你的光标位置 进行替换代码块
  • 4、创建代码文件, 就是上面我们已经用过的功能,直接在当前问答文件的地址进行新增, 这个功能也很 nice

不仅仅如此腾讯云 AI 助手还内置了多种 Agent 模式.

终端结合

目前经过测试,JetBrains 暂不支持,而 Vscode 支持,在 Vscode 当中内置了多种代理使用方法

  • @workspace:面向项目工程下的提问解答
  • @vscode:面向 vscode 帮助文档的提问解答。
  • @terminal:面向终端的提问解答。
  • 还支持自定义扩展 Agent 感兴趣的可前往: 自定义

这里我们将使用 terminal agent 面向终端, 一般就是出现报错等情况方便快速找到解决方案

如下案例 maven 报错我们就可以直接使用 AI 助手进行解释代码

然后将会打开助手对话框和平常的使用一样如果第一次问答没有出现想要的结果就慢慢引导给出更加精确的想法很快就可以得到答案.

控制台异常 FIx

我这里制造了一个异常,展现内置控制台的 /fix 快捷操作

操作演示

点击    对所选代码中的问题提出修复方案.

可以看到腾讯云 AI 助手将我们的问题提出了修复方案, 从为什么出现 到 解决方案 完整案例代码, 并且最后进行总结修复的代码 非常的不错.

那么以上就是基本的腾讯云 AI 助手的介绍了, 使用这么一款内置在开发工具当中的助手, 对开发人员非常的舒服, 接下来我就用几个案例带着同学来过一遍. 感受科技的快感 !!!

使用助手加强 EventBus 事件总线

背景: 当我们了解到使用 EventBus 如果存在多个监听器的情况下它会直接全部进行发送事件, 那肯定不想这样子,所以我们得要改造它, 配合使用腾讯云 AI 代码助手进行辅佐我们的代码实现想法.

⚠️ 代码助手是配合你的思路来完成你的工作, 你不能一下子就要它实现某个复杂的东西,得要一步步告诉如何操作

需求:

  • 定制规则使用注解来标注每个监听器不同的名称
  • 使用@PostConstruct 进行标记初始化我们的监听器,批量的注册到 EventBus 当中
  • 调用的时候直接指定需要发送的监听器名称就可以实现指定发送啦

事先我就已经搭建好了一个 maven 空架子如下

默认搭建好了 EventBus 的配置和代码

  • application 启动类
  • EventBusConfig 配置类
  • TestListener 监听器
  • TestController 测试接口

整体代码如下图:

那么我们就直接启动一下程序

可以看到出现了依赖循环 解决方法相比都知道了吧? 我们直接问腾讯云 AI 助手

直接将问题丢进去并且选择出问题的代码那么腾讯云助手就会去精确的检索和改造有问题的代码, 而不是直接丢个错误进去那么将大大减少 ai 的能力.

腾讯云 AI 助手:

要解决这个依赖循环问题,你需要移除EventBusConfig类中eventBus()方法和registerListeners()方法之间的循环依赖。一种方法是重构代码以避免循环依赖,例如将TestListener的注册逻辑移动到另一个配置类中。这里是一个简单的解决方案: 创建一个新的配置类,例如TestListenerConfig。 在TestListenerConfig中注册TestListener。 移除EventBusConfig中的registerListeners()方法。

上面助手给出了一个很规范的解决方案进行拆分出来减少耦合, 那么就拆出来, 进行测试, 可以成功的发送事件.

前面一开始助手就讲解了很多方法来解决,如果你知道某种你就和助手提使用你想的方法实现,比如使用上下文去拿 Bean 实现 也是可以的.

那么我这里为了方便我就直接使用 yml 配置来开启 allow-circular-references 允许循环使用, 这样就可以放在一个里面了.

接下来我们继续, 在前面我讲到了实现需求 实现就是定义一个注解来标记每一个监听器, 然后批量注册, 在自定义一个包装类,基于目标监听器类型对事件进行过滤, 从而达到指定发送的目的

  • 一、定制规则使用注解来标注每个监听器不同的名称
  • 二、使用@PostConstruct 进行标记初始化我们的监听器,批量的注册到 EventBus 当中
  • 三、定义包装类 事件过滤器 它确保只有匹配指定监听器类型的事件才会被实际的监听器处理。
  • 四、调用的时候直接指定需要发送的监听器名称就可以实现指定发送啦

那么根据我们的思路, 组织一段 prompt 问腾讯云 AI 助手

我正在改造EventBus post的时候传递指定类型,那么就发送到指定的监听器当中. 使用注解和ApplicationContextAware拿到注解集合批量注册对应的监听器

不错, 理解的非常到位! 接着我看了下代码完成度非常高.

就是少了一个 EventBusType 类 和 EventListenerComponent 注解 在后面我们问助手要.

下面就是助手输出的代码, 并不是很正确, 所以我说这是辅助配合,不是完完全全帮你写代码. 但是思路是我们想要的. (虽然已经实现大部分了)

代码语言:java复制
@Component
@Configuration
public class EventBusGuavaConfig implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        EventBusGuavaConfig.applicationContext = applicationContext;
    }

    @Bean
    public EventBus eventBus() {
        return new EventBus();
    }

    @PostConstruct
    public void registerListeners() {
        // 1. 获取 EventBus 实例
        EventBus eventBus = eventBus();

        // 2. 从 ApplicationContext 中获取所有被标注为 @EventListenerComponent 的 Bean
        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(EventListenerComponent.class);

        // 3. 遍历这些 Bean
        for (Map.Entry<String, Object> entry : beansWithAnnotation.entrySet()) {
            Object bean = entry.getValue();

            // 4. 获取每个 Bean 上的 @EventListenerComponent 注解
            EventListenerComponent annotation = bean.getClass().getAnnotation(EventListenerComponent.class);

            // 5. 如果注解存在
            if (annotation != null) {
                // 6. 获取注解中的值(监听器类型)
                EventBusType listenerType = annotation.value();

                // 7. 注册一个 FilteringSubscriber 实例到 EventBus
                eventBus.register(new FilteringSubscriber(bean, listenerType));
            }
        }
    }

    /**
     * FilteringSubscriber 是一个包装类,基于目标监听器类型对事件进行过滤。
     * 它确保只有匹配指定监听器类型的事件才会被实际的监听器处理。
     */
    private static class FilteringSubscriber {
        // 实际的监听器对象,如果满足过滤条件,它将处理事件。
        private final Object listener;
        // 用于过滤事件的监听器类型。
        private final EventBusType listenerType;

        /**
         * 构造一个具有指定监听器和监听器类型的 FilteringSubscriber。
         *
         * @param listener     实际的监听器对象
         * @param listenerType 用于过滤事件的监听器类型
         */
        FilteringSubscriber(Object listener, EventBusType listenerType) {
            this.listener = listener;
            this.listenerType = listenerType;
        }

        /**
         * 如果事件的目标监听器类型与此订阅者的监听器类型匹配,则处理该事件。
         * 该方法使用 @Subscribe 注解,表示它处理发布到 EventBus 的事件。
         *
         * @param event 要处理的事件
         */
        @Subscribe
        public void handleEvent(EventData<?> event) {
            // 检查事件的目标监听器类型是否与此订阅者的监听器类型匹配
            if (listenerType.equals(event.getTargetListener())) {
                // 创建一个新的 EventBus 实例来处理事件
                EventBus eventBus = new EventBus();
                // 将实际的监听器注册到新的 EventBus 实例
                eventBus.register(listener);
                // 将事件发布到新的 EventBus 实例,这将调用实际监听器的事件处理方法
                eventBus.post(event);
                // 在处理完事件后,将实际的监听器从新的 EventBus 实例中注销
                eventBus.unregister(listener);
            }
        }
    }

}

下面就开始定义注解 和 批量注册到 eventBus 当中

定义注解

用于标记每个自定义监听器

代码语言:java复制
/**
 * 事件侦听器组件
 *
 * @author Yang Shuai
 * Create By 2024/08/11
 */
@Component
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventListenerComponent {
    /**
     * 事件类型
     */
    String value();
}

批量注册监听器

接着我们就初始化批量注册到事件总线当中, 修改我们的配置文件 实现 应用程序上下文, 用来获取注解对应的监听器

定义枚举类型

直接问 EventBusType 帮我编写一下 按照规范则输出枚举, 很不错!

修改注解里面的属性类型为枚举

接着我们往下滑动看到还有一个 EventData 类, 这个里面就是 event 每个监听器接收到的数据, 那么里面肯定有 object 和 监听器类型字段, 我们直接问 AI 助手要.

果然不出所料一个 Object 监听器的数据一个 type 指定发送给哪个监听器

搞定, 有腾讯云 AI 助手辅助事半功倍哇

测试效果

分别把之前的两个测试监听器一个添加自定义注解一个不添加如果添加的接收到了那么就成功了.

完美搞定, 总的来说 腾讯云 AI 助手代码能力也是挺强的, 这些代码我都是手打的, 打得中途代码补全就是对话当中的代码, 还是很舒服的 !

使用助手自定义一个简易的 EventBus

经过上面我们改造了 EventBus 其实也就是注册->发送->指定->监听器, 那么我们其实也可以根据这个思想来搞个简单的

我根据我的需求提供一个完整的 Prompt

希望有一种集中式的方式(如策略模式)来处理多个 listener,而不是为每个 listener 都写一个 bean。 你希望能够自动将 listener 配置到 EventBus 中,而无需手动处理。 你提到想通过自定义注解(如 @EventListenerComponent)并为其增加 value 属性,以便在事件分发时判断消息应该发给哪个监听器。 泛型在事件中的应用: 希望在 MyEvent 事件类中传递的参数使用泛型,以提高代码的灵活性和可重用性。 如何避免加载全局组件: 提到在使用 applicationContext.getBeansWithAnnotation(Component.class) 时,可能会加载到全局的组件。为避免这种情况,考虑自定义一个注解来精确标识需要的组件。 消息分发的优化: 希望在事件发布 (post) 时能够根据 listener 的类型或其他条件进行更精确的分发,而不是在 handleEvent 方法中逐个判断。 使用枚举进行判断: 希望通过枚举的方式来处理监听器类型的判断,以使代码更加清晰和易于维护。

以下就是完整的代码案例我一个个 copy 稍微有点瑕疵都是合理范围内可以正常运行

很不错, 完成度非常高, 我一步步的按照代码顺序来成功运行, 以下图就是完整代码

使用助手开发装B神器

在前面我们已经向AI助手生成了GIT提交代码, 接下来使用这个来开发装B神器, 以视频形式更加直观~

视频内容

获得的帮助与提升

经过前面的讲解和实战操作以及此次文章的撰写, 获得的帮助我就不多说了都可以感受得到,我深入了解并体验了AI代码助手,我学会了如何通过AI工具提升编程效率,减少重复劳动、机械代码的编写。使用腾讯云AI助手后,我的代码编写速度和质量都得到了显著提升,同时也加深了对现代编程工具的理解。在遇到代码问题时,AI助手能够迅速提供建议,这让我在开发过程中更为顺畅。

建议

在使用腾讯云AI助手的过程中,我发现该工具确实能够有效提升编程效率,但仍有一些改进空间:

  • 支持上传图片识别根据 prompt 来生成代码 (可能是付费效果)
  • 希望代码的准确性还可以进一步提升
  • 希望可以在代码窗口当中输入快捷键操作比如 // /fix xxx 回车就可以直接显示对话框,可能不好做,只是建议
  • 在网络不佳或断网的情况下,助手的响应速度和功能会受到影响。希望能加强离线模式的功能,让用户在离线时也能获得基本的代码补全和建议
  • 助手目前可以逐步学习用户的代码风格,但希望能加快这一学习过程,并允许用户手动输入或导入一些代码规范和风格标准,以加速个性化适应,比如支持阿里云开发规则手册
  • 虽然已经支持VS Code和JetBrains系列,但希望未来能扩展到更多的开发工具和环境,以适应不同开发者的需求

通过这些改进,腾讯云AI助手能够为开发者提供更加灵活、高效的编程支持。

最后

经过本篇文章的学习,我相信你也体会到了腾讯云 AI 代码助手的强大,免费高效辅助你在工作当中提高摸鱼时间。

本期结束咱们下次再见

0 人点赞