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(最关键)
- 打开你的 Obsidian 仓库 → Settings → Webhooks → Add webhook
- 填写配置:
Payload URL:http://你的服务器IP:8888/webhook
Content type:application/json
Secret:填上面脚本里的 SECRET_TOKEN
Which events?:选择 Just the push event
点击 Add webhook
测试是否成功,我这里点击上传,cat服务器端的笔记内容,查看是否一致:
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com