---
weight: 0
fasting: false
PSMF: false
OMAD: false
WaterFast: false
alcohol: false
alcohol_ml: 0
MED_001: true
nac: false
magnesium: false
fish_oil: false
coq10: false
berberine: false
b_complex: false
v_d3_k2: false
symptoms:
---
**# Role & Core Objective** 你是一位精通 Python、RAG 系统架构与个人知识管理（PKM）的高级工程师。 我的目标是在 Linux 服务器上的现有“Obsidian Bot”工程中，构建一个带有持久化记忆和实体关联能力（Ontology）的“第二大脑”系统。 它的终极目的是：**让知识实现自动化增长与连接，并将沉淀的知识直接反哺给后期的自动化内容生成。**

**# Core Requirements & Architecture** 请帮我基于以下 5 个核心需求，编写、重构并完善系统的核心代码骨架：

**1. 全新的知识摄入引擎：`mode note` (增量处理)**

- **触发逻辑**：接收一段纯文本或一个 URL。
    
- **URL 处理**：如果是 URL，请使用 `tavily-python` (我有 API Key) 抓取网页正文，并利用 Tavily 的特性获取相关的背景扩充信息。
    
- **大模型信息清洗与图谱化 (Ontology)**：调用现有的 Chat LLM（gemini）提取摘要、核心观点，并**严格要求 LLM 识别文中的关键逻辑实体（人物、概念、项目等），使用 Obsidian 的双链语法 `[[实体名称]]` 进行包裹**，以此实现轻量级的图谱连接。
    
- **双写落盘**：将清洗后、带双链的文本以 Markdown 格式保存到 Obsidian 的 `notes/` 目录中；同时对其进行切块（Chunking），同步写入本地的向量数据库（如 ChromaDB 或 SQLite-vec）。
    

**2. 知识检索与上层应用赋能 (`write` / `reply` / `zhihu`)**

- **检索接口**：在 `mode note` 中暴露一个 `search_knowledge(query, top_k=3)` 函数，支持单纯的内容查询。
    
- **上层调用**：请重构我现有的 `mode write`、`mode reply`、`mode zhihu`等模式 生成模块。在它们向 Chat LLM 发起最终生成请求**之前**，必须先在后台隐式调用 `search_knowledge`。
    
- **上下文组装**：将检索出的历史笔记、决策和双链关联知识，作为 Background Context 注入到生成的 System Prompt 中，做到“基于历史知识的生成”。
    

**3. 可插拔的 Embedding 方案 (向量化接口)**

- 请封装一个独立的 `EmbeddingProvider` 类。
    
- 不要强行使用生成式的 Chat LLM 来做向量。请预留两个实现方案的接口：一是调用云端专门的 Embedding API（如 Qwen3-Embedding-8B），二是本地基于 `sentence-transformers` 的开源方案。确保我可以极低成本地切换。
    

**4. 存量笔记的批量洗盘工具：`init_vault_indexer.py`**

- 编写一个独立的 CLI 脚本。
    
- **功能**：允许我通过命令行参数指定具体的文件或整个目录路径。
    
- **处理逻辑**：智能读取指定的 Obsidian `.md` 文件（包括 YAML 表头），按照 Markdown 标题进行合理的语义切块，然后调用上述的 Embedding 接口，将存量数据全量刷入向量数据库。并记录每条 Chunk 对应的原文件路径。
    
- **容错**：包含进度条和错误重试/跳过机制，防止遇到损坏文件时程序崩溃。
    

**# Outputs Expected from You**

1. 首先，请向我展示系统重构后的**目录结构树**和**核心数据流转图（文本描述）**。
    
2. 提供具体的 Python 代码脚手架（重点是 `mode_note.py`, `retrieval_engine.py`, 和修改后的 `mode_write.py` 的关键逻辑）。
    
3. 代码必须保持极简（KISS）、解耦，依赖清晰。




**# Role & Context** 你是一位精通 Python、Playwright 自动化和 Slack Bolt 框架的高级自动化工程师。 我们正在我的 Linux 服务器上为现有的 Obsidian Butler 系统增加一个全新的“知乎自动化打猎与回帖”模块 (`mode zhihu-hunter`)，这个功能可以在slack主动输入mode zhihu-hunter之后输入“开始工作”发起，也可以后续配置成cron任务定期自动发起。

**# Core Workflow (核心工作流)** 该模块需要实现以下闭环，并且必须包含**两道 Slack 人工确认防线**：

1. **猎手模式 (Hunt)**：监听 Obsidian `notes`, `Article`, `auto_report/deep-dive`, `CLAW/deepfact`, `Clippings`目录的内容(尤其是新增内容)，提取关键词，通过 Tavily 搜索知乎相关最新问题，推送到 Slack 等待我的第一道确认（是否回答该问题）。
    
2. **起草模式 (Draft)**：我确认后，后台调用现有的 RAG 引擎（检索本地向量库）结合大模型生成回答草稿，推送到 Slack 等待我的第二道确认（是否发布）。
    
3. **发布模式 (Publish)**：我确认发布后，调用 Playwright 无头浏览器自动写入知乎并发布。
    

**# Technical Requirements (技术实现硬性要求)** 请为我生成以下核心代码骨架，并严格遵循以下约束：

**模块一：`zhihu_playwright_engine.py` (底层发布与鉴权引擎)**

- **扫码长轮询登录**：
    
    - 启动 Headless 模式。必须注入 `playwright-stealth` 插件抹除指纹防反爬。
        
    - 尝试加载本地的 `zhihu_state.json`。
        
    - 如果未登录或 Cookie 失效，跳转知乎登录页，精准截取二维码元素 (`.SignFlow-qrCode` 或对应选择器) 保存为本地图片。
        
    - 调用 Slack 接口将二维码发给我，并在代码中 `wait_for_url` 等待我手机扫码完成（设置 2 分钟超时重试机制）。
        
    - 登录成功后，将最新的 Cookie 和 LocalStorage 覆盖保存回 `zhihu_state.json`。
        
- **自动发布逻辑**：
    
    - 提供一个 `publish_answer(question_url, answer_text)` 函数，模拟人类点击输入框、粘贴文本并点击发布按钮。
        

**模块二：`zhihu_hunter.py` (发现与起草引擎)**

- 提供 `find_questions(keywords)`：使用 `tavily-python` 搜索 `site:zhihu.com/question [关键词]`，解析出问题 URL 和标题。
    
- 提供 `draft_answer(question_context)`：集成现有的 `mode zhihu` 和本地 RAG 检索接口，生成知乎风格的干货回答。
    

**模块三：`slack_interactive_gateway.py` (Slack 交互控制台)**

- 使用 Slack Bolt 的 **Block Kit (Interactive Buttons)** 实现工作流的卡点：
    
    - 收到新问题时，展示【生成草稿】和【忽略】按钮。
        
    - 草稿生成后，展示【确认发布】、【重新生成】和【取消】按钮。
        
    - 收到二维码时，通过 Slack 发送图片提醒我扫码。
        

**# Output Expected** 请先给我梳理这三个模块之间的函数调用链路图，然后优先输出最重要的 **模块一 (`zhihu_playwright_engine.py`)** 的核心代码逻辑，特别是“二维码截图 -> 传给 Slack -> 等待扫码 -> 保存 State” 这一段的完美闭环。不要一次性输出所有代码，我们一步步来。