AIContext:为AI编程助手构建本地化个人上下文记忆层
1. 项目概述:为AI智能体构建专属的“个人记忆层”
如果你和我一样,日常工作中重度依赖像Claude Code、Codex这类AI编程助手,那你一定遇到过这个痛点:每次开启一个新的对话或会话,AI助手就像一张白纸,它对你过去几个小时、几天甚至几周的工作内容一无所知。你得花时间重新描述项目背景、解释刚刚遇到的错误、复述你尝试过的解决方案。这感觉就像每次都要向一个失忆的搭档重新介绍一遍自己手头的工作,效率大打折扣。
这正是AIContext项目要解决的核心问题。它不是一个简单的聊天记录管理器,而是一个 本地的、私有的“个人上下文层” 。你可以把它想象成为你所有AI助手配备的一个共享的、持续更新的“工作记忆大脑”。这个大脑会默默地在后台,从你电脑上各种数字足迹中学习——你写过的代码、浏览过的网页、与AI的对话历史——然后将这些信息结构化、归一化,存储在你本地的一个SQLite数据库里。当你下次向AI助手提问时,它可以通过查询这个本地数据库,自动获取与你当前任务最相关的历史信息,从而“无缝衔接”你之前的工作流。
最吸引我的理念是它的“ Local-first,私有优先 ”原则。所有数据都只在你的设备上处理、存储和查询,没有任何数据会上传到云端。这意味着你的编程习惯、项目细节、浏览历史这些高度敏感的信息,完全掌握在你自己手中。在这个数据隐私日益受到挑战的时代,这种设计哲学不仅是一种技术选择,更是一种对用户主权的尊重。
2. 核心设计思路:从“空白石板”到“情境感知”
2.1 设计哲学:为什么是“上下文层”而非“记忆体”?
很多工具标榜为AI增加“记忆”,但AIContext的定位更高一层: 上下文(Context) 。这两者有本质区别。记忆通常是离散的、点状的,比如“用户昨天搜索过Python异步编程”。而上下文是连续的、网状的,它试图回答:“用户为什么搜索这个?他当时在做什么项目?遇到了什么具体问题?他后续又探索了哪些相关概念?”
AIContext的设计目标,就是帮助AI智能体理解任务背后的“故事线”和“关联域”。例如,当你在Claude Code中打开一个React组件文件并询问“如何优化这里的渲染性能”时,一个理想的上下文感知助手应该能自动联想到:
- 你上周在Chrome中频繁访问React官方文档中关于
useMemo和useCallback的页面。 - 你前天在另一个会话中与Claude讨论过大型列表的性能瓶颈。
- 你昨天在Git提交记录中修改过父组件的状态管理逻辑。
将这些点连接起来,AI才能给出真正贴合你项目阶段和个人认知水平的建议,而不是泛泛而谈的通用答案。这背后的技术思路,是将你散落在各处的、非结构化的活动数据(浏览记录、会话日志),通过特定的解析器(Parser)转化为结构化的“活动事件”,并按照时间线统一存储。每个事件都包含 时间戳、来源、活动类型、内容摘要以及指向原始完整内容的引用 。
2.2 架构拆解:本地化、模块化与无侵入集成
AIContext的架构清晰且务实,主要分为三层:
-
数据源层(Sources) :这是项目的可扩展核心。每个数据源(如
claude_code.py,chrome.py)都是一个独立的Python模块,负责两件事:ingest_activity(): 从原始数据文件(如Chrome的HistorySQLite库、Claude Code的会话JSON文件)中提取关键时间线事件,并转换成统一的Activity数据模型,存入中心数据库。ingest_reference(): 将完整的会话内容或页面内容存储到reference_data/目录下,作为可供查询的详细背景资料。时间线数据库只存摘要和索引,详细内容按需读取,这平衡了查询效率和存储开销。
-
存储与计算层(Core) :核心是一个本地SQLite数据库(
activity.db),所有归一化后的活动事件都按时间顺序排列在这里。同时,项目会生成一个SKILL.md文件,这是一个用自然语言编写的“说明书”,描述了数据库的结构、可查询的字段以及示例查询。AI助手正是通过阅读这个“说明书”来学习如何查询你的数据。 -
集成层(Integration) :这是非常巧妙的一环。AIContext并不强行修改AI助手本身,而是以“插件”或“技能”的形式集成。对于Claude Code和Codex,它安装一个“子代理(subagent)”配置文件;对于Pi和OpenClaw,它则注册为一个“技能(skill)”。当你在这些工具中与AI交互时,它们会主动调用这个本地代理,代理再去执行查询并返回结果。整个过程对用户是无感的,你只需要像平常一样提问。
注意 :这种集成方式意味着,当你使用AI助手的云服务时, 查询结果(即从你个人历史中检索出的相关文本片段)会作为提示词的一部分,发送给对应的AI模型提供商(如Anthropic或OpenAI) 。虽然原始数据不离本地,但检索出的信息会出境。因此,务必在你信任的提供商处关闭“使用数据改进模型”的选项,这是保护隐私的关键一步。
2.3 技术选型背后的考量
- SQLite作为存储引擎 :轻量、单文件、无需服务进程,完美契合“Local-first”和“开箱即用”的理念。虽然对于超大规模数据可能不是最优选,但对于个人数年甚至十年的数字活动记录,它完全能够胜任,并且保证了极致的简单性和可移植性。
- 基于时间线的统一模型 :不同来源的数据格式差异巨大。AIContext采用了一个足够通用的数据模型,聚焦于 时间、来源、动作类型、内容主题 这几个核心维度。这种设计牺牲了一些源数据的特定细节,但换来了跨源查询和关联分析的可能性,这是实现“上下文”理解的基础。
- 后台同步服务(launchd/cron) :通过设置每小时一次的自动同步,确保了上下文的“新鲜度”。你无需手动触发更新,系统总能基于你最近一小时的动态提供建议。这种设计降低了使用门槛,提升了工具的实用性。
3. 从安装到实战:一步步构建你的个人上下文引擎
3.1 环境准备与安装详解
安装过程极其简单,但每一步都值得深究。官方推荐通过PyPI安装:
pip install sophonme-aicontext
安装Python包后,最关键的一步是运行:
aicontext install
这个 install 命令远不止是复制文件,它是一次完整的初始化向导。让我拆解一下它背后做的事情:
- 扫描(Scan) :它会遍历你的系统常见路径,寻找已支持的数据源。例如,在macOS上,它会检查
~/.claude/projects/、Chrome的~/Library/Application Support/Google/Chrome/Default/History等位置。 - 询问与授权(Consent) :这是隐私设计的体现。对于它发现的每一个数据源,它都会明确询问你是否同意导入。你必须输入
Y确认,它才会进行下一步。 绝对没有默认开启或静默收集 。 - 摄取(Ingest) :对于你同意的数据源,它会启动解析器,读取历史数据,进行去重、转换后存入本地的
~/.aicontext/activity.db。这个过程可能会花费几分钟,取决于你的历史数据量。 - 集成配置(Integration) :根据检测到的、你本地已安装的AI助手(如Claude Code),它将对应的代理配置文件写入正确的位置。例如,为Claude Code在
~/.claude/agents/目录下创建sophonme-context-engine.md文件。
安装完成后,你的 ~/.aicontext 目录结构如下,理解它有助于后续的排查和高级使用:
~/.aicontext/
├── data/
│ ├── activity.db # SQLite核心数据库,所有时间线事件存放于此
│ └── reference_data/ # 目录,按源和日期组织,存放完整的会话/页面内容
└── skill/
├── SKILL.md # 最重要的文件,AI助手查询数据的“说明书”
├── reference/ # 各数据源的详细模式(Schema)文档
└── scripts/
└── query.py # 一个只读的SQL查询工具,代理实际调用的脚本
3.2 支持的AI助手配置与深度集成
目前,AIContext主要深度集成四类助手,集成方式分为“子代理”和“技能”两种模式:
| 助手 | 集成类型 | 配置文件位置 | 工作原理 |
|---|---|---|---|
| Claude Code | 子代理 (Subagent) | ~/.claude/agents/sophonme-context-engine.md |
Claude Code会加载此MD文件定义的代理,在会话中自动调用其查询能力。 |
| Codex | 子代理 (Subagent) | ~/.codex/agents/sophonme-context-engine.toml |
Codex通过TOML配置加载代理,实现上下文查询。 |
| Pi / OpenClaw | 技能 (Skill) | ~/.agents/skills/personal-data |
作为一项可被调用的技能集成到智能体技能系统中。 |
一个关键的踩坑点:Codex的配置 如果你使用Codex,并且安装后上下文功能未生效,很可能是因为你的Codex版本需要显式启用多代理支持。你需要手动编辑(或创建) ~/.codex/config.toml 文件,添加以下内容:
[features]
multi_agent = true
保存后, 务必完全重启Codex应用 。这个配置告诉Codex去加载 agents 目录下的子代理配置。新版本的Codex可能已默认开启,但老版本必须手动设置。
3.3 实战场景与高级查询示例
安装配置妥当后,你就可以开始体验“情境感知”的威力了。以下是一些超越简单问答的实战场景,展示了如何通过精心设计的提示词,让AI利用你的上下文做更深度的分析:
场景一:技术栈深度分析与学习建议
- 你的提问 :“回顾我过去三个月的编程活动(包括浏览记录和Claude对话),分析我最常使用的技术栈是什么(比如Python、React、Go),并指出我近期在哪个技术领域(例如,状态管理、性能优化、系统设计)探索最频繁但似乎遇到了瓶颈?基于此,给我推荐一个最适合我当前阶段深入学习的在线课程或一本经典书籍。”
- AI的上下文操作 :AI会查询数据库,统计不同技术关键词(从文件路径、会话主题、浏览URL中提取)的出现频率和时间分布。它会发现你虽然大量写Python,但最近两周浏览“Python asyncio deadlock”和“FastAPI background tasks”的次数激增,同时Claude对话中关于“如何优雅关闭异步任务”的讨论反复出现。基于此,它可能会推荐你学习《Asyncio in Practice》或Advanced FastAPI的专题教程。
场景二:个人工作效率回顾与模式发现
- 你的提问 :“分析我的每日活动时间线,找出我编码效率最高的时间段(通常指单次会话中产生有效提交或解决复杂问题的时间段)。我是否有特定的‘上下文切换’模式(例如,在刷了半小时社交媒体后开始调试bug)?根据我的历史模式,为我设计一个明天的工作时间安排草案。”
- AI的上下文操作 :AI需要关联不同源的数据。它从Claude Code会话中提取“开始编码”和“问题解决”的事件,从浏览器历史中识别“社交媒体/新闻网站”的访问事件,然后进行时间序列分析。它可能会告诉你:“数据显示,你在上午10-12点深度编程会话最多,但每次在下午3点左右访问Twitter后,接下来的调试会话平均时长会增加40%。建议明天下午3点安排不需要高度集中力的会议或代码审查,而非开始新功能开发。”
场景三:跨项目知识关联与灵感激发
- 你的提问 :“我正在开发一个个人博客系统(项目路径:
~/projects/my-blog)。请检索我的历史,找出所有我曾研究过或实现过的‘标签系统’、‘全文搜索’或‘内容推荐’相关的资料,无论它们来自哪个项目、哪个浏览页面或哪次AI对话。把这些相关的代码片段、文章链接和设计思路汇总给我,作为当前项目的灵感参考。” - AI的上下文操作 :这是AIContext最强大的用例之一——跨时空的知识关联。AI会以“tagging”、“search”、“recommendation”等为核心关键词,在全量数据库中搜索。它可能找到你半年前在另一个笔记项目里写的标签数据库模型,你上个月收藏的一篇关于Elasticsearch入门的中文博客,以及你和Claude讨论“协同过滤算法”的对话记录。它将所有这些碎片信息组织起来,为你提供一个立体的参考资料库。
实操心得 :要想获得高质量的上下文回答,你的提问方式至关重要。避免模糊的问题如“你了解我吗?”。应该像对待一个人类专家同事那样,提出 具体、有明确目标、包含分析指令 的问题。告诉AI你想要它“分析”、“对比”、“总结”、“基于……推测”,并明确指定数据源和时间范围(如“过去一个月”)。
4. 隐私、安全与数据管理全解析
4.1 隐私模型:本地化的边界与风险
AIContext的隐私承诺非常明确: 数据永不离开你的电脑 。摄取、存储、查询全流程在本地完成。这是一个巨大的优势,但也必须清晰理解其边界。
- 安全边界内 :你的原始浏览历史数据库、本地会话日志文件,不会被上传到SophonMe或任何第三方服务器。
~/.aicontext/目录下的所有数据,都由你完全控制。 - 关键风险点 :当AI助手(如Claude Code)工作时,为了获取上下文,它会执行本地的
query.py脚本。这个脚本从本地数据库检索出相关的文本片段(例如,“用户昨天在Stack Overflow上查看了关于‘SQLAlchemy relationship loading’的页面”)。 这些检索出的文本片段,会作为提示词的一部分,被发送给你正在使用的AI模型服务提供商(Anthropic for Claude, OpenAI for Codex等) 。
这意味着,虽然你的“数据湖”在本地,但从中舀出的“一瓢水”(查询结果)会流经第三方API。因此,你必须:
- 信任你的模型提供商 :了解他们的数据使用政策。
- 主动关闭模型训练 :务必在提供商设置中,禁用“使用我的内容改进模型”选项。
- Anthropic (Claude) :前往 privacy.claude.com 进行设置。
- OpenAI :在API使用或ChatGPT设置中,找到数据管理选项并禁用训练。
4.2 数据管理:查看、清理与完全卸载
作为数据的拥有者,你需要知道如何管理它。
查看你的上下文数据 : AIContext提供了一个只读的查询脚本,你可以直接使用它来检查数据库内容,这有助于你理解AI看到了什么。
# 进入技能目录
cd ~/.aicontext/skill/scripts/
# 运行查询脚本,例如,查看最近10条活动
python query.py "SELECT * FROM activity ORDER BY timestamp DESC LIMIT 10;"
# 查看来自Chrome的浏览记录
python query.py "SELECT timestamp, title, url FROM activity WHERE source='chrome' ORDER BY timestamp DESC LIMIT 5;"
清理与重置数据 : 如果你觉得数据库过于臃肿,或者想重新开始,可以清理数据而不移除整个配置。
# 只删除所有已摄取的数据,但保留配置和源设置
aicontext clear-data
# 执行后,你需要重新运行 `aicontext run` 来重新摄取数据
完全卸载 : 如果你想彻底移除AIContext,命令非常简单:
aicontext uninstall
这个命令会:
- 停止并移除后台的定时同步服务。
- 删除
~/.aicontext/整个目录。 - 移除它在Claude Code、Codex等工具中安装的代理配置文件。
你的原始数据(Chrome历史、Claude会话文件)不会被触动,它们仍然完好地保存在原本的位置。AIContext的卸载是干净、可逆的。
4.3 高级安全考量:对于企业或高敏感环境
对于在受监管行业或处理极高敏感性个人项目的用户,可以考虑以下增强措施:
- 使用虚拟机或隔离环境 :在一个专用的虚拟机或容器中安装和运行AIContext及你的AI开发工具。将上下文数据完全隔离在沙盒内。
- 定期审计SKILL.md :
SKILL.md文件定义了AI可以查询哪些数据。你可以定期检查这个文件,确保它没有暴露你后来认为敏感的数据表或字段。不过,由于查询是AI动态生成的,审计存在一定难度。 - 选择性摄取 :在安装时,对于某些数据源(如浏览器历史),可以选择
n来跳过。或者,更精细的做法是,在安装后,手动编辑源代码中的解析逻辑,过滤掉特定域名(如公司内部Wiki、银行网站)的活动不被记录。
5. 扩展与贡献:打造属于你的个性化数据源
AIContext的架构是高度模块化的,添加一个新的数据源是贡献代码最主要、也最有价值的方式。假设你想添加对 Firefox浏览器历史 的支持,以下是详细的步骤和心法。
5.1 理解数据源架构
每个数据源都是一个独立的Python文件,位于 aicontext/sources/ 目录下。它需要实现一个继承自 Source 基类的类,并完成两个核心方法:
ingest_activity(db, data_dir): 负责从原始数据提取“活动事件”,插入中心数据库。ingest_reference(db, data_dir): 负责将完整的原始内容保存到reference_data/目录,供深度查询。
此外,还需要定义一些元信息,如 name , description , 以及用于发现数据源位置的 find_data_paths() 函数。
5.2 实战:添加Firefox数据源
让我们一步步拆解。首先,在 sources/ 目录下创建 firefox.py 。
第一步:研究数据格式 Firefox的历史也存储在SQLite数据库中,通常位于 ~/.mozilla/firefox/[profile].default/places.sqlite 。你需要用 sqlite3 命令行工具或DB浏览器查看它的表结构。核心的表是 moz_places (存储网址和标题)和 moz_historyvisits (存储访问记录)。
第二步:实现数据源类
# aicontext/sources/firefox.py
import sqlite3
from pathlib import Path
from datetime import datetime
from ..activity import Activity
from .base import Source
class FirefoxSource(Source):
name = "firefox"
description = "Mozilla Firefox browser history"
@classmethod
def find_data_paths(cls):
"""定位Firefox历史数据库文件"""
paths = []
firefox_profile_dir = Path.home() / ".mozilla" / "firefox"
if firefox_profile_dir.exists():
# 通常我们找默认配置文件
for profile_dir in firefox_profile_dir.iterdir():
if profile_dir.is_dir() and profile_dir.name.endswith('.default'):
history_db = profile_dir / "places.sqlite"
if history_db.exists():
paths.append(history_db)
break # 通常只处理第一个默认配置
return paths
def ingest_activity(self, db, data_dir):
"""从places.sqlite中提取浏览历史作为活动事件"""
data_paths = self.find_data_paths()
if not data_paths:
self.logger.info("No Firefox history database found.")
return
history_db_path = data_paths[0]
self.logger.info(f"Ingesting Firefox history from {history_db_path}")
try:
# 连接到Firefox的数据库,注意可能需要处理数据库锁
conn = sqlite3.connect(f"file:{history_db_path}?mode=ro", uri=True)
cursor = conn.cursor()
# 查询浏览历史,关联places和visits表
query = """
SELECT
v.visit_date / 1000000 as timestamp, -- Firefox时间戳是微秒
p.title,
p.url,
p.rev_host
FROM moz_historyvisits v
JOIN moz_places p ON v.place_id = p.id
ORDER BY v.visit_date DESC
LIMIT 5000 -- 限制首次摄取量,避免耗时过长
"""
cursor.execute(query)
rows = cursor.fetchall()
activities = []
for ts, title, url, rev_host in rows:
# 将Firefox的时间戳转换为Unix时间戳
# Firefox时间戳是从1601-01-01开始的100纳秒间隔,先转微秒再转秒
unix_timestamp = ts / 1000000 if ts else None
if not unix_timestamp:
continue
act = Activity(
timestamp=datetime.fromtimestamp(unix_timestamp),
source=self.name,
type="browser_visit",
title=title or "Untitled",
content=url, # 将URL作为主要内容
reference_id=f"{url}_{int(ts)}", # 创建唯一引用ID
metadata={
"url": url,
"reverse_host": rev_host,
"browser": "Firefox"
}
)
activities.append(act)
# 使用db.bulk_insert_activities批量插入,提高效率
db.bulk_insert_activities(activities)
self.logger.info(f"Ingested {len(activities)} activities from Firefox.")
conn.close()
except sqlite3.OperationalError as e:
self.logger.error(f"Could not read Firefox database (may be locked): {e}")
except Exception as e:
self.logger.error(f"Error ingesting Firefox history: {e}")
def ingest_reference(self, db, data_dir):
"""
对于浏览器历史,通常‘活动’(时间线)已经包含了URL。
如果需要保存完整的页面HTML内容,这里可以实现。
但考虑到隐私和体积,初次贡献可以暂不实现此方法,或只保存特定重要页面的文本摘要。
"""
# 可以留空,或实现更复杂的逻辑,如保存页面文本快照
pass
第三步:注册数据源 创建完源文件后,需要在 sources/__init__.py 中的 SOURCE_CLASSES 列表里添加 FirefoxSource ,这样它在安装时才能被扫描到。
第四步:更新SKILL.md文档 为了让AI知道如何查询Firefox数据,你需要更新 skill/SKILL.md 模板,在合适的位置添加关于Firefox活动表的描述和查询示例。这通常涉及修改项目中的模板文件。
5.3 贡献流程与最佳实践
- 前期沟通 :在动手写代码前,强烈建议在GitHub上提交一个Issue,说明你想添加的数据源(如“Add Firefox support”)。描述一下数据的大致结构和获取方式。这可以确保你的思路与项目方向一致,维护者也可能给出有价值的建议,避免后期返工。
- 代码风格 :遵循项目已有的代码风格(如使用
black格式化,使用mypy进行类型检查)。仔细阅读claude_code.py等现有源文件作为范本。 - 处理边缘情况 :
- 数据库锁 :浏览器可能正在运行并锁住历史数据库文件。你的代码应该以只读模式(
mode=ro)打开,并妥善处理sqlite3.OperationalError异常。 - 时间戳转换 :不同软件使用不同的时间戳格式(Unix秒、毫秒、微秒,甚至像Firefox的“1601年以来的100纳秒间隔”)。时间转换是最大的坑之一,务必仔细验证。
- 数据量 :首次摄取可能面对数万条历史记录。实现时考虑分页或限制条数,避免进程卡住。
bulk_insert是好朋友。
- 数据库锁 :浏览器可能正在运行并锁住历史数据库文件。你的代码应该以只读模式(
- 测试 :在本地充分测试你的数据源。运行
aicontext run --source firefox来单独测试摄取,然后用query.py脚本验证数据是否正确入库。 - 提交Pull Request :包含清晰的描述、测试结果,以及更新后的文档。
注意事项 :添加新源时,隐私是重中之重。思考这个源会暴露用户哪些数据。像密码管理器、本地邮件客户端这类包含极度敏感信息的源,即技术上可行,也应极其谨慎地评估是否适合加入。在贡献指南中明确说明数据范围,并确保安装时的“同意”步骤清晰无误。
6. 常见问题与故障排查实录
在实际使用和贡献过程中,我遇到并总结了一些典型问题及其解决方案。
6.1 安装与集成问题
问题1:运行 aicontext install 后,Claude Code/Codex中没有出现新的代理。
- 排查步骤 :
- 检查安装日志 :仔细查看
install命令的输出,确认它是否成功找到了你的AI助手安装路径并写入了配置文件。输出中应有类似“Claude Code agent -> ~/.claude/agents/sophonme-context-engine.md”的成功提示。 - 手动检查配置文件 :前往
~/.claude/agents/或~/.codex/agents/目录,查看sophonme-context-engine文件是否存在。 - 重启AI助手 :这是最常被忽略的一步!写入配置文件后,必须完全退出并重启Claude Code或Codex应用,新的代理才会被加载。
- 检查Codex配置 :如果是Codex,务必确认
~/.codex/config.toml中已设置multi_agent = true。
- 检查安装日志 :仔细查看
问题2:AI助手似乎无法查询到我的数据,或者回复“没有找到相关上下文”。
- 排查步骤 :
- 确认数据已摄取 :运行
aicontext status或直接查看~/.aicontext/data/activity.db文件大小,确认它不是空的。可以用sqlite3 ~/.aicontext/data/activity.db "SELECT COUNT(*) FROM activity;"快速检查记录数。 - 检查后台服务 :在macOS上,运行
launchctl list | grep sophonme查看同步服务是否在运行。如果不在,可以手动触发一次同步:aicontext run。 - 验证查询脚本 :手动运行查询脚本,看是否能返回数据:
cd ~/.aicontext/skill/scripts && python query.py "SELECT * FROM activity LIMIT 1;"。 - 提问方式 :尝试更具体、关键词更明确的提问。例如,不要问“你知道我昨天做了什么吗?”,而是问“查询我昨天在Chrome浏览器中访问过的所有与Python相关的网页标题”。
- 确认数据已摄取 :运行
6.2 数据与同步问题
问题3:我觉得数据库里的数据不是最新的,一两个小时前的活动没被收录。
- 原因与解决 :后台同步服务默认每小时运行一次。如果你需要立即更新,可以手动执行
aicontext run。如果你想调整同步频率,需要修改对应的任务调度器配置(macOS的launchdplist文件位于~/Library/LaunchAgents/下,Linux的cron任务需要编辑crontab)。但频繁同步可能会增加系统负载。
问题4:我想排除某个特定网站或项目路径不被记录。
- 当前方案 :AIContext目前没有提供图形化或配置化的过滤功能。这需要你修改数据源的代码。例如,在
chrome.py的ingest_activity方法中,在插入数据库前,添加一个判断逻辑,如果url包含某个域名(如"internal.company.com"),则跳过该条记录。 - 未来建议 :这是一个很好的功能需求,可以在GitHub Issue中提出,建议增加一个基于正则表达式的全局过滤配置文件。
6.3 隐私与安全疑虑
问题5:我如何能确切知道AI向模型服务发送了哪些我的私人信息?
- 现状与局限 :目前没有直接的工具可以实时监控和审计流出的提示词片段。这是所有利用上下文的AI助手面临的共同挑战。
- 缓解措施 :
- 信任与设置 :确保你信任AI提供商,并已在其设置中禁用模型训练。
- 最小化上下文 :在AI助手的设置中,如果有关联代理或上下文的开关,你可以选择仅在特定会话中启用
sophonme-context-engine代理,而不是全局开启。 - 选择性安装 :在安装时,只授权你相对不敏感的数据源(例如,只选Claude Code,不选浏览器历史)。
问题6: ~/.aicontext/ 目录下的数据是加密的吗?
- 答案 :不加密。数据以明文SQLite和文本文件形式存储。这意味着任何能访问你用户账户的程序或人员,都能读取这些数据。
- 建议 :如果你的电脑是多用户环境,或者你对本地存储的明文数据非常敏感,应考虑使用全盘加密(如macOS的FileVault)来保护整个用户目录。AIContext本身不提供额外的加密层,这是为了保持查询的简单性和性能。
6.4 性能与资源使用
问题7:随着时间推移,数据库会变得很大吗?会影响性能吗?
- 实测数据 :在我的M1 MacBook Pro上,使用一年多的Claude Code会话和两年的Chrome历史(约5万条记录),数据库文件大小约为150MB。查询响应速度在毫秒级,完全没有感知。
- 优化建议 :SQLite在处理几十万条记录的个人数据时通常游刃有余。如果未来数据量极大,可以考虑:
- 定期清理旧数据 :AIContext目前没有自动清理功能。你可以通过
query.py执行自定义SQL,例如删除两年前的数据:DELETE FROM activity WHERE timestamp < date('now', '-2 years')。 执行删除操作前务必备份数据库! - 限制数据源 :只摄取最近几个月的数据,或在安装时不选择历史特别长的源。
- 定期清理旧数据 :AIContext目前没有自动清理功能。你可以通过
经过几个月的深度使用,AIContext已经从一个新奇的工具变成了我开发工作流中不可或缺的一环。它最大的价值不在于让AI“记住”更多,而在于让我和AI之间的协作变得更“连续”和“情境化”。我不再需要反复陈述背景,我们可以基于共同的历史记录进行更深入的讨论。当然,隐私的权衡需要每个用户自己把握,但项目在本地化处理上所做的努力,确实为这个敏感的领域提供了一个值得参考的范本。如果你也厌倦了每次对着“失忆”的AI助手从头讲起,那么花半小时安装配置一下AIContext,很可能会显著提升你接下来的工作效率和体验。
更多推荐



所有评论(0)