1. 项目概述:构建你的个人AI知识中枢
如果你和我一样,每天在各种AI工具(Claude、ChatGPT、Cursor)和笔记软件(Notion、Obsidian)之间来回切换,那么你一定也体会过那种“知识碎片化”的无力感。一个绝妙的项目想法可能在Claude的对话里,一个关键的调试步骤在Cursor的聊天记录里,而一个重要的家庭待办事项又躺在手机备忘录里。每次开启一个新的AI会话,都像是从零开始,过去的思考和决策无法被有效复用。Beacon这个项目,就是为了解决这个痛点而生的。它本质上是一个个人专属的、可被AI智能体(Agent)读取的知识系统,将你所有的碎片化信息——想法、决策、会议记录、项目进展——统一存储、语义化索引,并让任何支持MCP协议的AI客户端都能直接查询和写入。它的核心价值在于,让你的每一次思考沉淀,都能成为未来AI助手的“记忆”,实现知识的复利增长。
这个系统的技术栈非常清晰务实:后端使用Supabase(提供了开箱即用的PostgreSQL数据库和鉴权),利用其pgvector扩展存储文本向量;通过一个MCP服务器作为桥梁,将数据库的能力暴露给AI客户端;前端则是你日常使用的任何AI工具。整个架构的设计哲学是“你完全拥有数据”,没有供应商锁定风险,所有代码开源,部署在你自己控制的Supabase项目上。接下来,我将以一个资深全栈开发者的视角,带你从零开始,深度拆解Beacon的架构设计、部署细节、使用心法,以及我在实际搭建和长期使用中踩过的坑和总结的经验。
2. 架构深度解析:为什么是Supabase + pgvector + MCP?
在决定自建知识系统时,技术选型决定了系统的天花板和未来的维护成本。Beacon的选择看似简单,但背后有深刻的考量。
2.1 存储层:Supabase与pgvector的黄金组合
为什么是Supabase,而不是直接租用一台云服务器安装PostgreSQL?对于个人项目,尤其是涉及敏感个人数据的系统,Supabase提供了近乎完美的平衡点。
Supabase的核心优势:
- 零运维的PostgreSQL:你得到的是一个功能完整的Postgres数据库,无需操心服务器维护、备份、升级。这对于个人开发者来说是巨大的解放。
- 内置的向量搜索能力:Supabase原生支持
pgvector扩展。这意味着你不需要额外部署像Weaviate或Qdrant这样的专用向量数据库,简化了架构。向量搜索可以直接通过SQL完成,学习成本和开发成本极低。 - 完整的开发生态:Supabase提供了即时的RESTful API、实时订阅、存储、边缘函数和严格的Row Level Security。Beacon的架构图中,
process-thought边缘函数正是运行在Supabase Edge Functions上,实现了无服务器化的文本处理流水线。 - 可控的成本与数据主权:虽然Supabase是SaaS,但你的数据存储在独立的Postgres实例中。你拥有项目的超级管理员密钥,可以随时导出全部数据。其免费层额度对于个人知识库初期使用绰绰有余,成长路径清晰。
pgvector的工作机制: 当你在Beacon中“捕获”一条想法(例如:“下次重构用户认证模块时,可以考虑采用Passport.js的OAuth2策略,它比手写的安全性更高”),这条文本会被发送到Supabase的边缘函数。该函数调用OpenAI的text-embedding-3-small模型,将这段文本转换为一个1536维的浮点数向量。这个向量就像这段文本在高维空间中的一个“坐标点”。语义相近的文本,其向量点在空间中的距离(通常使用余弦相似度或欧氏距离计算)也会很近。
随后,这个向量连同原始文本,被存入thoughts表的embedding字段(vector(1536)类型)。当你进行语义搜索时,AI客户端发出的查询文本也会被转换成向量,然后在数据库里执行类似SELECT * FROM thoughts ORDER BY embedding <=> query_vector LIMIT 10的查询,快速找到最相关的历史记录。这就是“不是关键词,而是实际含义”搜索的底层原理。
2.2 接入层:MCP(Model Context Protocol)的核心价值
MCP是Anthropic推出的一种协议,它定义了AI模型(如Claude)与外部工具、数据源之间进行通信的标准方式。你可以把它想象成AI世界的“USB协议”或“驱动程序接口标准”。
Beacon-MCP服务器的作用:beacon-mcp这个独立的npm包,本质上是一个适配器。它实现了MCP协议,将Supabase数据库的“增删改查”等能力,包装成AI模型可以理解和调用的“工具”(Tools)。例如,它暴露了capture(捕获想法)、search(语义搜索)、browse_projects(浏览项目)等工具。
工作流程举例: 当你在Claude Desktop中写道:“把我刚才关于重构认证模块的想法保存到知识库”,Claude会通过配置好的MCP连接,调用beacon-mcp服务器的capture工具。该工具接收文本,通过Supabase客户端将其写入数据库,并触发边缘函数进行向量化和分类。之后,当你在Cursor中询问:“我之前关于认证模块有什么想法?”,Cursor的AI同样通过MCP调用search工具,从你的Beacon库中检索出最相关的记录。
这种架构的颠覆性在于:它实现了一次建设,多处通用。你不再需要为Claude、Cursor、Windsurf等每个工具单独开发插件。只要它们支持MCP,就能立即接入你的个人知识库。这真正实现了“One database. Every AI.”的愿景。
2.3 数据模型设计:核心表与领域表的精妙关系
Beacon的数据库设计体现了“核心收口,领域扩展”的思想,这是保证系统灵活性和结构化的关键。
thoughts表:万能收件箱这是整个系统的基石。所有捕获的原始文本、其向量嵌入、以及由LLM自动生成的元数据(如所属领域、思考类型、关联话题、提及人物)都存储在这里。它就像一个原始的、未分类的收件箱,确保没有任何信息因为无法分类而被丢弃。
领域表(Domain Tables):结构化的视图work_projects、personal_projects、household等表,是thoughts的结构化视图。它们通过外键与thoughts关联。LLM在分类时,如果判断一条想法属于某个具体项目或领域,除了在thoughts表中打上标签,还可能在这些领域表中创建或更新一条更结构化的记录。
例如,你捕获了一条想法:“项目‘Alpha’的API网关需要增加速率限制,阈值初步定为每分钟1000次请求。”
- LLM会将其分类到
work_projects领域,thought_type可能是technical_decision。 - 同时,它可能会在
work_projects表中找到名为“Alpha”的项目,并在这条项目记录的“最近动态”或关联想法列表中,链接到这条thoughts记录。
这种设计的优势:
- 冗余与效率的平衡:
thoughts表保证了一切皆可搜,领域表提供了高效的结构化查询。你可以直接问“我的‘Alpha’项目最近有什么进展?”,AI会查询work_projects表及其关联的想法,而不是在全量想法中做语义搜索,速度更快、更精准。 - 适应性与演进:如果你的生活重心变化(比如从工程师转型为创业者),你可以通过运行不同的SQL schema文件(
02_life.sql,03_career.sql)来动态调整领域表结构,而无需改动核心的thoughts表。 - 决策与复盘:专门的
decisions和weekly_reviews表,强迫你对信息进行更高层次的抽象和总结,这对于个人成长和项目管理至关重要。
3. 从零开始的完整部署与配置实战
理论讲完,我们进入实战环节。假设你是一名软件工程师(对应engineer原型),我将带你一步步搭建起属于你的Beacon系统。请严格按照顺序操作,我会在每个步骤中加入我的“踩坑心得”。
3.1 前期准备:环境与账号
代码获取:
git clone https://github.com/ConnorBritain/beacon.git cd beacon注意:项目根目录主要包含SQL schema定义和部署脚本,真正的MCP服务器在另一个仓库(
beacon-mcp),我们稍后配置。账号与密钥准备:
- Supabase账号:前往 supabase.com 注册并创建一个新项目。创建后,在项目设置 -> API页面,找到
Project URL(https://[your-project-ref].supabase.co)和service_role密钥(anon和public角色权限不足,我们需要service_role来执行管理操作)。妥善保存。 - OpenAI API Key:用于文本向量化。建议在OpenAI平台创建一个新的API Key,专用于此项目。
- Anthropic API Key:用于LLM分类(判断想法属于哪个领域、什么类型)。在Anthropic控制台创建。(虽然原文档提到Anthropic,但根据代码,分类LLM是可配置的,理论上也可使用OpenAI的Chat模型,这里我们遵循原设计)。
- Supabase账号:前往 supabase.com 注册并创建一个新项目。创建后,在项目设置 -> API页面,找到
3.2 数据库与边缘函数部署
这是最核心的一步,涉及到数据库结构的创建和自动化处理逻辑的部署。
安装并链接Supabase CLI:
# 在beacon项目根目录下,已存在package.json,直接安装依赖 npm install # 将本地CLI链接到你的线上Supabase项目 npx supabase link --project-ref [your-project-ref] # 例如:npx supabase link --project-ref abcdefghijklmnopqrst链接成功后,本地操作(如数据库迁移、函数部署)都会指向你的线上项目。
设置环境密钥: 这些密钥将被注入到Supabase边缘函数的环境中。
npx supabase secrets set OPENAI_API_KEY=sk-你的openai密钥 npx supabase secrets set ANTHROPIC_API_KEY=sk-ant-你的anthropic密钥重要心得:永远不要将
service_role密钥设置为环境变量或秘密!它拥有最高数据库权限,只应在安全的服务器端环境(如这里的边缘函数)或极度信任的本地脚本中使用。我们稍后配置MCP客户端时,会用到它,但那是在你自己的本地机器上。部署边缘函数:
npx supabase functions deploy process-thought部署成功后,你会得到一个URL,类似
https://[your-project-ref].supabase.co/functions/v1/process-thought。这个函数负责接收新的thoughts,调用OpenAI生成嵌入向量,再调用LLM进行分类,最后将数据写入数据库。执行数据库Schema: 登录Supabase网页控制台,进入SQL Editor。
- 首先,打开
schema/00_core.sql文件,全选复制,在SQL Editor中执行。这会创建最核心的thoughts、decisions、weekly_reviews表以及进行向量搜索的search_thoughts函数。 - 接着,根据你的需求选择执行其他schema文件。作为一名工程师,我建议按顺序执行:
01_projects.sql:创建工作和个人项目表。02_life.sql:创建家庭和人际关系表。(即使单身,household表也可以管理房租、账单等生活事务)- (可选)
03_career.sql:如果你在求职或关注职业发展。
- 最后,必须执行
04_rls.sql。这为所有表启用了行级安全策略(RLS),并创建了一个用于边缘函数内部通信的数据库角色authenticated_service_role。RLS是Supabase安全模型的基石,它能确保即使API密钥泄露,攻击者也无法直接访问或篡改你的数据。
踩坑警告:务必按顺序执行,特别是
04_rls.sql必须在最后。因为RLS策略会阻止后续的建表语句。如果顺序错了,你会遇到权限错误。- 首先,打开
3.3 配置AI客户端(以Claude Desktop为例)
现在,我们需要让AI客户端能够“看见”并操作Beacon。这里以Claude Desktop为例,其他支持MCP的客户端(如Cursor、Windsurf)配置逻辑类似,只是配置文件路径不同。
全局安装MCP服务器: Beacon的MCP服务器是一个独立的npm包。
npm install -g @connorbritain/beacon-mcp # 或者使用npx,但全局安装后配置更简洁定位Claude Desktop的MCP配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json如果文件或目录不存在,请先打开一次Claude Desktop应用。
- macOS:
编辑配置文件: 在配置文件中添加
beacon-mcp服务器的配置。请务必将[your-project-ref]和[your-service-role-key]替换成你自己的信息。{ "mcpServers": { "beacon": { "command": "npx", "args": ["-y", "@connorbritain/beacon-mcp@latest"], "env": { "SUPABASE_URL": "https://[your-project-ref].supabase.co", "SUPABASE_SERVICE_ROLE_KEY": "[your-service-role-key]", "OPENAI_API_KEY": "sk-..." // 这里可以复用之前的OpenAI Key,或新建一个 } } // ... 你可能有其他的MCP服务器配置 } }安全与配置详解:
SUPABASE_SERVICE_ROLE_KEY:这是让MCP服务器拥有最高数据库权限所必需的。因为MCP服务器运行在你的本地电脑上,等同于你本人操作,所以使用service_role密钥是安全的。切勿将此密钥分享给任何人或上传到公开仓库。OPENAI_API_KEY:这里配置的Key是给beacon-mcp服务器使用的,用于在搜索时将你的查询文本转换成向量。它可以和边缘函数里用的那个是同一个,也可以不同。- 配置完成后,重启Claude Desktop。
验证连接: 重启后,在Claude Desktop的新对话中,你应该能看到一个“齿轮”或“插件”图标,点击后能看到可用的工具列表,其中包含
beacon提供的工具(如capture,search等)。你也可以直接输入“/”查看可用工具列表。如果没出现,请检查Claude Desktop的日志(通常在应用菜单的“帮助”或“调试”选项中)。
4. 核心使用心法:从零到一构建你的“第二大脑”
系统搭好了,怎么用才能让它真正产生价值?很多人止步于搭建,却疏于喂养和查询。下面分享我沉淀下来的一套高效工作流。
4.1 初始种子注入:如何高质量地“灌入”历史数据
一个空空如也的知识库是没有用的。docs/SEEDING.md提供了一些思路,但我想分享更具体的实操。
策略一:从代码仓库历史中提取(工程师高价值)这是最高信号的种子数据。在你的重要项目根目录,创建一个CLAUDE.md文件(这是Claude Code的上下文文件),但内容模板可以参考Beacon提供的docs/CLAUDE_MD_TEMPLATE.md。核心是引导AI(Claude)在理解项目时,将其关键设计决策、待解决的问题、项目上下文“反向总结”并捕获到Beacon中。 你可以直接对Claude说:“请阅读本项目代码,提取核心架构设计、当前已知的待办事项(TODO/FIXME)、以及重要的技术决策,并将它们作为一条条独立的‘想法’保存到我的Beacon知识库中,领域设为‘work_projects’,项目名称为[你的项目名]。”
策略二:从AI对话历史中提炼这是最丰富的来源。在Claude或ChatGPT的聊天界面,使用docs/PROMPTS.md中的提示词。例如,给Claude一个长篇对话,然后说:“请分析我们之前的对话,提取其中所有涉及技术决策、学习心得、问题解决方案、待办事项的片段,并为每一条生成一个简洁的标题和总结,然后调用Beacon工具将它们保存起来。” 这个过程可能需要手动分批进行,但回报极高。
策略三:结构化数据手动录入对于decisions(决策日志)和weekly_reviews(周复盘),我强烈建议你手动创建第一批记录。这能帮助LLM更好地理解这些表的格式和用途。例如,手动在Supabase表视图里插入几条过去的重要决策,包含“决策内容”、“背景”、“选项”、“选择理由”、“结果预期”等字段。
心得:质量优于数量。初始阶段,不要追求导入成千上万条聊天记录。优先导入那些你明确知道未来会需要回溯的、高价值的、结构化的信息。前100条高质量种子的价值远高于10000条杂乱无章的对话片段。
4.2 日常捕获:培养“随时存档”的肌肉记忆
系统的价值随着使用频率指数级增长。你需要培养新的习惯。
- 对话中即时捕获:在任何AI对话中,当产生一个值得记录的结论、想法或代码片段时,立刻用一句话总结,并告诉AI:“请将‘[你的总结]’这个想法保存到Beacon,领域可能是‘work_projects’下的‘XX项目’。” AI会调用
capture工具。一开始可能觉得打断流程,但习惯后,这就像按一下“收藏”按钮一样自然。 - 使用快捷指令:一些MCP客户端支持自定义快捷指令。你可以设置一个快捷键,快速弹出一个输入框,输入想法后直接触发捕获,无需在AI对话中进行。
- 定期批量处理:每天下班前或每周回顾时,花10分钟浏览一下当天的聊天记录、笔记,将零散的想法批量捕获。你可以直接对AI说:“这是我今天的一些零散想法:[粘贴文本]。请将它们拆分成独立的条目,并保存到Beacon。”
4.3 搜索与查询:如何问出好问题
这是发挥Beacon威力的关键。语义搜索很强大,但提问方式影响结果。
- 从模糊到精确:开始时可以问得很宽泛,比如“我之前对微服务架构有什么思考?”。系统会返回相关的想法。然后你可以基于这些结果,进行更精确的追问,比如“关于微服务间通信,我具体比较过gRPC和HTTP REST的哪些优缺点?”
- 结合领域表查询:对于明确属于某个项目或领域的问题,直接指定领域能让搜索更高效。例如:“搜索我在‘家庭装修’这个
household项目下的所有想法。” - 利用决策复盘:在做新决策前,先搜索
decisions表。“看看我过去半年所有与技术选型相关的决策,以及它们的后续结果如何。” 这能极大避免重复踩坑。
4.4 维护与演进:让你的系统持续生长
- 每周回顾:利用
weekly_reviews表。每周固定时间,让AI帮你总结:“基于过去一周捕获的所有想法,生成一份周度回顾,重点突出关键进展、学到的教训和下周的潜在行动项。” 然后将这份回顾本身也保存到weekly_reviews表中。时间久了,这里就是你个人成长的清晰地图。 - Schema的迭代:你的生活和工作重心会变。也许半年后你开始创业,
personal_projects表就不够用了,你需要增加ventures(创业项目)表,并关联investors(投资人)表。这时,你可以参考现有schema文件,编写新的05_ventures.sql,在Supabase SQL Editor中执行即可。Beacon的模块化设计让这种演进变得非常轻松。 - 数据备份:虽然Supabase可靠,但定期备份是好习惯。在Supabase控制台,你可以设置自动备份,或者定期使用
pg_dump通过连接字符串导出数据。
5. 常见问题与故障排查实录
在实际搭建和使用中,你几乎一定会遇到下面这些问题。这里是我和社区成员遇到的真实案例和解决方案。
5.1 部署与连接问题
问题1:部署边缘函数时失败,提示“Function failed to deploy”。
- 排查:首先检查Supabase CLI的日志
npx supabase functions logs process-thought。最常见的原因是环境密钥未设置或设置错误。 - 解决:确保已正确运行
npx supabase secrets set ...命令。密钥值不要有多余的空格或换行。可以尝试重新部署:npx supabase functions deploy process-thought --no-verify-jwt(如果与JWT验证有关)。
问题2:Claude Desktop中看不到Beacon工具。
- 排查步骤:
- 检查配置文件路径和格式:确保
claude_desktop_config.json文件在正确的位置,并且是合法的JSON格式(可以使用在线JSON校验工具)。一个多余的逗号都会导致整个配置被忽略。 - 检查命令路径:如果你没有全局安装
@connorbritain/beacon-mcp,npx命令可能需要完整路径。可以尝试在配置中改用绝对路径到Node.js和npx。 - 查看客户端日志:在Claude Desktop中,通常有“打开日志文件”或“切换开发者工具”的选项。查看其中是否有关于加载MCP服务器的错误信息,通常会有非常详细的报错。
- 手动测试MCP服务器:打开终端,尝试手动运行命令:
npx -y @connorbritain/beacon-mcp。如果它报错(如缺少环境变量),则会直接显示出来。根据错误信息修正你的配置文件中的env部分。
- 检查配置文件路径和格式:确保
问题3:调用capture工具成功,但数据库里没有记录,或者embedding字段为空。
- 排查:这说明MCP服务器与Supabase通信正常,但边缘函数
process-thought可能没有触发或执行失败。 - 解决:
- 在Supabase控制台,进入Database -> Functions,找到
process-thought,查看其“触发器”。确保在thoughts表上有INSERT触发器。 - 查看该函数的日志:在控制台进入Functions -> process-thought,查看日志流。常见的错误包括:OpenAI/Anthropic API密钥无效、额度不足、网络超时。日志会明确告诉你问题所在。
- 在Supabase控制台,进入Database -> Functions,找到
5.2 使用与性能问题
问题4:语义搜索返回的结果不相关。
- 原因分析:这通常是向量嵌入模型或搜索策略的问题。
- 解决方案:
- 检查嵌入模型:Beacon默认使用
text-embedding-3-small,它在速度和效果间取得了很好平衡。如果你追求更高精度,可以修改边缘函数的代码,换用text-embedding-3-large,但会消耗更多token和计算时间。 - 优化搜索查询:
search_thoughts函数可能使用了简单的余弦相似度。对于短查询,效果可能不佳。可以尝试在搜索前,让AI对你的查询进行“查询扩展”(Query Expansion),即让AI将你的短问题改写成几个语义相近的长句,然后分别搜索再合并结果。 - 混合搜索:纯向量搜索有时会遗漏精确匹配。可以考虑在
search_thoughts函数中实现“混合搜索”(Hybrid Search),即同时进行向量相似度搜索和关键词(如ILIKE)搜索,然后对结果进行加权融合。这需要对SQL函数进行修改。
- 检查嵌入模型:Beacon默认使用
问题5:LLM分类不准确,经常把工作想法分到“个人”领域。
- 原因:分类的准确性完全依赖于你提供给LLM的提示词(Prompt)和上下文。默认的边缘函数提示词可能不适合你的语言习惯。
- 解决:你需要定制化
supabase/functions/process-thought/index.ts中的分类提示词。打开这个文件,找到classifyThought函数,其中有一个systemPrompt和userPrompt。根据你的需求,用更明确的例子和规则来重写它们。例如,明确告诉LLM:“如果想法中提到‘用户故事’、‘代码评审’、‘Sprint’,则属于work_projects;如果提到‘周末’、‘家人’、‘购物’,则属于household。” 修改后,重新部署边缘函数即可。
问题6:随着数据量增长,搜索变慢。
- 优化方案:
- 创建向量索引:这是最重要的优化。在Supabase SQL Editor中运行:
CREATE INDEX ON thoughts USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);lists参数可以根据你的数据量调整(通常取sqrt(行数))。索引能极大加速近似最近邻搜索。 - 限制搜索范围:在调用搜索时,尽可能通过
domain或project_id等条件过滤,减少需要计算相似度的行数。 - 分区表:如果数据量极大(数十万条以上),可以考虑按时间(如按月)对
thoughts表进行分区,搜索时只在最近的分区上进行。
- 创建向量索引:这是最重要的优化。在Supabase SQL Editor中运行:
5.3 成本与安全考量
问题7:使用成本会很高吗?
- 分析:主要成本来自三部分:1) OpenAI嵌入API调用;2) Anthropic/OpenAI分类API调用;3) Supabase数据库资源(超出免费额度后)。
- 控制策略:
- 嵌入:
text-embedding-3-small价格极低,每1000个token约$0.00002。一条普通想法通常不超过100 token,成本可忽略不计。 - 分类:这是主要成本来源。每条捕获的想法都会触发一次分类调用。你可以通过调整边缘函数逻辑来降低成本:例如,对于非常短的、或明显属于某个领域的内容(比如以“TODO:”开头的),可以跳过LLM分类,直接根据规则指定领域。
- Supabase:免费层提供500MB数据库和2GB带宽,对于个人知识库初期完全够用。监控你的用量,如果接近限额,可以考虑升级到Pro版(每月25美元),性价比依然很高。
- 嵌入:
问题8:我的数据安全吗?
- 安全架构:
- 传输安全:Supabase所有连接强制使用HTTPS。
- 存储安全:数据库连接使用SSL。你的数据存储在Supabase的Postgres中,与Supabase的其他客户隔离。
- 访问控制:通过RLS策略,即使有人拿到了你的API匿名密钥(
anonkey),他也无法读取或修改你的数据,因为所有表都设置了auth.uid() = user_id的策略(假设你实现了用户系统)。在Beacon的当前设计中,它假设是单用户,并使用service_role密钥绕过RLS进行管理操作。因此,保护你的SUPABASE_SERVICE_ROLE_KEY就是保护你数据安全的重中之重。
- 建议:定期轮换你的Supabase项目密钥,永远不要在公共代码、截图或聊天中泄露
service_role密钥。
搭建并熟练使用Beacon,就像为自己安装了一个外挂的“长期记忆体”。它不会取代你的思考,而是将你从记忆和整理信息的负担中解放出来,让你更专注于创造和决策。这个过程需要一些初期的投入和习惯养成,但一旦系统运转起来,它带来的信息检索效率和决策质量提升是实实在在的。最让我惊喜的时刻,往往是在一个全新项目的技术讨论中,AI助手突然插话:“根据你去年在‘项目Y’中的笔记,你曾提到技术Z在类似场景下存在ABC问题,建议考虑替代方案W。” 那一刻,你会感觉过去所有的思考都没有白费,它们正在穿越时间,帮助现在的你做出更明智的选择。