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