乐于分享
好东西不私藏

13k星 Personal AI Infrastructure!Daniel Miessler 开源的个人AI助手基础设施

13k星 Personal AI Infrastructure!Daniel Miessler 开源的个人AI助手基础设施

你有没有这种感觉——你用 ChatGPT、用 Claude、用各种 AI 工具,但它们都有一个共同的问题:它们不了解你。

每次打开一个新的对话,AI 就像失忆了一样,什么都不知道。它不知道你的工作背景、不知道你的项目进展、不知道你上个月遇到的 Bug 是怎么解决的、不知道你习惯用什么样的代码风格。

这就是为什么 Daniel Miessler 创建了 Personal AI Infrastructure 项目。目前这个项目在 GitHub 上已经收获 13,188 颗星,单日增长 620 星。它的核心理念很简单:让你的 AI 真正认识你,而不是每次都从零开始。

今天我们就来深入聊聊这个项目,看看它是怎么工作的,以及你能从中学到什么。

痛点:为什么你的 AI 总是像个陌生人

在说 Personal AI Infrastructure 之前,我想先聊聊一个很多人都在经历的问题。

想象一下这个场景:你是一个软件工程师,你正在做一个复杂的项目。你让 AI 帮你写了一个模块,过了几周,你又需要在这个模块上做修改。你再次打开 AI,对话开始了:

「帮我修改一下上次写的那个模块。」

AI 困惑地看着你:「抱歉,我不明白你在说什么。」

你叹了口气,开始重新描述项目背景、模块功能、技术选型、之前遇到的问题...这个过程重复了一次又一次。

或者另一个场景:你让 AI 帮你处理一封重要的邮件,它写出来的邮件语气总是太正式、太生硬,不像你平时说话的风格。你花了大量时间修改 AI 的输出,让它更「像你」。

这两个场景的共同问题是:AI 没有你的上下文,没有你的记忆,没有对你这个人的理解。

大多数 AI 工具都是 stateless 的——每次对话都是独立的,关闭对话,所有的记忆都消失了。就算有些产品加了「记忆」功能,也不过是存几条简单的摘要,像一张随手贴的便签。

Personal AI Infrastructure 试图解决的就是这个问题。它不是简单的「存储用户信息」,而是一套完整的个人 AI 基础设施,让你的 AI 能够真正理解你、记住你、为你服务。

核心理念:Agentic AI Infrastructure

Daniel Miessler 在项目的 README 中提出了一个概念叫 Agentic AI Infrastructure——有代理能力的 AI 基础设施。

这个名字听起来很花哨,但背后的思想很简单:不是让 AI 被动地响应你的请求,而是让 AI 主动地帮助你。

传统的方式是:

  1. 你遇到问题
  2. 你问 AI
  3. AI 回答
  4. 你自己执行

Agentic 的方式是:

  1. AI 主动发现你需要什么
  2. AI 自动获取相关上下文
  3. AI 帮你执行任务
  4. AI 把结果记录下来,充实它的知识库

这个区别的关键在于谁在驱动整个流程。传统方式是人在驱动,AI 只是工具。Agentic 方式是 AI 在驱动,人只是做最终决策。

架构概览:四大核心组件

Personal AI Infrastructure 的架构分为四大核心组件,每个组件都有明确的职责。

1. Data Collection(数据收集)

第一个组件是数据收集。AI 要了解你,首先需要获取关于你的数据。

这个项目支持收集多种类型的个人数据:

通讯数据

  • Email(Gmail、Outlook)
  • 即时消息(Slack、Discord)
  • 会议记录(Google Meet、Zoom)

工作数据

  • GitHub 仓库和代码
  • Notion 或其他笔记工具
  • 文档和文件(Google Drive、Dropbox)

日程和任务

  • 日历(Google Calendar)
  • 任务管理(Linear、Jira、Todoist)

网络行为

  • 浏览记录
  • 阅读的文章
  • 搜索历史

收集这些数据的目的是为了让 AI 有一个关于你的「完整画像」。当 AI 知道你上个月写了什么代码、参加了什么会议、处理了什么邮件,它就能给出更有针对性的建议。

2. Memory System(记忆系统)

收集来的原始数据是没有用的,需要处理和存储成 AI 能理解的形式。这就是 Memory System 的职责。

Memory System 会把原始数据转换成结构化的记忆,存储在本地数据库中。这些记忆会按时间、类型、重要性等维度组织起来,方便后续检索。

一个典型的记忆条目可能是这样的:

记忆类型:项目上下文
时间:2024-03-15
内容:用户正在开发一个电商平台,使用技术栈是 Next.js + Supabase。
主要功能包括:商品管理、订单处理、支付集成、用户评论。
目前遇到的挑战是:支付集成遇到了 Stripe Webhook 的调试问题。
相关标签:#电商 #Next.js #Supabase #Stripe
来源:GitHub + Notion + 邮件
置信度:高

这种结构化的记忆比简单的摘要有用得多。AI 可以根据标签快速检索相关记忆,可以根据时间线了解项目发展历程,可以根据置信度判断信息的可靠程度。

3. Context Engine(上下文引擎)

当用户发起请求时,Context Engine 会自动准备相关的上下文。

这是整个系统最智能的部分。传统的 AI 交互是这样的:

  1. 用户说:「帮我优化一下这个函数的性能」
  2. AI 问:「能给我看看这个函数的代码吗?」
  3. 用户粘贴代码
  4. AI 给建议

Personal AI Infrastructure 的方式是这样的:

  1. 用户说:「帮我优化一下这个函数的性能」
  2. Context Engine 自动找到:
    • 这个函数所在的文件
    • 相关的测试用例
    • 最近的代码提交记录
    • 之前的性能相关讨论
    • 项目的性能优化规范
  3. AI 直接给出建议(基于完整的上下文)

用户的请求没有变化,但 AI 能够获得的信息量完全不同。这就是 Context Engine 的价值——它把「让人来提供上下文」变成「让系统自动准备上下文」。

4. Action System(执行系统)

最后一个组件是 Action System——让 AI 能够真正执行任务,而不只是给建议。

Action System 让 AI 能够:

  • 读写文件系统
  • 操作浏览器
  • 调用 API
  • 执行命令行工具
  • 管理你的日历和邮件

这意味着 AI 不只是能给你建议,还能帮你执行。你可以让它帮你安排会议、回复邮件、写代码并提交到 GitHub、生成报告并发送到你的邮箱。

与传统个人助手工具的对比

Personal AI Infrastructure 不是唯一在做个人 AI 助手的项目。让我对比一下它和其他工具的区别:

维度 Personal AI Infrastructure Notion AI ChatGPT Memory Superhuman
数据收集 深度集成多个平台 只看 Notion 只看对话历史 只看邮件
记忆结构 层级化、结构化 文档式 简单摘要 无
上下文准备 自动 无 无 无
执行能力 完整系统级 文档操作 有限 邮件操作
隐私 本地优先 云端 云端 云端
定制化 完全可定制 固定功能 有限 固定功能
学习能力 持续学习 无 有限 无

从这个对比可以看出,Personal AI Infrastructure 在大多数维度上都有优势。它的数据收集更全面、记忆结构更智能、上下文准备更自动化、执行能力更系统级。

技术实现:从零构建你的个人 AI 系统

说了这么多理念,你可能想知道这个系统具体是怎么实现的。让我来介绍一下核心的技术组件。

存储层:SQLite + 向量数据库

Personal AI Infrastructure 使用 SQLite 作为主数据库,存储结构化的记忆数据。SQLite 的好处是轻量、无服务器、单文件,方便备份和迁移。

对于语义搜索,项目使用了 向量数据库(如 Qdrant 或 Chroma)来存储记忆的向量表示。这样 AI 可以通过语义相似度来检索记忆,而不只是依赖关键词匹配。

import sqlite3
import numpy as np
from datetime import datetime

class MemoryStore:
    def __init__(self, db_path="memory.db"):
        self.conn = sqlite3.connect(db_path)
        self.create_tables()
    
    def create_tables(self):
        cursor = self.conn.cursor()
        
        # 记忆主表
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS memories (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                content TEXT NOT NULL,
                memory_type TEXT,
                tags TEXT,
                source TEXT,
                created_at TIMESTAMP,
                importance INTEGER DEFAULT 5,
                last_accessed TIMESTAMP,
                access_count INTEGER DEFAULT 0
            )
        """
)
        
        # 向量存储表
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS memory_vectors (
                memory_id INTEGER PRIMARY KEY,
                vector BLOB,
                FOREIGN KEY (memory_id) REFERENCES memories(id)
            )
        """
)
        
        # 索引
        cursor.execute("""
            CREATE INDEX IF NOT EXISTS idx_tags ON memories(tags)
        """
)
        cursor.execute("""
            CREATE INDEX IF NOT EXISTS idx_type ON memories(memory_type)
        """
)
        
        self.conn.commit()
    
    def add_memory(self, content, memory_type, tags, source, importance=5):
        cursor = self.conn.cursor()
        cursor.execute("""
            INSERT INTO memories 
            (content, memory_type, tags, source, created_at, importance)
            VALUES (?, ?, ?, ?, ?, ?)
        """
, (content, memory_type, ','.join(tags), source, 
              datetime.now().isoformat(), importance))
        self.conn.commit()
        return cursor.lastrowid
    
    def get_relevant_memories(self, query, limit=5):
        """获取与查询相关的记忆"""
        cursor = self.conn.cursor()
        
        # 优先匹配标签和类型
        cursor.execute("""
            SELECT * FROM memories 
            WHERE tags LIKE ? OR content LIKE ?
            ORDER BY importance DESC, access_count DESC
            LIMIT ?
        """
, (f"%{query}%", f"%{query}%", limit))
        
        results = cursor.fetchall()
        return results
    
    def update_access(self, memory_id):
        """更新记忆的访问统计"""
        cursor = self.conn.cursor()
        cursor.execute("""
            UPDATE memories 
            SET last_accessed = ?, access_count = access_count + 1
            WHERE id = ?
        """
, (datetime.now().isoformat(), memory_id))
        self.conn.commit()

这个简化的实现展示了记忆存储的核心逻辑:通过 SQLite 存储结构化的记忆数据,通过标签和内容匹配来检索相关记忆。

上下文准备:根据请求动态组装

当用户发起请求时,Context Engine 需要根据请求的内容,动态组装相关的上下文。

from typing import List, Dict

class ContextEngine:
    def __init__(self, memory_store, data_collectors):
        self.memory_store = memory_store
        self.data_collectors = data_collectors
    
    def prepare_context(self, user_request: str) -> Dict:
        """根据用户请求准备上下文"""
        
        # 1. 从记忆系统检索相关记忆
        relevant_memories = self.memory_store.get_relevant_memories(
            user_request, limit=10
        )
        
        # 2. 提取关键实体(项目名、技术栈、人名等)
        entities = self.extract_entities(user_request)
        
        # 3. 获取实体的详细信息
        entity_details = {}
        for entity in entities:
            entity_details[entity] = self.get_entity_details(entity)
        
        # 4. 组装上下文
        context = {
            "user_request": user_request,
            "relevant_memories": relevant_memories,
            "entities": entity_details,
            "current_time": datetime.now().isoformat(),
            "recent_activity": self.get_recent_activity(limit=5)
        }
        
        return context
    
    def extract_entities(self, text: str) -> List[str]:
        """从文本中提取关键实体"""
        # 这里可以用 NER 模型,也可以用简单的关键词匹配
        # 简化版本
        entities = []
        known_entities = [
            "电商平台", "支付系统", "Next.js", "React", "Supabase"
        ]
        for entity in known_entities:
            if entity in text:
                entities.append(entity)
        return entities
    
    def get_entity_details(self, entity: str) -> Dict:
        """获取实体的详细信息"""
        # 从各个数据源获取实体相关的信息
        details = {}
        
        for collector in self.data_collectors:
            info = collector.get_info_about(entity)
            if info:
                details[collector.name] = info
        
        return details

Context Engine 的核心是根据请求动态组装上下文。它不只是在对话开始时塞一堆信息,而是根据用户具体问什么,有针对性地准备相关信息。

数据收集器:模块化设计

数据收集采用了模块化设计,每种数据源有一个独立的收集器。这种设计的好处是可以灵活添加新的数据源,不需要修改核心逻辑。

from abc import ABC, abstractmethod

class DataCollector(ABC):
    """数据收集器基类"""
    
    @abstractmethod
    def authenticate(self):
        """认证到数据源"""
        pass
    
    @abstractmethod
    def fetch(self, query: str = None):
        """获取数据"""
        pass
    
    @abstractmethod
    def get_name(self) -> str:
        """返回收集器名称"""
        pass

class GitHubCollector(DataCollector):
    """GitHub 数据收集器"""
    
    def __init__(self, token):
        self.token = token
        self.api_base = "https://api.github.com"
    
    def get_name(self) -> str:
        return "github"
    
    def authenticate(self):
        # GitHub 使用 Personal Access Token
        self.headers = {
            "Authorization": f"token {self.token}",
            "Accept": "application/vnd.github.v3+json"
        }
    
    def fetch(self, query=None):
        """获取 GitHub 数据"""
        results = []
        
        # 获取用户的仓库列表
        repos = self.get_repos()
        results.extend(repos)
        
        # 获取最近的提交
        commits = self.get_recent_commits(limit=20)
        results.extend(commits)
        
        # 获取 issue 和 PR
        issues = self.get_recent_issues(limit=10)
        results.extend(issues)
        
        return results
    
    def get_repos(self):
        """获取用户仓库"""
        # 实现省略...
        return []
    
    def get_recent_commits(self, limit=20):
        """获取最近提交"""
        # 实现省略...
        return []

class GmailCollector(DataCollector):
    """Gmail 数据收集器"""
    
    def get_name(self) -> str:
        return "gmail"
    
    def authenticate(self):
        # Gmail 使用 OAuth2
        pass
    
    def fetch(self, query=None):
        """获取邮件数据"""
        # 实现省略...
        return []

这种模块化设计的优势:

  1. 易于扩展:添加新的数据源只需要实现一个新的 Collector 类
  2. 独立测试:每个收集器可以独立测试
  3. 灵活配置:可以只启用需要的收集器
  4. 错误隔离:一个收集器出问题不影响其他收集器

实际应用场景

说了这么多架构和实现,你可能更关心的是:这东西到底能干什么?

让我列举几个实际的应用场景。

场景一:代码项目助手

你的 AI 知道你正在做什么项目,知道项目的技术栈,知道你之前遇到过什么问题。当你问「为什么我的支付流程有问题」,AI 可以立刻检索到:

  • 3 周前你在 GitHub 上开了一个 issue 描述支付问题
  • 2 周前你修改了 Stripe 集成代码
  • 1 周前你在 Slack 上讨论了 Webhook 调试的技巧

这种上下文让 AI 的回答精准得多。

场景二:日程和任务管理

你的 AI 知道你的日程安排、你的任务清单、你的工作习惯。当你说「帮我安排这周的工作」,AI 可以:

  • 查看你的日历,了解你已经安排的会议
  • 查看你的任务列表,了解待办事项的优先级
  • 根据你的工作习惯(上午效率高 vs 下午效率高)来安排任务
  • 自动在日历上创建时间块

场景三:邮件处理

你的 AI 知道你的工作内容、你的联系人、你的沟通风格。当你收到一封邮件,AI 可以:

  • 自动分类(需要回复、仅需阅读、待处理)
  • 帮你起草回复,语气和风格都像你
  • 识别需要跟进的任务并创建提醒
  • 总结长邮件的要点

场景四:知识管理

你的 AI 知道你的学习内容、你读过的文章、你做过的笔记。当你问「我之前看过关于 React Server Components 的文章吗」,AI 可以检索到相关记忆并给你准确的回答。

隐私和安全:本地优先

Personal AI Infrastructure 非常重视隐私和安全。大多数数据处理是在本地完成的,不会上传到云端。

这与很多商业 AI 产品不同。当你使用某个在线 AI 助手时,你的对话数据可能被用来训练模型、可能被存储在服务器上、可能被第三方访问。

Personal AI Infrastructure 的本地优先策略意味着:

  1. 数据不离开你的设备:所有的数据处理都在本地进行
  2. 你拥有数据:不存在云端账号,数据完全属于你
  3. 可离线使用:大部分功能可以在没有网络的情况下使用
  4. 可自托管:可以部署在自己的服务器上,完全控制

如何开始

如果你想搭建自己的 Personal AI Infrastructure,可以按以下步骤开始:

第一步:安装基础组件

# 克隆项目
git clone https://github.com/danielmiessler/Personal-AI-Infrastructure.git
cd Personal-AI-Infrastructure

# 安装 Python 依赖
pip install -r requirements.txt

# 配置环境变量
cp .env.example .env
# 编辑 .env 填入你的 API keys 和认证信息

第二步:配置数据源

根据你需要的数据源,配置相应的收集器:

# config/collectors.yaml
collectors:
  - type: github
    enabled: true
    config:
      token: your_github_token
  
  - type: gmail
    enabled: true
    config:
      credentials_file: ./secrets/gmail_credentials.json
  
  - type: notion
    enabled: true
    config:
      api_key: your_notion_api_key
  
  - type: calendar
    enabled: true
    config:
      provider: google

第三步:运行数据收集

# 运行一次完整的数据收集
python -m collectors.run_all

# 或者只运行特定的数据源
python -m collectors.run --source github

第四步:启动 AI 服务

# 启动 Personal AI 服务
python -m personal_ai.run

# 服务会在 http://localhost:8000 运行

第五步:配置你的 AI 模型

# config/model.yaml
model:
  provider: openai  # 或 anthropic, local 等
  model: gpt-4
  api_key: your_api_key
  
context:
  max_tokens: 8000
  temperature: 0.7
  
memory:
  retrieval_limit: 10
  relevance_threshold: 0.7

局限性和挑战

Personal AI Infrastructure 不是完美的,它有一些局限性和挑战。

数据收集的复杂性

要让 AI 真正了解你,需要收集大量的数据。但获取数据访问权限并不容易——很多服务(如 Gmail、Google Calendar)需要 OAuth 认证,有些服务可能没有开放 API。

记忆的准确性

AI 的记忆来源于数据收集,但数据收集可能不完整或不准确。如果某条记录没有正确分类,或者某个重要事件没有被记录,AI 的回答就会受到影响。

本地运行的限制

本地优先的策略保护了隐私,但也带来了计算能力的限制。如果你想在本地运行大模型,可能需要高性能的 GPU。如果使用云端 API,又需要考虑隐私问题。

维护成本

Personal AI Infrastructure 需要持续的维护:更新数据收集器、处理认证过期、清理无用数据、调整检索算法等。这比使用现成的 AI 产品需要更多的时间和精力。

总结

Personal AI Infrastructure 是一个非常有野心的项目,它的核心理念是让 AI 真正了解你,而不只是响应你的请求。

通过四大核心组件——数据收集、记忆系统、上下文引擎、执行系统——它构建了一个完整的个人 AI 基础设施。用户可以拥有真正理解自己的 AI 助手,而不是每次都要重新解释背景。

虽然项目还有一些局限性,但它代表了一个重要的发展方向:从「通用 AI 工具」到「个人化 AI 助手」的转变。

如果你对 personal AI 感兴趣,想要拥有一个真正「认识你」的 AI 助手,这个项目值得研究和尝试。


免责声明:本文内容基于 danielmiessler/Personal-AI-Infrastructure GitHub 仓库公开信息,所有技术细节和功能描述均来源于此项目。Daniel Miessler 对本文内容不承担责任。

参考资料:

  • GitHub 仓库:https://github.com/danielmiessler/Personal-AI-Infrastructure[1]
  • Daniel Miessler 博客:https://danielmiessler.com/[2]
  • Daniel Miessler 的播客:https://podcast.personal.ai/[3]
  • SQLite 文档:https://www.sqlite.org/docs.html[4]
  • Chroma 向量数据库:https://docs.trychroma.com/[5]

引用链接

[1]https://github.com/danielmiessler/Personal-AI-Infrastructure

[2]https://danielmiessler.com/

[3]https://podcast.personal.ai/

[4]https://www.sqlite.org/docs.html

[5]https://docs.trychroma.com/

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料