2026-03-30

03月30日

一、今日完成情况

  • 完成AI机器人上下文数据库的记忆功能
  • 完成AI机器人的上下文压缩优化,减少token消耗,降低上下文要求
  • 完成AI机器人的内容架构设计,总结每日、每周的Obsidian工作量,作为参考,可以根据我当前的进度对症下药推荐下一步做什么。

二、今日感悟

  • 核心业务数据​:
    • AI机器人项目上下文工程
  • ​今日工作总结:​
    • AI上下文数据库记忆:完成MongoDB对话历史存储,实现AI长期记忆功能
    • AI机器人架构优化:设计上下文压缩策略,降低token消耗,实现客观层与意图层分离
    • 双层总结系统:完成daily_summary.py和weekly_summary.py,实现每日工作量自动总结和周进度汇总
    • 信息架构重构:构建短期实时对话+中期总结+长期知识库的三层AI认知体系
  • ​明日工作计划:
    • 明天重点测试和集成这些模块,确保数据从Obsidian到MongoDB到AI上下文的全链路闭环
  • ​今日学习成长:​
    • 挺有成就感的

三、备注

,

四、金瓶梅案例鉴赏

1、背景

潘金莲发现了书童和玉箫行为不检点的事情了,潘金莲威胁说,要告发老爷。书童作为全书当中的聪明人,小厮当中办事最灵活,能力最强的人,其实立马卷钱变现跑路了。

而玉箫作为正宫月娘房里的丫鬟,其实即使潘金莲告发,她应该是被打一顿,非常严重的打一顿,毕竟府里面上下,都是知道他的脾气的。

潘金莲以这个事情威胁玉箫,要其说出关于月娘房里的所有消息的时候,她选择了完全服从,把自己的位置放在了最低位,完全成为了潘金莲的傀儡。

2、问题

玉箫这么做有什么问题吗?

问题非常大,首先玉箫相比于潘金莲有着信息优势,潘金莲是不知道月娘房中的深层信息的,所以只要玉箫表面上服从,告诉潘金莲一些非核心的信息,其实无大碍。

关于深层的信息,如果月娘不说,玉箫不说,小玉不说,潘金莲怎么会知道呢,她要是知道,就不需要使用玉箫来当这个传话筒了呀。

所以玉箫可以做到表明服从,实际根本上还是忠于月娘的。

潘金莲也不好强行告发玉箫,不然西门庆会觉得她要搞事情,反而对于潘金莲是没有好处的,属于是损人不利己的做法,所以玉箫完全可以假定,潘金莲没有动机为了告发而告发,潘金莲只是需要月娘的信息而已。

3、正确做法

就是表面上服从,告诉潘金莲可有可无的信息,而不告诉核心机密,毕竟玉箫的后台是大娘,是立于不败之地的,大娘背后就是一个家族。

而潘金莲是没有后天的,加入她失势,玉箫也会落得不好的下场。

五、AI机器人架构–上下文压缩

1、短期对话层

上下文10条记录,原封不动的告诉AI,让AI知道我当前的主要聊天上下文,这个是实时性质的,让AI知道我当前时刻的思维,并且相对给出即时的建议。

2、中期档案层

这个需要两部分,一方面是通过我和AI的对话,我所表示的个人意愿,另一方面是通过读取我的每日笔记,快速把握我每天客观上完成的情况,实现主客观统一。

  • Obsidian 笔记 = 客观事实层:记录你「实际干了什么」(刚性行为、时间分配、学习 / 实验室工作量)
  • AI 对话记录 = 主观意图层:记录你「想干什么、为什么没干、诉求变化、优先级调整」(柔性想法、反馈、计划、提醒要求)

因此,我需要分开来存储,主观意图这一部分使用一个collection来存储,,Obsidian笔记总结,使用一个collection来存储。

A、Obsidian daily 总结:

# ~/secretary/scripts/daily_summary.py
import os
import asyncio
from datetime import datetime
import pytz
from openai import AsyncOpenAI
from mongo_client import summary_db
from dotenv import load_dotenv
import os

load_dotenv()

# ===================== 固定配置 =====================
VAULT_ROOT = os.path.expanduser("~/secretary/obsidian_vault")
TIMEZONE = pytz.timezone("Asia/Shanghai")

# AI 接口配置
API_BASE = os.getenv("DEEPSEEK_API_URL")
API_KEY = os.getenv("DEEPSEEK_API_KEY")

# 获取今日日志路径
def get_today_log_path():
    now = datetime.now(TIMEZONE)
    year = now.year
    month = now.month
    date_str = now.strftime("%Y-%m-%d")
    return os.path.join(VAULT_ROOT, "我的工作量", f"{year}年度", f"{month}月份", f"{date_str}.md")

# 读取日志内容
def read_today_log():
    log_path = get_today_log_path()
    print(log_path)
    if not os.path.exists(log_path):
        return "今日未记录学习/工作内容"
    try:
        with open(log_path, "r", encoding="utf-8") as f:
            return f.read()
    except:
        return "日志文件读取失败"

# AI 生成100字客观摘要
async def generate_daily_summary(text):
    client = AsyncOpenAI(base_url=API_BASE, api_key=API_KEY)
    prompt = f"""请以「技术学习+技术工作量」为核心,用不超过120字,客观总结今日内容,仅保留技术相关事实,根据客观情况来,没任务完成可以不总结,严格排除非技术内容(如非技术类读书、闲聊、无关日常等),不添加主观评价、不冗余。需包含:
1.  技术学习:AI技术、java、python等、框架、算法/刷题(如代码随想录)、技术知识点复习、技术笔记整理(Obsidian技术相关);
2.  技术工作量:实验室技术任务、项目开发(技术模块);
3.  完成情况:技术相关任务/学习是否完成、未完成原因(仅技术相关或合理时间冲突);
4.  核心细节:仅提炼与技术学习、技术工作相关的关键内容,无关内容一律不提及。
{text}"""
    print(text)
    response = await client.chat.completions.create(
        model="deepseek-reasoner",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

# 主函数
async def main():
    log_content = read_today_log()
    summary = await generate_daily_summary(log_content)
    date_str = datetime.now(TIMEZONE).strftime("%Y-%m-%d")
    
    # ===================== 核心修改:独立保存每日总结 =====================
    summary_db.save_daily_summary(date_str, summary)
    print(f"✅ {date_str} 每日摘要已独立保存至 daily_summaries 集合")

if __name__ == "__main__":
    asyncio.run(main())

使用代码找到我的每日笔记的路径,因为我记录笔记是有格式规定的,python代码可以轻松定位到,然后使用reasoner模型进行总结。

B、Obsidian weekly 总结

# ~/secretary/scripts/weekly_summary.py
import asyncio
from datetime import datetime
import pytz
from openai import AsyncOpenAI
from mongo_client import summary_db
from dotenv import load_dotenv
import os

load_dotenv()

# ===================== 配置 =====================
TIMEZONE = pytz.timezone("Asia/Shanghai")

# AI 接口配置
API_BASE = os.getenv("DEEPSEEK_API_URL")
API_KEY = os.getenv("DEEPSEEK_API_KEY")

# AI 生成300字周总结
async def generate_weekly_summary(daily_list):
    client = AsyncOpenAI(base_url=API_BASE, api_key=API_KEY)
    content = "\n".join([f"{item['date']}:{item['content']}" for item in daily_list])
    prompt = f"""请以「技术学习+技术工作量」为核心,合并以下7天的记录,用280-320字客观总结,仅保留技术相关事实,严格排除非技术内容(如非技术类读书、闲聊、无关日常等),不添加主观评价,逻辑清晰、重点突出。需包含:
1.  技术学习累计成果:编程语言/框架学习时长、算法/刷题(如代码随想录)总数量/模块、技术知识点复习范围、Obsidian技术笔记核心内容;
2.  技术工作量:具体技术工作内容、项目开发(技术模块)推进情况;
3.  完成与问题:本周技术相关计划是否达标、未完成技术任务及核心原因(技术难度、时间冲突等)、技术学习/工作中遇到的问题;
4.  关键细节:仅提炼与技术学习、技术工作相关的调整动作(如调整技术学习重点、优化项目开发节奏),无关内容一律不提及。
{content}"""
    response = await client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

# 主函数
async def main():
    # 获取最近7天每日总结
    daily_list = summary_db.get_recent_7days()
    if not daily_list:
        print("❌ 近7天无每日摘要,无法生成周总结")
        return
    
    # 生成周总结
    weekly_summary = await generate_weekly_summary(daily_list)
    
    # ===================== 核心修改:自动生成周标识 + 独立保存 =====================
    # 格式:2026-W13(年份-第几周),唯一不重复
    week_tag = datetime.now(TIMEZONE).strftime("%Y-W%U")
    summary_db.save_weekly_summary(week_tag, weekly_summary)
    
    print(f"✅ {week_tag} 每周摘要已独立保存至 weekly_summaries 集合")

if __name__ == "__main__":
    asyncio.run(main())

此代码可以读取我每日完成总结情况,帮我总结每周完成情况。进行进一步抽象,这样的话,我的上下文可以直接参考比如说 最近两周 的工作完成情况,实现一个连续性的效果。

按照星期为单位,一星期两星期都可以,导入到AI的上下文当中,作为我最近的工作记录的完成情况,从而让AI根据主要矛盾给出定制化的建议。

3、长期细节方向层()

我的知识库可以作为重要参考依据,比如代码随想录当中,关于项目准备的时间线建议,或者黑马等开发的班的时间安排,又或是师兄的java快速上手的时间线安排,均可,这些都是方向性的事情,很重要。

长远来说还是需要向量数据库的,未来有钱了搞个好一点的服务器,可以简单实现的。

最终发给 AI 的内容 = Obsidian客观完成 + 对话记录总结 + 长期工作安排(外置知识库)

4、自动执行脚本指令

定时任务语法

crontab -e
# 每日00:00 同步Obsidian笔记
0 0 * * * /bin/bash ~/secretary/scripts/sync_vault.sh

# 每日00:10 生成每日摘要
10 0 * * * /home/ubuntu/miniconda3/bin/python ~/secretary/scripts/daily_summary.py >> ~/secretary/logs/summary.log 2>&1

# 每周日00:20 生成每周摘要
20 0 * * 0 /home/ubuntu/miniconda3/bin/python ~/secretary/scripts/weekly_summary.py >> ~/secretary/logs/summary.log 2>&1

为什么我的眼里常含泪水,因为我对这片土地爱得深沉!

5、github上传监听,自动同步笔记至服务器

  • 同步脚本:~/secretary/scripts/sync_vault.sh(直接用)
  • 目录:~/secretary/obsidian_vault(不动)
  • 数据库、摘要脚本:完全不影响

第一步:服务器创建「Webhook 监听脚本」

scripts 文件夹下创建 webhook_listener.py

# ~/secretary/scripts/webhook_listener.py
from fastapi import FastAPI, Request, Header
import subprocess
import os

app = FastAPI()
# 安全密钥(自己随便写一个字符串,后面GitHub要用)
SECRET_TOKEN = "188390AA52f@"
# 你的同步脚本路径
SYNC_SCRIPT = "/home/ubuntu/secretary/scripts/sync_vault.sh"

@app.post("/webhook")
async def github_webhook(request: Request, x_github_event: str = Header(None)):
    # 1. 验证请求来自GitHub
    body = await request.body()
    # 2. 执行同步脚本
    try:
        result = subprocess.run(
            ["bash", SYNC_SCRIPT],
            capture_output=True,
            text=True,
            cwd=os.path.dirname(SYNC_SCRIPT)
        )
        print("同步成功:", result.stdout)
        return {"status": "success", "message": "Obsidian 已实时同步"}
    except Exception as e:
        return {"status": "error", "message": str(e)}

后台永久运行(关闭终端也不关闭)

nohup uvicorn webhook_listener:app --host 0.0.0.0 --port 8888 > ~/secretary/logs/webhook.log 2>&1 &

第三步:去 GitHub 配置 Webhook(最关键)

  1. 打开你的 Obsidian 仓库 → Settings → Webhooks → Add webhook
  2. 填写配置:
    Payload URL:http://你的服务器IP:8888/webhook
    Content type:application/json
    Secret:填上面脚本里的 SECRET_TOKEN
    Which events?:选择 Just the push event
    点击 Add webhook
Pasted image 20260330220151

测试是否成功,我这里点击上传,cat服务器端的笔记内容,查看是否一致:

Pasted image 20260330220251 Pasted image 20260330220332
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com
Obsidian