vgrep
完全本地运行的语义代码搜索引擎,用自然语言搜索代码而非关键词匹配
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
完全本地运行的语义代码搜索引擎,用自然语言搜索代码而非关键词匹配
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
场景切入: 凌晨两点,你在调试一个三个月前写的微服务框架,想要找到"所有和认证相关的代码"。传统 grep 只能搜 auth、login、token 这些关键词——但你心里清楚,认证逻辑散落在 middleware.rs、session.rs、jwt.rs 里,变量名五花八门,毫无规律。你开始一个一个文件翻,心态逐渐崩溃。
nugrp(读作 "nu-grep")正是来解决这个痛点的:它不搜关键词,而是搜意图。你问 vgrep "where is authentication handled?" 它能理解你想找认证相关代码,返回正确的结果——即使代码里从没出现过 auth 这个词。
代码搜索是开发者每天都在做的事情,但传统工具的能力边界明显:grep 只能精确匹配字符串,正则表达式虽然灵活,但面对"找所有和错误处理相关的代码"这类需求时依然力不从心。变量命名风格不同、代码结构不同、注释语言不同——这些问题让基于关键词的搜索变得脆弱。
随着大语言模型(LLM)能力的提升,语义向量搜索成为了解决这个问题的关键技术。nugrp 诞生于 2025 年 12 月,由 Cortex Foundation 团队开发,定位是完全本地运行、零云依赖的语义搜索工具——这意味着你的代码永远不会离开你的机器。
nugrp 的技术链路并不复杂,但每个环节都设计得很扎实:
第一步:分块(Chunking)。 索引阶段,系统用 walkdir 遍历指定目录,忽略 .gitignore 中的规则文件,然后按 512 token 为窗口、64 token 重叠的方式将代码文件切分成若干 chunk。每个 chunk 的起始行和结束行信息都被记录下来,供后续展示上下文使用。文件变更通过 notify 库监听文件系统事件,增量更新索引。
第二步:生成向量。 每个 chunk 的文本内容送入 embedding 模型,生成一个高维浮点向量。nugrp 使用 llama-cpp-rs(一个 Rust 封装的 llama.cpp)作为推理后端,默认从 Hugging Face Hub 下载 embedding 模型(如 all-MiniLM-L6-v2 或类似模型)。LlamaBackend 支持 CPU、CUDA、Metal(macOS)和 Vulkan 多后端,用户可根据硬件条件选择。向量生成后通过 SHA-256 哈希做内容去重,避免重复索引。
第三步:向量存储。 所有 chunk 的向量和元数据(路径、行号、文件哈希)存储在 SQLite 数据库中(使用 rusqlite + bundled 模式,无需单独安装 SQLite)。搜索时,查询语句同样经过 embedding 模型得到向量,然后在数据库中做余弦相似度搜索,返回 top-K 最相似的 chunk。
第四步:搜索与展示。 搜索结果去重(同一文件保留得分最高的 chunk),并附带代码预览和行号范围。系统支持 TUI(终端交互界面,使用 ratatui + crossterm)和 CLI 两种模式,TUI 模式下用户可以在终端内浏览搜索结果。
nugrp 的源码结构遵循 Rust 生态的惯用风格,按功能模块分层:
src/core/:核心业务逻辑,包含 embeddings.rs(Llama.cpp 封装和向量生成)、indexer.rs(文件遍历、分块、索引构建)、search.rs(向量搜索和结果排序)、db.rs(SQLite 封装和 CRUD)。核心逻辑完全自研,不依赖外部搜索库。
src/cli/:命令行入口,使用 clap 解析命令行参数,支持子命令(init、serve、watch、search 等)。交互式配置引导使用 dialoguer。
src/server/:HTTP API 服务器,基于 axum 框架。当用户以 server 模式启动时,embedding 模型常驻内存,实现亚 100ms 的重复搜索响应时间。提供 JSON API 供外部调用。
src/ui/:TUI 界面实现,用 ratatui(tui-rs 的分支)构建终端交互界面,支持键盘导航和搜索结果浏览。
src/watcher.rs:文件系统监控,使用 notify 库监听文件变更,自动触发增量索引更新。
src/config.rs:配置管理,支持 ~/.config/vgrep/config.json 配置文件,配置项包括运行模式(server/local)、服务器地址、embedding 模型路径、线程数、上下文大小、GPU 加速开关等。
依赖生态简析: 项目选用的大多是 Rust 生态中经过充分验证的 crate——llama-cpp-2 封装 llama.cpp 的 Rust 接口,rusqlite 负责向量存储,axum 提供 HTTP 服务,ratatui 负责终端 UI,walkdir + ignore 处理文件遍历。这套依赖组合既保证了功能完整,又避免了过度依赖。
安装过程极为简单,一行命令:curl -fsSL https://vgrep.dev/install.sh | sh。安装脚本会下载对应平台的预编译二进制文件(Rust 编译产物),并放入 ~/.local/bin 或 PATH 中的某个目录。
初始化需要两步:vgrep init(创建配置目录和数据库)+ vgrep models download(从 Hugging Face Hub 下载 embedding 模型,约几百 MB 到 1GB 不等,取决于模型选择)。首次启动会自动下载默认模型。
两种运行模式: local 模式每次搜索时加载模型(冷启动),适合偶尔使用;server 模式常驻内存,适合频繁搜索的场景,响应时间可降至 100ms 以内。vgrep serve 启动服务后,vgrep watch 可以监听目录变更并自动更新索引。
GPU 加速支持通过 feature flags 开启:--features cuda 或 --features metal(macOS),编译时指定硬件加速后端,运行时可显著提升 embedding 生成速度。
nugrp 作为一个年轻项目(2025 年 12 月才创建),也存在一些明显的问题:
首先,chunk 策略的局限。 固定 512 token 窗口 + 64 token 重叠的策略对不同语言和代码结构的适应性有限——长函数可能被截断,短函数又可能因为上下文不足而影响语义理解精度。项目代码中也提到 reranker(重排序)功能因 backend 冲突暂时被禁用,当前仅靠余弦相似度排序,精度有限。
其次,模型选择的局限。 当前强依赖 Hugging Face Hub 下载模型,在网络受限环境下可能遇到困难。默认 embedding 模型是否是最优选择(精度 vs. 速度 vs. 内存占用)也需要用户自行判断。
第三,SQLite 的向量搜索局限性。 SQLite 并非专门的向量数据库,余弦相似度搜索在大规模向量集上的性能可能不如 pgvector、Chroma 等专用方案。当前仅 146 stars 的用户量还不构成规模问题,但若用户代码库规模达到数万文件,性能瓶颈可能会显现。
nugrp 属于 2025-2026 年快速增长的"本地优先 AI"工具趋势的代表。随着 llama.cpp 等高效推理框架的成熟和 embedding 模型的小型化,越来越多的 AI 能力可以在不依赖云服务的情况下运行。
这类工具的核心价值在于:数据主权——代码是企业最重要的知识产权之一,上传到第三方服务的风险不言而喻。nugrp 通过 100% 本地运行、零 API 调用彻底消除了这个顾虑。
从技术角度看,nugrp 选择 Rust + llama.cpp 的组合也很有代表性:Rust 的内存安全保证和高效并发能力,配合 llama.cpp 的跨平台推理优化,使得工具在保证性能的同时具备良好的可移植性。CUDA/Metal/Vulkan 多后端支持也是亮点,覆盖了主流 GPU 硬件。
目前项目已有 146 stars、84 个 open issues、3 个 forks,仍处于早期活跃开发阶段。对于需要频繁在大型代码库中定位代码的开发者来说,nugrp 值得一试——尤其是那些对代码隐私有严格要求的场景。
项目链接: https://github.com/CortexLM/vgrep
标签: #语义搜索 #本地AI #向量数据库 #Rust #llamacpp #代码搜索 #隐私计算