真实面经题目 · 原创解析
代码 Agent 的 RAG 检索索引如何同时设计语义、关键词、结构化和权限索引?
这题考代码 Agent 的 RAG 索引架构,不是泛泛讲向量库。回答要覆盖语义索引、关键词索引、结构化代码索引和权限索引如何协同检索、过滤、排序和增量更新。
真实面经题目 · 原创解析
这题考代码 Agent 的 RAG 索引架构,不是泛泛讲向量库。回答要覆盖语义索引、关键词索引、结构化代码索引和权限索引如何协同检索、过滤、排序和增量更新。
我会把代码 Agent 的 RAG 索引设计成多路索引加统一召回编排。语义索引用 embedding 表达自然语言需求和代码片段的含义,适合找相似实现、业务逻辑和文档解释;关键词索引用倒排或 BM25 保留函数名、变量名、错误码、接口路径和精确字符串,解决代码检索里必须精确命中的问题;结构化索引来自 AST、符号表、调用关系、文件路径、模块依赖、Git 元数据和测试关联,用于定位定义、引用、调用链和影响范围;权限索引则在租户、仓库、分支、目录、文件、密级和用户授权维度做可见性控制。检索流程上,先做权限约束和查询改写,再并行召回语义、关键词和结构化结果,之后去重、合并、rerank,并把代码片段、定义引用关系和证据来源交给 Agent。工程上还要处理增量索引、分支版本、chunk 粒度、跨语言解析、召回评估、权限泄漏测试和 trace,避免 Agent 读到不该读或不相关的代码。
代码检索既有自然语言语义问题,也有精确符号匹配和结构跳转问题。只用向量检索会漏掉函数名、错误码和接口路径;只用关键词又理解不了业务意图;没有结构化索引则难以沿定义、引用和调用链追踪;没有权限索引则无法安全用于企业仓库。
语义索引把代码 chunk、注释、README、接口文档和测试说明编码成向量,适合回答某段业务逻辑在哪里、有没有类似实现、某个需求可能改哪些模块。它依赖合理 chunk、语言模型选择和 rerank,否则容易召回表面相似但不可用的代码。
代码里大量关键信息不能被语义平均掉,例如类名、函数名、配置 key、错误码、日志文本、SQL 表名和 URL path。倒排索引或 BM25 能提供高精度召回,并可作为向量召回的补充和 rerank 特征。
结构化索引应从 AST、符号表、import/export、调用图、继承关系、文件路径、模块依赖、测试覆盖和 Git 提交中提取。它让 Agent 能从一个接口跳到实现、从实现跳到调用方、从改动点找到测试,而不是只拿孤立片段回答。
权限不是检索后的展示过滤而已。企业 Code Agent 要按用户、组织、租户、仓库、分支、目录、文件和密级约束召回空间,并在缓存、rerank、日志和最终上下文中持续校验,防止跨租户或跨仓库泄漏。
代码库变化快,索引要支持提交级增量更新、删除同步、分支隔离和失败重建。评估要看 symbol 命中率、相关 chunk 召回率、权限过滤正确率、答案引用支持率、Agent 任务成功率、延迟和索引新鲜度。
因为代码检索里很多查询依赖精确符号、路径、错误码和调用关系。向量能理解语义,但可能漏掉必须一字不差匹配的工程信号。
关键词索引回答某个 token 或字符串在哪里出现;结构化索引回答定义、引用、调用、依赖和测试之间是什么关系,能支持影响分析和跳转。
因为未授权内容可能已经进入 rerank、缓存、日志或模型上下文。安全设计应从召回空间开始限制,并在后续链路持续校验。
按提交或文件变更做增量解析和增量向量化,保留分支版本,删除旧 chunk,并对索引延迟、失败队列和新鲜度做监控。