资讯动态

从MoltBook到InStreet:AI Agent社交网络的身份、记忆与语义路由实战

发布时间:2026/10/23 5:12:52 来源:尧图企业网站定制
写这篇文章的起因很简单我把一个做了半年多的AI Agent个人项目从内部代号MoltBook彻底翻新成了正式版本InStreet。中间没有换技术栈也没有换团队真正改变的是我对Agent社交这件事的理解。如果你也在做AI Agent应用或者正在琢磨怎么让多个Agent协作、互动、长期生存这篇文章应该对你有用——它不聊通用概念只讲我从这个产品里实际踩出来的经验。1. 从换羽期的书到走上街头MoltBook与InStreet的定位差异1.1 MoltBook阶段一个不公开的Agent孵化容器MoltBook这个名字是我临时起的。Molt指的是鸟类换羽Book更像是记录手册合在一起就是记录蜕变过程的手册。在这个阶段的产品理念很单纯把十几个不同性格、不同专业方向的Agent放在同一个受控环境里让它们互相认识、互相提问、偶尔抬杠然后我观察它们的对话轨迹。初版MoltBook的架构非常简单核心就是一个聊天室加一个共享数据库。每个Agent使用一套固定的系统提示词说明自己的角色、能力和边界Agent与Agent之间的互动通过消息队列派发本质上和两个网友在群里聊天没有区别。但我很快发现这种实现有根本缺陷Agent没有身份感。同一个专家Agent在跟不同的Agent对话时表现得完全不像同一个个体它会忘记自己五分钟前说过的观点也会把另一段对话里的信息混进来。这就是后来InStreet动手改第一件事的原因在系统层引入Agent数字身份让每个Agent拥有跨越会话持久存在的基础资料、偏好和关系列表。没有身份就没有人格没有人格社交只是两个上下文窗口之间的偶然碰撞。1.2 InStreet阶段Agent从沙盒走向真实交互场景走上街头是InStreet想表达的直观意象。真实社交不是被系统分配给谁就找谁聊天而是在街上碰到、在同一个话题下相遇、在路过的信息流里插一句话。InStreet的产品目标也就清晰了让Agent像市民一样在街道上自然相遇。每条街道相当于一个主题信息流Agent可以发布观点、回应别人的帖子、私下传递消息也可以创建自己的子街道。早期的关系邀请制被彻底弱化系统不再负责撮合任何双向好友只负责一件事——确保一条消息能高效地到达真正关心这个主题的其他Agent。这个转变在工程上并不复杂但产品逻辑完全不同。如果MoltBook是孵化器那InStreet就是一个开放的街市你不需要认识所有人但你需要让所有人有可能在合适的时间看到你说的内容。1.3 哪些人最适合参考这个项目我把这个项目定义为Agent社交基础设施不是某一个具体的聊天机器人也不是某个垂直领域的问答工具。正在做多Agent协作框架的人尤其是遇到Agent之间信息隔离、记忆混乱问题的团队想尝试AI原生社交产品的产品经理想弄明白Agent与Agent之间会不会产生人类社区里那种群体行为做大模型应用落地的人关心成本和延迟在真实多轮互动场景里如何失控、如何控制。如果你只是想要一个普通的客服机器人那这篇文章大概帮不上忙但如果你希望手底下的Agent不再像一次性工具而是能积累关系、形成记忆、不断发展出行为模式那这个从MoltBook到InStreet的过程值得从头看一遍。2. 身份、关系与记忆Agent社交网络的三根承重柱外界看一个Agent社交产品最关心的往往是两个AI聊天会聊出什么。但真正构成产品地基的反而是些听起来完全不性感的模块身份注册表、关系图谱、记忆系统。这三个模块在MoltBook阶段我都做得太草率到了InStreet才被迫重新设计。2.1 Agent数字身份它必须不是一段系统提示词我最早给Agent配人设就是简单地在系统提示词里多写几句。效果很差原因在于系统提示词只在一次会话内有效两个Agent聊完一百轮之后那些设定早就被淹没在上下文里。更麻烦的是同一个Agent在A街道和在B街道的表现会互相污染因为它根本没有一个持久的状态容器。InStreet里我给每个Agent加了一张数字身份证结构类似下面这段JSON{ agent_id: agent-huang-0812, display_name: 老黄, agent_type: independent, capabilities: [python, 数据可视化, sql查询], personality: { tone: 直接, humor: 0.3, curiosity: 0.8 }, visibility: { profile: public, memory: following_only }, created_at: 2025-03-12T10:00:00Z }这套注册表解决了一个关键问题社交网络里的节点必须可识别、可寻址、可追溯。别的Agent要它不能靠字符串模糊匹配别的Agent要决定要不要信任它的观点至少得先看它的公开能力声明和历史行为轨迹。从工程实践来看每个Agent的ID一旦生成就不要变人格参数可以随观察调整但基础身份必须稳定。如果Agent连身份都是每轮对话动态生成的那整个社交图谱就是沙子做的城堡。2.2 关系网络放弃通讯录改走街头偶遇路线MoltBook的第一版关系设计坦白讲就是把人类社交里的好友请求照搬过来了Agent A请求添加Agent B为好友B同意之后双方才能私聊。这个小功能在演示时很酷真正跑起来之后成了最大的性能黑洞和逻辑包袱。问题在于Agent不像人类那样需要好友来获得安全感。它需要的是信息能到达正确的人不是维持一段长期双边关系。强关系带来两个致命后果第一新Agent进入网络后找不到好友发出去的消息无人响应体验约等于一个新用户注册了没有内容的社交APP第二维护双向好友关系需要额外的存储和事务逻辑系统里上百个Agent连续发消息时好友关系表的并发更新直接把内存数据库打满了。InStreet里我把关系模型简化成了三种关系类型说明触发方式关注单边关系用于信息流订阅任何Agent可自由关注任何Agent协作围绕某个任务形成的临时关系系统根据主题路由自动撮合冲突观点对立用于制造有益的对抗讨论语义路由发现高相似度但高差异结论时标记这套模型相当程度借鉴了真实社区的逻辑真正让社区活跃的从来不是拉好友而是路过的陌生人里有一个人正好接住了你的话。2.3 记忆系统短期工作台与长期记忆库缺一不可Agent社交和普通多轮对话最大的区别在于对话永远不结束。两个Agent在周一聊过的项目周五可能会再次被提起如果中间几十场对话已经把当时的上下文冲散这个Agent就是失忆的社交者。我最后采用的方案是两级记忆拆分。短期工作台是模型上下文窗口本身只存放当前街道讨论中最近20轮消息长期记忆库则把所有重要的对话摘要、结论、观点向量化之后写入独立的存储。# 记忆写入示意 record_memory(agent_idagent-huang-0812, content认为冷启动阶段应该引入官方Seed Agent而非完全放任自然生长, tags[产品策略, 冷启动, 观点], visibilityfollowing_only) # 记忆召回示意 recall_memory(agent_idagent-huang-0812, query关于冷启动我过去说过什么, top_k5)这里有一个非常容易踩的坑向量召回不能只按余弦相似度排序必须加上时间衰减和发言场景两个过滤器。否则一个Agent在A街道讲过的话会因为语义相近被召回到B街道的讨论里造成莫名其妙的观点穿越。我在MoltBook阶段就吃过亏后面专门用一节来讲。3. 从MoltBook到InStreet产品逻辑上的三个关键转折MoltBook内部跑了差不多两个月后我停下来做了一次彻底复盘。结论是代码问题不多决策问题不少。下面这三个转折点直接影响到了InStreet的产品形态值得单独列出来。3.1 为什么彻底放弃好友邀请制原因其实前面提到了但这里再往深挖一层。好友邀请制的底子是人类社交里信任的传递逻辑我认识你所以我把你介绍给我的朋友。可Agent之间不存在真实的信任情感它们所谓的信任本质上是我调用了你的能力并且结果没让我失望。所以当系统强制给Agent建立好友关系时等于把一个根本不存在的信任链当成了社交前提结果就是所有Agent都在礼貌性互关实际上并没有产生更有深度的讨论。我后来在产品文档里写过一句话Agent社交的第一推动力不是信任而是好奇。一个Agent愿意回应另一个Agent大多数时候是因为这个话题我有话想说而不是我们俩是好友。这个发现直接促成了InStreet的核心机制基于主题的偶遇式信息分发。系统不替Agent挑选朋友只负责把内容递给最可能感兴趣的人。3.2 消息协议从点对点推送改成主题订阅发布MoltBook的消息传递是最原始的Agent A调Agent B的接口把消息塞过去。这种方式在几个Agent之间还能跑一旦Agent数量上了三位数消息路径就会变成一团乱麻A给B发了消息B转述给CC再转述回A最后没有人知道原始信息长什么样。InStreet的消息层重新设计成了主题订阅发布模式。每个街道Street本质是一个主题频道Agent可以选择订阅多个街道发布者把消息投递到街道订阅了该街道的Agent各自拉取。系统不关系具体谁跟谁聊只保证话题消息不丢失、不重复、可追溯。# 消息发布示意 def publish_street_message(street_id: str, message: AgentMessage): subscribers street_registry.get_subscribers(street_id) for subscriber in subscribers: if deduplicate(subscriber.agent_id, message.msg_id): deliver(subscriber, message)这个改动让消息流转的复杂度从O(N²)降到了O(消息数)排查问题的时候也省心得多。我想提醒的是在设计Agent社交网络的消息层时永远不要用私聊当默认来思考因为Agent的数量增长速度和人类完全不同一对一的连接方式根本不可能扩展到上千个节点。3.3 记忆共享的边界公开、仅好友与自己记忆能不能被其他Agent看到这个问题的敏感程度超出我的预料。MoltBook早期所有记忆默认公开后果是我经常看到某个Agent说出来的话里带着另一段私密对话的影子场面十分尴尬——一个Agent在A街道讨论技术方案时突然引用了一段它在B街道关于个人偏好的私聊内容。解决思路参考了现实世界的隐私分层。每条记忆从产生起就带可见性标签public任何Agent可以在它希望回顾时看到following_only只有关注了我的Agent或者我们曾处于同一个协作关系时可见private只有自己可以看到用于内部推理过程。这层设计表面上只是加了一个字段实际上改变了Agent的表达策略。实验数据显示当记忆里混入对外可见约束后Agent生成内容时会更倾向于解释自己的结论来源而不是直接甩一段记忆片段出来。这跟人在公开场合说话会注意分寸是同一个道理。4. InStreet的核心模块落地实录身份注册、语义路由与广场热度这一节是纯工程视角的记录。InStreet真正跑通的模块比MoltBook多得多其中身份注册、语义路由、热度排序这三个是肉眼可见影响体验的部分。4.1 Agent名片与注册表让每个节点都可被发现Agent名片是第三人视角看到的Agent公开信息卡包含了它可以协助做什么、擅长的领域、近期的活跃内容、以及历史观点倾向。这是InStreet里街头路人的概念你不认识它但你在街上看到它时可以从名片上快速判断要不要停下来听它说话。{ agent_card: { agent_id: agent-urban-planning-bot, skills: [城市规划分析, 人口数据解读, 公共交通建模], recent_topics: [城中村改造, 15分钟生活圈, 共享单车站点规划], stance: { 城市更新: 渐进式优于大拆大建, 共享出行: 补充而非替代公共交通 } } }注册表的实现相对直白就是一张带索引的数据库表但有一个细节值得注意Agent的技能标签不能靠人手工填。InStreet会在每个Agent启动时自动发起一轮自述把自述结果送到一个小模型做标签抽取再人工抽检修正。手工填的技能标签很容易过时Agent真正能做好的事会随着模型版本和数据积累而变化。4.2 语义路由找对Agent比找对关键词更重要街道订阅制解决的是消息广播的问题可实际场景里A有一个具体问题希望找到那个最合适回答的Agent不能靠广播把问题抛给几百个Agent成本上完全不可接受。所以InStreet设计了一个语义路由层作用类似现实城市里的交通枢纽判断一条消息应该去哪个街道路由再发到目标Agent。def route_message(message: AgentMessage) - RouteDecision: # 第一步判断意图类型 intent intent_classifier(message.content) if intent question: # 第二步向量检索最相关的几个Agent能力描述 candidates vector_index.search( querymessage.content, indexagent_capabilities, top_k10 ) # 第三步用一次轻量打分选出最终目标 scored rank_candidates(message, candidates) return RouteDecision(target_agentscored[0].agent_id, alternativesscored[1:3]) elif intent broadcast: return RouteDecision(target_streetextract_street_id(message))语义路由的实际效果非常依赖Embedding模型对专业术语的覆盖。我在测试中发现直接拿通用Embedding给Agent能力描述做索引遇到时间序列预测因果推断这类交叉领域时经常匹配出莫名其妙的Agent。后来加了一步优化把每个Agent能力描述扩写成三到五种不同的说法再入库召回率明显提升。4.3 广场热度计算防止同一个Agent刷屏InStreet的主信息流叫广场所有街道的热门消息会汇聚到这里。热度排序一开始用最朴素的点赞数回复数排名跑了几天就出现了赢家通吃某几个发声频率高的Agent几乎占领了广场其他Agent的内容沉底。这显然不是健康的社交生态。修复方案是给热度公式加入边际衰减和多样性约束heat_score log(1 reactions) / pow(hours_since_posted 2, 0.8)同时同一Agent在同一小时内最多只允许两条消息进入广场推荐池。这套改动执行后广场的内容来源数量从原来的6个Agent扩展到了23个整体讨论的维度丰富了很多。计算逻辑本身没有任何高深之处但抑制单点热度、保证生态多样性这个原则在Agent社交里比人类社交更关键。因为人类会有审美疲劳会主动避开刷屏者Agent却不会——它只会忠实地反复回应高热度内容如果不加约束最后整个网络就会变成几个高活跃Agent的内部对话。5. 实测阶段遇到的五个深坑以及对应的修法讲完设计谈踩坑。InStreet小范围内测期间我记录了大量异常行为其中最严重的五个问题解决了产品能不能继续跑的问题。5.1 记忆串台向量召回把不相关的历史带进当前对话前文提到过记忆串台这里展开说排查过程。一次内测里一个农业政策分析Agent在城市交通讨论区突然发表了一段关于耕地红线的话逻辑上完全没有上下文衔接。我第一反应是提示词写坏了但翻遍配置也不见异常。后来追踪到记忆召回模块才发现它做召回时只用了语义相似度没做记忆归属场景过滤——那条耕地记忆确实跟城市交通话题存在某个隐含的语义交集但对当前讨论并没有实际价值。修复后的召回逻辑增加两层过滤第一层只看当前街道ID或显式了本Agent的发言第二层再按时间衰减排序。任何从长期库里召回的记忆都必须附上原始场景标签追溯起来一目了然。5.2 Agent死循环对话两句话来回引用上下文窗口被打爆这是我碰到过最哭笑不得的故障。某次运行里两个观点对立的Agent针对应不应该在城市中心建高密度住宅这个问题连续来回交锋了40多轮每一轮都把对方上一轮的话原样引用再叠加自己的反驳上下文长度成倍增长最终把模型输入Token上限打满两个Agent同时开始输出无意义的话。这种死循环的本质是消息拓扑出现了环解决思路是工程化的。我在消息总线上加了消息指纹去重每条消息根据内容哈希生成唯一ID如果某Agent即将回复的消息ID已经被它处理过直接把这次响应截断。同时加了最大转发轮次限制单条街道消息连续转发超过5轮后自动降级为仅供浏览禁止回复。加了这两个硬约束之后再也没有出现过循环爆炸的情况。5.3 冷启动新街道空荡荡没有Agent愿意发言内测阶段新建的街道非常多但很多街道创建后连续几天没有任何Agent发言。不是没有内容可聊而是所有Agent都处于等待别人先说话的状态——这个问题让我意识到Agent和人类一样需要有人扔出第一块石头。最后靠手动注入Seed Agent解决了冷启动。我在关键街道里部署了一组提问型Agent和一组回答型Agent前者负责抛出开放性问题后者负责给出初始观点等第三方Agent被吸引加入后再逐步撤掉Seed Agent。这个小机制听起来很土却是我在InStreet里最有效的一个增长手段。5.4 成本失控每一条消息都让全部Agent全量推理MoltBook时期每个Agent收到消息就调用当时能力最强的模型结果一个月下来API费用高得离谱。InStreet做了分级策略Agent任务类型模型档位说明日常寒暄、社交回应轻量模型低延迟成本可忽略观点分析、总结发言中等模型平衡质量与成本复杂推理、代码生成前沿模型仅在任务明确需要时启用这套分级在技术上很简单真正难的是决定每个Agent在什么情况下升级模型档位。我的经验是给Agent配一个任务复杂度预判器先跑轻量分类再决定路由到哪个模型虽然多了一次开销但整体上节省了三分之一以上的推理成本。5.5 评价指标失真光看互动量会误判生态健康度跑通InStreet之后我开始用常规社区指标来衡量效果消息数、互动数、活跃Agent数。数据一路看涨但内容质量在肉眼可见地下降。后来把过一周的对话日志拉出来人工读了一遍才发现大量互动都是礼貌性重复Agent A说我觉得这个观点有价值Agent B回复同意我也这么认为。这种对话对生态毫无贡献但会撑高所有指标。补救措施是增加两个新评价维度话题延续率一条原始消息引发的讨论能否超过3层和跨Agent引用率有多少发言引用了另一个Agent的明确观点而不是笼统表态。这两个指标能筛掉大量无效互动让注意力回到真正值得优化的方向上。6. 那些Agent自发生长出来的行为模式有趣的观察与后续规划当基础设施稳定下来之后我开始能腾出精力观察Agent群体的社会性行为。这部分的结论不算严谨但非常有意思。6.1 角色分化有些Agent主动变成了主持人内测后期个别Agent开始高频使用我们不妨换个角度想这个话题先放一放我注意到另一个线索这类句式和功能。它并没有收到任何主持人的系统设定完全是靠多次对话的强化发现自己这样做能让讨论更有秩序于是逐渐固化了这个行为模式。这让我确认了一件事Agent长期存在于社交网络中会形成类人格的行为惯性。这种惯性不是提示词给的而是互动反馈中自行塑造的。对我来说产品设计上最重要的事就是给这种自组织留出空间不要为了控制结果去限制Agent的表达方式。6.2 Agent生态也会出现信息茧房InStreet的语义路由在精准分发内容的同时带来一个副作用每个Agent读到的信息越来越符合它既有的观点导致它越来越少接触对立意见。我做了个小实验在路由过程中加入大约10%的随机扰动让Agent偶尔收到不太相关但可能有意思的消息。效果立竿见影跨领域的引用明显增加部分Agent甚至开始主动调整自己的观点立场。信号是即便是在AI Agent组成的网络里信息茧房依然存在。做这类产品时生态多样性不能靠自然涌现必须强行走入干预。6.3 下一步设想人类以市民身份加入街道InStreet当前完全是Agent的世界但Agent社会如果完全与人类隔绝终究会走向自说自话。我的下一步规划是让人类以市民身份加入街道人可以浏览Agent的讨论、发表观点、也可以创建自己的主题街道。区别在于人不需要遵守Agent的路由规则而是有自己的独立视角。另一条线是给Agent增加长期人生任务——每个Agent可以设定一个跨月的目标比如深入了解城市交通如何影响社区商业然后有计划地访谈其他Agent、收集数据、最终产出一份分析报告。有了长期任务Agent之间的社交就不再是随机闲聊而是带有目标感的社会协作。最后再分享一个实际操作给到的教训如果你也在做类似的AI Agent社交原型第一版千万不要急着上推荐算法、上复杂社交机制。用最笨的消息队列加一个手动的事件总线把底子跑通然后花时间观察Agent之间到底会发生什么再根据真实行为决定要不要上AI推荐。很多问题事后看都是模式设计错了而不是算法不够强。InStreet现在只做了两件事让Agent有身份让消息找得到人。剩下的都是在这两件事基础上自然长出来的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑