60 秒回答模板

我会把代码 Agent 的 RAG 索引设计成多路索引加统一召回编排。语义索引用 embedding 表达自然语言需求和代码片段的含义,适合找相似实现、业务逻辑和文档解释;关键词索引用倒排或 BM25 保留函数名、变量名、错误码、接口路径和精确字符串,解决代码检索里必须精确命中的问题;结构化索引来自 AST、符号表、调用关系、文件路径、模块依赖、Git 元数据和测试关联,用于定位定义、引用、调用链和影响范围;权限索引则在租户、仓库、分支、目录、文件、密级和用户授权维度做可见性控制。检索流程上,先做权限约束和查询改写,再并行召回语义、关键词和结构化结果,之后去重、合并、rerank,并把代码片段、定义引用关系和证据来源交给 Agent。工程上还要处理增量索引、分支版本、chunk 粒度、跨语言解析、召回评估、权限泄漏测试和 trace,避免 Agent 读到不该读或不相关的代码。

考点 四类索引
难度 真实面经题
回答目标 讲清设计、取舍和边界

深入解析

01

先说明为什么要多索引

代码检索既有自然语言语义问题,也有精确符号匹配和结构跳转问题。只用向量检索会漏掉函数名、错误码和接口路径;只用关键词又理解不了业务意图;没有结构化索引则难以沿定义、引用和调用链追踪;没有权限索引则无法安全用于企业仓库。

02

语义索引解决意图相似

语义索引把代码 chunk、注释、README、接口文档和测试说明编码成向量,适合回答某段业务逻辑在哪里、有没有类似实现、某个需求可能改哪些模块。它依赖合理 chunk、语言模型选择和 rerank,否则容易召回表面相似但不可用的代码。

03

关键词索引保留精确信号

代码里大量关键信息不能被语义平均掉,例如类名、函数名、配置 key、错误码、日志文本、SQL 表名和 URL path。倒排索引或 BM25 能提供高精度召回,并可作为向量召回的补充和 rerank 特征。

04

结构化索引表达代码关系

结构化索引应从 AST、符号表、import/export、调用图、继承关系、文件路径、模块依赖、测试覆盖和 Git 提交中提取。它让 Agent 能从一个接口跳到实现、从实现跳到调用方、从改动点找到测试,而不是只拿孤立片段回答。

05

权限索引必须前置和贯穿

权限不是检索后的展示过滤而已。企业 Code Agent 要按用户、组织、租户、仓库、分支、目录、文件和密级约束召回空间,并在缓存、rerank、日志和最终上下文中持续校验,防止跨租户或跨仓库泄漏。

06

线上要做增量和评估

代码库变化快,索引要支持提交级增量更新、删除同步、分支隔离和失败重建。评估要看 symbol 命中率、相关 chunk 召回率、权限过滤正确率、答案引用支持率、Agent 任务成功率、延迟和索引新鲜度。

易错点

  • 把题目答成普通 RAG,只讲 embedding 和向量数据库。
  • 忽略代码里的函数名、错误码、路径等精确匹配需求。
  • 没有 AST、符号表、调用图等结构化索引,无法支持代码 Agent 的定位和修改。
  • 把权限当成展示层过滤,忽略缓存、rerank、日志和上下文泄漏风险。
  • 不讨论增量更新和分支隔离,默认代码索引是静态知识库。
  • 只看召回数量,不看引用支持、任务成功率和权限过滤正确率。

面试官追问

为什么代码 RAG 不能只用向量索引?

因为代码检索里很多查询依赖精确符号、路径、错误码和调用关系。向量能理解语义,但可能漏掉必须一字不差匹配的工程信号。

结构化索引和关键词索引有什么区别?

关键词索引回答某个 token 或字符串在哪里出现;结构化索引回答定义、引用、调用、依赖和测试之间是什么关系,能支持影响分析和跳转。

权限索引为什么不能只在返回结果时过滤?

因为未授权内容可能已经进入 rerank、缓存、日志或模型上下文。安全设计应从召回空间开始限制,并在后续链路持续校验。

代码库频繁变更时索引怎么维护?

按提交或文件变更做增量解析和增量向量化,保留分支版本,删除旧 chunk,并对索引延迟、失败队列和新鲜度做监控。