2026年10月27日 · 阅读 —

AI 改代码总在全文搜索?Serena 给它补上 IDE 的符号导航

Agent 与 Skills测试与评测

AI 改代码总在全文搜索?Serena 给它补上 IDE 的符号导航

改一个方法名,搜出几十处同名文本。有的是真正的调用,有的是另一个类里的方法,还有文档、日志和测试数据。

人可以在 IDE 里点“查找引用”,确认哪些位置用到了同一个方法。换成 AI 编码助手,如果手头只有文本搜索和文件替换,它就得从一堆命中里逐条判断。

Serena 是一套供 AI 使用的代码工具,通过 MCP 接入现有编码助手,提供符号查找、引用查询、编辑和重命名等能力。 MCP 可以理解为助手连接外部工具的接口。接入 Serena 后,模型仍负责判断任务,Serena 帮它查询和操作代码。

文本搜索与查引用,各自找的东西不同

这里的“符号”,指函数、类、方法等代码对象。两个方法都叫 cancel,并不代表它们是同一个对象。

方式主要依据适合的任务
全文搜索与替换字符串、正则表达式找配置项、文案、日志和文本形式的标识
IDE 原生导航与重构编辑器对代码结构和关系的分析开发者查引用、跳转定义、重命名
Serena 的符号工具将语言服务器或 IDE 的分析能力提供给 Agent让 AI 查找定义、识别引用、按符号修改代码

比如,预约服务和优惠券服务都定义了 cancel。按文本全局替换,需要额外排除无关内容;符号重命名则以指定代码对象为目标,通过后端的引用分析更新关联位置。

这并不意味着要放弃全文搜索。文案、配置值和业务状态字符串,本来就经常需要按文本查找。Serena 增加的是另一种定位方式。

仓库里有哪些可以用的东西

项目 README将 Serena 定位为面向 Coding Agent 的 IDE 工具。它不提供一个新模型,也不要求迁移到另一款编辑器。

仓库中的 src/serena/ 承载 MCP 服务、工具与项目管理等应用能力,src/solidlsp/ 是语言服务器集成组件;docs/02-usage/ 提供安装、客户端接入、项目配置和使用流程文档。

工具文档列出了几项容易理解的操作:

  • get_symbols_overview:查看文件中定义了哪些类、函数或方法,先读结构。
  • find_symbol:查找指定代码对象。
  • find_referencing_symbols:寻找引用该对象的位置。
  • replace_symbol_body:替换指定符号的完整定义。
  • rename_symbol:通过语言服务器的重构能力,对指定符号执行重命名。

这些是传统工具接口中的名称。实际暴露哪些工具,取决于后端、客户端上下文及配置,不是每次连接都会把所有工具全部打开。

此外,Serena 支持项目记忆,用于保存项目约定、常用操作等信息。根据项目流程文档,首次接入项目时的 onboarding 会帮助 Agent 熟悉项目,并留下可供后续读取的材料。

两种后端,不要混着理解

Serena 默认使用语言服务器。语言服务器通过 LSP 协议,为编辑器提供定义、引用、重命名等代码分析能力,Serena 将其中的能力提供给 Agent。

另一个选择是 Serena JetBrains 插件,借用 JetBrains IDE 的代码分析与重构能力。README 标明它是付费插件,提供试用。

两种后端的能力不完全相同。README 将符号重命名列为 LSP 后端能力;文件或目录移动、内联重构,以及交互式调试等能力则列在 JetBrains 插件一侧。某些语言的实现查找能力,也取决于具体语言服务器。

项目还提供了 v2 的 REPL 接口。REPL 是一种可持续执行代码的交互环境,Agent 可以用 Python 把多次查询组合起来,在工具运行环境中筛选结果,再将需要的部分带回对话。官方工具文档给出的用途包括组合查询、减少中间结果占用对话内容。本文没有实测节省比例,不据此承诺固定的速度或费用收益。

在 Claude Code 里接入

README 当前给出的安装命令是:

uv tool install -p 3.13 serena-agent

前提是已安装 uv。安装后初始化 Serena:

serena init

这一步默认使用语言服务器后端。特定语言可能还需要额外依赖,应按项目的语言支持说明配置。

在要工作的项目目录中,可以按客户端接入文档的项目级示例添加 MCP:

claude mcp add serena -- serena start-mcp-server --context claude-code --project "$(pwd)"

随后在 Claude Code 中使用 /mcp 检查连接状态,必要时重连。该文档也提供了 serena setup claude-code 自动配置入口。

项目设置保存在 .serena/project.yml 中,可以配置语言、忽略规则和写入权限等。项目较大时,项目流程文档建议按需预先建立符号索引:

serena project index

以上是项目公开文档中的操作说明,本次没有安装或运行 Serena。连接成功之后,还应观察一次实际任务是否使用了对应工具;工具出现在列表里,不等于模型已经调用过。

模拟案例:给预约服务的方法改名

以下是基于 Serena 已公开能力设计的模拟示例,不是实测记录,也不是仓库自带业务。

假设二手车 App 的预约服务中,有一个方法:

模拟示例:变更目标

AppointmentService.cancel
    → AppointmentService.cancel_appointment

要求:
更新项目内可解析到的相关代码引用,保持业务行为不变。
不修改其他类的同名方法。
不改外部 API 地址、数据库字段或用户可见文案。

这类任务适合用来理解符号工具。业务变化很小,验收重点是改名是否准确,以及有没有误伤无关对象。

先确认对象,再形成影响范围

模拟请求可以这样写:

模拟示例:给编码助手的任务

使用 Serena 查找 AppointmentService.cancel 的定义与引用。
先只读分析,列出关联实现和测试,区分其他类的同名方法。
另行检查配置、字符串调用等不能仅靠符号引用确认的用法。
给出修改计划,暂不编辑。

预期产物是一份影响范围说明:目标定义在哪里,哪些调用引用了它,相关测试在哪里,以及哪些用法还需要人工判断。

如果代码通过字符串动态查找方法,语言服务器未必能将它与定义关联起来。这部分应补充文本检查,不能把一次引用查询当作所有使用方式的完整清单。

用符号重命名完成修改,再运行相关检查

确认范围后,模拟流程进入编辑阶段:让 Agent 针对已确认的对象使用 rename_symbol,检查修改内容,并通过项目已有命令运行相关测试。

这里没有给出一个通用测试命令。真实项目的测试框架、目录和启动要求不同,应使用项目中已经定义的执行方式。Serena 负责提供代码工具,测试仍由宿主或已启用的执行工具运行。

验收可以按以下模拟要求展开:

检查对象预期行为
目标方法与关联调用使用新名称,相关代码可通过适用的类型检查或编译检查
其他类的 cancel保持原样
原有预约取消测试修改后重新执行,业务结果符合原有约定
API、数据字段和文案未因方法改名发生无关变更
动态用法经过补充检查,未确认项不被写成已覆盖

本例预期减少的是人工辨别同名文本、逐处维护可解析引用的动作。是否节省时间、能覆盖哪些调用,需要在实际语言和项目环境中验证。

从代码关系走到测试范围

对测试开发,符号查询可以用于寻找修改点的调用方、关联测试和候选回归范围。它提供代码关系,业务优先级还需要结合需求、调用方式和风险判断。

预约取消还可能涉及通知、退款或排期释放。即便相关调用全部完成改名,也不能仅凭引用关系认定这些业务都已验证。实际回归仍要检查用户能否取消、取消后资源是否释放,以及通知等后续行为。

产品或业务人员不必直接调用这些工具,但可以要求交付说明列出:改了哪个对象、影响了哪些调用、执行了哪些验证。这样,方法名改了这件小事,就能对应到明确的修改范围和检查结果。

第一次尝试可以只做一次只读查询:选一个熟悉的方法,让 Agent 给出定义、引用和关联测试,再与 IDE 中的结果核对。确认它找的是同一个代码对象,再考虑交给它编辑。

来源:Serena 仓库与 README · 工具与 REPL 接口 · 客户端接入 · 项目工作流程

#Serena #MCP #AI编程 #测试开发 #代码重构