← 返回博客

AI 持续带来惊喜

2024年1月22日


最近我一直在我的日常编码中使用 Zed 内置的 AI 助手。 我对 AI 持怀疑态度,这已经不是什么秘密了,但我希望保持开放的心态,并给 AI 一个让我印象深刻的机会。

以下是一些最近的例子,在这些例子中,Zed 的 AI 集成给我留下了深刻的印象。

使用 AI 编写文档

在过去的两个星期里,团队一直在举办我们亲切地称之为“文档派对”的活动,我们所有人都会花一两个小时来记录 Zed 代码库的各个部分。

在其中一个派对上,我发现自己需要记录两个具有相同字段的结构体:一个内部设置结构体和一个用于序列化的单独结构体。 其中一个结构体记录了它的字段,而另一个没有。

#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
    pub tab_size: NonZeroU32,
    pub hard_tabs: bool,
    pub soft_wrap: SoftWrap,
    // ...
}
 
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
pub struct LanguageSettingsContent {
    /// How many columns a tab should occupy.
    ///
    /// Default: 4
    #[serde(default)]
    pub tab_size: Option<NonZeroU32>,
    /// Whether to indent lines using tab characters, as opposed to multiple
    /// spaces.
    ///
    /// Default: false
    #[serde(default)]
    pub hard_tabs: Option<bool>,
    /// How to soft-wrap long lines of text.
    ///
    /// Default: none
    #[serde(default)]
    pub soft_wrap: Option<SoftWrap>,
    // ...
}

虽然我可以手动复制文档注释,但这个结构体有 16 个字段,并且每个文档注释中的行数不平衡,这使得多光标操作有点棘手。

我决定在内联助手中输入这个提示,看看会发生什么。

复制 LanguageSettingsContent 中字段的文档注释,并将它们添加到 LanguageSettings 中的字段。 忽略关于默认值的说明。 只需带上文档注释。

AI 逐字复制了文档注释——没有包含我要求它忽略的关于默认值的说明——并将它们放在了相应的字段上。

#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
    /// How many columns a tab should occupy.
    pub tab_size: NonZeroU32,
    /// Whether to indent lines using tab characters, as opposed to multiple
    /// spaces.
    pub hard_tabs: bool,
    /// How to soft-wrap long lines of text.
    pub soft_wrap: SoftWrap,
    // ...

使用 AI 翻译代码

在我的空闲时间里,我一直在重建我个人网站的骨架。 作为其中的一部分,我需要将我的模板从 Tera 转换为我在 auk 之上构建的新模板系统。

我需要将我编写的这个小组件移植到 Auk 的 DSL。

<div class="pv2 flex items-end">
  <div class="pv1 w-20"> {{ label }} </div>
  <div class="pv1 w-80">
    <progress class="language-bar flex" value="{{ value }}" max="10"></progress>
  </div>
</div>

再一次,我认为看看 Zed 助手能用它做什么会很有趣。 我用以下内容提示它

使用 auk 的 DSL 重写此 HTML,就像上面的 post_link 函数一样。

助手吐出的最终结果看起来和我手动生成的结果完全一样。

pub fn language_stat(label: &str, value: u32) -> HtmlElement {
    div()
        .class("pv2 flex items-end")
        .child(div().class("pv1 w-20").text_content(label))
        .child(
            div().class("pv1 w-80").child(
                progress()
                    .class("flex language-bar")
                    .value(value.to_string())
                    .max("10"),
            ),
        )
}

我特别惊讶于助手能够轻松适应我创建的这个全新的 DSL。 通过简单地与一些其他示例组合在同一个缓冲区中,AI 能够拼凑出足够的上下文来正确形成。

自从发现 Zed 助手非常擅长在 Tera 和 Auk 之间进行转换以来,我一直在迁移过程中继续使用它,以减少手动繁重的工作。 在撰写本文时,几乎有 1,300 行 Auk 模板代码,其中大部分是在 AI 助手的帮助下编写的。

λ nix-shell -p cloc --command "cloc --vcs=git crates/site/src/{components,templates}"
 
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Rust                            16            130              2           1293
-------------------------------------------------------------------------------
SUM:                            16            130              2           1293
-------------------------------------------------------------------------------

虽然我仍然不相信 AI 会让软件开发人员过时,但这些经历让我相信,将 AI 谨慎地集成到我们的开发工具和工作流程中肯定是有空间的。

在 Zed,我们正在探索如何利用 AI 的力量来增强开发人员编写软件的能力,而我们才刚刚开始。

这篇文章最初发表在 maxdeviant.com