# 多源数据整合与llm_wiki知识库设计

## 1. 数据源分类

| 类型 | 来源 | 处理方式 | 存储位置 |
|------|------|---------|---------|
| 对话 | LiveKit音频流 | STT → LLM提取事实 | SQLite facts表 |
| 照片 | 摄像头/相册 | EXIF+VLM+人脸检测 | SQLite events表 + metadata |
| 视频 | 摄像头录制 | 关键帧提取+VLM | SQLite events表 + metadata |
| 文件 | 本地/网络 | 文本提取 → llm_wiki | llm_wiki知识库 |

## 2. llm_wiki整合架构

```
┌─────────────────────────────────────────────────────────────┐
│                   数据源输入层                               │
└───────────────┬─────────────────────────────────────────────┘
                │
    ┌───────────┼───────────┬───────────┐
    ▼           ▼           ▼           ▼
┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐
│ 对话   │  │ 照片  │  │ 视频  │  │ 文件  │
└───┬───┘  └───┬───┘  └───┬───┘  └───┬───┘
    │          │          │          │
    ▼          ▼          ▼          ▼
┌───────────────────────────────────────────────────────┐
│              数据处理层（agent.py）                    │
│  • _extract_facts_from_dialogue()                     │
│  • _extract_facts_from_photo()                        │
│  • _extract_facts_from_video()                        │
│  • _extract_facts_from_file() ← 新增                  │
└───────────────────┬───────────────────────────────────┘
                    │
        ┌───────────┴───────────┐
        ▼                       ▼
┌─────────────────┐      ┌─────────────────┐
│ SQLite Profile   │      │ llm_wiki 知识库 │
│ Manager         │      │ (结构化管理)    │
└────────┬────────┘      └────────┬────────┘
         │                        │
         │            ┌───────────┘
         │            ▼
         │     ┌─────────────────┐
         │     │ MCP/RAG 查询接口 │
         │     └────────┬────────┘
         │              │
         ▼              ▼
┌─────────────────────────────────────────────┐
│           Hermes API Server (:8642)         │
│  • LLM路由                                 │
│  • 工具调用（包括knowledge_base）            │
│  • RAG增强回复                              │
└─────────────────────────────────────────────┘
```

## 3. 文件处理流程

### 3.1 文件类型支持
- PDF: 文本提取
- Markdown/Text: 直接读取
- Word/Excel: 格式转换
- HTML: 内容提取

### 3.2 处理流程
```python
async def _extract_facts_from_file(self, file_path: str, source_id: str):
    """
    从文件提取事实并写入llm_wiki
    """
    # 1. 文件类型检测
    ext = Path(file_path).suffix.lower()
    
    # 2. 内容提取
    content = await self._extract_file_content(file_path, ext)
    
    # 3. 调用LLM提取结构化知识
    prompt = f"""
    分析以下文档内容，提取关键知识实体和关系：
    
    文件: {file_path}
    内容摘要: {content[:500]}...
    
    请返回JSON格式：
    {{
      "title": "文档标题",
      "entities": ["实体1", "实体2"],
      "relationships": [
        {{"from": "实体A", "relation": "related_to", "to": "实体B"}}
      ],
      "summary": "简要总结",
      "topics": ["主题1", "主题2"]
    }}
    """
    
    # 4. 写入llm_wiki
    wiki_data = await self._call_llm(prompt)
    await self._save_to_llm_wiki(wiki_data, source_id)
    
    # 5. 关联到事件
    event = self.profile_manager.add_event(
        timestamp=time.time(),
        participant_ids=["system"],
        event_type="document",
        description=f"分析文件: {Path(file_path).name}",
        metadata={
            "source_id": source_id,
            "file_path": file_path,
            "extracted_entities": wiki_data.get("entities", []),
            "summary": wiki_data.get("summary", "")
        }
    )
```

## 4. llm_wiki数据结构

```python
# llm_wiki 存储格式
{
    "id": "wiki_001",
    "title": "Q4产品路线图",
    "source": "file",
    "source_id": "Q4计划.pdf",
    "content": "完整文本内容...",
    "entities": ["产品A", "负责人B", "截止日期C"],
    "relationships": [
        {"from": "产品A", "relation": "owner", "to": "负责人B"},
        {"from": "产品A", "relation": "due_date", "to": "截止日期C"}
    ],
    "topics": ["work", "project"],
    "confidence": 0.92,
    "created_at": 1726857600,
    "updated_at": 1726857600
}
```

## 5. 查询与检索

### 5.1 RAG查询流程
```
用户提问 → Hermes API → LLM分析意图
    ↓
是否需要知识检索？
    ↓ 是
查询llm_wiki（关键词/向量）
    ↓
返回相关片段 + 上下文
    ↓
LLM生成回答（引用来源）
```

### 5.2 多源关联查询
```python
# 查询某个事件的完整信息
query = "Q4产品会议相关信息"

# 1. 查events表（时间、地点、人物）
events = pm.get_events(event_type="work", last_days=7)

# 2. 查facts表（事实属性）
facts = pm.get_facts(topic="work")

# 3. 查llm_wiki（文档内容）
wiki_docs = llm_wiki.search(query)

# 4. 整合输出
result = {
    "events": events,
    "facts": facts,
    "documents": wiki_docs,
    "sources": [
        {"type": "event", "id": "evt_001"},
        {"type": "fact", "id": "fact_002"},
        {"type": "wiki", "id": "wiki_003"}
    ]
}
```

## 6. 配置示例

```yaml
# config.yaml
profile_manager:
  enabled: true
  auto_extract_facts: true

llm_wiki:
  enabled: true
  storage_path: ~/.hermes/llm_wiki
  auto_index_files: true      # 自动索引新文件
  supported_types:            # 支持的文件类型
    - .pdf
    - .md
    - .txt
    - .docx
    - .html
  
integration:
  sync_to_wiki: true          # 是否同步到llm_wiki
  max_content_length: 5000    # 最大提取内容长度
```

## 7. 使用示例

### 7.1 上传文件自动入库
```
用户上传: Q4计划.pdf
    ↓
系统自动处理:
1. 提取文本内容
2. LLM提取实体和关系
3. 写入llm_wiki
4. 关联到work主题
    ↓
后续可查询:
- "Q4产品路线图相关内容"
- "张三负责的项目有哪些"
- "会议相关文档"
```

### 7.2 多源联合查询
```
用户问: "上次会议说了什么？"
    ↓
系统检索:
1. events表 → 找到"Q4产品会议"
2. facts表 → 获取会议相关事实
3. llm_wiki → 找到相关文档内容
4. 整合输出完整答案
```

## 8. 优势

1. **结构化知识**: llm_wiki提供知识图谱式的存储
2. **可追溯**: 每个事实都有关联的数据源
3. **可扩展**: 支持多种文件类型
4. **智能检索**: 支持关键词+语义双重检索
5. **多源整合**: 对话、照片、视频、文件统一关联
