DLAI-Windsurf-笔记-全-

DLAI Windsurf 笔记(全)

001:课程介绍 🚀

在本节课中,我们将要学习如何利用 Windsurf 的 AI 编程代理来构建应用程序。Windsurf 是一个协作式的智能代理集成开发环境,它提供了一个可以与 AI 代理协同工作的空间。通过本课程,你将掌握使用 Windsurf 构建多个有趣应用的技能,并深入了解基于大语言模型的编程代理是如何构建的。

课程概述

欢迎来到“使用 Windsurf 的 AI 编程代理构建应用程序”课程。本课程由 Windsurf 合作开发,并由 Anhu Ramachandran 讲授。Windsurf 是一个协作式代理 IDE,它提供了一个可以与 AI 代理协同工作的空间。

我知道许多人在编码工作中使用 AI,例如代码补全作为一项基础功能。但许多用户,即使是那些使用 AI 辅助编程的用户,也尚未充分利用 AI 的全部潜力。本课程将使你熟练掌握当今最前沿的最佳实践,并有望彻底改变你的编程方式。

讲师 Aishha Ramasandran 是 Windsurf 的创始团队成员,也是 AI 编程代理领域的专家。感谢 Andrew,Windsurf 让使用 AI 编程变得更加有趣和轻松。

AI 编程工具的发展现状

目前,开发者可用的 AI 编程工具范围很广。在一端,是简单的编码辅助工具,它们通常只对大语言模型进行一次调用。在另一端,是旨在完全自动化编码体验的自主代理。我们构建 Windsurf 的初衷,是让它作为一个协作式代理,来弥合简单编码辅助与完全自主代理之间的差距。

我一直认为,当我了解一个工具是如何构建的时,我就能更好、更强大地使用它。这正是我对这门课程感到特别兴奋的原因。你将学习像 Windsurf 这样的代理 AI 工具的内部工作原理,同时使用它来构建游戏、修复单元测试、更新大型代码库,并从零开始构建一个完整的维基百科主题分析应用程序。

Windsurf 的核心优势

不同 AI 编程工具之间的一个主要区别在于它们如何在流程中使用大语言模型来规划和执行操作。一个有效的编码代理能够维护代码库的上下文,跟踪你的开发意图,并使用正确的工具来执行任务,这赋予了它一个优秀结对编程伙伴的感觉。

使 Windsurf 成为一个成功的 AI 编程代理的主要因素之一,是其强大的搜索和发现能力。这使它能够采取多个步骤来扫描多个文件,甚至在线搜索文档,然后识别与任务最相关的代码或文档,并最终执行一系列代码编辑来实现编程意图。

这是一个比简单调用模型更复杂、更离散的流程管道,Anho 将详细讲解所有这些细节。

致谢与展望

许多人共同努力创建了这门课程,我要感谢整个 Windsurf 团队。来自 Deep Bta AI 的 Ema Gagari 和 Jeff Ladwwickig 也为本课程做出了贡献。这门课程将会非常有趣。我认为是的,让我们进入下一个视频开始学习吧。


本节课中我们一起学习了本课程的总体介绍、AI 编程工具的现状、Windsurf 作为协作式代理的核心设计理念及其优势。在接下来的章节中,我们将动手实践,深入探索如何使用 Windsurf 构建具体的应用程序。

002:快速入门 🚀

在本节课中,你将学习如何开始使用 Windsurf,并借助 AI 代理在几分钟内构建你的第一个应用程序。


概述

本节我们将完成 Windsurf 的安装与初步设置,并利用其核心 AI 代理 Cascade 来创建一个简单的贪吃蛇游戏。通过这个过程,你将直观地体验到 AI 辅助编程的强大与便捷。


下载与安装 Windsurf

首先,你需要下载并安装 Windsurf 应用程序。

以下是具体步骤:

  1. 打开浏览器,在谷歌中搜索 Windsurf AI download
  2. 根据你的操作系统(例如 Mac 或 Windows),点击相应的下载链接和按钮。
  3. 下载完成后,打开应用程序。

安装完成后,你将看到类似下图的界面,这就是 Windsurf 的主界面。

接下来,你需要登录并进行身份验证,之后就可以开始使用了。

Windsurf 是基于 Visual Studio Code 的一个分支版本。因此,如果你使用过 VS Code,会发现很多界面元素看起来很相似。不过,本课程将重点探索其集成的众多 AI 功能。

由于它是 VS Code 的分支,在安装过程中,你还可以选择导入现有 VS Code 的所有设置。


认识核心 AI 代理:Cascade

Windsurf 界面中首先要注意的是右侧的面板,名为 Cascade。这是我们将在本课程中频繁使用的 AI 协作代理。

如果 Cascade 面板没有显示,你可以使用键盘快捷键 Command + L(在 Mac 上)来打开或关闭它。


使用 Cascade 构建第一个应用

现在,让我们使用 Cascade 来构建我们的第一个应用程序。如图所示,我启动了一个完全空白的项目。

我将直接向 Cascade 发出指令来创建应用。我选择创建一个贪吃蛇游戏。

具体指令如下:

create a snake game in JavaScript and HTML

发出指令后,你会立即看到 Cascade 开始执行一系列操作。它会自动创建并编写多个代码文件来完成手头的任务。

Cascade 甚至能建议终端命令。我可以直接运行它生成的命令来启动应用。

应用似乎已准备就绪,我可以在浏览器中访问 localhost:8000 来查看我的游戏。

游戏运行成功!我可以控制蛇移动,游戏结束后也能重新开始。


与 AI 代理协作迭代功能

但这就是与 AI 代理协作的魅力所在:我们可以轻松地进行修改和迭代。让我们回到 Windsurf,对游戏做一些有趣的修改。

例如,我想让背景颜色在每次蛇吃到食物方块时都发生变化。

我给 Cascade 的新指令是:

change the background color every time a food square is consumed

Cascade 接受了这个任务并开始修改代码。

修改完成后,我刷新浏览器页面,检查效果。太棒了!现在每次吃到食物,背景颜色都会改变,完全符合我的要求。

这就是 AI 代理的威力:你可以尽情发挥创意,用它来构建任何你想要的东西。


持续迭代与功能增强

让我们再添加一个功能,让游戏更像经典的贪吃蛇。我想把食物方块变成一个苹果表情符号。

指令如下:

change the food square to be an apple emoji

Cascade 再次执行了修改。

刷新游戏后,我们看到食物已经变成了 🍎 表情,同时背景变色功能依然有效。

我们可以一直这样迭代下去。让我们再添加一个效果:在食物被吃掉的位置产生一个小型粒子爆炸。

指令如下:

add a little explosion where the food square is consumed every time it is successful

Cascade 处理了这条指令。

刷新游戏并重新开始,现在我们看到,每次蛇吃到苹果时,除了背景变色,还会出现粒子爆炸效果。

我们甚至可以“打破规则”。让我们回到 Windsurf,让苹果也动起来,变成一个移动的目标,但移动速度比蛇慢。

指令如下:

make the apple also move, make the apple into a moving target that moves slower than the snake

Cascade 实现了这个改动。

现在刷新游戏,可以看到苹果开始缓慢移动,虽然比蛇慢,但仍然可以捕捉到。


总结

本节课,我们一起学习了如何快速入门 Windsurf。我们完成了软件的下载、安装与设置,并重点认识了其核心的 AI 协作代理 Cascade

通过指令 create a snake game in JavaScript and HTML,我们见证了 Cascade 如何自动生成代码文件并构建出一个可运行的基础应用。随后,我们通过一系列自然语言指令(如修改背景色、替换食物图标、添加爆炸效果、让食物移动)与 Cascade 互动,快速地对应用进行了迭代和功能增强,最终创建出了一个个性化的贪吃蛇游戏。

这个过程展示了 AI 辅助编程的核心优势:将你的创意快速转化为现实。虽然 AI 的输出具有一定的不确定性,你可能需要对其结果进行微调,但这极大地扩展了你的创造边界。

现在,你应该去尝试构建属于自己的应用程序,尽情探索你的创意。


003:AI代码助手101 🧠

在本节课中,我们将回顾AI编程工具的发展历程,区分炒作与现实,并建立理解不同类型代码助手的心智模型。我们将从纯人工编程时代开始,逐步探讨Copilot式助手、自主代理以及协作代理(或称“工作流”)的演变,最后讨论当前AI代码助手的现实能力与局限性。

从纯人工编程到Copilot式助手

上一节我们使用AI协作代理构建了第一个应用。现在,让我们回溯历史,看看这些工具是如何发展而来的。

在AI出现之前,完全是人类开发者的时代。我们可以将人类开发者编写代码时的行为表示为一系列动作的时间线,例如:

  • 在代码库中导航
  • 进行编辑
  • 进行研究

当ChatGPT以及GitHub Copilot、Codium、Cursor等工具出现后,我们开始进入所谓的 Copilot式助手时代。在这个时代,人类无需独立完成每一个小任务(例如进行一次编辑或做一些研究),而是可以通过获取自动补全建议或向聊天式体验提问来替代。这显然增加了价值,并推动了行业向前发展。

随着时间的推移,这些工具变得越来越好。一个关键的改进是能够访问私有知识源。在代码领域,这可能是一个私有的代码库。大型语言模型本身并未在这些私有代码库上训练,但通过检索方法授予访问权限后,AI助手可以为开发者提供更具体、更准确的答案、响应和建议。这使得情况变得更好知识与工具的融合提升了效果。

思考这些Copilot式工具的最佳方式,是将其视为一个刚开始学习编程的人。你无法要求它完成一个非常长期运行的任务,因为它只能进行一次LLM调用。但通过不断审查它的输出,你肯定能获得价值并加速自己的开发进程。

然而,单次LLM调用是这些Copilot式工具的限制,这也制约了Copilot式系统整体能完成的工作量。正因如此,我们开始大量讨论“代理”。

从自主代理到协作代理

上一节我们介绍了Copilot式助手的局限性。本节中,我们来看看旨在突破这些限制的“代理”。

最初被讨论的代理迭代是自主代理的概念。Cognition公司的Devin等工具就属于这种模式。其理念相对简单:不是每次LLM调用都需要开发者审查,而是让AI系统能够链式调用多次LLM,并集成访问能够改变状态或为AI系统提供新输入和信息的工具。理论上,这将使AI系统能够完成更大、更复杂的任务。

它们仍然像Copilot式系统一样,可以访问知识源。思考这些自主代理的最佳方式,是将其视为一名实习生或初级工程师。你仍然需要为他们非常清晰地界定任务范围,并且在它们完成工作后,你必须实际审查它所完成的所有工作。这是现实的一部分,也是理解自主代理概念的一种方式。

另一个现实是,许多这类自主代理系统,特别是在软件工程领域,确实需要花费大量时间。任何与实习生或初级开发者合作过的人都知道,在你作为开发者和AI代理之间,可能会存在一些并行开发工作。

因此,在自主代理的概念之后,真正下一代工具是协作代理的概念,我在本讲座及其他地方可能将其称为“工作流”。工作流的基本理念是,不将AI视为你委派工作的实习生或初级工程师,而是更多地将其视为一个结对编程伙伴。将其视为结对编程伙伴的好处在于,你不必完美地界定工作范围并审查代理的大量工作成果,而是一种来回的、思维同步式的体验。人类在IDE中采取的任何行动都可以被代理推理,而代理所做的任何工作也可以被人类推理。

当然,它们仍然可以访问知识源。但是,知识源、工具以及对彼此行为的理解这三者的结合,创造了一种新的体验。Windsurf以及我们名为Cascade的代理等工具,正是在这种范式上构建的。

现实考量:能力与局限

尽管关于AI系统和AI代理在软件工程方面的能力可能存在很多炒作,但现实是,这些工作流与之前出现的任何其他代理式或非代理式系统有着相同类型的问题和缺点

以下是当前AI代码助手的核心局限:

  1. 底层依赖大型语言模型:这些模型存在数据分布问题。并非每种语言或框架在模型训练所依赖的公共数据集中都得到同等程度的体现。
  2. 工具调用可能不完美:代理调用外部工具时可能出现错误或理解偏差。
  3. 工具集有限:可用的工具集可能无法完全匹配我们人类或开发者所能做的所有不同事情。
  4. 存在“不完整的意图”:代理永远无法完全知晓你在茶水间与同事的对话内容,因此你不能指望代理知道所有事情。因此,引导它达到你所能达到的水平,并不能无限提高其性能。

为何要学习AI代码助手?

这一切引出了一个问题:今天我们为什么要讨论AI代码助手?原因主要有两方面。

第一,这些工具现已可用。关于代理系统有很多理论,但并没有太多个人可以在自己时间自由使用的实际应用。因此,我们可以利用这段时间来真正理解构建一个普遍可访问的代理产品需要什么,以及理解这些产品底层运作的一些心智模型。

当然,另一半原因是,这是软件工程师的工具。你作为开发者,可以了解如何最好地利用它们,这将为你的开发工作带来优势。


本节课中,我们一起学习了AI代码助手的发展脉络。我们从纯人工编程出发,经历了Copilot式助手的辅助,探讨了旨在独立完成更大任务的自主代理,最终认识了强调人机实时协作的“工作流”或协作代理。同时,我们也清醒地认识到当前技术仍受限于数据、工具和不完整意图等现实因素。理解这些演变和现状,将帮助你更有效地将AI助手融入开发流程,提升工作效率。

004:自动修复测试

在本节课中,我们将学习如何使用 AI 代理(Cascade)来分析和修复 JavaScript 代码中的问题。通过这个过程,你将更详细地了解代理的工作原理。

概述

在本节中,我们将在一个使用 Jest 等框架进行测试的 JavaScript 代码库上执行任务。即使你不熟悉 JavaScript 或这些框架也没关系,本次演示的重点在于展示你能够借助代理,在不熟悉的代码库上进行迭代开发。我们将看到 Cascade 如何理解代码库、运行测试、分析问题并自动修复。

开始调试与修复

首先,我要求 Cascade 修复或运行代码库中的所有测试。以下是 Cascade 执行过程中的几个关键步骤。

Cascade 首先会浏览整个代码库,理解如何运行这些测试。它利用对现有代码的认知进行分析,并拥有建议终端命令等工具。因此,它可以建议我运行测试的命令,然后分析测试结果。

当测试失败时,Cascade 能够分析堆栈跟踪并询问是否要调查该问题。我可以像在任何聊天体验中一样与它对话。在这个案例中,它是一个能够独立执行多步骤操作的代理。

我回答“是”。随后,Cascade 将像人类一样,使用多种工具执行多个步骤。它会利用上下文感知能力,分析测试代码以及影响测试的源代码,推理问题可能出在哪里,然后使用工具实际编辑文件。

在这个例子中,它发现问题是测试用例本身有误,于是进行了相应的编辑。之后,它再次建议我运行测试的命令。现在,所有测试都通过了。

大约一分钟内,在一个我们并不十分了解的代码库中,代理帮助我们解决了测试中的错误。我接受了这些更改。

智能感知与全局更新

接下来,我想展示 Cascade 在 Windsurf 中的另一个能力。我转到定义文件,将函数名改为更具描述性的名称。然后我回到 Cascade,只需说“继续,更新所有调用点”。

请注意,我并没有指定我做了哪些更改,但因为 Cascade 能够感知我在编辑器其他部分的操作,它能注意到我刚才所做的更改,并相应地采取行动。

Cascade 会查找所有文件,更新所有调用点。这涉及到跨多个文件的多次编辑,这是许多仅依赖单次大语言模型调用的 AI 代码助手无法做到的。

完成所有编辑后,Cascade 可以建议我们重新运行测试,以验证测试仍然通过,并且所有调用点都已相应更新。

总结

本次演示虽然简短,但突出了使 Cascade 异常强大的几个核心要素:对现有代码库的理解、用于调查和验证工作的多种工具,以及它能清晰理解开发者与文本编辑器交互时的意图。

下一节,我们将以此为例,剖析并理解此类智能代理系统工作的一些思维模型。

005:协作式 AI 代码代理的工作原理 🧠

在本节课中,我们将深入探讨协作式 AI 代码代理(如 Cascade)的核心工作原理。我们将学习几个心智模型,用以剖析和理解代理在底层是如何运作的,重点关注其核心组件,而非用户界面等表面特性。

经典代理循环 🔄

上一节我们深入观察了代理的实际运作。本节中,我们来看看理解其基础的一个经典模型:代理循环

许多人都可能见过这个经典代理循环的某种形式。本质上,代理系统会从开发者那里获得一些输入提示。它会访问一个充当“大脑”的大型语言模型,该模型负责处理输入提示并进行推理:“在我作为代理所拥有的所有不同工具中,我应该使用哪个工具?”这可能是像 GrP 或嵌入搜索这样的搜索工具,可能是编辑文件的工具,也可能是建议终端命令的工具。在演示中你看到了所有这些工具。在工具执行某些操作之后,大型语言模型会再次推理:“好的,根据输入和刚刚调用的工具,我的下一个动作应该是什么?是应该调用另一个工具吗?”如果是,它将持续这个循环,直到最终那个充当大脑的大型语言模型决定:“好了,我们完成工具调用了,是时候进入结束状态,结束我的动作并返回给用户了。”

这就是经典的代理循环,其中大型语言模型被用作工具调用的推理代理。

由此可以清晰地看出,代理系统存在两个重要组件:

  1. 工具:可以采取的所有动作是什么?每个步骤中这些工具的能力有多强?
  2. 推理模型:目前,在决定调用什么工具以及如何调用(给定大型语言模型拥有的所有相关信息)方面,最先进的技术通常是来自 OpenAI 和 Anthropic 等模型提供商的通用基础模型。

超越循环:上下文感知与人类行为追踪 📍

然而,这些并没有完全涵盖可以用来改进代理体验(如 Cascade)的所有维度。我想提到的第一个概念是上下文感知。我们之前稍微提到过这一点,当时谈到改进知识访问如何能提升和夯实 AI 系统的结果。但关于上下文感知这个问题,有几种不同的思考方式。

以下是思考上下文感知问题的几个方面:

  • 来源:手头任务的所有相关知识来源是什么?对于编写新代码这样的任务,这当然包括私有代码库中的现有代码,但也可能包括文档、工单或 Stack Overflow 等内容。这些都是可以帮助代理在其决策过程中立足的各种信息来源。
  • 解析:能够访问数据固然很好,但你实际上是如何对这些数据进行推理的?这些知识中是否存在可以实际提高从大量信息中检索相关信息能力的结构或隐含信息?我们将在接下来的几张幻灯片中更详细地讨论这一点。
  • 访问权限:这一点更多是关于确保上下文感知的安全性,尤其是在考虑可能对某些知识有访问控制的大型组织时。AI 不应提供特定用户原本无法访问的知识。

代理系统中未被经典代理循环完全捕捉的另一个组件是人类行为追踪的概念。

理解开发者正在采取的隐含行动,使得代理系统能够理解需要做什么。这真正实现了那种协作式代理体验或流畅的体验。如果说上下文感知是拉取所有相关的显性知识,那么追踪开发者是否打开了一个文件、在 IDE 中执行了某些导航操作,或是在文件中进行了编辑——我们从这些已采取的行动中获得的所有这些隐性信息——也可以作为 LLM 的输入,用于推理下一步需要调用什么工具,或者我们是否已完成工具调用。

组合的价值:以自动补全为例 ✨

我们可以通过观察其他 AI 模式(不仅仅是代理系统)来了解上下文感知和人类行为追踪组合的价值。

例如,我们可以看看经典的自动补全功能,即 AI 在光标位置建议几行代码以完成输入,这样开发者就不必从头开始键入。这在编写样板代码时很有帮助。

下图显示了一系列不同的实验,我们改变了模型可访问的上下文感知和人类行为追踪的水平。在所有示例中,模型完全相同,我们改变的只是提供给它的输入类型。

我们将自动补全的基线性能定义为:仅使用当前打开的文件作为 LLM 的上下文来生成自动补全建议。如果你开始纳入意图(这可能包括 IDE 中打开的其他文件和标签),自动补全结果的质量实际上提高了 11%。这清楚地表明,通过纳入意图和人类行为追踪,即使使用相同的模型,也能产生更好的结果。

如果我们尝试另一个实验,例如,天真地对整个代码库进行分块嵌入,然后在整个仓库中进行简单的基于嵌入的检索,这也比基线好。但需要注意的一点是(这可能有点反直觉),它的表现实际上比仅使用打开文件和标签的意图要差。这实际上非常重要地指出了上下文感知系统的解析能力。因为如果你将解析方式从简单的分块和仅基于嵌入的检索,改为使用抽象语法树解析、自定义代码解析器、更智能的分块和更高级的检索(我们不仅看基于嵌入的检索,还看启发式方法和代码库的其他结构,如导入或附近文件)的系统,你实际上可以大幅提高系统相对于基线的性能。

因此,这真正强调了对于代理系统而言,不仅工具和模型很重要,上下文感知和理解开发者意图也同样至关重要。

代理系统的三大工具类别 🛠️

当然,稍微讨论一下工具也很重要,因为工具是代理在推理步骤之间可以采取的行动。如果你有更高质量的工具,你将能够采取更高质量的行动,从而更快地获得更好的结果。

工具主要有三大类别,这是剖析代理系统构成的另一个模型。

以下是构成代理系统的三类主要工具:

  1. 搜索与发现工具:首先,你基本上需要获取所有相关信息才能进行更改。
  2. 状态更改工具:允许我们改变世界状态的工具。
  3. 验证工具:用于检查对状态的任何更改是否确实改善了整个系统,并使我们更接近手头的任务。

仔细想想,这其实也是人类工作的方式:当我们开始一项任务时,我们会在代码库、网上或其他地方寻找所有相关信息,然后进行一些更改,接着我们会编译代码、运行代码并查看结果,看看是否完全符合我们的预期。如果不符合,我们就重新开始这个过程。因此,我们可以用非常类似的方式,在这些类别中思考代理的工具。

整体协作体验 🤝

那么,再次将所有部分整合起来,真正让这种协作式代理体验感觉非常自然的,正是这种组合。

例如,假设你想进行一项修改。你修改了一个类,现在你想在同一个目录中的其他类上做同样的修改。这是一个相对样板化的任务。但如果有一个结对程序员或一个人工程序员在我旁边,一直观察我的工作,我就可以直接告诉他们:“嘿,在这个目录的类似位置做同样的事情。”再次将协作代理视为结对程序员,你可以看到这些不同的组件如何帮助实现这一点。

首先,代理一直在观察开发者行为的理念,将使其能够理解“同样的事情”指的是我刚刚所做的最近一次编辑。对工具的访问将允许代理在此目录中找到相关文件,然后使用类似编辑的功能进行更改。而上下文感知将允许代理推理其他类是否实际上处于与我刚刚修改的类相似的位置。

因此,需要所有这三个组件共同作用,才能创造出这种与代理协作的体验,类似于与一个人类结对程序员一起工作。

总结 📝

本节课中,我们一起学习了协作式 AI 代码代理的核心工作原理。

  • 上下文感知引入了显性知识。
  • 人类行为追踪引入了隐性意图。
  • 工具随后采取行动,结合这些显性知识和隐性意图,并在搜索与发现、状态更改和验证过程中执行。
  • 最终,大型语言模型用于整合所有这些,以选择在适当的时间进行正确的工具调用,但这在当今不同的代理系统中是通用的。

理解这些核心组件——而不仅仅是表面的用户交互——有助于我们更好地设计、评估和利用 AI 编程代理,让它们成为我们开发过程中真正高效、自然的合作伙伴。

006:AI 代理的搜索与发现 🔍

在本节课中,我们将对 AI 代理的搜索与发现问题进行一次深入的探讨。这个问题实际上需要新的范式、对现有基准的质疑以及新颖的方法,以最大化代理的最终影响力。

为什么代码的搜索与发现是一个有趣的问题?

上一节我们介绍了课程主题,本节中我们来看看为什么代码的搜索与发现本身就是一个值得研究的难题。

代码因其框架、库和抽象而变得非常分散。你需要的相关信息并不全在你正在编辑的那个文件里。信息通常是不完整的,编写新代码不仅需要现有代码,还需要文档、工单,甚至需要搜索网络。同时,代码也是不精确的,众所周知,实现同一功能有多种方法。因此,如果你想在你的特定代码库中以正确的方式构建某些东西,一个千篇一律的方法和响应可能行不通。

搜索与发现问题的真正核心在于:如果我们只检索到不正确或无价值的信息,那么我们的 AI 代理系统也只能得到不正确和无价值的结果。

当前的技术现状:检索增强生成

在深入探讨新方法之前,我们先了解一下当前的技术现状。

当前最先进的技术是检索增强生成。在一个非常基础的层面上,我们从用户的问题或提示开始,一个检索器会检索出必要的相关上下文,连同问题和任务一起传递给大语言模型,以获得响应。这是我们在抽象层面上对检索的一般理解。

但是,如果我们仔细思考,这主要是为类似 Copilot 的辅助系统设计的,我们只对大语言模型进行一次调用。而代理方法从根本上改变了这一点,因为我们不必在单次检索上做大量迭代来使其更复杂、更精确。多步骤的代理式检索方法意味着我们实际上可以进行多次检索尝试。

这与人类的行为非常相似。如果我们出去搜索可能相关的信息,但发现它看起来并不相关,我们会进行另一次搜索,并持续进行,直到在采取任何行动之前收集到所有相关信息。这就是我们在思考任何面向搜索与发现问题的代理生成方法时应该采取的方式。

因此,也许检索器不必超级完美,但我们需要能够对其进行迭代。同样重要的是,并非所有检索器都必须相同。我们可以为整个搜索与发现问题中可能需要执行的不同类型的任务配备不同的检索器。

搜索与发现任务的类型与工具

以下是我们在搜索与发现过程中可能需要的一些任务和工具类型。

  • 第一类:我们知道需要从语料库中获取什么,并且有明确的检索规则,例如 grep
  • 第二类:我们大致知道需要获取什么,但不知道如何获取。例如,我知道外面有一个联系表单对象的示例,我需要进行网络搜索来找到它。
  • 第三类:通常比较模糊,我只想获取完成任务所需的所有相关信息。我并不确切知道具体是什么,但我知道我的总体目标,比如在当前情况下是构建一个新的联系表单对象。

本课程中,我们将重点讨论我们如何创新并为第三类任务添加了一些新型工具。

深入理解第三类任务:获取所有相关信息

为了更好地理解第三类任务,让我们设想一个场景:我想构建一个新对象,只需要所有相关信息。这其实很巧妙。以尝试为我的特定代码库构建联系表单为例,我可能需要从内部工具库中提取信息,查看外部包和文档,参考代码库内外的其他示例,以及风格指南。显然,我需要综合许多不同的信息片段,才能为我的特定代码库获得真正高质量的响应。

考虑到这一点,我们来谈谈当前的技术现状。

当前技术现状:嵌入搜索

当前解决这类问题最先进的方法是嵌入搜索。其工作原理的快速解释是:你有一个嵌入模型,能够将对象(可以是一段代码片段)转换为一串数字,即一个嵌入向量。你可以对代码库中所有现有的代码片段都进行此操作。

在检索时,你只需获取当前的工作内容(即你正在处理的代码上下文),使用相同的嵌入模型将其转换为自己的嵌入向量,然后比较生成的嵌入向量与所有现有嵌入向量,看看在这个 N 维嵌入空间中哪些向量是相近的。

嵌入模型背后的基本思想是,将看起来相似的文本片段转换为在嵌入空间中也彼此接近的向量序列。因此,如果操作正确,当你进行检索时,你拉入的代码片段至少与你当前的工作相似,理想情况下是相关的。

这就是基本方法。但当然,这种基于嵌入的方法并不完美,因为我们操作的是嵌入向量而非原始文本,我们丢失了原始文本片段的许多细微差别。因此,尽管我们尝试了越来越大的嵌入模型和各种方法,但嵌入检索的效果似乎存在某种瓶颈。

创新与独特方法:质疑基准并构建新工具

正是在这里,Windsurf 和 Cascade 内部针对此问题的一些创新和独特方法开始显现,因为我们问自己的第一个问题是:这里的基准测试结果真的有用吗?现实情况是,许多用于检索的基准测试对于代码问题来说并不完美。

这些基准测试的工作方式是:有一个信息语料库,它就像一个“大海捞针”问题——我是否从整个语料库中检索到了一个非常特定的信息片段。但在现实中,正如我们讨论的,为了构建联系表单对象,我们实际上需要综合许多信息片段才能得到正确的响应。

因此,“大海捞针”的方法并不是我们特别感兴趣的基准。我们更感兴趣的是这样一种想法:如果我检索 50 个对象,在这 50 个对象中,有多少个真正相关的“真实”对象会出现?如果我对它们的召回率很高,那么至少我拥有了完成特定任务所需的、存在于更大语料库中的所有相关信息。

当然,像这样的基准,我们需要自己构建。我们是如何构建的呢?我们查看了 GitHub 公共代码库的语料库,意识到每次提交信息都对应着跨多个文件的一系列更改。这实际上在查询(可以从提交信息推导出来)和我们可能需要检索的所有“真实”相关代码片段(即该次提交中存在的所有更改)之间建立了匹配。

因此,通过从代码库中提取这些信息,我们可以查询提交信息,并提出问题:我们的检索方法是否找到了所有被修改的文件?如果我想提前进行那次提交或查询,这些文件就是所有相关的信息片段。

如果我们观察基于嵌入的方法在这类基准测试上的结果,我们会注意到,实际上没有任何方法能达到超过 50% 的召回率。这意味着基于嵌入的方法有很高的误报率,尤其是在越来越大的代码库上,甚至在一开始就只检索到了一半进行更改所必需的信息。

因此,我们显然希望构建一个比这更好的工具。我们的方法是什么?

我们的方法:Ripide 与基于 LLM 的语义搜索

我们使用了更多的计算资源。我们针对这个问题的解决方案称为 Ripide。其基本思想是摆脱嵌入,因为一旦我们进入嵌入空间,就会失去那些细微差别。相反,我们获取查询,对代码库中的每一个代码片段,应用一个大语言模型来提问:这个代码片段与我手头的特定查询有多相关?

我们并行运行所有这些查询,然后利用每个片段相关性的响应,对代码库中的所有代码片段进行重新排序。正如你所意识到的,这种级别的重新排序从未应用于嵌入空间。所有这些都是通过一个基于 LLM 的语义搜索式检索器完成的。毫不奇怪,它在我们的“召回率@50”基准测试上优于基于嵌入的方法。

再次强调,这只是多步骤检索过程中的一个工具。它仍然不完美。但是,通过构建一个在检索质量上显著更高的工具,并将其与多步骤检索范式相结合,我们现在拥有了一种方法,可以让我们的代理系统能够在大型代码库上运行。

总结与要点

本节课中我们一起学习了 AI 代理在代码领域的搜索与发现问题。以下是一些关键的收获:

  • 既然我们讨论的是代理,请务必考虑多步骤检索,而不是单步骤检索。
  • 考虑所有不同种类的潜在工具,因为你不需要单一的检索方法,可以拥有多种检索方法。
  • 质疑基准和约束条件,以开发新的检索方法,从而改进你的代理系统。

现在我们已经深入探讨了搜索与发现,特别是针对 Cascade、代码和代理的工作原理,接下来让我们将其应用到一个大型代码库上,执行几个不同的任务。

007:理解大型代码库 🏗️

在本节课中,你将应用并见证这些搜索与发现方法的力量,我们将使用 AI 代理在一个大型生产代码库上完成几个不同的任务。

概述

我们将深入一个包含大量 Java 代码的仓库,演示 Cascade 如何利用其强大的搜索与发现工具,帮助开发者快速理解复杂的代码库并执行特定任务。本节将展示多步骤检索、代码分析和网络搜索等工具的实际应用。

探索大型 Java 代码库

上一节我们介绍了搜索与发现工具的基本概念,本节中我们来看看它们如何应用于一个真实的大型项目。这是一个包含约 10 万行 Java 代码的仓库,使用了多种框架和包,例如 GroovySpring Boot

假设我是一名新加入该项目的开发者。通常,熟悉这样的代码库需要很长时间。但借助我们讨论过的强大工具,Cascade 能够帮助我们加速这一过程。

我将在 Cascade 中提出第一个问题:

解释整个源代码目录(约 3000 个文件)中的代码是做什么的。

让我们看看 Cascade 如何应对。Cascade 将使用多种我们讨论过的搜索与发现工具。

首先,它会使用 Ls 工具来识别所有顶级目录。接着,它执行了一次 Ript 调用。如你所见,系统搜索并评估了近 3000 个不同的代码片段,以判断它们与“理解此代码库”这个问题的相关性。然后,它特别进入了 test 目录进行深入理解,并再次调用了 Ript

这里可以看到一个多步骤检索过程:在尝试给出答案之前,已经进行了多次检索调用。最终,Cascade 以一种相当简洁的方式,向我解释了关于这个仓库我需要了解的所有重要部分,甚至提供了一些方便的链接,让我可以点击并深入查看代码。

我可以随时进行后续提问。例如,在浏览了初步解释后,我对“书籍管理”部分产生了兴趣。

请进一步解释书籍管理是如何实现的。

这是一个连续的对话,之前的对话轨迹和上下文也被纳入考虑。但正如你将看到的,系统会针对这个新查询进行另一个 Ript 调用,以寻找更相关的内容。

因此,我们看到在回答问题之前,系统进行了多次此类搜索与发现工具的调用。最终,再次给出了全面的解释,并附带了大量可以点击查看的代码引用。

这就是这些强大工具在真实生产代码库上的威力。

执行代码库迁移任务

接下来,我将展示搜索与发现在另一种不同类型任务中的应用。

假设我实际上想对这个代码库执行一次迁移。我们以 Spring Boot 为例。我会问 Cascade:

当前使用的是哪个版本的 Spring Boot?以及最新版本是什么?

这个问题的前半部分需要理解代码库,后半部分则可能需要访问网络获取信息。

因此,Cascade 会先进行分析,找出当前使用的 Spring Boot 版本。然后,你可以看到网络搜索被触发。Cascade 会去网上搜索最新的 Spring Boot 版本,获取结果,并创建一个概要。我既可以查看原始网页,也可以在编辑器中查看它正在分析的文本内容。

它为我提供了预训练模型中不存在的信息,甚至告诉我:“嘿,这里存在显著的版本差距,需要进行多次版本升级。”并开始引导我进行迁移过程。

虽然我不会演示完整的迁移,但这个演示突出展示了多种不同的搜索与发现工具:我们看到了 Ls 工具、Ript 工具和网络搜索工具的使用。每一次都以多步骤方法进行,这正是允许智能体系统处理这些更复杂、长期运行任务的关键。

总结

本节课中,我们一起学习了 Cascade 的 AI 代理如何利用多步骤的搜索与发现工具(如 LsRipt 和网络搜索)来高效理解大型生产代码库。我们看到了它如何快速概括代码结构、深入解释特定模块,并获取外部信息以指导如框架升级等实际开发任务。希望这能让你清晰地理解这些强大工具在实际生产环境中的应用方式。接下来,让我们转换方向,开始构建一个新的应用程序,以探索 Cascade 提供的更多功能。

008:维基百科分析应用 – 数据分析

在本节课中,你将使用协作代理(Cascade)来开始构建一个更大的维基百科分析应用的数据分析部分。在此过程中,你将学习如何指导和观察 AI 代理工作的基础知识。

概述:用户体验的核心要素

在开始构建应用之前,我们先介绍最后一个概念。之前的课程讨论了很多构成协作式 AI 代理(如 Cascade)强大功能的不同组件,例如上下文感知、工具和人工操作。但同样重要的是,思考那些独立于这些底层能力、却能提升用户体验的维度。即使底层能力保持不变,工具的许多方面也能极大地优化用户体验。在开始构建维基百科分析应用时,我会多次提及这些要点,因此了解它们很重要。

以下是几个关键维度:

  • 能力:我们将大量使用 Cascade。但事实证明,这些代理能力并非 Windsurf 这类 AI 原生 IDE 提供的唯一能力。那么,何时适合使用其他能力呢?
  • 指导:虽然 Cascade 有能力独立检索正确信息,但事实证明,如果你能像对待结对程序员一样,在适当的地方给予 AI 一些指导,使其能够集中精力,它的表现会好得多。那么,如何有效地对 Cascade 进行指导呢?
  • 可观察性:当然,现在 AI 能做的远不止提供几行自动补全建议或回复一条聊天消息。因此,如果你擅长随时观察 AI 在做什么,你就能跟上 AI 的进度,保持状态,并确保自己能有效地处理越来越大的任务。
  • 细节打磨:有很多有用的按钮和快捷键,可以确保你以最优的方式与 AI 进行原生交互。我们决定开发自己的 AI 交互界面并非随意之举,其中包含了许多我们认为能带来独特体验的用户体验细节。

了解了这些,让我们正式开始。

启动项目:从零开始

我们将从一个名为 Wikipedia Analysis 的完全空白项目开始,并从零构建它。在本视频中,我们将进行一些数据分析。

这个应用的灵感来源于我和办公室的一些朋友玩的一个叫“Catfish”的游戏。简单来说,游戏会给出一个维基百科页面的所有分类,你需要猜出对应的页面。这让我思考,如果我想了解一类新的信息,我需要做什么?我需要学习哪些基本术语?在真正理解那个主题之前,我首先必须了解什么?

因此,我们要做的是尝试利用维基百科信息,获取一个分类,并理解属于该分类的所有页面中出现的单词频率,这将为我开始工作提供一个很好的起点。

我将从这样一个提示开始(直接复制在这里):

写一个脚本,该脚本接收一个维基百科分类作为命令行参数,并输出该分类下所有页面中非常见单词的累计频率。然后针对“Large language models”这个分类运行它。

我指定了要使用 MediaWiki API。在运行之前,有几点需要指出:我相对具体地描述了输入和输出的格式,并指定了希望使用的 API。即使没有现有上下文,对 AI 保持清晰仍然很重要。如果你从一个非常模糊的陈述开始,AI 可能会做出正确但出乎意料的事情。再次强调,请将其视为结对程序员。如果你想让结对程序员为你开始一些工作,你需要告诉它做什么。

在开始工作之前,再指出 Cascade 面板的几个要点。如你所见,我目前使用 Claude 3.5 Sonnet 作为推理模型,你实际上可以选择多种不同的可用模型。

现在,让我们开始吧。我将点击回车键,让 Cascade 开始工作。

观察与指导:Windsurf 的功能

在点击安装 requirements.txt 中的依赖命令之前,让我们先指出 Windsurf 中几个帮助你观察 AI 在做什么的功能。

第一个是我们之前实际上已经用过的功能,就是 “打开差异对比”按钮。因为编辑可能发生在多个文件中,能够点击“打开差异对比”并查看 Cascade 所做的更改是非常棒的。审查 AI 所做的更改仍然很重要。

你会注意到的另一件事是我们称之为 Cascade 导航栏 的东西。这本质上是一种将审查流程直接构建到编辑器中的方式。因此,如果一个文件中有多个更改,你可以使用上下箭头;你可以使用左右箭头在不同有编辑的文件之间切换。我可以在单个代码块级别、文件级别或跨所有文件接受这些更改。

现在我们已经了解了一些可观察性功能,让我们继续这里的工作。首先,我需要安装 requirements.txt 中的依赖。所以点击“接受”。

注意这里,我的环境实际上使用 python3 而不是 python,使用 pip3 而不是 pip。Cascade 能够识别这一点并相应地纠正。但在它继续的同时,也许我希望 Cascade 在我工作时始终知道这一点。我不想每次都去弄清楚我用的是 pip3 而不是 pip

所以,我将在这里展示第一种指导方法:如果你转到右下角的 Windsurf 设置选项卡,可以看到有很多不同的设置,我将进入这个名为 “设置全局 AI 规则” 的选项。这些是 Cascade 在你工作时(无论在哪里工作)都会遵循的规则。当然,仓库规则是针对特定仓库的,但我可以在这里直接说:使用 python3 代替 python,使用 pip3 代替 pip,类似这样。现在,Cascade 应该能够在我每次要求它做某事时遵循这些指令,我们稍后会验证这一点。

但让我们继续看看 Cascade 在做什么。它现在说,好的,让我们在那个“大型语言模型”分类上运行它。我们让它运行,如你所见,它开始运行并开始处理属于“大型语言模型”分类的所有维基百科页面。

你可能注意到我们截断了输出,这只是出于空间考虑。但 Cascade 实际上使用的是 IDE 的原生终端。因此,通过点击这个名为 “转到终端” 的小按钮,你可以在编辑器的终端面板中调出完整的执行过程。我可以进去查看,即使我只看到最后几行,也能看到一些最常见的词,毫不意外,是像 modelmodelslanguageOpenAIChatGPT 这样的词。所以,我们已经可以大致了解到,是的,如果我要学习大型语言模型,这些可能是我需要了解的一些术语。

这很棒。它成功地构建了一个数据分析脚本,这正是我想做的。我将继续并接受所有更改。重要的是要边进行边接受更改,而不是仅仅累积而不处理。所以,我将接受所有更改并关闭终端。

验证与总结:规则生效与本节回顾

现在,让我们实际检查一下我之前设置的全局规则的效果。为此,我将使用一个不同的功能。我可以在当前的 Cascade 对话中要求检查这一点,但保持不同对话之间的分离很重要。

所以,我将在这里与 Cascade 开始一个新的对话。我可以问它执行之前需要的相同命令:安装 requirements.txt 中的依赖。如果它什么都没学到,它只会用 pip 而不是 pip3。但是,它正在使用我们指定的全局规则,直接使用 pip3。这是一个例子,说明仅仅设置一些规则就能让 Cascade 始终遵循关于你环境或你做事方式的一般最佳实践。

当然,在这种情况下,一切都已经设置好了。回到我原来的对话,我只需要转到过去的对话记录并返回,我就回到了最初的对话中。

总结

在本节课中,你使用 Cascade 构建了应用程序的整个分析部分,利用维基百科 API 提取所有相关数据,进行相应解析,并输出词频结果。在此过程中,你能够使用 Windsurf IDE 中的多项功能来指导 Cascade 并观察它的行为。

在下一节中,我们将为系统添加缓存功能,因为我不想在每次迭代应用程序时都重新运行这个分析。我们下节再见。

009:添加缓存与处理意外情况

在本节课中,我们将为维基百科分析应用添加缓存功能。更重要的是,你将学习当 AI 代理的行为与预期略有偏差时,如何引导它回到正确的轨道上。

让我们开始吧。

概述

在上节课中,我们完成了词频分析的核心功能。但在继续构建应用的其他部分之前,我们需要添加一个缓存机制。这是因为处理与“大语言模型”相关的数百个页面需要相当长的时间。我们希望当输入相同时,结果能够被缓存,这样在调整应用其他部分时就不会遇到性能问题。

初次尝试与问题

为了实现缓存,我向 AI 代理(Cascade)发出了以下指令:

Create a local cache, so we aren't rerunning retrieval logic for the same category.

这正是我们刚才提到的需求。让我们看看 Cascade 做了什么。

很好,Cascade 进行了多次编辑。我可以使用 Cascade 的侧边栏逐条查看代码差异,理解所做的修改。

我们运行一下修改后的代码。当然,第一次运行仍然需要处理所有文件。

让我们检查一下缓存文件。看起来它并没有完全按照我的意图执行。它只是缓存了每个不同页面的页面ID,这并不是我真正想要的。我真正希望的是缓存整个脚本的处理结果。

回顾我的查询指令,我发现我的表述有些模糊。从技术上讲,它确实缓存了与该类别相关的页面结果信息,但并非我期望的最终脚本处理结果。

解决方案:使用“回退”功能

现在有几种处理方式。即使我已经接受了所有文件更改,我们仍然可以:

  1. 进入 Cascade,要求它撤销所有更改,然后尝试进行新的编辑来修复问题。但这可能会使情况变得混乱。
  2. 使用一个便捷的功能:将鼠标悬停在某条消息上,会出现“回退到该步骤”的选项。

回退功能将回滚整个对话历史,并撤销该步骤之后所有对文件所做的更改。如果我点击“回退”,wiki_category_analysis.py 文件中的所有缓存逻辑都会消失。

这个功能有助于保持对话历史的清晰,避免陷入来回纠错的困境。如果保留那些错误的尝试,可能会在未来的对话中给 AI 代理造成混淆。因此,“回退”是一个帮助你摆脱困境的非常有用的功能。

我删除了那个不正确的缓存文件,不再需要它了。😊

修正指令并成功实现

现在,让我修改一下指令,使其更具体地描述我想要实现的目标:

Create a local cache of the script results. I don‘t want to rerun even the processing logic again for the same category.

这次我明确指出了要缓存“脚本结果”。好的,Cascade 首先提示我需要创建缓存目录,这没问题。

它进行了一些修改。让我们再次尝试运行。

第一次运行时,它仍然需要处理所有文件。现在让我们看看缓存文件的内容。太好了!缓存现在完全符合我的期望,里面是脚本的处理结果。如果我再次运行脚本,结果会快得多。

回顾与总结

在本节课中,我们成功构建了缓存逻辑。我依然可以使用 Cascade 侧边栏来查看所有更改,😊 确保一切符合预期并理解代码。我可以在单个代码块级别或整个文件级别接受更改。

但更重要的是,在本节课中,你学会了当 AI 的行为出乎意料时,如何巧妙地引导它回到正轨。善用“回退”等功能,可以让你与 AI 结对编程伙伴保持健康、高效的对话历史。

在下节课中,我们将把目前完成的所有工作可视化,通过添加一个前端界面,以一种美观的方式展示所有这些结果和词频数据。我们下节课见。

010:构建维基百科分析全栈应用 🚀

在本节课中,你将构建一个全栈应用程序,用于展示之前为维基百科分析应用所做的数据分析结果。在此过程中,你将学习一系列技巧、窍门和最佳实践,以最大化你与 AI 代理的互动效率。

概述

我们将把之前完成的词频分析和缓存功能可视化,通过一个网页来展示结果。我们将使用 HTML、JavaScript 和 Flask 框架来完成这个任务。


启动新对话并创建网页

上一节我们完成了词频分析和缓存逻辑。本节中,我们来看看如何将这些功能集成到一个可视化的网页应用中。

首先,在 Windsurf 中开启一个新的对话,因为我们要开始构建前端。使用的提示词如下:

创建一个网页,从结果缓存中加载数据(如果可用),否则从头计算词频,并显示一个词云图,其中单词的大小与词频成正比。使用 HTML、JavaScript 和 Flask 来完成此任务。

AI 代理(Cascade)接收指令后,会创建和编辑一系列文件。

审查与运行应用

以下是 Cascade 做出的更改,我们可以使用 OpenDiff 工具或 Cascade 侧边栏来审查和调查所有更改。

审查完成后,我们可以运行应用。应用成功启动后,在浏览器中访问 localhost:5000

输入一个分类,例如“大型语言模型”,然后点击生成词云图。由于命中了缓存,生成速度很快,效果看起来不错。

管理进程与审查更改

回到 Windsurf,我们可以看到 Cascade 正在运行一个终端进程。

在输入提示区域上方出现的工具栏中,你可以看到所有需要审查的更改、需要查看的文件,以及当前正在运行的所有终端进程。你可以从这里或直接从运行命令的地方结束或取消任何进程。

在审查更改时,有多种方式:

  • 可以逐个文件查看。
  • 可以按代码块接受更改。
  • 可以按文件接受更改。
  • 可以直接从工具栏接受所有更改。

利用编辑器功能理解代码

查看生成的 HTML 文件,里面包含了很多 JavaScript 代码。如果你对 JavaScript 不熟悉,Windsurf 编辑器提供了一些便捷功能来帮助你理解。

例如,将光标移动到 generateWordCloud 这个 JavaScript 函数上,你会注意到文本编辑器上方出现了一些有用的代码透镜(Code Lens)。

点击“解释”按钮,Cascade 会分析相关代码并向我解释其功能。这对于在不熟悉的语言或框架中使用 Cascade 非常有帮助。这种能力得益于我们在早期课程中提到的、构建在代码库之上的复杂解析逻辑。

使用命令和自动补全增强应用

接下来,我想为词云添加不同的颜色,让它看起来更漂亮。这里我将演示一些与 Cascade 代理无关的编辑器功能,因为 Windsurf 是一个 AI 原生的 IDE,体验远不止于代理。

首先,我创建一个新文件 color_palette.py 来定义颜色调色板。我会暂时关闭 Cascade 对话。

第一个功能是“命令”功能。它允许你直接在文本编辑器中使用自然语言向 AI 发出指令,快捷键是 Cmd+I

我输入指令:“创建一个包含六种典型颜色的 ColorPalette 类,包含一堆常见的调色板。”

AI 会快速为我生成大量代码,这比通过 Cascade 提示可能更快。这就是为什么你不应该事事都依赖代理生成。

此外,你还能看到自动补全功能正在尝试建议额外的样板代码。例如,输入 class RGBColorPalette,我可以使用自动补全来快速生成多行代码。

我可以继续工作,例如“定义一个函数来获取所有调色板”或“定义一个方法来返回它们”。你还会注意到,即使是被动编辑,AI 也会根据远离光标位置的上下文,建议接下来的编辑。这是在文本编辑器内部拥有强大被动体验的好处,你可以快速生成大量样板代码,而无需依赖代理完成每一个编辑。

使用提及功能集成新代码

现在,我需要将创建的这个 ColorPalette 类集成到我的应用程序中。为此,我将切换回 Cascade。

我将要求 Cascade 将 get_all_color_palettes 方法集成到现有的应用中。这里我将使用一个名为“提及”的功能。

“提及”是一种让你作为开发者以非常轻量的方式引导 AI 的方法,指向那些你已经知道 AI 需要查看的地方。你可以提及文件、目录、单个方法或函数(我们稍后会用到),甚至可以提及网页或第三方 API 的公共文档。

为了集成调色板,我使用 @ 提及功能来标记 get_all_color_palettes 函数。

然后给出指令:“将颜色调色板设置为下拉可选,并显示正在使用的颜色。”

通过使用提及,代理能够直接定位到需要查看的代码位置,然后利用其代理搜索和发现能力查看其他相关部分,并开始进行修改。我们可以通过 OpenDiff 查看正在进行的更改。

让我们看看效果。看起来不错。尝试生成一个分类的词云图,现在可以选择不同的调色板了,词云图会根据选择的调色板改变颜色。

迭代与优化

我注意到,在选择不同的调色板时,词云图会自动改变,而无需我点击“生成词云图”按钮。这可能是期望的行为,但也许我想改变这一点。这就是与 AI 代理或任何 AI 工具合作的迭代过程。

我回到 Windsurf 并给出指令:“确保即使我更改了调色板的选择,也需要点击生成按钮来创建新的词云图。”

接受所有更改后,回到应用程序并刷新。现在,如果我选择一个新的调色板,颜色选项会改变,但词云图不会自动更新,直到我点击生成按钮。这样我们就完成了对应用细节的迭代优化。


总结 🎉

在本节课中,我们一起学习了如何构建一个完整的全栈应用。我们不仅使用 Cascade 构建了整个应用,还利用了“命令”和“自动补全”功能快速构建了大量样板代码,并将其集成到整体应用程序中。

正如你所见,使用 Windsurf 不仅仅是与一个代理迭代,它是一个完整的 AI 体验,旨在最大限度地提高你开发所需功能的速度。我们完成了相当多的工作,接下来还有最后一节课。让我们继续前进。

011:维基百科分析应用 – 最终优化 🎨

在本节课中,我们将利用 AI 代理的多模态能力,为应用添加更多功能。同时,你将了解一系列实用功能和最佳实践,以便继续构建和定制你的维基百科分析应用。


课程概述

在上一节课中,我们完成了应用的核心功能。本节中,我们将通过一个具体的例子,学习如何利用多模态输入(如图片)来快速实现界面布局调整,从而提升开发效率。此外,我们还将介绍 Windsurf 和 Cascade 中一些未能在演示中展示的高级功能和设置。


利用多模态输入优化界面

我们的应用目前运行良好。在界面下方,有一个可以插入图片到 Cascade 的功能,我们将利用这一点。

首先,我回到应用程序界面。为了更清晰地展示我想要添加的内容,我将截取当前应用界面的一个屏幕截图。

打开截图后,我进行了一些简单的标注。我在左侧添加了一个矩形框,并输入了文字。除了现有的词云可视化,我还希望同时看到词频的原始数据。

因此,我添加了文本“Raw Frequencies”(原始频率),并简单列出了几个示例词汇。这只是一个大约30秒内完成的粗略草图,目的是向 Cascade 传达我的布局意图,而无需详细描述每个细节。

完成草图后,我回到 Cascade,并使用图片输入功能上传了这张截图。

上传图片后,我只需对 Cascade 发出简单的指令:“按照图片所示,将原始频率添加到应用中。”

Cascade 能够利用其背后推理模型的多模态能力来理解这张图片。值得注意的是,它自动识别出“原始频率”应该放在词云图的左侧方框内,而我从未在文字指令中明确提及这一点。

修改似乎已经生效。我们返回应用并刷新页面。

刷新后,可以看到原始频率数据已经显示在左侧的方框中,并且使用了我在草图中标注的红色文字和边框。这就是一个利用多模态输入来显著提升开发速度的简单示例。


探索更多功能与设置

虽然这是我们演示中要添加的最后一个功能,但为了帮助你更好地进行后续开发,我将指出一些在演示中未能展示的 Cascade 和 Windsurf 功能。

首先,Windsurf 的设置面板中有许多选项,可以用于定制你的使用体验。

记忆功能

其中一个未展示的功能是“记忆”。其理念与“规则”类似,都是 Cascade 可以持续回溯和参考的信息片段。它允许 Cascade 随着时间推移,逐步构建起关于你工作方式和重要事项的“状态”。

这些记忆可以是你明确提及的(即规则),也可以是自动生成的。Cascade 可以在你工作时自动生成记忆并通知你,或者你也可以直接告诉 Cascade “记住这个”,它就会将其存入记忆库。与规则一样,你可以随时返回编辑这些记忆。

这是一种让 Cascade 自动学习的方式,无需你将所有事项都明确表述为规则。设置面板中还有许多控制被动体验和其他用户体验的选项。

命令列表与Turbo模式

在设置面板中搜索“Windsurf”,你会看到许多其他可编辑的字段。其中一个我很喜欢的功能是 Cascade 命令的“允许列表”和“拒绝列表”。

在演示中,Cascade 建议的每个命令都需要我手动接受。但有时,有些命令我完全愿意让它自动运行,而有些命令我则永远不希望它自动运行。你可以通过设置白名单和黑名单来管理这些命令。

在最近的版本中,甚至加入了“Turbo模式”。如果你希望完全沉浸在与 AI 代理的协作编程中,开启此模式后,Cascade 将自动运行所有建议的命令。


课程总结 🎯

本节课中,我们一起学习了如何利用多模态输入快速实现界面构思,为维基百科分析应用添加了显示原始数据的功能。我们看到,Windsurf 和 Cascade 提供了众多有趣的功能和特性,能够极大地改善开发体验和工作流程。

当然,这只是当前的一个瞬间。Cascade 和 Windsurf 将持续改进,AI 会变得更智能,功能、交互指导和可观测性也将不断扩展。请通过我们的文档或更新日志保持关注,了解 Windsurf 和 Cascade 的最新动态,从而最大化你作为开发者使用 AI 的体验。

012:总结

在本课程中,我们一起学习了关于 AI 代码助手的历史、如何区分炒作与现实、如何思考这些 AI 代码助手以及 AI 代理的工作原理。我们深入探讨了搜索与发现这一具体且重要的范式。在此过程中,你使用 Windsurf 和协作代理构建了多个不同的应用程序。

课程回顾 🎯

上一节我们完成了应用程序的构建,本节中我们来回顾整个课程的核心内容。

以下是本课程涵盖的主要学习要点:

  • AI 代码助手的历史:了解了 AI 代码助手从早期工具到现代智能代理的发展历程。
  • 区分炒作与现实:学会了如何客观评估 AI 代码助手的能力与当前局限性。
  • 理解 AI 代码助手:建立了如何有效利用这些工具辅助编程的思维框架。
  • AI 代理的工作原理:探讨了驱动 AI 代码助手执行任务的核心技术机制。
  • 搜索与发现范式:深入研究了 搜索发现 作为 AI 代理理解需求和寻找解决方案的关键模式。
  • 实践应用构建:通过实际操作,使用 Windsurf 平台及其 协作代理 完成了多个应用程序的开发。

展望未来 🚀

恭喜你完成本课程的学习。我期待看到你使用 Windsurf 构建出更多精彩的作品。

本节课中我们一起学习了 AI 编程代理的核心概念与实践方法,从理论认知到实际构建,完成了从了解到应用的完整旅程。

posted @ 2026-03-26 08:13  绝不原创的飞龙  阅读(10)  评论(0)    收藏  举报