跳转至

RAG vs Search:技术路线与大厂选择

更新日期:2026-04-15


一、本质区别

飞书 add-on(待手动转 mermaid / 图)

component: blk_631fefbbae02400430b8f9f4

维度 传统 Search RAG AI Search (融合)
输入形式 关键词 自然语言问题 自然语言问题
输出形式 文档列表 生成式答案 + 引用 生成式答案 + 链接
索引规模 万亿网页 百万-亿级文档 融合
索引技术 倒排索引 + PageRank 向量索引 + 倒排 混合
更新延迟 分钟-小时 需要重嵌入,小时-天 混合
成本 极低/次 中 (需 LLM)
精度 取决于用户判断 模型判断 模型判断

二、大厂路线选择

2.1 路线图

2.2 为什么 Google 不完全转向 RAG

Google 的困境:AI 搜索的每次查询成本是传统搜索的 10-100 倍,但广告收入没有成比例增长。全面转型 RAG 会毁掉商业模式。 传统搜索商业模式: - 查询成本: 毫秒级 + 微小算力 - 收入: 每次搜索 0.1-1 美元广告 (CPM 高峰) - 利润率: ~90%

AI Search (RAG) 商业模式: - 查询成本: LLM 生成 + 搜索 + 文档抓取 - 收入: 广告位减少 (答案直接给出) + 订阅 - 利润率: ~10-30% (估计)

Google 的策略: - 保留传统搜索作为基础 - AI Overview 作为"高价值"查询的增值服务 - 不激进转型, 等待基础设施成本下降


三、Perplexity 的 RAG 架构

flowchart LR
    q["用户问题"]
    rewrite["Query 改写<br/>LLM 转关键词"]
    search["Web 搜索<br/>Bing / Google API"]
    fetch["并行抓取<br/>20 个候选页"]
    chunk["切块 + 嵌入"]
    rerank["Rerank<br/>cross-encoder"]
    gen["生成答案<br/>带引用"]

    q --> rewrite --> search --> fetch --> chunk --> rerank --> gen

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class q,rewrite,search,fetch,chunk,rerank,gen stage

3.1 关键组件


四、企业内部该选哪个

飞书 add-on(待手动转 mermaid / 图)

component: blk_631fefbbae02400430b8f9f4

场景 推荐 原因
技术文档问答 RAG 数据量有限,向量检索够用
客服/知识库 RAG + FAQ 结构化答案为主
代码搜索 专用代码嵌入 + RAG 代码语义与文本不同
法律/合规分析 GraphRAG 需要跨文档推理
新闻/实时信息 Search API + LLM 实时性要求高
产品说明+用户对话 Hybrid RAG 多源信息
研究综述 Agentic RAG 需要多轮检索和综合

五、RAG 会消亡吗

5.1 长上下文的威胁

Google Gemini 2M tokens, Llama-4 Scout 10M tokens。理论上能把整个知识库塞进上下文,直接问答。 判断: 简单 RAG (<10K 文档) 会被长上下文替代;复杂 RAG (企业级、多源、实时) 不会消失。

5.2 RAG 的分化方向

方向 核心特征 适用场景
Simple RAG embedding + top-k + LLM 文档量小、单跳问答
Hybrid RAG 向量 + BM25 + 重排 需要精确召回的企业搜索
GraphRAG 实体图 + 子图召回 跨文档推理、合规、法律
Agentic RAG 多轮检索 + 工具调用 研究综述、复杂问答
Long-context 直接塞入 1M+ tokens 单文档深读、代码库
Cache-augmented 预计算 KV 缓存 高频静态文档

六、为什么 Perplexity 能打 Google

6.1 Google 的反击


七、实现一个 Perplexity-like 系统

class MyPerplexity:
    def __init__(self, search_api, llm, reranker):
        self.search = search_api  # Bing/Google PSE
        self.llm = llm
        self.reranker = reranker

    def query(self, question, max_sources=5):
        # Step 1: Query understanding - 改写为搜索 query
        search_query = self.llm.generate(f"""
将这个问题改写为搜索引擎查询 (关键词形式):
问题: {question}
查询:""")

        # Step 2: Web search
        results = self.search(search_query, count=20)  # 取 20 个候选

        # Step 3: 并行 fetch 正文
        docs = parallel_fetch([r['url'] for r in results])

        # Step 4: Chunk
        chunks = []
        for doc in docs:
            chunks.extend(chunk_text(doc, size=800))

        # Step 5: Rerank
        reranked = self.reranker.rank(question, chunks)[:max_sources]

        # Step 6: 生成答案 (带引用)
        context = "\n\n".join([f"[{i+1}] {c.text} (source: {c.url})" 
                                for i, c in enumerate(reranked)])

        answer = self.llm.generate(f"""
基于以下参考资料回答问题。每一句话末尾标注引用编号 [1][2]...
参考资料:
{context}

问题: {question}
回答:""")

        return {
            'answer': answer,
            'sources': [{'url': c.url, 'title': c.title} for c in reranked]
        }

参考文献


上级 · H. 应用层