“RAG 已死,grep 当立?” 面试被问爆的话题,看完这篇都清晰了
github热门推荐 › “RAG 已死,grep 当立?” 面试被问爆的话题,看完这篇都清晰了 (第 58 章)
🤖 一句话说清楚:grep 和 RAG 到底是什么?
先给你打个最直白的比方:
- grep
就像你用 Ctrl+F 在文档里精准找关键词,比如搜 “TODO”“function_name”,只要字对上了,立刻给你结果,又快又准,而且 100% 可控。 - RAG
就像你用 AI 在一堆资料里按意思找内容,比如搜 “差旅报销政策”,它会理解你的需求,把意思相关的段落找出来,哪怕里面没出现 “差旅报销” 这四个字。
最近 Claude Code 火了,因为它不用 RAG,靠 grep+Glob+Read 三个工具,代码检索效果直接拉满,于是网上开始传 “RAG 已死”。但真的是这样吗?
🧠 核心对比:grep vs RAG,到底谁强谁弱?
1. 工作原理拆解
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 为什么 Claude Code 用 grep 做代码检索效果更好?
很多人以为是 RAG 不行了,其实是代码这个场景太适合 grep:
-
代码里的函数名、变量名、类名都是固定的字符串,用 grep 搜 getUserInfo,比用向量检索找 “获取用户信息的函数” 准多了; -
代码库天天变,RAG 的索引刚建好,代码已经更新了,很容易出现 “索引和实际代码不同步” 的问题; -
用 grep 不用维护复杂的向量库,用户打开项目就能直接用,没有部署和维护成本; -
再配合 Glob(找文件)和 Read(读内容),Claude Code 形成了一套Agentic Search闭环:先 Glob 找文件,再 grep 搜关键词,最后 Read 读内容,效率比 RAG 高得多。
📊 什么时候用 grep?什么时候用 RAG?(面试必背决策框架)
很多人面试被问住,就是因为只知道说 “grep 比 RAG 好”,却没搞懂场景匹配。
✅ 优先选 grep 的场景
-
代码检索:找函数定义、变量引用、TODO 注释; -
日志分析:按关键词 / 错误码筛选日志; -
结构化文本:配置文件、命令行输出、脚本; -
快速验证:临时项目、一次性任务,不想搭 RAG 基础设施。
✅ 优先选 RAG 的场景
-
企业知识库:20 万份非结构化文档,搜 “差旅报销政策” 这种语义需求; -
跨模态检索:带图片、表格、PDF 的混合文档,关键词没法直接匹配; -
同义词 / 模糊需求:比如搜 “收入确认规则”,要匹配 “ASC 606”“记账规则” 这类同义词; -
大规模非结构化数据:百万级文档,纯 grep 会返回大量噪音,淹没有效信息。
📈 场景决策流程图(竖排)
你的数据是什么类型?↓┌─────────────┐ ┌───────────────────┐│ 代码/日志/配置 │ │ 企业文档/知识库/非结构化数据 │└──────┬──────┘ └─────────┬─────────┘↓ ↓关键词明确吗? 需求是语义模糊吗?↓ ↓用grep 用RAG↓ ↓┌─────────────┐ ┌───────────────────┐│ 实时、低成本、精确匹配 │ │ 理解语义、跨文本、泛化检索 │└─────────────┘ └───────────────────┘
🛠️ 代码对比:grep vs RAG,实际使用有什么区别?
1. grep 检索代码(零成本,直接用)
# ------------------------------# 步骤1:用ripgrep(高性能grep)找代码里的TODO# ------------------------------# 安装ripgrep(比原生grep快很多)# macOSbrew install ripgrep# Ubuntusudo apt install ripgrep# 步骤2:在项目里搜索TODO注释rg "TODO" ./src --include="*.ts"# 输出:所有包含TODO的TypeScript文件和行号,毫秒级返回
# ------------------------------# 步骤1:安装依赖# ------------------------------pip install langchain chromadb sentence-transformers# ------------------------------# 步骤2:构建向量索引(需要分块、嵌入、建库)# ------------------------------from langchain.vectorstores import Chromafrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.document_loaders import DirectoryLoader# 加载文档loader = DirectoryLoader("./docs", glob="*.txt")documents = loader.load()# 分块text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)texts = text_splitter.split_documents(documents)# 嵌入并建向量库embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")db = Chroma.from_documents(texts, embeddings, persist_directory="./chroma_db")db.persist()# ------------------------------# 步骤3:检索(语义搜索)# ------------------------------query = "公司差旅报销政策"docs = db.similarity_search(query, k=3)# 输出:语义相关的3段文档内容,需要等待索引加载和向量计算
💡 成熟的 Agent 系统,是 “组合拳” 不是 “单选题”
Claude Code 的成功,不是因为它完全不用 RAG,而是它在代码场景里,用 grep 解决了最核心的检索问题。真正成熟的 Agent 系统,从来不会只选一个工具:
-
代码场景:用 grep+Glob+Read 做精确检索,快速定位文件和函数; -
知识库场景:用 RAG 做语义检索,理解用户的模糊需求; -
混合场景:先用语义搜索定位大方向,再用 grep 做精确匹配,最后读文件确认。
就像原文里说的:技术选型从来没有银弹,理解原理、匹配场景,才是正道。说 “RAG 已死” 的人,本质上是把 “特定场景下的优化” 当成了 “通用结论”。
⚠️ 版权声明
本文为免费文章,欢迎转载。转载请注明出处:一木科技(https://www.pingquan.vip/2026/05/28/rag-%e5%b7%b2%e6%ad%bb%ef%bc%8cgrep-%e5%bd%93%e7%ab%8b%ef%bc%9f-%e9%9d%a2%e8%af%95%e8%a2%ab%e9%97%ae%e7%88%86%e7%9a%84%e8%af%9d%e9%a2%98%ef%bc%8c%e7%9c%8b%e5%ae%8c%e8%bf%99%e7%af%87/),并保留原文链接。
还没有评论,来说两句?