meeting_memory/README.md

203 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 会议纪要长期记忆系统
基于 LLM + LlamaIndex 向量库 + Obsidian 知识图谱的会议纪要长期记忆管理系统,支持**行动项状态追踪**与**双重内容去重**。
## 工作流程
```
会议纪要.md ──→ ①内容哈希查重 ──→ ②语义相似度查重 ──→ LLM 结构化抽取 ──→ 状态合并
│ │ │
│ │ ┌─────┘
│ │ │ meeting_state.json
│ │ │ (行动项/指标历史/内容哈希)
│ │ └─────┐
│ │ │
│ ├──→ ③标题+日期查重 ──┼──→ Obsidian Vault
│ │ │ ├── Raw/
│ │ │ ├── Meetings/
│ │ │ ├── Entities/
│ │ │ └── Graphs/
│ │ │
│ │ └──→ 向量索引持久化
│ │
└── 命中 → 跳过 ────┘── 命中 → [s]跳过 / [o]覆盖
```
## 快速开始
```bash
cd meeting_memory
# 1. 安装依赖
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
# 2. 配置 API
cp .env.example .env
# 编辑 .env填入你的 LLM 和 Embedding API 信息
# 3. 处理一个会议纪要
.venv\Scripts\python main.py process 会议文件.md
# 4. 用 Obsidian 打开 obsidian_vault/ 查看知识图谱
```
## 使用方式
### 交互模式(推荐)
```bash
.venv\Scripts\python main.py
```
进入后可直接输入问题查询,支持以下命令:
| 命令 | 说明 |
|------|------|
| `query 问题` | 语义查询会议记忆 |
| `process 文件路径` | 处理新的会议文件 |
| `stats` | 查看统计 |
| `exit/quit` | 退出 |
非命令文本自动作为查询处理。
### 命令行模式
```bash
# 处理会议文件(重复时会交互询问跳过/覆盖)
python main.py process meeting_example.md
# 强制覆盖(不询问,清理旧数据后重新处理)
python main.py process meeting_example.md -f
# 语义查询
python main.py query "弱光指标目标值是多少?"
# 查看统计
python main.py stats
# 直接输入文本
python main.py text "今天会议讨论了..."
# 批量处理(自动交互,推荐加 -f 跳过确认)
python main.py batch "meetings/*.md" -f
```
## 架构
```
meeting_memory/
├── config.py 配置 (LLM / Embedding / Obsidian / 向量库 / 状态路径)
├── extractor.py LLM 从会议纪要中抽取结构化信息
│ ├── title, date, participants
│ ├── entities (人物/组织/指标/概念)
│ ├── relations (主体-谓词-客体)
│ ├── action_items (任务+负责人+截止)
│ ├── metrics (指标+数值+趋势)
│ └── decisions (决策记录)
├── meeting_state.py ★ 跨会议状态追踪引擎
│ ├── ActionItem: 按 task+assignee 哈希匹配
│ ├── Metric: 按 metric_name+owner 哈希匹配
│ ├── 历史演变记录 (时间线)
│ ├── 会议系列自动识别 (去除期号后缀)
│ └── ★ 内容哈希注册表 (content_hashes) 防重复
├── vector_store.py LlamaIndex 向量索引管理
│ ├── 自定义 Embedding 适配 (兼容任意 OpenAI 兼容 API)
│ ├── 会议文档向量化存储 (含演变信息)
│ ├── 语义检索 (similarity_top_k)
│ ├── ★ 查重 + 按 meeting_id 删除覆盖
│ └── ★ 原文语义相似度查重 (find_similar_text)
├── obsidian_manager.py Obsidian Vault 生成器
│ ├── Raw/ — 未加工的原文 (status: unprocessed/processed)
│ ├── Meetings/ — 完整会议笔记 + YAML frontmatter
│ ├── Entities/ — 实体笔记 (含行动项时间线)
│ └── Graphs/ — 知识图谱总览 (MOC)
├── meeting_processor.py 主流程编排
│ ├─ 内容哈希查重 → 语义相似度查重 → LLM 抽取 → 状态合并 → Obsidian → 向量库
│ ├─ ★ 前置去重 (LLM 调用前),避免无效 API 调用
│ └─ ★ 重复处理时支持 skip/overwrite 选择
├── main.py CLI 入口 (交互模式 + 子命令,支持 -f 强制覆盖)
├── requirements.txt 依赖
├── .env 密钥配置
├── meeting_state.json ★ 跨会议状态持久化文件 (行动项/指标历史演变/内容哈希注册表)
├── vector_store_data/ 向量索引持久化目录
└── obsidian_vault/ Obsidian 知识库 (可直接用 Obsidian 打开)
├── .obsidian/ Obsidian 配置 (app.json, core-plugins.json)
├── Raw/ ★ 未加工原文 (处理前先保存)
├── Meetings/ 会议笔记 *.md
├── Entities/ 实体笔记 *.md (含历史时间线)
└── Graphs/ 知识图谱总览
```
## 核心能力
### 1. LLM 结构化抽取
输入原始会议纪要,自动抽取:
- **会议元信息**: 标题、日期、参会人
- **实体**: 人物、部门、项目、KPI指标、概念制度
- **关系**: 主体-谓词-客体 (如 `建维部 → 负责 → 网络运维`)
- **行动项**: 任务描述 + 负责人 + 截止时间 + 优先级
- **指标**: 指标名 + 当前值 + 目标值 + 趋势 (向好/持平/恶化)
- **决策**: 决策内容 + 提出人 + 状态
### 2. LlamaIndex 向量检索
- 会议内容向量化存储
- 支持自然语言语义查询
- 持久化索引,重启自动加载
- 兼容任意 OpenAI 兼容的 Embedding API
### 3. 跨会议行动项追踪
- 每个行动项按 `task + assignee` 生成稳定哈希 ID
- 同系列会议(自动去除"第X期"后缀)中的相同任务被自动匹配
- 状态变更历史完整保留:`待办 → 进行中 → 已完成`
- Obsidian 笔记中展示完整时间线
- `meeting_state.json` 持久化所有历史
### 4. 双重内容去重
处理前在 LLM 调用之前进行两道去重检查,避免重复内容污染记忆库:
- **① 内容哈希指纹**SHA256(原文) 精确匹配,拦截完全相同的文件/文本纳秒级100% 确定)
- **② 语义相似度**:原文 Embedding 余弦相似度 > 0.92 时触发,拦截同一会议的不同转录版本
- **③ 标题+日期查重**兜底LLM 提取后,在向量库中检索相同标题/日期的会议
- 命中后交互询问:**[s]跳过** 或 **[o]覆盖**
- 覆盖模式:删除旧向量节点 + 旧 Obsidian 笔记 + 旧哈希注册,重新处理
- `-f / --force` 标志跳过所有确认,适用于批量处理
### 5. Obsidian 知识图谱
- 自动生成完整的 Obsidian Vault
- 所有实体独立笔记,`[[Wiki Link]]` 双向链接
- 实体笔记中的行动项显示**最新状态 + 历史演变**
- 打开 Obsidian Graph View 即可看到实体关系网络
- 知识图谱总览提供全局索引
- `.obsidian/` 配置自动生成
## 配置
编辑 `.env`:
```ini
# LLM API (用于结构化抽取)
LLM_API_KEY=sk-xxx
LLM_BASE_URL=https://api.deepseek.com/v1
LLM_MODEL=deepseek-chat
# Embedding API (用于向量检索)
EMBEDDING_API_KEY=sk-xxx
EMBEDDING_BASE_URL=https://api.openai.com/v1
EMBEDDING_MODEL=text-embedding-3-small
```
## 依赖
- `openai` — LLM 调用
- `pydantic` — 结构化数据模型
- `llama-index` — 向量索引与语义检索
- `chromadb` — 向量数据库后端
- `python-dotenv` — 环境变量管理
- `pyvis` — 图谱可视化 (扩展功能)