2026年10月27日 · 阅读 —
AI 改代码总在全文搜索?Serena 给它补上 IDE 的符号导航
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编程 #测试开发 #代码重构