Skip to main content

Command Palette

Search for a command to run...

代码Agent

理解您的代码库

软件工程师最重要的工作之一,是在脑海中构建代码库的全貌,并深入理解系统的运作方式。随着项目规模不断扩大,要找到所需的代码也越来越困难。

过去,浏览大型代码库需要记住正则表达式模式,或学习专门的工具来高效搜索。借助编码 agent,您可以用自然语言描述要查找的内容,让智能体使用工具帮您找到。

Cursor 为智能体提供了专门的高效搜索工具。了解这些工具的工作原理,能帮助您提出更好的问题,并获得更准确的结果。

智能体搜索

要精确查找某段代码,最直接的方法是寻找完全匹配的内容,例如函数名、变量名或其他代码片段。

智能体可以使用 grep 这一精确字符串查找工具,也可以创建更复杂的正则表达式模式或词边界匹配。还有 ripgrep 等在 grep 基础上改进的工具,支持递归搜索。

这两种工具都非常好用。不过,Cursor 借助 Instant Grep 将 grep 进一步优化;与 ripgrep 相比,它能显著加快在大型代码库中的智能体搜索速度。

使用这些工具无需配置或改变使用习惯。Cursor 会自动提供这些工具;与智能体聊天时,它会在后台使用这些工具。

按语义搜索

当您不知道确切的符号或文本时,Agent 可以按语义搜索您的代码库。它会结合 grep 查找相关文件,并追踪精确引用。详见 Agent 如何搜索您的代码库

如何提出好问题

问题的表述方式会影响智能体使用哪些搜索工具,以及搜索结果的效果。提问可以从具体到宽泛:你可以先要求精确匹配某段文本,例如函数名;也可以提出宽泛的问题,例如“帮我了解用户在我们的应用中提交付款后会发生什么。”

知道自己要找什么时,就从具体的问题开始。探索陌生领域时,则可以扩大范围。下面来看几个示例。

在第一个示例中,由于提示词要求查找具体内容,智能体会先使用 grep。它会搜索 import.*PaymentService,找出所有引用该服务的文件。

Ask mode example: 定向搜索
找出所有从我们的 PaymentService 导入内容的文件,并告诉我它们如何处理 PaymentFailedError。

探索陌生领域时,可以扩大搜索范围。下一个示例中,我们询问应用如何处理付款失败。请注意,第一个工具调用是“搜索代码库”。智能体会先找到相关文件,再使用 grep 补充细节。

Ask mode example: 宽泛探索
我们的应用如何处理付款失败?请带我了解从结账表单到用户看到的错误消息的整个错误流程。

Explore 子代理

智能体还可以生成子代理,更高效地完成任务。

内置的 Explore 子代理 可帮助您搜索代码库。Explore 子代理在独立于父智能体的上下文窗口中运行,并使用速度更快的模型,因此可以执行大量并行搜索,而不会占用过多主对话的上下文。

您无需手动调用它。智能体会在判断其适用时使用它。不过,您也可以直接要求使用该子代理。

正如我们在基础课程中所讲,了解并关注上下文用量很重要。如果您要搜索代码库中的许多文件,就会生成大量上下文。子代理仅返回其发现结果,让主对话保持聚焦,从而显著改善上下文管理。

架构图

对于大型或不熟悉的代码库,您可以让智能体生成架构图,例如 Mermaid 图,帮助您直观理解代码库。

Ask mode example: 架构图
创建一个 Mermaid 图,展示我们支付系统的数据流,包括结账表单、API 路由、支付服务和 Stripe 集成。

这些图有助于入职、编写文档和设计评审。它们还能揭示架构问题,例如某个服务依赖过多其他服务,或数据流走了意料之外的路径。

常见失败模式:未理解就改动

一个常见错误是,在不了解现有实现的情况下就让智能体修改代码。智能体可能会在已有工具函数的情况下新建一个,或采用与代码库其余部分不同的模式。

提出修改请求前,先让智能体进行探索:

Ask mode example: 修改前先探索
在进行任何更改之前,请向我展示现有的表单验证是如何工作的。我们使用哪些模式?共享验证器在哪里?

编码 agent 会按字面理解您的请求。如果您没有提供意图,它们会自行做出最佳判断。有时这样做效果不错。但对于需要遵循现有模式的更改,先理解代码库并明确知道该提出什么要求,通常能获得更好的结果。

接下来

你已经能够查找并理解代码。下一章将学习如何将理解付诸实践并上线:规划功能、编写测试,以及将设计转化为代码。

你已完成本节