203 lines
8.5 KiB
Markdown
203 lines
8.5 KiB
Markdown
|
|
# 会议纪要长期记忆系统
|
|||
|
|
|
|||
|
|
基于 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` — 图谱可视化 (扩展功能)
|