日期:2026-03-26
这个项目不是“失败的半成品”,而是一个方向对、主链路已打通、但工程化明显停在 MVP 阶段的个人项目。它最有价值的部分是:
- 选题成立:
VS Code 扩展 + 本地索引后端 + 代码检索/解释 - 主闭环成立:
打包工作区 -> 上传 -> chunk -> 入库 -> search/explain/agent - 架构有边界:前端扩展、API、索引、检索、LLM 适配已经分层
它最需要的不是“推倒重来”,而是一次有节制的整理:先收敛范围、再补工程骨架、最后再谈功能升级。
从 README.md 和代码实现看,这个项目的目标是做一个面向 VS Code 的本地 Code RAG 工具:
- 扩展负责触发搜索、解释、Agent、构建索引
- 后端负责上传 zip、入队任务、检索、调用 LLM
- 索引侧用 Tree-sitter 做 AST-aware chunking
- 存储侧用 Chroma 做向量检索
- 任务侧用 Redis + RQ 做异步构建
这个方向本身是合理的,而且对个人项目来说,拆分也不算乱。
我没有假装“完整跑通”整个系统,而是做了更适合当前阶段的项目体检:
- 阅读了核心说明、依赖、Docker 配置
- 串读了 API、索引、检索、Agent、VS Code 扩展主链路
- 做了 Python 语法级检查:
python3 -m compileall api ai indexer retriever eval - 检查了仓库结构、Git 状态、空文件、配置文件现状
当前可确认:
- Python 代码层面没有语法错误
- 仓库是独立 Git 仓库,当前只有
.DS_Store脏改动 - VS Code 扩展依赖未安装,所以我没有宣称前端构建已验证
这个项目最好的地方,是代码虽然简略,但职责边界已经有了:
- api/main.py 负责 HTTP 入口
- indexer/chunker.py 负责代码切块
- indexer/embed_ingest.py 负责写入 Chroma
- retriever/hybrid_search.py 负责检索和重排
- ai/llm.py 负责模型适配
- clients/vscode/src/extension.ts 负责 VS Code 入口
这说明你去年其实已经把“产品骨架”想明白了。
从实现上看,索引主流程是成立的:
- 扩展把 workspace 打包上传
- 后端保存 zip 并入队
- worker 解压后切 chunk
- chunk 写入 Chroma collection
/search、/explain、/agent/explain再按 workspace 查询
这一点很重要,因为很多个人项目死在“只有 demo,没有真正通路”。这个项目不是。
项目现在更像“做出来了第一版闭环”,而不是“可持续迭代的产品仓库”。
表现为:
- 文档有了,但和实现不完全一致
- 配置层存在,但很多没真正接入
- 测试层几乎空白
- 依赖、License、空文件这些基础卫生还没收口
indexer/chunker.py 不是简单按字符切片,而是围绕函数、类、方法、箭头函数做 chunk,这个方向是对的。它至少已经考虑了:
- 结构化代码单元
- 注释拼接
- 导出信息
- AST 路径
- 去重 ID
这部分完全可以作为后续重构的核心保留资产。
api/main.py:77 的 collection 命名和 clients/vscode/src/api.ts:97 的 x-workspace-id 设计,说明你当时已经意识到“多项目隔离”是代码检索工具的核心问题。这点很成熟。
不是做一个网页 demo,而是直接嵌进 VS Code,这让它更接近真实使用场景。对个人项目来说,这是加分项。
下面这些不是吹毛求疵,而是我认为最值得优先处理的结构性问题。
最明显的是语言支持。
扩展打包时允许很多文件类型进入 zip,例如 .py、.java、.go、.rs、.c、.cpp、.md、.json 等,见 clients/vscode/src/indexer.ts:25。
但后端 chunker 实际只支持 JS/TS 相关扩展,见 indexer/chunker.py:24。
这会导致两个问题:
- 用户感知上像是“支持很多语言”
- 实际索引阶段只会处理 JS/TS,别的文件大多只是被上传但不会进入 AST chunk
这类不一致比“功能还没做”更伤体验,因为它会制造误解。
/explain 走的是按请求解析 provider/api key 的新逻辑,见 api/main.py:305 和 ai/llm.py。
但 Agent 里仍然直接用环境变量创建 OpenAI client,见 ai/agent.py:31。
后果是:
- 扩展里传的
x-llm-provider、x-api-key对 Agent 不一定生效 ctx在/agent/explain里基本没被用上,见 api/main.py:628- Agent 实际上仍偏“只支持 OpenAI”
这和 README 里“Provider 可切换”的整体叙述不完全一致。
/search 调用检索时传的是 include_documents=False,见 api/main.py:183。
而 retriever/hybrid_search.py:73 在这种情况下会把 docs 置成 None,于是 retriever/hybrid_search.py:89 生成的 text_preview 也基本为空。
最终 clients/vscode/src/searchView.ts:39 的 tooltip 价值会很有限。
这不是大 bug,但说明有些功能链路“看起来在,实际没喂够数据”。
从代码导入看,实际核心依赖集中在:
fastapipydanticredisrqchromadbtree-sittertree-sitter-languagesopenaipython-dotenvrequests
但 requirements.txt 里有大量当前代码并未直接使用的包,而且体量很大。这通常意味着它更像一次环境冻结,而不是项目级依赖声明。
后果很现实:
- Docker build 更慢
- 依赖冲突概率更高
- 未来恢复这个项目的成本更高
好消息是你已经有了一个更接近真实需求的 requirements-mvp.txt,这说明收敛依赖并不难。
仓库里虽然有配置目录,但目前:
- configs/embedding.yaml 是空文件
- configs/retrieval.yaml 是空文件
同时大量参数仍散落在代码和环境变量里,例如:
- 检索分数逻辑
- chunk 限制
- zip 限制
- 默认 top_k
- 模型名
这会让后续调参和多环境管理比较痛苦。
目前有几个非常直观的“未收尾”信号:
这些东西本身不一定影响运行,但会直接影响你重新接手时对仓库的信任感,也会影响别人看这个项目时的专业印象。
api/main.py 的特点是“功能集中、可读性尚可、但过胖”。
优点:
- 路由齐全
- 逻辑比较直白
- explain 和 stream explain 都有
- workspace 隔离已经接上
问题:
- 单文件承担太多职责
- 搜索、解释、索引、Agent、状态查询都堆在一个文件里
- prompt、fallback、context 构造和 route 混在一起
建议以后拆成:
api/routes/search.pyapi/routes/indexing.pyapi/routes/agent.pyservices/explain_service.pyservices/index_service.py
indexer/chunker.py 是目前最像“核心资产”的一块。
优点:
- 逻辑相对独立
- 输入输出比较明确
- 已经有一定语义信息提取
问题:
- 只支持 JS/TS
- query 规则仍比较基础
- 没有配套测试样本验证 chunk 质量
- 注释抽取和 chunk 选择逻辑仍偏启发式
retriever/hybrid_search.py 目前属于“够用但非常轻”。
优点:
- 简单直接
- 有 runtime code 优先意识
- symbol boost 思路是对的
问题:
- 重排规则全靠硬编码
- 评分体系比较原始
- 没有独立评测闭环来校准参数
ai/llm.py 比 ai/agent.py 明显更成熟。
我对它们的判断是:
llm.py体现了你后来已经开始往“统一 provider 适配层”走agent.py还保留着更早期的 MVP 风格
也就是说,这里不是“完全不会做”,而是“重构做了一半停住了”。
扩展部分总体可读,而且命令入口清楚。
优点:
- 命令链路清楚
- 配置项也有基本暴露
- 结果视图和 Explain 面板都已实现
问题:
- 多工作区支持很弱,默认只取第一个 workspace,见 clients/vscode/src/indexer.ts:47
- 索引文件类型和后端支持不一致
- Explain WebView 的 markdown 渲染是手写简化版,后面很容易出显示问题
如果今天从零重写,短期会很爽,但你会丢掉几个已经很值钱的东西:
- 你去年已经想明白的产品边界
- 你已经走通的索引链路
- 你已经试过的 VS Code 交互形态
- 你对“本地优先、workspace 隔离、AST-aware”这几个关键判断
更合适的做法是:
- 先保留现有仓库
- 做一次“工程化清理 + 范围收敛”
- 在此基础上再决定是否抽第二版
目标:让仓库重新具备“我敢继续在这里开发”的感觉。
建议先做:
- 清理
requirements.txt,收敛到真实运行依赖 - 补全
LICENSE - 删除或填充空文件
- 在 README 顶部明确“当前只支持 JS/TS”
- 对齐扩展允许上传的文件类型和后端真实支持范围
- 补一个最小 smoke test 文档或脚本
目标:减少“文档说一套、代码半套”的状态。
建议做:
- 统一 explain 和 agent 的 LLM 配置入口
- 把 API 路由拆文件
- 把 chunk / retrieval / provider 的关键配置外置
- 让 search 返回可用 preview
- 给索引流程加更明确的错误信息和完成摘要
目标:让项目从“可演示”走向“可持续使用”。
建议方向:
- 增强 chunk 质量和召回评估
- 增加更多语言支持
- 增加增量索引而不是每次整包上传
- 加真正的 streaming explain UI
- 做更可信的 Agent 调度和证据展示
这个项目是有作品集潜力的,但前提是你把“半成品感”去掉。
对外展示时,最重要的不是再加 5 个功能,而是把以下几点做扎实:
- 问题定义清楚
- 架构图清楚
- 支持范围明确
- demo 路径稳定
- 仓库基础卫生完整
换句话说,这个项目现在缺的不是想法,而是“第二次整理”。
如果你愿意继续,我建议下一步直接从下面这组动作开始,而不是继续空想:
- 先做一次仓库清理和文档校正
- 再统一 LLM 配置链路
- 再修索引文件类型和 preview 这两个低成本体验问题
- 最后再决定要不要做第二版架构拆分
这条路线投入小,但回报很高。
这是一个“方向靠谱、骨架已成、但停在 MVP 工程化门口”的项目。
我对它的总体评价是:
- 选题:好
- 架构意识:比一般个人项目强
- 核心链路:成立
- 工程完成度:偏低
- 是否值得继续:值得,而且不需要推倒重来
如果你要,我下一步最适合做的是二选一:
- 直接帮你做第一轮“仓库整理 + 文档校正 + 依赖收敛计划”
- 或者直接开始改代码,先把我上面点到的 2 到 3 个高价值问题修掉