Skip to content
签到签到

第 10 章:RAG 与知识检索

本章解决的问题

前端 AI 面试经常把 RAG、Agent、Function Calling 放在一起问。这一章讲清 RAG 的定位和前端职责。

交互图解:生产级 RAG 数据链路 · 查看图解导读

大白话理解

RAG 是 Retrieval-Augmented Generation。

意思是:

text
用户提问
-> 从知识库检索相关资料
-> 把资料和问题一起交给模型
-> 模型根据资料生成答案

它适合回答“公司内部文档里怎么说”,而不是让模型只靠记忆回答。

必须掌握的概念

1. Embedding

Embedding 把文本转成向量。语义相近的文本,向量距离通常更近。

2. Chunking

长文档不能整体塞进一个向量。通常按段落、标题或固定窗口切块。

把用户问题转成向量,再搜索最相近的文档块。

4. RAG 与 Function Calling 的区别

RAG 重点解决“知识从哪里来”。

Function Calling 重点解决“系统能做什么”。

它们可以同时使用:

  • 工具负责从知识库检索。
  • 检索结果作为上下文。
  • 模型再生成最终答案。

DeepSeek Harness 对应实现

DeepSeek Harness 的核心是 Agent 工具系统,而不是一个专用 RAG 引擎。知识检索可以表达为工具:

  • 搜索工具把结果写入 tool/result
  • Agent Loop 把结果回传给模型。
  • 前端展示搜索工具的状态和来源。

在 DeepSeek Harness 中,工具输出需要可回放和可展示,因此前端可以知道模型使用了哪些检索来源。

进一步阅读:

  • docs/cookbook/adding-a-tool.md
  • packages/web/

代码示例

简化向量相似度

ts
function cosineSimilarity(a: number[], b: number[]): number {
  let dot = 0
  let normA = 0
  let normB = 0

  for (let i = 0; i < a.length; i += 1) {
    dot += a[i] * b[i]
    normA += a[i] * a[i]
    normB += b[i] * b[i]
  }

  return dot / (Math.sqrt(normA) * Math.sqrt(normB))
}

RAG 流程

ts
interface Chunk {
  id: string
  text: string
  vector: number[]
}

async function answerWithRag(
  question: string,
  chunks: Chunk[],
  embed: (text: string) => Promise<number[]>,
  generate: (context: string, question: string) => Promise<string>,
): Promise<string> {
  const questionVector = await embed(question)
  const ranked = chunks
    .map(chunk => ({
      chunk,
      score: cosineSimilarity(questionVector, chunk.vector),
    }))
    .sort((a, b) => b.score - a.score)
    .slice(0, 5)

  const context = ranked.map(item => item.chunk.text).join('\n\n')
  return generate(context, question)
}

前端通常不实现 embedding,但需要展示检索来源、引用和状态。

面试怎么问

问:RAG 是什么?

回答要点:

  • 先检索,再生成。
  • 把相关资料放入上下文。
  • 降低模型幻觉。
  • 适合私有知识。

问:RAG 和 Function Calling 有什么区别?

回答要点:

  • RAG 解决知识获取。
  • Function Calling 解决动作执行。
  • 知识检索可以作为一个工具。
  • 两者不互斥。

问:前端如何展示 RAG 结果?

回答要点:

  • 展示检索状态。
  • 展示引用来源。
  • 支持用户查看原文。
  • 结果不稳定时提供重试或手动切换来源。

自测题

  1. RAG 的三个主要阶段是什么?
  2. Embedding 的作用是什么?
  3. 为什么长文档需要 chunking?
  4. RAG 和工具调用可以如何组合?

本章小结

RAG 是前端 AI 产品中常见的知识增强方式。前端要理解它的数据流,并负责展示来源和检索状态。

进一步阅读:

  • packages/web/README.md
  • docs/subsystems/web.md