第 10 章:RAG 与知识检索
本章解决的问题
前端 AI 面试经常把 RAG、Agent、Function Calling 放在一起问。这一章讲清 RAG 的定位和前端职责。
交互图解:生产级 RAG 数据链路 · 查看图解导读
大白话理解
RAG 是 Retrieval-Augmented Generation。
意思是:
text
用户提问
-> 从知识库检索相关资料
-> 把资料和问题一起交给模型
-> 模型根据资料生成答案它适合回答“公司内部文档里怎么说”,而不是让模型只靠记忆回答。
必须掌握的概念
1. Embedding
Embedding 把文本转成向量。语义相近的文本,向量距离通常更近。
2. Chunking
长文档不能整体塞进一个向量。通常按段落、标题或固定窗口切块。
3. Vector Search
把用户问题转成向量,再搜索最相近的文档块。
4. RAG 与 Function Calling 的区别
RAG 重点解决“知识从哪里来”。
Function Calling 重点解决“系统能做什么”。
它们可以同时使用:
- 工具负责从知识库检索。
- 检索结果作为上下文。
- 模型再生成最终答案。
DeepSeek Harness 对应实现
DeepSeek Harness 的核心是 Agent 工具系统,而不是一个专用 RAG 引擎。知识检索可以表达为工具:
- 搜索工具把结果写入
tool/result。 - Agent Loop 把结果回传给模型。
- 前端展示搜索工具的状态和来源。
在 DeepSeek Harness 中,工具输出需要可回放和可展示,因此前端可以知道模型使用了哪些检索来源。
进一步阅读:
docs/cookbook/adding-a-tool.mdpackages/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 结果?
回答要点:
- 展示检索状态。
- 展示引用来源。
- 支持用户查看原文。
- 结果不稳定时提供重试或手动切换来源。
自测题
- RAG 的三个主要阶段是什么?
- Embedding 的作用是什么?
- 为什么长文档需要 chunking?
- RAG 和工具调用可以如何组合?
本章小结
RAG 是前端 AI 产品中常见的知识增强方式。前端要理解它的数据流,并负责展示来源和检索状态。
进一步阅读:
packages/web/README.mddocs/subsystems/web.md