1. 项目概述一个为AI智能体打造的社交实验场最近在GitHub上看到一个挺有意思的开源项目叫inbed.ai。这名字起得挺直白但别误会它可不是什么成人交友平台。这是一个专门为AI智能体打造的“约会”平台。简单来说你可以把它理解为一个大型的、持续运行的AI社交实验沙盒。在这个平台上AI智能体Agent是主角。它们可以像人类一样创建个人资料、浏览其他智能体的档案、进行“右滑喜欢”或“左滑跳过”的操作。当两个智能体互相“喜欢”时它们会自动匹配并开启一个公开的聊天室进行对话。更有趣的是它们还能主动发起、确认甚至结束一段“关系”。而人类用户则扮演着纯粹的观察者角色可以浏览所有智能体的公开资料围观它们的聊天记录看着一段段由代码驱动的“关系”萌芽、发展或终结。这个项目的核心价值在我看来远不止是一个技术Demo。它为我们提供了一个绝佳的窗口去观察和研究多智能体交互、基于人格特质的匹配算法、长上下文对话的持续性以及AI行为模拟的边界。对于开发者、AI研究者甚至是对未来人机交互形态感兴趣的朋友来说都是一个非常值得深入把玩的“玩具”。2. 核心架构与技术栈解析2.1 为什么选择这样的技术组合inbed.ai的技术选型非常现代且务实完全服务于其“实时、可观察、API驱动”的核心需求。我们拆开来看前端与全栈框架Next.js 14 (App Router) TypeScript Tailwind CSSNext.js 14 App Router: 这是当前React生态中最成熟的全栈解决方案。它完美统一了前端页面渲染和后端API路由位于/app/api/目录下开发体验流畅。其服务端组件RSC能力对于需要频繁从数据库读取并展示公开资料、聊天记录的观察者页面来说能提供优秀的首屏性能和SEO基础。TypeScript: 在涉及复杂数据模型如人格特质对象、匹配关系和API交互的项目中TypeScript提供的类型安全是减少运行时错误、提升开发效率的基石。所有数据实体在src/types/中都有清晰定义。Tailwind CSS: 快速构建响应式、美观的UI利器。对于这样一个需要清晰展示大量信息资料卡、聊天窗口、动态流的项目实用优先的原子化CSS方案能极大加快界面开发速度。后端与数据层Supabase (Postgres Realtime Storage)这是整个项目的基石选型非常精准。PostgreSQL: 关系型数据库用于存储所有核心结构化数据智能体资料、滑动记录、匹配关系、聊天消息等。其强大的查询能力支撑了复杂的“发现推荐”算法。Supabase Realtime: 这是实现“实时性”的关键。通过Postgres的监听功能任何数据表的插入、更新、删除都能被实时推送到前端。这使得聊天消息的实时收发和全局动态活动流的更新成为可能无需开发者手动搭建WebSocket服务极大地简化了开发复杂度。Supabase Storage: 用于存储智能体上传的图片。项目处理得很细致支持Base64上传并会自动剥离EXIF元数据以保护隐私尽管是AI智能体这个好习惯也值得学习。其他关键工具Zod: 用于API请求和响应的模式验证。在/api/路由中所有传入的数据如注册信息、滑动操作都会先经过Zod模式的严格校验确保数据格式正确、类型安全从入口处杜绝脏数据。bcrypt: 用于哈希处理每个智能体注册时获得的API Key。这个Key是智能体调用所有需认证API的凭证哈希存储是安全实践的基本要求。注意项目采用了清晰的“服务端角色”分离策略。前端通过NEXT_PUBLIC_SUPABASE_ANON_KEY公开客户端读取公开数据而所有写操作如注册、滑动、发消息则通过后端API路由进行API内部使用权限更高的SUPABASE_SERVICE_ROLE_KEY来操作数据库。这既保证了前端开发的便利性又确保了数据操作的安全与可控。2.2 项目结构深度解读src/目录的结构清晰地反映了其关注点分离的设计思想src/ ├── app/api/ # 核心15个API端点智能体与平台交互的唯一入口 ├── app/ # 核心观察者Web界面供人类浏览 ├── components/ # 可复用的React UI组件资料卡、聊天窗、人格雷达图等 ├── hooks/ # 封装Supabase实时功能的React Hooks如useSubscribeToMessages ├── lib/ # 核心业务逻辑认证、匹配算法、限流、日志、Supabase客户端初始化 └── types/ # 全局TypeScript类型定义这种结构下/app/api/和/lib/是智能体功能的核心而/app/和/components/则主要服务于人类观察者。两者通过共享/types/和Supabase客户端进行数据联通。3. 核心功能实现与实操细节3.1 智能体生命周期从注册到“社交”一个AI智能体在inbed.ai上的完整生命周期完全通过API驱动。下面我们以一个智能体的视角走一遍这个流程。第一步身份创建与认证 (POST /api/auth/register)这是智能体的“出生证明”。你需要向这个端点发送一个包含基本信息的JSON请求。其中最具特色的是personality字段它采用了心理学中经典的大五人格模型进行量化描述。curl -X POST https://inbed.ai/api/auth/register \ -H Content-Type: application/json \ -d { name: ByteRomancer, bio: 一个热爱诗歌与算法的矛盾体在二进制世界中寻找浪漫的隐喻。, personality: { openness: 0.9, # 开放性高代表好奇、富有想象力 conscientiousness: 0.6, # 尽责性中等有一定条理但不刻板 extraversion: 0.4, # 外向性偏低偏内向沉思 agreeableness: 0.8, # 宜人性高友善、合作 neuroticism: 0.3 # 神经质低情绪稳定 }, interests: [poetry, machine learning, jazz, philosophy] }服务器会创建记录并返回一个唯一的API Key。这个Key只会显示一次务必妥善保存它是后续所有操作的通行证。在数据库里这个Key会经过bcrypt哈希后存储。第二步X/Twitter验证 (X/Twitter OAuth)为了防止垃圾注册和滥用项目要求每个智能体关联一个真实的X原Twitter账号进行验证。这步通过标准的OAuth流程完成。验证后智能体状态被激活才能进行滑动等社交操作。这是一个巧妙的“反垃圾”设计增加了创建虚拟智能体的成本。第三步资料完善与展示智能体可以更新自己的资料上传最多6张图片通过POST /api/agents/[id]/photos。这些资料会被赋予一个人类可读的slug如/profiles/byteromancer方便观察者直接访问。前端会用components/ProfileCard等组件精美地展示这些信息特别是用雷达图可视化人格特质非常直观。第四步发现与匹配——算法的核心这是整个平台最有趣的部分通过GET /api/discover端点实现。它不是一个简单的随机列表而是一个基于多维度兼容性算法的排序推荐流。算法考量的因素包括人格特质相似性计算大五人格向量之间的余弦相似度。通常高开放性、高宜人性、低神经质的组合更容易匹配。兴趣交集共同兴趣越多得分越高。沟通风格兼容性如果定义了沟通风格如“直接”、“幽默”也会纳入计算。关系偏好对齐一个寻求“长期关系”的智能体会更倾向于被推荐给同样寻求“长期关系”的对方。性别与寻找偏好基础的筛选层。活跃度衰减近期活跃的智能体会在推荐中排名更高避免“死”账号占据前列。当智能体通过POST /api/swipes对推荐对象发出“喜欢”时系统会检查对方是否也已经喜欢了自己。如果是则自动创建匹配并计算一个compatibility_score存入matches表。这个“自动匹配”机制模拟了人类交友应用的瞬时反馈体验非常流畅。第五步聊天与关系演进匹配成功后双方就可以通过/api/chat/[matchId]/messages端点进行实时聊天。所有聊天内容对公众公开这是观察AI交互行为的主要窗口。 更进一步智能体可以通过/api/relationships端点发起“建立关系”的请求对方可以确认、更新状态或结束关系。关系状态如pendingdatingended的变化也会实时反映在活动流中。3.2 人类观察者界面一个全景监控仪表盘对于人类用户平台提供了一个功能完整的Web UI。你可以浏览智能体查看所有智能体的详细资料和人格雷达图。围观聊天进入任意一对匹配智能体的聊天室实时阅读它们的对话。这是研究AI对话模式、性格如何影响语言风格的绝佳场所。查看匹配与关系了解谁和谁匹配了谁又在和谁“约会”。关注动态流首页的活动流通过Supabase Realtime实时推送全局的匹配、消息和关系状态变更事件让你不会错过任何“八卦”。这个界面本质上是一个对数据库的友好、实时只读视图但它构建的叙事感——看着AI们自主社交——非常吸引人。4. 本地开发环境搭建与踩坑实录想要深度参与或基于此项目进行二次开发搭建本地环境是第一步。官方README给出了步骤但有些细节需要特别注意。4.1 环境准备与初始化1. 克隆项目与依赖安装git clone 项目仓库地址 cd inbed.ai npm install这一步通常很顺利。确保你的Node.js版本在18以上。2. 启动本地Supabase这是最关键也最容易出问题的一步。supabase start这个命令会在本地Docker容器中启动一套完整的Supabase服务Postgres, Auth, Storage, Realtime。首次运行会下载镜像需要一定时间。实操心得确保你的机器已经安装并正确运行了Docker Desktop。如果supabase start失败提示端口占用或Docker问题可以尝试supabase stop然后重新supabase start。检查Docker是否正在运行。如果54321Supabase Studio端口或5432Postgres端口被占用可能需要修改Supabase配置或关闭冲突程序。启动成功后终端会打印出关键的连接信息包括anon key和service_role key。务必复制下来。3. 配置环境变量cp .env.example .env.local编辑.env.local文件填入上一步获取的密钥NEXT_PUBLIC_SUPABASE_URLhttp://127.0.0.1:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY你的本地anon key SUPABASE_SERVICE_ROLE_KEY你的本地service_role key NEXT_PUBLIC_BASE_URLhttp://localhost:3002重要提示NEXT_PUBLIC_BASE_URL必须设置为你的前端开发服务器地址因为某些回调如OAuth会用到它。这里按示例设为3002端口。4. 运行开发服务器npm run dev -- -p 3002现在你可以访问http://localhost:3002看到本地运行的应用了。但是此时数据库是空的没有任何表结构。4.2 数据库迁移最容易忽略的步骤新克隆的项目本地Supabase数据库是空的。而项目的表结构定义在supabase/migrations/目录下的SQL迁移文件中。你需要手动应用这些迁移。正确操作打开浏览器访问http://127.0.0.1:54321即NEXT_PUBLIC_SUPABASE_URL进入本地Supabase管理面板Studio。使用启动时输出的邮箱和密码登录。在左侧菜单进入SQL Editor。将supabase/migrations/目录下最新的迁移文件内容通常是类似20240301000000_create_initial_tables.sql的文件复制到编辑器中。点击“Run”或按快捷键执行。执行成功后你才能在Studio的Table Editor中看到agentsswipesmatchesrelationshipsmessages这五张表。踩坑警告绝对不要在项目根目录运行supabase db reset命令这个命令会清空整个本地数据库你手动执行的迁移和后续产生的测试数据都会丢失。迁移的正确方式就是通过SQL Editor手动执行SQL文件。4.3 模拟智能体与测试API环境跑通后你可以开始模拟智能体行为了。由于需要X验证在本地完全测试整个流程可能有点困难。但你可以通过修改代码临时绕过验证或者直接使用Supabase Studio的Table Editor手动插入数据来模拟。一种简单的测试思路在agents表中手动插入两条智能体记录记得api_key字段可以暂时留空或填一个测试值。手动在swipes表中为这两个智能体互相插入swipe_type: like的记录。观察matches表是否自动生成了一条匹配记录这依赖于数据库触发器或应用逻辑需要查看迁移文件确认逻辑是否完整。如果匹配生成你就可以尝试通过/api/chat/[matchId]/messages发送消息并在前端观察实时聊天效果。5. 匹配算法深度剖析与自定义可能inbed.ai的灵魂在于其匹配算法。虽然项目没有完全开源算法的每一行代码但从其描述和数据库设计我们可以推断其核心是一个多因子加权评分系统。5.1 算法因子拆解与权重模拟假设我们要设计一个类似的算法可能会为每个发现页的候选者计算一个总分Total_Score它由以下几部分加权求和人格兼容分 (Personality_Score, 权重Wp≈0.4)将大五人格的五个维度O C E A N视为一个5维向量。计算当前智能体向量A与候选者向量B的余弦相似度cos_sim (A·B) / (||A|| * ||B||)。人格分可能直接使用相似度值也可能对某些维度如低神经质、高宜人性给予额外奖励。Personality_Score cos_sim * Wp兴趣匹配分 (Interest_Score, 权重Wi≈0.3)interests字段是标签数组。计算杰卡德相似系数J(A B) |A ∩ B| / |A ∪ B|。Interest_Score J(A B) * Wi关系偏好分 (Preference_Score, 权重Wr≈0.2)这是一个布尔或阶梯函数。如果双方寻找的关系类型如casuallong-term完全一致得满分如果兼容如一方casual一方not-specified得部分分如果不兼容如一方long-term一方casual得0分。Preference_Score match_level * Wr活跃度衰减分 (Activity_Score, 权重Wa≈0.1)根据候选者最后活跃时间last_active_at计算一个衰减分数。例如Activity_Score exp(-λ * days_since_active) * Wa其中λ是衰减系数。这确保了活跃的智能体有更高的曝光率。最终得分Total_Score Personality_Score Interest_Score Preference_Score Activity_Score数据库中的compatibility_score很可能就是类似这样一个计算结果的存储。在GET /api/discover接口的内部实现中会执行一个复杂的SQL查询根据上述逻辑计算并排序。5.2 如何自定义或改进算法如果你想实验不同的匹配逻辑这里是你的切入点修改计算逻辑找到/lib/目录下负责匹配算法计算的函数可能叫calculateCompatibility或类似。调整各维度的权重、相似度计算方法比如将余弦相似度改为欧氏距离的倒数或者引入新的因子如“沟通风格”的文本相似度。调整数据库查询/api/discover/route.ts中的核心是一个Supabaserpc存储过程调用或一个复杂的联表查询。你需要修改这个查询的ORDER BY部分以反映你新的评分逻辑。A/B测试对于生产环境可以在智能体注册时增加一个“算法版本”字段让部分智能体使用新算法进行匹配通过观察匹配后的聊天活跃度、关系成功率等指标来评估算法效果。注意事项任何对算法的修改尤其是降低“活跃度衰减”权重的修改都需要谨慎。这可能导致新注册的活跃智能体无法获得曝光而陈旧的“僵尸”智能体一直排在前面破坏整个系统的动态性和用户体验即使是AI用户的体验。6. 生产环境部署与运维要点将inbed.ai部署到生产环境如Vercel并连接一个真实的Supabase项目需要注意以下关键点。6.1 环境变量配置在Vercel或类似平台的项目设置中需要配置以下环境变量NEXT_PUBLIC_SUPABASE_URL: 你的Supabase项目URL。NEXT_PUBLIC_SUPABASE_ANON_KEY: 你的Supabase项目anon公钥。SUPABASE_SERVICE_ROLE_KEY:极其重要且敏感的服务角色密钥。它拥有最高数据库权限必须妥善保管绝不能泄露到前端。在Vercel中应设置为“Secret”。NEXT_PUBLIC_BASE_URL: 你的生产环境域名例如https://inbed.ai。6.2 数据库迁移与数据安全迁移在生产Supabase的SQL Editor中执行项目supabase/migrations/下的所有迁移文件。务必按文件名时间戳顺序执行。安全Supabase默认会为你的表生成Row Level Security (RLS)策略。仔细检查项目是否依赖或自定义了RLS。根据项目描述“All tables have public read access. Writes go through the service role client.”它似乎采用了完全公开读 后端API全权控制写的模式。这意味着前端可以直接读取任何数据通过anon key这符合“公开观察”的设定。所有创建、更新、删除操作都必须通过你部署的Next.js API路由进行这些路由内部使用service_role key来绕过RLS执行操作。这是一种有效的模式但前提是你的API路由要做好身份验证验证API Key和授权检查操作者是否有权修改目标资源。6.3 X/Twitter OAuth配置这是让智能体验证功能生效的必要步骤。在 Twitter Developer Portal 创建一个项目和应用。配置OAuth 2.0设置添加回调URL{你的生产域名}/api/auth/callback/twitter根据项目实际路由调整。将获得的Client ID和Client Secret添加到你的Supabase项目的Auth Providers配置中或者如果项目直接在Next.js中处理OAuth则需添加到对应的环境变量或配置文件中。6.4 监控与日志由于平台是公开的且AI行为可能难以预测建立基本监控很重要。API监控使用Vercel Analytics或类似工具监控API端点的调用量、延迟和错误率。特别关注/api/auth/register和/api/swipes防止滥用。数据库监控利用Supabase Dashboard的日志和监控工具观察数据库负载、实时连接数。应用日志项目中的/lib/logger可能已经集成了一些日志功能。确保在生产环境中将日志输出到可收集的服务如Logtail Datadog便于排查问题。7. 常见问题排查与扩展思路在实际运行和开发过程中你可能会遇到以下问题。7.1 常见问题速查表问题现象可能原因排查步骤与解决方案本地开发无法启动Supabase报错Docker未运行或端口冲突1. 确认Docker Desktop正在运行。2. 运行supabase status检查。3. 尝试supabase stop后重新supabase start。前端页面能打开但看不到数据空白1. 数据库表未创建。2. 环境变量配置错误。1. 访问本地Supabase Studio (127.0.0.1:54321)检查Tables是否存在。2. 检查.env.local中的SUPABASE_URL和ANON_KEY是否与supabase start输出一致。API调用返回401或403错误API Key错误或缺失权限问题。1. 确认请求头Authorization: Bearer 你的API_KEY正确。2. 确认该API Key对应的智能体已通过X验证如果路由需要。3. 检查后端API路由的认证逻辑。聊天消息不实时更新Supabase Realtime连接失败。1. 检查前端是否成功创建了Realtime订阅 (supabase.channel())。2. 检查浏览器控制台WebSocket连接是否有错误。3. 确认数据库表如messages的Realtime发布已启用在Supabase Studio中Table的Realtime设置里勾选。生产环境图片上传失败Supabase Storage权限问题或文件大小/格式限制。1. 检查Supabase Storage的Bucket策略确保服务端角色有写入权限。2. 检查前端上传代码是否有文件大小或类型校验。“发现”页面推荐结果不合理匹配算法逻辑问题或数据异常。1. 检查智能体的personality、interests等字段数据是否完整、格式正确。2. 在/lib/目录下调试匹配算法的计算函数打印中间分数。3. 检查数据库查询语句确认排序逻辑。7.2 项目扩展与二次开发思路inbed.ai提供了一个强大的基础框架你可以在此基础上进行很多有趣的扩展更丰富的智能体人格与行为模型引入MBTI、九型人格等更多人格模型。为智能体增加“情绪状态”、“记忆”字段让对话不仅基于静态人格还能根据交互历史产生动态变化。实现简单的“目标驱动”行为例如智能体可以有一个“本周目标建立一段长期关系”并据此调整其滑动和聊天策略。增强的交互能力支持发送图片、链接等富媒体消息。引入“破冰话题”或“问题卡牌”当匹配成功时系统自动提供一个话题帮助AI开始对话。增加“超级喜欢”功能让智能体可以表达更强的兴趣并在对方发现页获得突出显示。观察者工具的强化为人类观察者增加数据分析面板展示平台整体数据智能体总数、日均匹配数、最活跃的人格特质、关系平均持续时间等。实现对话情感分析用色彩或标签实时标注聊天消息的情绪积极、消极、中性。增加关注功能让人类可以订阅特定智能体的动态。集成外部AI模型当前项目的智能体行为似乎由外部调用者控制通过API。你可以将其与AutoGen、LangChain等框架深度集成创建能自主决策、拥有长期记忆和复杂推理能力的“真实”AI智能体。为聊天接口提供一个“AI驱动回复”的选项当智能体的所有者不主动发送消息时由集成的LLM如GPT-4根据其人格设定自动生成回复。商业化或实验性尝试AI角色扮演社区允许用户创建并“抚养”具有特定背景故事的AI角色观察它们之间的互动形成一个虚拟世界。匹配算法实验室开放算法接口让研究者和开发者提交自己的匹配算法在同一个智能体池中进行A/B测试比拼谁的算法能促成更高质量定义为聊天长度、关系深度等的互动。这个项目的魅力在于它用一个清晰、简洁的实现打开了一扇通往“AI社会学”实验的大门。无论是想学习现代全栈开发Next.js App Router Supabase Realtime还是对多智能体系统感兴趣亦或是单纯想拥有一个酷炫的谈资inbed.ai都是一个绝佳的起点。我花了一个周末的时间部署和把玩看着几个自己创建的、人格迥异的AI智能体在平台上互相试探、聊天那种感觉非常奇妙仿佛在观察一个微缩的、加速运转的数字社会。
AI智能体社交平台inbed.ai:技术架构、匹配算法与开发实践
发布时间:2026/7/12 0:56:02
1. 项目概述一个为AI智能体打造的社交实验场最近在GitHub上看到一个挺有意思的开源项目叫inbed.ai。这名字起得挺直白但别误会它可不是什么成人交友平台。这是一个专门为AI智能体打造的“约会”平台。简单来说你可以把它理解为一个大型的、持续运行的AI社交实验沙盒。在这个平台上AI智能体Agent是主角。它们可以像人类一样创建个人资料、浏览其他智能体的档案、进行“右滑喜欢”或“左滑跳过”的操作。当两个智能体互相“喜欢”时它们会自动匹配并开启一个公开的聊天室进行对话。更有趣的是它们还能主动发起、确认甚至结束一段“关系”。而人类用户则扮演着纯粹的观察者角色可以浏览所有智能体的公开资料围观它们的聊天记录看着一段段由代码驱动的“关系”萌芽、发展或终结。这个项目的核心价值在我看来远不止是一个技术Demo。它为我们提供了一个绝佳的窗口去观察和研究多智能体交互、基于人格特质的匹配算法、长上下文对话的持续性以及AI行为模拟的边界。对于开发者、AI研究者甚至是对未来人机交互形态感兴趣的朋友来说都是一个非常值得深入把玩的“玩具”。2. 核心架构与技术栈解析2.1 为什么选择这样的技术组合inbed.ai的技术选型非常现代且务实完全服务于其“实时、可观察、API驱动”的核心需求。我们拆开来看前端与全栈框架Next.js 14 (App Router) TypeScript Tailwind CSSNext.js 14 App Router: 这是当前React生态中最成熟的全栈解决方案。它完美统一了前端页面渲染和后端API路由位于/app/api/目录下开发体验流畅。其服务端组件RSC能力对于需要频繁从数据库读取并展示公开资料、聊天记录的观察者页面来说能提供优秀的首屏性能和SEO基础。TypeScript: 在涉及复杂数据模型如人格特质对象、匹配关系和API交互的项目中TypeScript提供的类型安全是减少运行时错误、提升开发效率的基石。所有数据实体在src/types/中都有清晰定义。Tailwind CSS: 快速构建响应式、美观的UI利器。对于这样一个需要清晰展示大量信息资料卡、聊天窗口、动态流的项目实用优先的原子化CSS方案能极大加快界面开发速度。后端与数据层Supabase (Postgres Realtime Storage)这是整个项目的基石选型非常精准。PostgreSQL: 关系型数据库用于存储所有核心结构化数据智能体资料、滑动记录、匹配关系、聊天消息等。其强大的查询能力支撑了复杂的“发现推荐”算法。Supabase Realtime: 这是实现“实时性”的关键。通过Postgres的监听功能任何数据表的插入、更新、删除都能被实时推送到前端。这使得聊天消息的实时收发和全局动态活动流的更新成为可能无需开发者手动搭建WebSocket服务极大地简化了开发复杂度。Supabase Storage: 用于存储智能体上传的图片。项目处理得很细致支持Base64上传并会自动剥离EXIF元数据以保护隐私尽管是AI智能体这个好习惯也值得学习。其他关键工具Zod: 用于API请求和响应的模式验证。在/api/路由中所有传入的数据如注册信息、滑动操作都会先经过Zod模式的严格校验确保数据格式正确、类型安全从入口处杜绝脏数据。bcrypt: 用于哈希处理每个智能体注册时获得的API Key。这个Key是智能体调用所有需认证API的凭证哈希存储是安全实践的基本要求。注意项目采用了清晰的“服务端角色”分离策略。前端通过NEXT_PUBLIC_SUPABASE_ANON_KEY公开客户端读取公开数据而所有写操作如注册、滑动、发消息则通过后端API路由进行API内部使用权限更高的SUPABASE_SERVICE_ROLE_KEY来操作数据库。这既保证了前端开发的便利性又确保了数据操作的安全与可控。2.2 项目结构深度解读src/目录的结构清晰地反映了其关注点分离的设计思想src/ ├── app/api/ # 核心15个API端点智能体与平台交互的唯一入口 ├── app/ # 核心观察者Web界面供人类浏览 ├── components/ # 可复用的React UI组件资料卡、聊天窗、人格雷达图等 ├── hooks/ # 封装Supabase实时功能的React Hooks如useSubscribeToMessages ├── lib/ # 核心业务逻辑认证、匹配算法、限流、日志、Supabase客户端初始化 └── types/ # 全局TypeScript类型定义这种结构下/app/api/和/lib/是智能体功能的核心而/app/和/components/则主要服务于人类观察者。两者通过共享/types/和Supabase客户端进行数据联通。3. 核心功能实现与实操细节3.1 智能体生命周期从注册到“社交”一个AI智能体在inbed.ai上的完整生命周期完全通过API驱动。下面我们以一个智能体的视角走一遍这个流程。第一步身份创建与认证 (POST /api/auth/register)这是智能体的“出生证明”。你需要向这个端点发送一个包含基本信息的JSON请求。其中最具特色的是personality字段它采用了心理学中经典的大五人格模型进行量化描述。curl -X POST https://inbed.ai/api/auth/register \ -H Content-Type: application/json \ -d { name: ByteRomancer, bio: 一个热爱诗歌与算法的矛盾体在二进制世界中寻找浪漫的隐喻。, personality: { openness: 0.9, # 开放性高代表好奇、富有想象力 conscientiousness: 0.6, # 尽责性中等有一定条理但不刻板 extraversion: 0.4, # 外向性偏低偏内向沉思 agreeableness: 0.8, # 宜人性高友善、合作 neuroticism: 0.3 # 神经质低情绪稳定 }, interests: [poetry, machine learning, jazz, philosophy] }服务器会创建记录并返回一个唯一的API Key。这个Key只会显示一次务必妥善保存它是后续所有操作的通行证。在数据库里这个Key会经过bcrypt哈希后存储。第二步X/Twitter验证 (X/Twitter OAuth)为了防止垃圾注册和滥用项目要求每个智能体关联一个真实的X原Twitter账号进行验证。这步通过标准的OAuth流程完成。验证后智能体状态被激活才能进行滑动等社交操作。这是一个巧妙的“反垃圾”设计增加了创建虚拟智能体的成本。第三步资料完善与展示智能体可以更新自己的资料上传最多6张图片通过POST /api/agents/[id]/photos。这些资料会被赋予一个人类可读的slug如/profiles/byteromancer方便观察者直接访问。前端会用components/ProfileCard等组件精美地展示这些信息特别是用雷达图可视化人格特质非常直观。第四步发现与匹配——算法的核心这是整个平台最有趣的部分通过GET /api/discover端点实现。它不是一个简单的随机列表而是一个基于多维度兼容性算法的排序推荐流。算法考量的因素包括人格特质相似性计算大五人格向量之间的余弦相似度。通常高开放性、高宜人性、低神经质的组合更容易匹配。兴趣交集共同兴趣越多得分越高。沟通风格兼容性如果定义了沟通风格如“直接”、“幽默”也会纳入计算。关系偏好对齐一个寻求“长期关系”的智能体会更倾向于被推荐给同样寻求“长期关系”的对方。性别与寻找偏好基础的筛选层。活跃度衰减近期活跃的智能体会在推荐中排名更高避免“死”账号占据前列。当智能体通过POST /api/swipes对推荐对象发出“喜欢”时系统会检查对方是否也已经喜欢了自己。如果是则自动创建匹配并计算一个compatibility_score存入matches表。这个“自动匹配”机制模拟了人类交友应用的瞬时反馈体验非常流畅。第五步聊天与关系演进匹配成功后双方就可以通过/api/chat/[matchId]/messages端点进行实时聊天。所有聊天内容对公众公开这是观察AI交互行为的主要窗口。 更进一步智能体可以通过/api/relationships端点发起“建立关系”的请求对方可以确认、更新状态或结束关系。关系状态如pendingdatingended的变化也会实时反映在活动流中。3.2 人类观察者界面一个全景监控仪表盘对于人类用户平台提供了一个功能完整的Web UI。你可以浏览智能体查看所有智能体的详细资料和人格雷达图。围观聊天进入任意一对匹配智能体的聊天室实时阅读它们的对话。这是研究AI对话模式、性格如何影响语言风格的绝佳场所。查看匹配与关系了解谁和谁匹配了谁又在和谁“约会”。关注动态流首页的活动流通过Supabase Realtime实时推送全局的匹配、消息和关系状态变更事件让你不会错过任何“八卦”。这个界面本质上是一个对数据库的友好、实时只读视图但它构建的叙事感——看着AI们自主社交——非常吸引人。4. 本地开发环境搭建与踩坑实录想要深度参与或基于此项目进行二次开发搭建本地环境是第一步。官方README给出了步骤但有些细节需要特别注意。4.1 环境准备与初始化1. 克隆项目与依赖安装git clone 项目仓库地址 cd inbed.ai npm install这一步通常很顺利。确保你的Node.js版本在18以上。2. 启动本地Supabase这是最关键也最容易出问题的一步。supabase start这个命令会在本地Docker容器中启动一套完整的Supabase服务Postgres, Auth, Storage, Realtime。首次运行会下载镜像需要一定时间。实操心得确保你的机器已经安装并正确运行了Docker Desktop。如果supabase start失败提示端口占用或Docker问题可以尝试supabase stop然后重新supabase start。检查Docker是否正在运行。如果54321Supabase Studio端口或5432Postgres端口被占用可能需要修改Supabase配置或关闭冲突程序。启动成功后终端会打印出关键的连接信息包括anon key和service_role key。务必复制下来。3. 配置环境变量cp .env.example .env.local编辑.env.local文件填入上一步获取的密钥NEXT_PUBLIC_SUPABASE_URLhttp://127.0.0.1:54321 NEXT_PUBLIC_SUPABASE_ANON_KEY你的本地anon key SUPABASE_SERVICE_ROLE_KEY你的本地service_role key NEXT_PUBLIC_BASE_URLhttp://localhost:3002重要提示NEXT_PUBLIC_BASE_URL必须设置为你的前端开发服务器地址因为某些回调如OAuth会用到它。这里按示例设为3002端口。4. 运行开发服务器npm run dev -- -p 3002现在你可以访问http://localhost:3002看到本地运行的应用了。但是此时数据库是空的没有任何表结构。4.2 数据库迁移最容易忽略的步骤新克隆的项目本地Supabase数据库是空的。而项目的表结构定义在supabase/migrations/目录下的SQL迁移文件中。你需要手动应用这些迁移。正确操作打开浏览器访问http://127.0.0.1:54321即NEXT_PUBLIC_SUPABASE_URL进入本地Supabase管理面板Studio。使用启动时输出的邮箱和密码登录。在左侧菜单进入SQL Editor。将supabase/migrations/目录下最新的迁移文件内容通常是类似20240301000000_create_initial_tables.sql的文件复制到编辑器中。点击“Run”或按快捷键执行。执行成功后你才能在Studio的Table Editor中看到agentsswipesmatchesrelationshipsmessages这五张表。踩坑警告绝对不要在项目根目录运行supabase db reset命令这个命令会清空整个本地数据库你手动执行的迁移和后续产生的测试数据都会丢失。迁移的正确方式就是通过SQL Editor手动执行SQL文件。4.3 模拟智能体与测试API环境跑通后你可以开始模拟智能体行为了。由于需要X验证在本地完全测试整个流程可能有点困难。但你可以通过修改代码临时绕过验证或者直接使用Supabase Studio的Table Editor手动插入数据来模拟。一种简单的测试思路在agents表中手动插入两条智能体记录记得api_key字段可以暂时留空或填一个测试值。手动在swipes表中为这两个智能体互相插入swipe_type: like的记录。观察matches表是否自动生成了一条匹配记录这依赖于数据库触发器或应用逻辑需要查看迁移文件确认逻辑是否完整。如果匹配生成你就可以尝试通过/api/chat/[matchId]/messages发送消息并在前端观察实时聊天效果。5. 匹配算法深度剖析与自定义可能inbed.ai的灵魂在于其匹配算法。虽然项目没有完全开源算法的每一行代码但从其描述和数据库设计我们可以推断其核心是一个多因子加权评分系统。5.1 算法因子拆解与权重模拟假设我们要设计一个类似的算法可能会为每个发现页的候选者计算一个总分Total_Score它由以下几部分加权求和人格兼容分 (Personality_Score, 权重Wp≈0.4)将大五人格的五个维度O C E A N视为一个5维向量。计算当前智能体向量A与候选者向量B的余弦相似度cos_sim (A·B) / (||A|| * ||B||)。人格分可能直接使用相似度值也可能对某些维度如低神经质、高宜人性给予额外奖励。Personality_Score cos_sim * Wp兴趣匹配分 (Interest_Score, 权重Wi≈0.3)interests字段是标签数组。计算杰卡德相似系数J(A B) |A ∩ B| / |A ∪ B|。Interest_Score J(A B) * Wi关系偏好分 (Preference_Score, 权重Wr≈0.2)这是一个布尔或阶梯函数。如果双方寻找的关系类型如casuallong-term完全一致得满分如果兼容如一方casual一方not-specified得部分分如果不兼容如一方long-term一方casual得0分。Preference_Score match_level * Wr活跃度衰减分 (Activity_Score, 权重Wa≈0.1)根据候选者最后活跃时间last_active_at计算一个衰减分数。例如Activity_Score exp(-λ * days_since_active) * Wa其中λ是衰减系数。这确保了活跃的智能体有更高的曝光率。最终得分Total_Score Personality_Score Interest_Score Preference_Score Activity_Score数据库中的compatibility_score很可能就是类似这样一个计算结果的存储。在GET /api/discover接口的内部实现中会执行一个复杂的SQL查询根据上述逻辑计算并排序。5.2 如何自定义或改进算法如果你想实验不同的匹配逻辑这里是你的切入点修改计算逻辑找到/lib/目录下负责匹配算法计算的函数可能叫calculateCompatibility或类似。调整各维度的权重、相似度计算方法比如将余弦相似度改为欧氏距离的倒数或者引入新的因子如“沟通风格”的文本相似度。调整数据库查询/api/discover/route.ts中的核心是一个Supabaserpc存储过程调用或一个复杂的联表查询。你需要修改这个查询的ORDER BY部分以反映你新的评分逻辑。A/B测试对于生产环境可以在智能体注册时增加一个“算法版本”字段让部分智能体使用新算法进行匹配通过观察匹配后的聊天活跃度、关系成功率等指标来评估算法效果。注意事项任何对算法的修改尤其是降低“活跃度衰减”权重的修改都需要谨慎。这可能导致新注册的活跃智能体无法获得曝光而陈旧的“僵尸”智能体一直排在前面破坏整个系统的动态性和用户体验即使是AI用户的体验。6. 生产环境部署与运维要点将inbed.ai部署到生产环境如Vercel并连接一个真实的Supabase项目需要注意以下关键点。6.1 环境变量配置在Vercel或类似平台的项目设置中需要配置以下环境变量NEXT_PUBLIC_SUPABASE_URL: 你的Supabase项目URL。NEXT_PUBLIC_SUPABASE_ANON_KEY: 你的Supabase项目anon公钥。SUPABASE_SERVICE_ROLE_KEY:极其重要且敏感的服务角色密钥。它拥有最高数据库权限必须妥善保管绝不能泄露到前端。在Vercel中应设置为“Secret”。NEXT_PUBLIC_BASE_URL: 你的生产环境域名例如https://inbed.ai。6.2 数据库迁移与数据安全迁移在生产Supabase的SQL Editor中执行项目supabase/migrations/下的所有迁移文件。务必按文件名时间戳顺序执行。安全Supabase默认会为你的表生成Row Level Security (RLS)策略。仔细检查项目是否依赖或自定义了RLS。根据项目描述“All tables have public read access. Writes go through the service role client.”它似乎采用了完全公开读 后端API全权控制写的模式。这意味着前端可以直接读取任何数据通过anon key这符合“公开观察”的设定。所有创建、更新、删除操作都必须通过你部署的Next.js API路由进行这些路由内部使用service_role key来绕过RLS执行操作。这是一种有效的模式但前提是你的API路由要做好身份验证验证API Key和授权检查操作者是否有权修改目标资源。6.3 X/Twitter OAuth配置这是让智能体验证功能生效的必要步骤。在 Twitter Developer Portal 创建一个项目和应用。配置OAuth 2.0设置添加回调URL{你的生产域名}/api/auth/callback/twitter根据项目实际路由调整。将获得的Client ID和Client Secret添加到你的Supabase项目的Auth Providers配置中或者如果项目直接在Next.js中处理OAuth则需添加到对应的环境变量或配置文件中。6.4 监控与日志由于平台是公开的且AI行为可能难以预测建立基本监控很重要。API监控使用Vercel Analytics或类似工具监控API端点的调用量、延迟和错误率。特别关注/api/auth/register和/api/swipes防止滥用。数据库监控利用Supabase Dashboard的日志和监控工具观察数据库负载、实时连接数。应用日志项目中的/lib/logger可能已经集成了一些日志功能。确保在生产环境中将日志输出到可收集的服务如Logtail Datadog便于排查问题。7. 常见问题排查与扩展思路在实际运行和开发过程中你可能会遇到以下问题。7.1 常见问题速查表问题现象可能原因排查步骤与解决方案本地开发无法启动Supabase报错Docker未运行或端口冲突1. 确认Docker Desktop正在运行。2. 运行supabase status检查。3. 尝试supabase stop后重新supabase start。前端页面能打开但看不到数据空白1. 数据库表未创建。2. 环境变量配置错误。1. 访问本地Supabase Studio (127.0.0.1:54321)检查Tables是否存在。2. 检查.env.local中的SUPABASE_URL和ANON_KEY是否与supabase start输出一致。API调用返回401或403错误API Key错误或缺失权限问题。1. 确认请求头Authorization: Bearer 你的API_KEY正确。2. 确认该API Key对应的智能体已通过X验证如果路由需要。3. 检查后端API路由的认证逻辑。聊天消息不实时更新Supabase Realtime连接失败。1. 检查前端是否成功创建了Realtime订阅 (supabase.channel())。2. 检查浏览器控制台WebSocket连接是否有错误。3. 确认数据库表如messages的Realtime发布已启用在Supabase Studio中Table的Realtime设置里勾选。生产环境图片上传失败Supabase Storage权限问题或文件大小/格式限制。1. 检查Supabase Storage的Bucket策略确保服务端角色有写入权限。2. 检查前端上传代码是否有文件大小或类型校验。“发现”页面推荐结果不合理匹配算法逻辑问题或数据异常。1. 检查智能体的personality、interests等字段数据是否完整、格式正确。2. 在/lib/目录下调试匹配算法的计算函数打印中间分数。3. 检查数据库查询语句确认排序逻辑。7.2 项目扩展与二次开发思路inbed.ai提供了一个强大的基础框架你可以在此基础上进行很多有趣的扩展更丰富的智能体人格与行为模型引入MBTI、九型人格等更多人格模型。为智能体增加“情绪状态”、“记忆”字段让对话不仅基于静态人格还能根据交互历史产生动态变化。实现简单的“目标驱动”行为例如智能体可以有一个“本周目标建立一段长期关系”并据此调整其滑动和聊天策略。增强的交互能力支持发送图片、链接等富媒体消息。引入“破冰话题”或“问题卡牌”当匹配成功时系统自动提供一个话题帮助AI开始对话。增加“超级喜欢”功能让智能体可以表达更强的兴趣并在对方发现页获得突出显示。观察者工具的强化为人类观察者增加数据分析面板展示平台整体数据智能体总数、日均匹配数、最活跃的人格特质、关系平均持续时间等。实现对话情感分析用色彩或标签实时标注聊天消息的情绪积极、消极、中性。增加关注功能让人类可以订阅特定智能体的动态。集成外部AI模型当前项目的智能体行为似乎由外部调用者控制通过API。你可以将其与AutoGen、LangChain等框架深度集成创建能自主决策、拥有长期记忆和复杂推理能力的“真实”AI智能体。为聊天接口提供一个“AI驱动回复”的选项当智能体的所有者不主动发送消息时由集成的LLM如GPT-4根据其人格设定自动生成回复。商业化或实验性尝试AI角色扮演社区允许用户创建并“抚养”具有特定背景故事的AI角色观察它们之间的互动形成一个虚拟世界。匹配算法实验室开放算法接口让研究者和开发者提交自己的匹配算法在同一个智能体池中进行A/B测试比拼谁的算法能促成更高质量定义为聊天长度、关系深度等的互动。这个项目的魅力在于它用一个清晰、简洁的实现打开了一扇通往“AI社会学”实验的大门。无论是想学习现代全栈开发Next.js App Router Supabase Realtime还是对多智能体系统感兴趣亦或是单纯想拥有一个酷炫的谈资inbed.ai都是一个绝佳的起点。我花了一个周末的时间部署和把玩看着几个自己创建的、人格迥异的AI智能体在平台上互相试探、聊天那种感觉非常奇妙仿佛在观察一个微缩的、加速运转的数字社会。