# knowhub/knowhub_db 数据库设计文档

## 概述

`knowhub_db` 是 KnowHub 系统的 **PostgreSQL 数据库访问层**，使用远程 PostgreSQL + **fastann/pgvector** 扩展同时支持向量检索和关系型查询。

系统围绕四张核心表构建，以 **原子能力（atomic_capability）** 为中心，连接知识、工具和需求：

```
                     knowledge（知识表）
                    ╱         ╲
        support_capability    tools
               ╱                ╲
  atomic_capability  ←────→  tool_table
    （原子能力表）              （工具表）
         |                       |
    requirements            capabilities
         ↓                       ↓
  requirement_table ←──────→ atomic_capability
     （需求表）
```

---

## 数据库表结构

### 1. `atomic_capability` — 原子能力表（新增）

原子能力是系统的核心概念，从知识中提炼而来，连接工具实现与需求匹配。

索引：`atomic_capability_pkey (id)`

| 字段 | 类型 | 说明 | 示例值 |
|------|------|------|--------|
| `id` | VARCHAR | 主键 | `"ac-image-gen-001"` |
| `name` | VARCHAR | 能力名称 | `"文生图"` |
| `criterion` | TEXT | 评估标准，用于判断该能力是否达成 | `"能根据文本提示生成符合描述的图像"` |
| `description` | TEXT | 能力描述 | `"通过自然语言描述生成对应视觉内容的能力"` |
| `requirements` | JSONB | 关联的需求 ID 列表 | `["req-001", "req-002"]` |
| `implements` | JSONB | 工具实现映射，key 为 tool_name，value 为描述（使用方式、效果、局限） | `{"Midjourney": "通过 /imagine 命令生成图像，效果优秀但不支持中文提示词"}` |
| `tools` | JSONB | 关联的工具 ID 列表 | `["tools/image_gen/midjourney"]` |
| `source_knowledge` | JSONB | 该能力提炼自哪些知识条目 | `["knowledge-20260330-030758-8611"]` |
| `embedding` | float4[] | 1536 维向量，对 name + description 做 embedding | — |

**关联关系：**
- `tools` → `tool_table.id`
- `implements` 的 key 为 `tool_table.name`
- `requirements` → `requirement_table.id`
- `source_knowledge` → `knowledge.id`

---

### 2. `tool_table` — 工具表（变更）

> 相对原表的变更：新增 `capabilities` 字段；知识关联字段重命名为 `tool_knowledge`、`case_knowledge`、`process_knowledge`。

索引：`tool_table_pkey (id)`

| 字段 | 类型 | 说明 | 示例值 |
|------|------|------|--------|
| `id` | VARCHAR | 主键，路径格式 | `"tools/image_gen/midjourney"` |
| `name` | VARCHAR | 工具名称 | `"Midjourney"` |
| `version` | VARCHAR | 版本号 | `"v5.2"` |
| `introduction` | TEXT | 功能介绍 | `"AI 图像生成工具，支持文生图、图生图"` |
| `tutorial` | TEXT | 使用指南 | `"通过 Discord 输入 /imagine 命令..."` |
| `input` | JSONB | 输入规格 | `"文本提示、参数配置"` |
| `output` | JSONB | 输出规格 | `"生成图像"` |
| `updated_time` | BIGINT | 更新时间戳（秒） | `1774570091` |
| `status` | VARCHAR | 接入状态 | `"未接入"` / `"可用"` / `"异常"` |
| `capabilities` | JSONB | 关联的原子能力 ID 列表 | `["ac-image-gen-001", "ac-image-edit-002"]` |
| `tool_knowledge` | JSONB | 关联的工具知识 ID 列表 | `["knowledge-20260327-150915-44a4"]` |
| `case_knowledge` | JSONB | 关联的用例知识 ID 列表 | `[]` |
| `process_knowledge` | JSONB | 关联的工序知识 ID 列表 | `[]` |
| `embedding` | float4[] | 1536 维向量，对 name + introduction 做 embedding | — |

**关联关系：**
- `capabilities` → `atomic_capability.id`
- `tool_knowledge` / `case_knowledge` / `process_knowledge` → `knowledge.id`

**相对原表变更说明：**
- 新增 `capabilities` 字段（JSONB 数组）
- 新增 `embedding` 字段（float4[]，对 name + introduction 做 embedding）
- 原 `knowledge` 字段重命名为 `tool_knowledge`

---

### 3. `knowledge` — 知识表（变更）

> 相对原表的变更：新增 `support_capability`、`tools` 字段；原 `embedding` 拆分为 `task_embedding` + `content_embedding` 双向量；`types` 扩展为六种分类。其余原有字段全部保留。

索引：`knowledge_pkey (id)`、`idx_knowledge_owner`、`idx_knowledge_status`

| 字段 | 类型 | 说明 | 示例值 |
|------|------|------|--------|
| `id` | VARCHAR | 主键 | `"knowledge-20260330-030758-8611"` |
| `task_embedding` | float4[] | 1536 维向量，对 task 做 embedding | — |
| `content_embedding` | float4[] | 1536 维向量，对 content 做 embedding | — |
| `message_id` | VARCHAR | 来源的 agent 任务消息 ID | `""` |
| `task` | VARCHAR | 完成什么任务 | `"调研 AI 图像生成工具的功能特性"` |
| `content` | TEXT | 知识正文 | `"当调研新兴 AI 工具时..."` |
| `types` | ARRAY | 知识类型（多选）：工序、用例、工具、经验、定义、User Profile | `['工具', '经验']` |
| `tags` | JSONB | 标签键值对 | `{"intent": "信息调研", "project": "feature_extract"}` |
| `tag_keys` | ARRAY | tags 中的键列表（用于过滤） | `['intent', 'state', 'project']` |
| `scopes` | ARRAY | 作用域（组织/用户） | `['org:cybertogether']` |
| `owner` | VARCHAR | 所有者 | `"srt_feature_extract_1"` |
| `resource_ids` | ARRAY | 关联的 resource ID 列表 | `['tools/image_gen/midjourney']` |
| `source` | JSONB | 来源信息 | `{"agent_id": "research_agent", "category": "exp"}` |
| `eval` | JSONB | 评估信息 | `{"score": 5, "harmful": 0, "helpful": 1, "confidence": 0.5}` |
| `created_at` | BIGINT | 创建时间戳（秒） | `1774811278` |
| `updated_at` | BIGINT | 更新时间戳（秒） | `1774943256` |
| `status` | VARCHAR | 状态 | `"approved"` |
| `relationships` | JSONB | 关联关系列表 | `[{"type": "complement", "target": "knowledge-..."}]` |
| `support_capability` | JSONB | 支撑的原子能力 ID 列表（可多个） | `["ac-image-gen-001", "ac-style-transfer-003"]` |
| `tools` | JSONB | 关联的工具 ID 列表 | `["tools/image_gen/midjourney"]` |

**关联关系：**
- `support_capability` → `atomic_capability.id`
- `tools` → `tool_table.id`

**相对原表变更说明：**
- 新增字段：`support_capability`（JSONB）、`tools`（JSONB）
- 原 `embedding`（float4[]）拆分为 `task_embedding` + `content_embedding` 两个向量字段
- `types` 可选值更新为：工序、用例、工具、经验、定义、User Profile
- 所有原有字段保留不变

---

### 4. `requirement_table` — 需求表（变更）

> 相对原表的变更：大幅简化，以原子能力 pattern 为核心，替代原来的 source_items/tools/trace/embedding 等字段。

索引：`requirement_table_pkey (id)`

| 字段 | 类型 | 说明 | 示例值 |
|------|------|------|--------|
| `id` | VARCHAR | 主键 | `"req-001"` |
| `description` | TEXT | 需求描述 | `"能够根据用户文本描述生成高质量图像"` |
| `atomics` | JSONB | 关联的原子能力 ID 列表 | `["ac-image-gen-001", "ac-style-transfer-003"]` |
| `source_nodes` | JSONB | 来源于内容树的节点，对象数组 | `[{"node_name": "image_gen", "posts": ["post-001", "post-002"]}]` |
| `status` | VARCHAR | 满足状态 | `"已满足"` / `"未满足"` |
| `match_result` | TEXT | 满足时描述如何满足；不足时描述缺什么，提供调研方向 | `"通过 Midjourney + ComfyUI 组合可满足，但中文提示词支持不足，需调研替代方案"` |
| `embedding` | float4[] | 1536 维向量，对 description 做 embedding | — |

**关联关系：**
- `atomics` → `atomic_capability.id`

**相对原表变更说明：**
- 删除字段：`task`、`type`、`source_type`、`source_itemset_id`、`source_items`、`tools`、`knowledge`、`case_knowledge`、`process_knowledge`、`trace`、`body`、`embedding`
- 新增字段：`description`（TEXT）、`atomics`（JSONB）、`source_nodes`（JSONB）、`status`（VARCHAR）、`match_result`（TEXT）

---

### 5. `resources` — 文档资源表（未变更）

索引：`resources_pkey (id)`

| 字段 | 类型 | 说明 | 示例值 |
|------|------|------|--------|
| `id` | TEXT | 主键，`/` 分隔路径格式 | `"references/python_type_hints"` |
| `title` | TEXT | 标题 | `"Python Type Hints 权威资源列表"` |
| `body` | TEXT | 公开内容（Markdown 或代码） | `"Python 类型提示调研的三个核心权威资源..."` |
| `secure_body` | TEXT | 私有/加密内容 | `""` |
| `content_type` | TEXT | 内容类型 | `"text"` |
| `metadata` | JSONB | 附加元数据 | `{"topic": "type_hints", "category": "python"}` |
| `sort_order` | INTEGER | 排序权重 | `0` |
| `submitted_by` | TEXT | 提交者 | `""` |
| `created_at` | BIGINT | 创建时间戳（秒） | `1774259301` |
| `updated_at` | BIGINT | 更新时间戳（秒） | `1774259301` |

---

## 表间关联关系总览

所有关联均为 **应用层软关联**（JSONB 字段存储 ID 列表/映射），不使用数据库外键约束。

```
atomic_capability.tools[]             ──→  tool_table.id
atomic_capability.implements{key}     ──→  tool_table.name
atomic_capability.requirements[]      ──→  requirement_table.id
atomic_capability.source_knowledge[]  ──→  knowledge.id

tool_table.capabilities[]          ──→  atomic_capability.id
tool_table.tool_knowledge[]        ──→  knowledge.id
tool_table.case_knowledge[]        ──→  knowledge.id
tool_table.process_knowledge[]     ──→  knowledge.id

knowledge.support_capability[]     ──→  atomic_capability.id
knowledge.tools[]                  ──→  tool_table.id

requirement_table.atomics[]        ──→  atomic_capability.id
```

**双向关联说明：**
- `atomic_capability` ↔ `tool_table`：能力的 `implements` 和工具的 `capabilities` 互为反向索引
- `atomic_capability` ↔ `knowledge`：能力的 `source_knowledge` 和知识的 `support_capability` 互为反向索引
- `atomic_capability` ↔ `requirement_table`：能力的 `requirements` 和需求的 `atomics` 互为反向索引

---

## 核心封装类

### `PostgreSQLStore` (`pg_store.py`)
知识条目的 CRUD + 向量检索：

| 方法 | 功能 |
|------|------|
| `insert(knowledge)` | 插入单条知识 |
| `insert_batch(list)` | 批量插入 |
| `search(embedding, filters, limit)` | 向量相似度检索 |
| `query(filters, limit)` | 纯标量过滤查询 |
| `get_by_id(id)` | 按 ID 查询 |
| `update(id, updates)` | 更新字段 |
| `delete(id)` | 删除 |
| `count()` | 统计总数 |

### `PostgreSQLResourceStore` (`pg_resource_store.py`)
资源文档的 CRUD + 导航：

| 方法 | 功能 |
|------|------|
| `insert_or_update(resource)` | 插入或更新 |
| `get_by_id(id)` | 按 ID 查询 |
| `list_resources(prefix, content_type, limit, offset)` | 列表查询 |
| `update(id, updates)` | 更新 |
| `delete(id)` | 删除 |
| `get_siblings(id)` | 获取前后同级节点 |

### `PostgreSQLRequirementStore` (`pg_requirement_store.py`)
需求的 CRUD + 向量检索：

| 方法 | 功能 |
|------|------|
| `insert_or_update(requirement)` | 插入或更新 |
| `get_by_id(id)` | 按 ID 查询 |
| `search(embedding, limit)` | 向量检索 |
| `list_all(limit)` | 列出所有需求 |
| `count()` | 统计总数 |

---

## 运维脚本

| 脚本 | 功能 |
|------|------|
| `create_tables.py` | 创建/变更数据库表结构 |
| `migrate_resources.py` | 从 SQLite 迁移资源到 PostgreSQL |
| `migrate_tools.py` | 从 SQLite 迁移工具数据 |
| `clean_invalid_knowledge_refs.py` | 清理失效的 knowledge ID 引用 |
| `clean_resource_knowledge_refs.py` | 清理 resources 中失效的引用 |
| `test_pg_connection.py` | 测试数据库连接 |
| `check_extensions.py` | 查看向量扩展 |
| `check_fastann.py` | 查看 fastann 函数和操作符 |
| `list_databases.py` | 列出所有数据库 |

---

## 环境变量配置

```bash
KNOWHUB_DB        # 数据库主机
KNOWHUB_PORT      # 端口（默认 5432）
KNOWHUB_USER      # 用户名
KNOWHUB_PASSWORD  # 密码
KNOWHUB_DB_NAME   # 数据库名
```

---

## 架构特点

1. **原子能力为核心**：`atomic_capability` 作为知识、工具、需求三者之间的桥梁，实现能力的提炼、实现映射和需求匹配。
2. **全表向量检索**：四张核心表均支持 1536 维 embedding，其中 knowledge 表有双向量（`task_embedding` + `content_embedding`）分别支持任务语义和内容语义检索。
3. **应用层软关联**：所有表间关系通过 JSONB 字段存储 ID 列表/映射，保持灵活性，需应用层维护一致性。
4. **双向索引**：核心关联关系均有正反两个方向的索引，方便从任意一端查询关联数据。
5. **三类工具知识**：工具关联的知识分为工具知识（tool_knowledge）、工序知识（process_knowledge）、用例知识（case_knowledge）三类，形成细粒度的知识图谱。
6. **资源路径 ID**：`resources.id` 和 `tool_table.id` 均支持 `/` 分隔路径格式，便于层级组织和导航。

### Embedding 策略

| 表 | 向量字段 | Embedding 内容 |
|------|------|------|
| `atomic_capability` | `embedding` | name + description |
| `tool_table` | `embedding` | name + introduction |
| `knowledge` | `task_embedding` | task |
| `knowledge` | `content_embedding` | content |
| `requirement_table` | `embedding` | description |
