# RAG 知识库搭建

> 上传文档、向量化存储，构建企业级知识库问答系统。

## 🧠 什么是 RAG？

RAG（Retrieval-Augmented Generation，检索增强生成）是一种结合「知识检索」和「AI 生成」的技术：

1. **检索**：从知识库中找到相关内容
2. **增强**：将检索结果作为上下文
3. **生成**：让 AI 基于上下文生成答案

```
用户问题 → 检索相关文档 → 拼接到 Prompt → AI 生成回答
```

## 📋 适用场景

- 📄 企业内部文档问答
- 🎯 产品 FAQ 自动化
- 📚 培训资料检索
- 🔍 合同/政策查询
- 🏥 专业知识库

## 🚀 搭建步骤

### 第一步：创建知识库

```typescript
const knowledgeBase = await client.ai.createKnowledgeBase({
  name: '产品使用手册',
  description: '公司产品相关文档',
  // 向量化模型
  embeddingModel: 'text-embedding-3-small',
  // 分块策略
  chunking: {
    type: 'recursive',
    chunkSize: 1000,
    chunkOverlap: 200
  }
})

console.log('知识库 ID:', knowledgeBase.id)
```

### 第二步：上传文档

支持格式：PDF、Word、TXT、Markdown、HTML

```typescript
// 上传单个文件
const doc = await client.ai.uploadDocument(knowledgeBase.id, {
  file: './docs/user-guide.pdf',
  metadata: {
    category: 'manual',
    version: '2.0',
    language: 'zh-CN'
  }
})

console.log('文档 ID:', doc.id)
console.log('状态:', doc.status)  // processing → ready

// 批量上传
const docs = await client.ai.uploadDocuments(knowledgeBase.id, [
  { file: './docs/faq.md', metadata: { category: 'faq' } },
  { file: './docs/api.md', metadata: { category: 'api' } },
  { file: './docs/tutorial.md', metadata: { category: 'tutorial' } }
])
```

### 第三步：等待处理

文档需要经过：
1. **解析**：提取文本内容
2. **分块**：按策略切分成小块
3. **向量化**：转成数学向量

```typescript
// 查询文档状态
const status = await client.ai.getDocumentStatus(doc.id)
console.log('处理状态:', status.processing_status)
console.log('块数量:', status.chunk_count)
```

### 第四步：配置检索

```typescript
await client.ai.configureRetrieval(knowledgeBase.id, {
  // 检索参数
  retrieval: {
    topK: 5,              // 返回前 5 条
    scoreThreshold: 0.7,  // 相似度阈值
    hybridSearch: true    // 混合搜索（关键词+向量）
  },
  // Rerank 配置
  rerank: {
    enabled: true,
    model: 'bge-reranker'
  }
})
```

### 第五步：问答

```typescript
const response = await client.ai.ask({
  knowledgeBaseId: knowledgeBase.id,
  question: '如何创建新项目？',
  // 可选参数
  options: {
    maxTokens: 1000,
    temperature: 0.7,
    includeSources: true  // 返回引用的文档片段
  }
})

console.log('回答:', response.answer)
console.log('引用:', response.citations)
```

### 响应示例

```json
{
  "answer": "创建新项目的步骤如下：\n1. 点击「新建项目」按钮\n2. 填写项目名称和描述\n3. 选择项目模板\n4. 点击「创建」完成",
  "citations": [
    {
      "document_id": "doc_abc123",
      "chunk_text": "点击「新建项目」按钮，进入项目创建页面...",
      "score": 0.95
    }
  ],
  "model": "gpt-4",
  "tokens_used": 850
}
```

## 🔧 高级配置

### 自定义分块策略

```typescript
const kb = await client.ai.createKnowledgeBase({
  name: '技术文档',
  chunking: {
    type: 'custom',
    // 按标题分块
    delimiters: ['# ', '## ', '### '],
    maxTokens: 500
  }
})
```

### 元数据过滤

```typescript
const response = await client.ai.ask({
  knowledgeBaseId: knowledgeBase.id,
  question: '退款政策是什么？',
  filters: {
    category: 'policy',
    version: '>=2.0'
  }
})
```

### 多知识库查询

```typescript
const response = await client.ai.ask({
  knowledgeBaseIds: ['kb-product', 'kb-faq', 'kb-manual'],
  question: '这个功能如何使用？',
  // 权重配置
  weights: {
    'kb-product': 0.5,
    'kb-faq': 0.3,
    'kb-manual': 0.2
  }
})
```

## 📊 知识库管理

### 查看统计

```typescript
const stats = await client.ai.getKnowledgeBaseStats(knowledgeBase.id)

console.log('文档数:', stats.document_count)
console.log('块数:', stats.chunk_count)
console.log('总 token 数:', stats.total_tokens)
```

### 更新文档

```typescript
// 重新上传会自动更新
await client.ai.updateDocument(doc.id, {
  file: './docs/user-guide-v3.pdf'
})
```

### 删除文档

```typescript
await client.ai.deleteDocument(doc.id)
```

## 🧪 最佳实践

### 文档准备

1. ✅ 清理格式，移除无关内容
2. ✅ 添加目录和标题结构
3. ✅ QA 格式文档效果最好
4. ❌ 避免过长的无结构文本
5. ❌ 避免大量表格（难以正确分块）

### 检索优化

```typescript
// 调整检索参数
const optimalConfig = {
  topK: 3,               // 不要太多，可能引入噪音
  scoreThreshold: 0.75,  // 设置合理阈值
  enableRerank: true     // 启用重排序
}
```

### Prompt 工程

```typescript
const response = await client.ai.ask({
  knowledgeBaseId: knowledgeBase.id,
  question: '...',
  systemPrompt: `你是一个专业客服，请基于给定的知识库内容回答用户问题。
  - 如果知识库中没有相关内容，请如实告知
  - 回答要简洁、专业、易懂
  - 适当引用原文帮助用户理解`
})
```

## ❓ 常见问题

### Q: 检索不到相关内容？

1. 检查文档是否处理完成（状态为 `ready`）
2. 降低 `scoreThreshold` 阈值
3. 尝试 `hybridSearch: true` 混合搜索
4. 增加 `topK` 获取更多候选

### Q: 回答不准确？

1. 检查源文档质量
2. 调整 `chunkSize`，太小可能丢失上下文
3. 启用 `rerank` 提高相关性
4. 优化 system prompt

### Q: 处理速度慢？

- 小文档使用更快的 embedding 模型
- 避开高峰期处理大批量文档
- 使用异步处理（Webhooks 通知）

---

**上一步：** [REST API 完整参考](./api-reference.md)  
**下一步：** [AI 工作流配置](./workflow.md)
