# 知识库与知识图谱

Yuxi 提供文档知识库、向量检索和知识图谱构建能力。当前支持 Milvus 知识库、Milvus 知识库内的图谱构建/展示/检索，以及 Dify Dataset、Notion Data Source 只读检索。

## 为什么需要知识库

在大模型应用场景中，仅依靠模型的内部知识往往不够准确和全面。通过构建知识库，我们可以：

- **注入私有知识**：让模型能够回答基于私有文档的问题
- **降低幻觉**：回答内容可追溯到原始文档
- **知识复用**：一次上传，多轮对话中重复使用

## 知识库类型

| 类型 | 特点 | 适用场景 |
|------|------|----------|
| **Milvus** | 高性能向量检索，支持文档入库、检索测试、评估和知识图谱构建 | 自建文档知识库与生产检索 |
| **Dify** | 连接 Dify Dataset 检索 API，只读连接器 | 复用已有 Dify 数据集 |
| **Notion** | 连接 Notion Data Source 检索 API，只读连接器 | 复用已有 Notion 页面内容 |

只读连接器（Dify、Notion）仅用于检索，不支持上传与入库；历史 LightRAG 类型不再作为受支持类型展示或创建。

## 创建知识库

访问 Web 界面的「知识库」页面，点击「新建知识库」：

1. 填写知识库名称和描述
2. 选择知识库类型（Milvus、Dify 或 Notion）
3. Milvus 配置嵌入模型和分块策略；只读连接器（Dify、Notion）按类型动态渲染连接参数（如 API URL、Token、Dataset ID 等）
4. 配置访问权限
5. 保存

::: tip 提示
知识库的名称和描述会被智能体用来判断何时应该使用这个知识库进行检索，所以请尽量详细地描述。
:::

## 文件处理流程

Milvus 文件从上传到可检索，经历三个阶段：

### 1. 上传阶段

将本地文件上传到服务器。文件保持原始格式存储。

### 2. 解析阶段

系统将文件转换为 Markdown 格式：

- 提取文本内容
- 图片上传到 MinIO，并在 Markdown 中用 URL 引用
- 表格、公式等尽量保持结构化

### 3. 入库阶段

系统对 Markdown 内容进行分块，将 chunk 内容与元数据双写到 PostgreSQL 的 `knowledge_chunks` 表，并将向量写入 Milvus。

在前端界面中，默认会自动完成前两个阶段。如果需要自动入库，勾选「上传后自动入库」选项；否则需要手动点击入库按钮。

## 知识库权限控制

每个知识库可以配置独立的访问权限：

- **全局共享**：所有用户可访问
- **部门共享**：指定部门可访问，且必须包含当前用户所在部门
- **指定人可访问**：仅创建者、管理员及被明确授权的人员可访问

权限规则：

- 超级管理员可访问所有知识库
- 管理员可访问共享知识库和本部门的知识库
- 普通用户只能访问已授权的知识库

## 知识图谱

Milvus 知识库详情页提供「知识图谱」Tab。图谱构建流程会从已入库 chunks 中抽取实体和关系，将 entity/triple 本体与 chunk 引用写入 Neo4j 和 PostgreSQL，并为唯一实体/三元组建立 Milvus 语义索引；检索时可召回图谱实体与三元组，并与 chunk 命中结果融合（RRF）。

主要能力：

- 配置 LLM 抽取器，更多抽取方式拓展中
- 构建待索引 chunks 的图谱实体与关系
- 查看构建状态、标签和统计信息
- 在知识库详情页搜索和展示子图
- 重置图谱配置与已构建数据

Neo4j 仍作为 Milvus 图谱存储服务保留，但不再提供独立 `/graph` 前端页面，也不再支持上传 JSONL 三元组到默认全局图谱。

### Neo4j 配置

Neo4j 连接信息可以在 `.env` 中配置：

- 默认账户：`neo4j`
- 默认密码：`0123456789`
- 管理界面：http://localhost:7474
- 连接地址：bolt://localhost:7687

## API 使用

如果需要通过程序批量处理文件，可以使用以下接口：

```bash
# 1. 上传文件
POST /api/knowledge/files/upload?kb_id=<知识库ID>
# 返回 file_path 和 content_hash

# 2. 解析并入库
POST /api/knowledge/databases/{kb_id}/documents
# 返回 status=queued 和 task_id
```

系统会自动去重：基于内容哈希判断是否已存在相同文件。
