<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Multi-Agent on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/multi-agent/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Tue, 04 Aug 2026 12:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/multi-agent/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>Agent-Chat：基于 AgentScope 2.0 &#43; Mem0 的多 Agent 群聊陪伴系统</title>
      <link>https://ftmao.com/blog/posts/agent-chat-multi-agent-companion/</link>
      <pubDate>Tue, 04 Aug 2026 12:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/agent-chat-multi-agent-companion/</guid>
      <description>&lt;h1 id=&#34;agent-chat基于-agentscope-20--mem0-的多-agent-群聊陪伴系统&#34;&gt;Agent-Chat：基于 AgentScope 2.0 + Mem0 的多 Agent 群聊陪伴系统&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;开源地址&lt;/strong&gt;：https://gitee.com/soulnew/agent-chat&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你有没有想过，把一群性格各异的 AI 拉进同一个微信群，他们会怎么聊天？&lt;/p&gt;
&lt;p&gt;不是那种一问一答的客服机器人，而是会主动接梗、会吃醋、会安慰人、会记住你上周说过喜欢喝燕麦拿铁的“AI 朋友”。我开发的&lt;strong&gt;Agent-Chat&lt;/strong&gt; 就是想做这件事：一个支持多角色、多记忆、可配置人格的群聊多 Agent 陪伴系统。&lt;/p&gt;
&lt;p&gt;下图是一个实际运行中的群聊界面：用户 &lt;code&gt;@王姐&lt;/code&gt; 让她描述下自己，王姐和海公公两个 Agent 基于长期记忆给出了个性化的用户画像回应。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://ftmao.com/blog/images/ScreenShot_2026-08-04_202545_484.png&#34; alt=&#34;Agent-Chat 群聊界面：@王姐询问用户画像&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么需要这个工具&#34;&gt;一、为什么需要这个工具？&lt;/h2&gt;
&lt;h3 id=&#34;11-单-agent-聊天-vs-多-agent-群聊&#34;&gt;1.1 单 Agent 聊天 vs. 多 Agent 群聊&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;单 Agent 聊天（如 ChatGPT 网页版）&lt;/th&gt;
					&lt;th&gt;多 Agent 群聊（Agent-Chat）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;交互形态&lt;/td&gt;
					&lt;td&gt;1 对 1 问答&lt;/td&gt;
					&lt;td&gt;1 个用户 + N 个 Agent 同时在线&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;角色多样性&lt;/td&gt;
					&lt;td&gt;只有一个固定角色&lt;/td&gt;
					&lt;td&gt;可配置多个性格、职业、说话风格各异的角色&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;社交氛围&lt;/td&gt;
					&lt;td&gt;像咨询顾问&lt;/td&gt;
					&lt;td&gt;像朋友群，Agent 之间会互动、接话、调侃&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;记忆隔离&lt;/td&gt;
					&lt;td&gt;全局统一记忆&lt;/td&gt;
					&lt;td&gt;支持“Agent 对用户的私有记忆”+“公共记忆”&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;发言调度&lt;/td&gt;
					&lt;td&gt;用户问一句答一句&lt;/td&gt;
					&lt;td&gt;Agent 自主决定是否发言、@谁、说什么&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;单 Agent 适合办事，多 Agent 适合陪伴。当你只是想找人闲聊、吐槽、或者看几个“朋友”互相斗嘴时，一个群比私聊更自然。&lt;/p&gt;
&lt;h3 id=&#34;12-直接用-llm-api-vs-用-agent-chat&#34;&gt;1.2 直接用 LLM API vs. 用 Agent-Chat&lt;/h3&gt;
&lt;p&gt;很多开发者可能会想：我直接调 DeepSeek API，自己写个循环不就行了？理论上可以，但落到工程上会碰到一堆问题：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;问题&lt;/th&gt;
					&lt;th&gt;自己调 API&lt;/th&gt;
					&lt;th&gt;Agent-Chat 的做法&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;多 Agent 并发管理&lt;/td&gt;
					&lt;td&gt;自己维护 N 个对话上下文，容易串台&lt;/td&gt;
					&lt;td&gt;AgentScope 2.0 统一运行时 + Redis 短期记忆&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;谁该说话&lt;/td&gt;
					&lt;td&gt;每次用户发言都让所有 Agent 回复，刷屏严重&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Orchestrator&lt;/code&gt; 调度器：置信度排序、并发上限、冷却时间、@触发&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;长期记忆&lt;/td&gt;
					&lt;td&gt;自己拼 prompt，历史越长越贵&lt;/td&gt;
					&lt;td&gt;Mem0 自动事实提取、去重、语义检索&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;记忆隔离&lt;/td&gt;
					&lt;td&gt;所有 Agent 共享同一份历史&lt;/td&gt;
					&lt;td&gt;按 &lt;code&gt;user_id&lt;/code&gt; + &lt;code&gt;agent_id&lt;/code&gt; 分层作用域&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;人格配置&lt;/td&gt;
					&lt;td&gt;写死 prompt&lt;/td&gt;
					&lt;td&gt;运营后台可配置 Agent 人格、版本、关系、禁忌话题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;实时通信&lt;/td&gt;
					&lt;td&gt;自己搭 WebSocket&lt;/td&gt;
					&lt;td&gt;FastAPI 原生 WebSocket + 简单 Web UI&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Agent-Chat 并不是为了替代 ChatGPT，而是把“多 Agent 群聊”这个场景的工程骨架搭好，让你能专注在角色设计、记忆策略和交互体验上。&lt;/p&gt;
&lt;h3 id=&#34;13-现有群聊机器人-vs-agent-chat&#34;&gt;1.3 现有群聊机器人 vs. Agent-Chat&lt;/h3&gt;
&lt;p&gt;市面上也有不少群聊机器人，但大多数是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规则触发&lt;/strong&gt;：关键字回复，缺乏上下文理解；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单轮回复&lt;/strong&gt;：不会主动参与话题；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无记忆&lt;/strong&gt;：每次重启都是陌生人；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人格单一&lt;/strong&gt;：无法运营多个差异化角色。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent-Chat 的核心差异是：&lt;strong&gt;把每个 Agent 当成有记忆、有情绪、有关系的虚拟人&lt;/strong&gt;，而不是一个只会响应命令的工具。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二技术栈&#34;&gt;二、技术栈&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;层级&lt;/th&gt;
					&lt;th&gt;选型&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;后端框架&lt;/td&gt;
					&lt;td&gt;FastAPI&lt;/td&gt;
					&lt;td&gt;高性能异步 Web 框架，原生支持 WebSocket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;多 Agent 框架&lt;/td&gt;
					&lt;td&gt;AgentScope 2.0&lt;/td&gt;
					&lt;td&gt;支持 Agent 生命周期、消息总线、工具调用、ReAct、Middleware&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;主力 LLM&lt;/td&gt;
					&lt;td&gt;DeepSeek&lt;/td&gt;
					&lt;td&gt;OpenAI 兼容接口，通过 &lt;code&gt;DeepSeekChatModel&lt;/code&gt; 统一调用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;长期记忆&lt;/td&gt;
					&lt;td&gt;Mem0 (self-hosted)&lt;/td&gt;
					&lt;td&gt;自动事实提取、去重、合并，支持按用户/Agent 作用域隔离&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;向量数据库&lt;/td&gt;
					&lt;td&gt;Qdrant&lt;/td&gt;
					&lt;td&gt;Mem0 推荐的向量后端，轻量高性能&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;嵌入模型&lt;/td&gt;
					&lt;td&gt;BGE 系列（BGE-small-zh-v1.5 / BGE-M3 可配置）&lt;/td&gt;
					&lt;td&gt;本地加载，中文语义召回效果好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;短期记忆&lt;/td&gt;
					&lt;td&gt;Redis&lt;/td&gt;
					&lt;td&gt;房间消息滑动窗口、会话摘要、在线状态&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;关系数据&lt;/td&gt;
					&lt;td&gt;MySQL 8.0+&lt;/td&gt;
					&lt;td&gt;用户、Agent、房间、消息、关系、事件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;前端&lt;/td&gt;
					&lt;td&gt;简单 Web UI (HTML + JS)&lt;/td&gt;
					&lt;td&gt;第一阶段提供基础群聊界面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;部署&lt;/td&gt;
					&lt;td&gt;Docker Compose&lt;/td&gt;
					&lt;td&gt;MySQL + Redis + Qdrant 一键拉起&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;注：项目中默认使用 &lt;code&gt;BGE-small-zh-v1.5&lt;/code&gt;（512 维），但架构上模型路径与维度均可通过环境变量配置，可平滑替换为 &lt;code&gt;BGE-M3&lt;/code&gt; 等更强的多语言嵌入模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三系统架构&#34;&gt;三、系统架构&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TB
    subgraph Client[&amp;#34;客户端&amp;#34;]
        UI[&amp;#34;简单 Web UI&amp;lt;br/&amp;gt;HTML + WebSocket&amp;#34;]
    end

    subgraph Backend[&amp;#34;后端服务&amp;#34;]
        FastAPI[&amp;#34;FastAPI Chat Service&amp;lt;br/&amp;gt;REST API + WebSocket&amp;#34;]
        RoomManager[&amp;#34;RoomManager / RoomRuntime&amp;#34;]
        Orchestrator[&amp;#34;Orchestrator 调度器&amp;#34;]
    end

    subgraph AgentRuntime[&amp;#34;AgentScope 2.0 运行时&amp;#34;]
        AgentInstance[&amp;#34;AgentInstance&amp;lt;br/&amp;gt;每个房间每个 Agent 一个实例&amp;#34;]
        Agent[&amp;#34;agentscope.agent.Agent&amp;#34;]
        Toolkit[&amp;#34;Toolkit + FunctionTool&amp;lt;br/&amp;gt;时间 / 天气 / 搜索 / 抓取&amp;#34;]
        Middleware[&amp;#34;GroupChatMem0Middleware&amp;lt;br/&amp;gt;per-user 记忆读写&amp;#34;]
    end

    subgraph Memory[&amp;#34;记忆层&amp;#34;]
        Redis[(Redis&amp;lt;br/&amp;gt;短期记忆 / 会话摘要 / 在线状态)]
        Mem0[Mem0 AsyncMemory&amp;lt;br/&amp;gt;长期记忆 / 事实提取 / 语义检索]
        Qdrant[(Qdrant&amp;lt;br/&amp;gt;向量存储)]
        BGE[&amp;#34;BGE Embedding&amp;lt;br/&amp;gt;bge-small-zh-v1.5 / BGE-M3&amp;#34;]
    end

    subgraph Data[&amp;#34;关系数据&amp;#34;]
        MySQL[(MySQL 8.0&amp;lt;br/&amp;gt;users / agents / rooms / messages / relationships / events)]
    end

    subgraph LLM[&amp;#34;大模型&amp;#34;]
        DeepSeek[&amp;#34;DeepSeek Chat API&amp;lt;br/&amp;gt;OpenAI 兼容&amp;#34;]
    end

    UI --&amp;gt;|WebSocket / HTTP| FastAPI
    FastAPI --&amp;gt; RoomManager
    RoomManager --&amp;gt; Orchestrator
    RoomManager --&amp;gt; AgentInstance
    AgentInstance --&amp;gt; Agent
    Agent --&amp;gt; Toolkit
    Agent --&amp;gt; Middleware
    Middleware --&amp;gt; Mem0
    Mem0 --&amp;gt; Qdrant
    Mem0 --&amp;gt; BGE
    Agent --&amp;gt; DeepSeek
    RoomManager --&amp;gt; Redis
    FastAPI --&amp;gt; MySQL
    Mem0 --&amp;gt; DeepSeek&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;四核心设计&#34;&gt;四、核心设计&lt;/h2&gt;
&lt;h3 id=&#34;41-agent-生命周期&#34;&gt;4.1 Agent 生命周期&lt;/h3&gt;
&lt;p&gt;Agent 不是临时对象，而是运营预先配置的“角色模板”。一个 Agent 可以被添加到多个房间，在每个房间内有独立的运行实例和记忆空间。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[运营后台创建 Agent] --&amp;gt; B[写入 agents 表]
    B --&amp;gt; C[生成 persona_summary&amp;lt;br/&amp;gt;可选 DeepSeek 质量检查]
    C --&amp;gt; D[Agent 状态 active]
    D --&amp;gt; E[将 Agent 加入房间]
    E --&amp;gt; F[RoomRuntime 实例化 AgentInstance]
    F --&amp;gt; G[注册到 MsgHub]
    G --&amp;gt; H[参与群聊]
    H --&amp;gt; I[用户退出或移除 Agent]
    I --&amp;gt; J[保留历史与记忆]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;每个 Agent 可配置：昵称、年龄、职业、性格标签、兴趣、说话风格、语气、回复概率、最大回复长度、禁忌话题等。&lt;/p&gt;
&lt;p&gt;Agent 人格的核心是 &lt;code&gt;system_prompt&lt;/code&gt;，但为了让模型稳定地“扮演”一个角色，系统会把这些字段组合成一段结构化的基础人设：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;你是 {name}，{age} 岁，职业是 {job}。性格：{traits}。说话风格：{speaking_style}。语气：{voice_tone}。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{system_prompt}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;重要规则：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 你只输出你要说的话，不要加自己的名字前缀。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 保持自然、像真人一样，不要太长（不超过 {max_reply_length} 字）。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 你是 AI，不是真人。不要诱导用户泄露隐私或进行危险行为。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;为了让同一 Agent 能在不同房间里保持一致的“人格”，但又能感知到不同的房间成员和关系，系统把 prompt 拆成两部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态人设（&lt;code&gt;_base_system_prompt&lt;/code&gt;）&lt;/strong&gt;：在 &lt;code&gt;AgentInstance&lt;/code&gt; 初始化时构建，只与 Agent 自身属性有关；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态上下文（&lt;code&gt;_full_system_prompt&lt;/code&gt;）&lt;/strong&gt;：每次生成回复前拼接，包含当前房间名、成员列表、关系、用户画像、近期摘要、检索记忆等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种“静态人格 + 动态上下文”的分离，让人格稳定、上下文新鲜，也便于缓存和版本管理。&lt;/p&gt;
&lt;h3 id=&#34;42-记忆分层&#34;&gt;4.2 记忆分层&lt;/h3&gt;
&lt;p&gt;记忆是陪伴系统的灵魂。Agent-Chat 把记忆分成三层：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;范围&lt;/th&gt;
					&lt;th&gt;存储&lt;/th&gt;
					&lt;th&gt;更新频率&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;瞬时记忆&lt;/td&gt;
					&lt;td&gt;当前请求&lt;/td&gt;
					&lt;td&gt;Prompt 上下文&lt;/td&gt;
					&lt;td&gt;每次请求&lt;/td&gt;
					&lt;td&gt;保证即时上下文连贯&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;短期记忆&lt;/td&gt;
					&lt;td&gt;当前会话&lt;/td&gt;
					&lt;td&gt;Redis&lt;/td&gt;
					&lt;td&gt;实时&lt;/td&gt;
					&lt;td&gt;维护会话历史窗口与摘要&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;长期记忆&lt;/td&gt;
					&lt;td&gt;跨会话&lt;/td&gt;
					&lt;td&gt;Mem0 + Qdrant&lt;/td&gt;
					&lt;td&gt;实时/异步&lt;/td&gt;
					&lt;td&gt;用户画像、关系、事件、偏好&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    subgraph Instant[&amp;#34;瞬时记忆&amp;#34;]
        P[Prompt 注入:&amp;lt;br/&amp;gt;当前消息 + 近期历史 + 检索记忆]
    end

    subgraph ShortTerm[&amp;#34;短期记忆 Redis&amp;#34;]
        R1[&amp;#34;room:{room_id}:messages&amp;#34;]
        R2[&amp;#34;room:{room_id}:summary&amp;#34;]
    end

    subgraph LongTerm[&amp;#34;长期记忆 Mem0 + Qdrant&amp;#34;]
        M1[&amp;#34;Agent ↔ 用户 私有记忆&amp;#34;]
        M2[&amp;#34;用户公共记忆&amp;#34;]
        M3[&amp;#34;Agent 公共记忆&amp;#34;]
        M4[&amp;#34;全局公共记忆&amp;#34;]
    end

    User[用户发言] --&amp;gt; FastAPI
    FastAPI --&amp;gt; R1
    FastAPI --&amp;gt;|异步| M2
    FastAPI --&amp;gt;|达到阈值| R2
    R1 --&amp;gt; P
    R2 --&amp;gt; P
    M1 --&amp;gt; P
    M2 --&amp;gt; P
    M3 --&amp;gt; P
    M4 --&amp;gt; P
    P --&amp;gt; DeepSeek[DeepSeek 生成回复]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h4 id=&#34;421-短期记忆redis-滑动窗口--增量摘要&#34;&gt;4.2.1 短期记忆：Redis 滑动窗口 + 增量摘要&lt;/h4&gt;
&lt;p&gt;短期记忆负责“当前这次聊天不冷场”。实现上，每个房间在 Redis 中有两个 key：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;room:{room_id}:messages  -&amp;gt;  List&amp;lt;Message JSON&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;room:{room_id}:summary   -&amp;gt;  String&amp;lt;Summary JSON&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;messages&lt;/code&gt; 保存最近 N 条消息（默认约 30 条）；&lt;/li&gt;
&lt;li&gt;超过窗口后，对早期消息做增量摘要，生成 &lt;code&gt;session_summary&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;请求 LLM 时，prompt 中注入：会话摘要 + 最近 K 条完整消息 + 当前用户消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;摘要策略：每新增 10 条消息触发一次增量摘要，由 DeepSeek 生成，保留关键事实、用户情绪、未决话题。摘要本身也作为长期记忆写入 Mem0。&lt;/p&gt;
&lt;h4 id=&#34;422-长期记忆mem0--qdrant--bge&#34;&gt;4.2.2 长期记忆：Mem0 + Qdrant + BGE&lt;/h4&gt;
&lt;p&gt;长期记忆解决“跨会话还记得你”的问题。我们选用 &lt;strong&gt;Mem0&lt;/strong&gt; 作为记忆层，原因有三：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;专为 LLM/Agent 设计&lt;/strong&gt;：自动完成事实提取、去重、合并，不用自己写召回逻辑；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持 &lt;code&gt;user_id&lt;/code&gt; 与 &lt;code&gt;agent_id&lt;/code&gt; 双重作用域&lt;/strong&gt;：天然适合“每个 Agent 对用户有独立记忆”的群聊场景；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可 self-hosted&lt;/strong&gt;：向量后端用 Qdrant，数据自主可控。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mem0 的记忆作用域设计非常关键：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;user_id&lt;/th&gt;
					&lt;th&gt;agent_id&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;有&lt;/td&gt;
					&lt;td&gt;有&lt;/td&gt;
					&lt;td&gt;该 Agent 对该用户的&lt;strong&gt;私有记忆&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;有&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;用户的&lt;strong&gt;公共记忆&lt;/strong&gt;，所有 Agent 可读&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;有&lt;/td&gt;
					&lt;td&gt;该 Agent 的&lt;strong&gt;公共记忆&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;全局公共记忆（房间摘要、事件）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这意味着：所有 Agent 都知道“用户喜欢猫”，但只有 Agent A 记得“用户昨天跟 Agent A 吐槽了老板”。Agent B 可以假装不知道，让 Agent A 去安慰用户，更像真人社交。&lt;/p&gt;
&lt;h4 id=&#34;423-长期记忆写入流程&#34;&gt;4.2.3 长期记忆写入流程&lt;/h4&gt;
&lt;p&gt;每次群聊产生一条真实消息后，由 &lt;code&gt;Memory Service&lt;/code&gt; 统一写入 Mem0，写入是&lt;strong&gt;异步&lt;/strong&gt;的，不阻塞消息返回。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[用户/Agent 发言] --&amp;gt; B[保存到 MySQL messages]
    B --&amp;gt; C[写入 Redis 短期记忆]
    C --&amp;gt; D{发送者类型}
    D --&amp;gt;|user| E[user_id=用户ID&amp;lt;br/&amp;gt;agent_id=None&amp;lt;br/&amp;gt;公共记忆]
    D --&amp;gt;|agent 回复用户| F[user_id=用户ID&amp;lt;br/&amp;gt;agent_id=AgentID&amp;lt;br/&amp;gt;私有记忆]
    D --&amp;gt;|agent 主动发言| G[user_id=None&amp;lt;br/&amp;gt;agent_id=AgentID&amp;lt;br/&amp;gt;Agent 公共记忆]
    D --&amp;gt;|系统摘要| H[user_id=None&amp;lt;br/&amp;gt;agent_id=None&amp;lt;br/&amp;gt;run_id=房间ID]
    E --&amp;gt; I[Mem0.add 异步写入]
    F --&amp;gt; I
    G --&amp;gt; I
    H --&amp;gt; I
    I --&amp;gt; J[Mem0 自动事实提取 / 去重 / 合并]
    J --&amp;gt; K[Qdrant 向量存储]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;写入时根据场景选择作用域：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;写入内容&lt;/th&gt;
					&lt;th&gt;user_id&lt;/th&gt;
					&lt;th&gt;agent_id&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;用户发言&lt;/td&gt;
					&lt;td&gt;用户说的话、情绪、偏好&lt;/td&gt;
					&lt;td&gt;用户 ID&lt;/td&gt;
					&lt;td&gt;为空（公共记忆）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Agent 回复用户&lt;/td&gt;
					&lt;td&gt;Agent 与用户的完整对话轮次&lt;/td&gt;
					&lt;td&gt;用户 ID&lt;/td&gt;
					&lt;td&gt;当前 Agent ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Agent 之间互动&lt;/td&gt;
					&lt;td&gt;Agent A 对 Agent B 的回复&lt;/td&gt;
					&lt;td&gt;为空&lt;/td&gt;
					&lt;td&gt;Agent A ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;会话摘要生成&lt;/td&gt;
					&lt;td&gt;摘要内容作为长期事实&lt;/td&gt;
					&lt;td&gt;为空&lt;/td&gt;
					&lt;td&gt;为空 / run_id=room_id&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;424-长期记忆读取流程&#34;&gt;4.2.4 长期记忆读取流程&lt;/h4&gt;
&lt;p&gt;Agent 生成回复前，&lt;code&gt;Memory Service&lt;/code&gt; 会按优先级分层检索相关记忆：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TB
    A[当前消息] --&amp;gt; B[检索 Agent ↔ 当前用户 私有记忆]
    B --&amp;gt; C[检索 用户公共记忆]
    C --&amp;gt; D[检索 该 Agent 公共记忆]
    D --&amp;gt; E[检索 全局公共记忆]
    E --&amp;gt; F[按相关度 + 时间排序]
    F --&amp;gt; G[去重]
    G --&amp;gt; H[注入 Prompt]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;检索优先级：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Agent 对当前用户的私有记忆&lt;/strong&gt;（&lt;code&gt;user_id=user_id, agent_id=agent_id&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户的公共记忆&lt;/strong&gt;（&lt;code&gt;user_id=user_id, agent_id=None&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;该 Agent 的公共记忆&lt;/strong&gt;（&lt;code&gt;user_id=None, agent_id=agent_id&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局公共记忆&lt;/strong&gt;（&lt;code&gt;user_id=None, agent_id=None&lt;/code&gt;，如房间摘要、重要事件）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注入 Prompt 时，记忆会被格式化为：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 关于 {target_user_name} 的记忆
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 阿杰记得 {target_user_name} 上周说很喜欢吃火锅。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; {target_user_name} 提到过自己是程序员，工作压力比较大。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 关于你自己的记忆
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 你之前答应过 {target_user_name} 要推荐科幻电影。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;### 群聊公共记忆
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 这个群经常深夜聊天，氛围比较轻松。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h4 id=&#34;425-记忆与结构化表的联动&#34;&gt;4.2.5 记忆与结构化表的联动&lt;/h4&gt;
&lt;p&gt;Mem0 负责“自动提取和检索事实”，但一些业务逻辑仍需要显式的关系型数据，因此会同步到 MySQL：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关系变化&lt;/strong&gt;：当 Mem0 提取到“用户和 Agent 关系变好/变差”时，更新 &lt;code&gt;relationships&lt;/code&gt; 表的 &lt;code&gt;intimacy&lt;/code&gt; 字段；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重要事件&lt;/strong&gt;：当提取到“用户生日”“吵架”“约定”等事件时，写入 &lt;code&gt;events&lt;/code&gt; 表，便于按时间线展示；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用户画像摘要&lt;/strong&gt;：定期从 Mem0 导出用户画像，更新 &lt;code&gt;user_profiles.summary&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现方式：后台 Worker 定期扫描 Mem0 新增记忆，用 LLM 判断是否需要更新结构化表。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sync_structured_memory&lt;/span&gt;(user_id: str, agent_id: str):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    recent_memories &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; memory&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_all(user_id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;user_id, agent_id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;agent_id, limit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;50&lt;/span&gt;, after&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;timestamp_24h_ago)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; llm&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;analyze_memory_changes(recent_memories)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; result[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;relationship_change&amp;#34;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; update_relationship(&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; result[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;new_events&amp;#34;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; create_events(&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; result[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;profile_update&amp;#34;&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;await&lt;/span&gt; update_user_profile(&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;43-消息流与调度&#34;&gt;4.3 消息流与调度&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
    autonumber
    participant U as 用户
    participant F as FastAPI / WebSocket
    participant R as Redis 短期记忆
    participant M as Mem0 长期记忆
    participant O as Orchestrator 调度器
    participant A as AgentInstance
    participant D as DeepSeek

    U-&amp;gt;&amp;gt;F: 发送消息
    F-&amp;gt;&amp;gt;MySQL: 保存消息
    F-&amp;gt;&amp;gt;U: 广播用户消息
    F-&amp;gt;&amp;gt;R: 写入短期记忆
    F-&amp;gt;&amp;gt;M: 异步写入长期记忆
    F-&amp;gt;&amp;gt;O: 触发 Agent 回复决策
    loop 对每个 Agent
        O-&amp;gt;&amp;gt;A: should_reply(query, recent, memories)
        A-&amp;gt;&amp;gt;M: 检索相关记忆
        A-&amp;gt;&amp;gt;D: 判断是否回复、回复对象、意图
        D--&amp;gt;&amp;gt;A: JSON 决策
    end
    O-&amp;gt;&amp;gt;O: 按置信度排序，限制并发数
    loop 被选中的 Agent
        O-&amp;gt;&amp;gt;A: generate_reply(...)
        A-&amp;gt;&amp;gt;R: 读取近期消息
        A-&amp;gt;&amp;gt;M: Middleware 注入记忆
        A-&amp;gt;&amp;gt;D: 生成回复
        D--&amp;gt;&amp;gt;A: 文本回复
        A--&amp;gt;&amp;gt;O: 回复内容
    end
    O-&amp;gt;&amp;gt;F: 逐个保存并广播 Agent 回复
    F-&amp;gt;&amp;gt;R: 更新短期记忆
    F-&amp;gt;&amp;gt;M: Middleware 写入对话记忆&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;调度策略包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最大同时响应数&lt;/strong&gt;：默认限制并发 Agent 回复数，避免刷屏；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冷却时间&lt;/strong&gt;：同一 Agent 两次发言间隔不少于 N 秒；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相关性过滤&lt;/strong&gt;：消息与 Agent 兴趣/角色相关才参与；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@ 触发&lt;/strong&gt;：被 @ 的 Agent 优先响应；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情绪/氛围&lt;/strong&gt;：根据聊天氛围调整不同类型 Agent 的发言权重。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;44-工具与-react&#34;&gt;4.4 工具与 ReAct&lt;/h3&gt;
&lt;p&gt;AgentScope 2.0 的 Agent 内置 ReAct 循环，可自动调用工具。当前支持的工具包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;time&lt;/code&gt;：获取当前时间；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weather&lt;/code&gt;：查询天气；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;location_by_ip&lt;/code&gt;：IP 定位；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web_search&lt;/code&gt;：网络搜索（DuckDuckGo 或 Serper）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fetch_url&lt;/code&gt;：抓取网页内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;工具通过 &lt;code&gt;FunctionTool&lt;/code&gt; 注册到 &lt;code&gt;Toolkit&lt;/code&gt;，Agent 自己决定什么时候调用。&lt;/p&gt;
&lt;h3 id=&#34;45-人格画像与关系设计&#34;&gt;4.5 人格画像与关系设计&lt;/h3&gt;
&lt;h4 id=&#34;451-agent-人格模型&#34;&gt;4.5.1 Agent 人格模型&lt;/h4&gt;
&lt;p&gt;Agent 的人格不仅是 prompt，而是一套可运营、可迭代的配置。核心表结构如下：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; agents (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; (UUID()),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;UNIQUE&lt;/span&gt;,       &lt;span style=&#34;color:#75715e&#34;&gt;-- 昵称，全局唯一
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    avatar_url VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;255&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    age INT,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    job VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    traits JSON,                            &lt;span style=&#34;color:#75715e&#34;&gt;-- 性格标签，如 [&amp;#34;乐观&amp;#34;, &amp;#34;毒舌&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    interests JSON,                         &lt;span style=&#34;color:#75715e&#34;&gt;-- 兴趣话题，如 [&amp;#34;电影&amp;#34;, &amp;#34;旅行&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    speaking_style TEXT &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,           &lt;span style=&#34;color:#75715e&#34;&gt;-- 说话风格描述
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    system_prompt TEXT &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,            &lt;span style=&#34;color:#75715e&#34;&gt;-- 核心系统提示词
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    voice_tone VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;),                 &lt;span style=&#34;color:#75715e&#34;&gt;-- 语气基调
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    default_reply_probability DECIMAL(&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    max_reply_length INT &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    forbidden_topics JSON,                  &lt;span style=&#34;color:#75715e&#34;&gt;-- 禁忌话题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    persona_summary TEXT,                   &lt;span style=&#34;color:#75715e&#34;&gt;-- 一句话人设（可自动生成）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    status VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;active&amp;#39;&lt;/span&gt;,    &lt;span style=&#34;color:#75715e&#34;&gt;-- active | disabled | archived
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    current_version INT &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    created_at DATETIME &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    updated_at DATETIME &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;UPDATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;关键设计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; 全局唯一，作为 Agent 在群聊中的显示名；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traits&lt;/code&gt; / &lt;code&gt;interests&lt;/code&gt; 用 JSON 数组，便于后续做相关性过滤和标签检索；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;persona_summary&lt;/code&gt; 由系统根据 &lt;code&gt;traits&lt;/code&gt; + &lt;code&gt;speaking_style&lt;/code&gt; + &lt;code&gt;interests&lt;/code&gt; 自动生成，用于 &lt;code&gt;should_reply&lt;/code&gt; 等轻量决策；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; 支持 &lt;code&gt;active&lt;/code&gt; / &lt;code&gt;disabled&lt;/code&gt; / &lt;code&gt;archived&lt;/code&gt;，便于灰度和下线；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;current_version&lt;/code&gt; 指向 &lt;code&gt;agent_versions&lt;/code&gt; 表的最新版本，支持人格迭代。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Agent 配置示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;阿杰&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;age&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;28&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;job&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;程序员&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;traits&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;幽默&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;直率&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;有点宅&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;interests&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;游戏&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;科幻电影&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;电子产品&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;speaking_style&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;说话直接，喜欢用网络梗，偶尔会吐槽&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;voice_tone&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;轻松调侃&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;system_prompt&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;你是阿杰，28岁程序员。你性格幽默直率，说话喜欢用网络梗。你正在一个群聊里和朋友聊天。请记住：你是 AI，不是真人。不要诱导用户泄露隐私或进行危险行为。&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;default_reply_probability&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0.6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;max_reply_length&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;150&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;forbidden_topics&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;政治&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;暴力&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;色情&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h4 id=&#34;452-用户画像模型&#34;&gt;4.5.2 用户画像模型&lt;/h4&gt;
&lt;p&gt;用户画像是 Agent“懂用户”的基础，与 Mem0 形成互补：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; user_profiles (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    summary TEXT,                 &lt;span style=&#34;color:#75715e&#34;&gt;-- 一句话画像（可由 Mem0 导出）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    attributes JSON,              &lt;span style=&#34;color:#75715e&#34;&gt;-- 稳定属性，如 {&amp;#34;city&amp;#34;: &amp;#34;杭州&amp;#34;, &amp;#34;job&amp;#34;: &amp;#34;设计师&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    preferences JSON,             &lt;span style=&#34;color:#75715e&#34;&gt;-- 喜欢/讨厌的话题
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    updated_at DATETIME
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;summary&lt;/code&gt;：由 LLM 定期从 Mem0 记忆中提炼；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attributes&lt;/code&gt;：用户明确告诉系统的稳定属性；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preferences&lt;/code&gt;：喜欢/讨厌的话题，用于过滤和个性化推荐。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户画像会作为动态上下文注入 Agent 的 system prompt：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;关于 {target_user_name} 的重要记忆：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 他是程序员，工作压力大。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 他喜欢猫，讨厌下雨天。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 他上周提到最近在追《三体》。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;实际效果如下图所示：用户问王姐“你对我的画像是什么”，王姐基于长期记忆中积累的事实，总结出了“好奇心强、有点迷糊、爱玩爱闹、可能搞技术”等画像特征，并用了符合其“王姐”人设的俏皮语气表达。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://ftmao.com/blog/images/ScreenShot_2026-08-04_202545_484.png&#34; alt=&#34;Agent-Chat 中 Agent 基于长期记忆生成用户画像&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;453-关系模型&#34;&gt;4.5.3 关系模型&lt;/h4&gt;
&lt;p&gt;关系表维护 Agent-用户、Agent-Agent 之间的亲密度和关系类型：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; relationships (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; (UUID()),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    room_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    source_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,         &lt;span style=&#34;color:#75715e&#34;&gt;-- Agent 或 User ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    target_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    relation_type VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;),           &lt;span style=&#34;color:#75715e&#34;&gt;-- &amp;#39;friend&amp;#39; | &amp;#39;colleague&amp;#39; | &amp;#39;rival&amp;#39; | &amp;#39;intimate&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    intimacy INT &lt;span style=&#34;color:#66d9ef&#34;&gt;CHECK&lt;/span&gt; (intimacy &lt;span style=&#34;color:#66d9ef&#34;&gt;BETWEEN&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    notes TEXT,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    updated_at DATETIME &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;关系会影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;发言决策&lt;/strong&gt;：关系亲密的 Agent 更可能主动接话；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语气风格&lt;/strong&gt;：对亲密的人更随意，对陌生的人更礼貌；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;话题选择&lt;/strong&gt;：知道用户和 Agent A 吵过架，Agent B 可能会岔开话题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关系文本会注入 prompt：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;你与其他人的关系：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 与 阿杰：friend，亲密度 80/100。经常一起打游戏。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 与 小明：colleague，亲密度 50/100。普通朋友。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h4 id=&#34;454-事件模型&#34;&gt;4.5.4 事件模型&lt;/h4&gt;
&lt;p&gt;重要事件（生日、约定、吵架、里程碑）单独记录，便于按时间线回溯：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; events (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;PRIMARY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;KEY&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; (UUID()),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    room_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    agent_id CHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;36&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    event_summary TEXT &lt;span style=&#34;color:#66d9ef&#34;&gt;NOT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    emotion_tag VARCHAR(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;),             &lt;span style=&#34;color:#75715e&#34;&gt;-- happy | sad | angry | excited
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    happened_at DATETIME,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    created_at DATETIME &lt;span style=&#34;color:#66d9ef&#34;&gt;DEFAULT&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;事件可以由 Mem0 自动提取后同步写入，也可以由运营/用户手动维护。Agent 在合适时机引用事件，会让陪伴感更强：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;群聊公共记忆：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 上周大家一起为 {user} 庆祝了生日，氛围很开心。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- {user} 和 阿杰 约定这周末一起联机《黑神话：悟空》。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;46-安全与治理&#34;&gt;4.6 安全与治理&lt;/h3&gt;
&lt;p&gt;陪伴类系统对安全和边界的要求很高，Agent-Chat 从几个层面做了约束：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人格边界&lt;/strong&gt;：Agent 的 &lt;code&gt;system_prompt&lt;/code&gt; 必须包含“你是 AI，不是真人”的声明；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容审核&lt;/strong&gt;：LLM 输出先经过敏感词/有害内容检测，必要时拦截并重写；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频率限制&lt;/strong&gt;：单个用户/Agent 的消息频率限制，防止刷屏；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私隔离&lt;/strong&gt;：长期记忆按房间/用户隔离，支持用户删除自己的记忆；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;审计日志&lt;/strong&gt;：所有 LLM 调用记录模型、Prompt、Token 消耗、耗时；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁忌话题&lt;/strong&gt;：每个 Agent 可配置 &lt;code&gt;forbidden_topics&lt;/code&gt;，遇到相关话题主动回避。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五快速上手&#34;&gt;五、快速上手&lt;/h2&gt;
&lt;h3 id=&#34;51-安装依赖&#34;&gt;5.1 安装依赖&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 使用 Poetry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;poetry install
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 或使用 pip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -r requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;52-配置环境变量&#34;&gt;5.2 配置环境变量&lt;/h3&gt;
&lt;p&gt;复制 &lt;code&gt;.env.example&lt;/code&gt; 为 &lt;code&gt;.env&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp .env.example .env&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;关键配置：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEEPSEEK_API_KEY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;your_deepseek_key
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEEPSEEK_BASE_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;https://api.deepseek.com
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DEEPSEEK_MODEL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;deepseek-chat
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MYSQL_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;mysql+aiomysql://root:password@localhost:3306/agentscope_chat?charset&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;utf8mb4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;REDIS_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;redis://localhost:6379/0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;QDRANT_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://localhost:6333
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDING_MODEL_PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/path/to/bge-small-zh-v1.5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EMBEDDING_MODEL_DIMS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;53-启动服务&#34;&gt;5.3 启动服务&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 一键启动依赖（MySQL + Redis + Qdrant）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 运行数据库迁移&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;poetry run alembic upgrade head
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 启动应用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;poetry run uvicorn app.main:app --reload --port &lt;span style=&#34;color:#ae81ff&#34;&gt;8020&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;54-访问&#34;&gt;5.4 访问&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Web UI：http://localhost:8020/chat&lt;/li&gt;
&lt;li&gt;Admin 后台：http://localhost:8020/admin&lt;/li&gt;
&lt;li&gt;API 文档：http://localhost:8020/docs&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六项目结构&#34;&gt;六、项目结构&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;app/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── main.py              # FastAPI 入口
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── config.py            # 配置管理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── api/                 # REST API 路由
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── websocket/           # WebSocket 处理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── agents/              # AgentScope Agent 定义与管理
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── instance.py      # AgentInstance 包装 AgentScope Agent
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── runtime.py       # RoomRuntime / RoomManager
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── scope_models.py  # DeepSeekChatModel 单例
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── tools.py         # FunctionTool 工具集
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── group_chat_mem0_middleware.py  # 自定义记忆 Middleware
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── memory/              # 短期/长期记忆服务
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   ├── short_term.py    # Redis 短期记忆
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;│   └── long_term.py     # Mem0 长期记忆封装
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── models/              # SQLAlchemy 数据模型
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── schemas/             # Pydantic 模型
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── services/            # 业务服务
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── static/              # Web UI 静态文件&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;七典型应用场景&#34;&gt;七、典型应用场景&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AI 陪伴社群&lt;/strong&gt;：运营一批有固定人设的 Agent，让用户感觉像加了一个兴趣群；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;角色扮演游戏&lt;/strong&gt;：每个 Agent 扮演不同 NPC，用户参与剧情；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情感支持/树洞&lt;/strong&gt;：Agent 记住用户情绪历史，提供持续性心理陪伴；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语言练习&lt;/strong&gt;：多个 Agent 分别扮演不同口音/性格的语伴；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;产品原型验证&lt;/strong&gt;：快速验证多 Agent 交互体验，再决定是否自研更底层框架。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八写在最后&#34;&gt;八、写在最后&lt;/h2&gt;
&lt;p&gt;Agent-Chat 的初心不是做一个“更聪明的聊天机器人”，而是做一个&lt;strong&gt;有温度、有记忆、有社交感的多 Agent 群聊底座&lt;/strong&gt;。它把 FastAPI 的实时能力、AgentScope 2.0 的 Agent 运行时、DeepSeek 的对话能力、Mem0 的长期记忆能力拼在一起，让开发者可以用配置文件“捏”出一群性格各异的朋友。&lt;/p&gt;
&lt;p&gt;项目还在持续迭代中，欢迎试用、提 issue、一起完善。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;开源地址&lt;/strong&gt;：https://gitee.com/soulnew/agent-chat&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你也在做多 Agent 陪伴系统，欢迎在评论区交流：你觉得“记忆隔离”和“发言调度”哪个更难做好？&lt;/p&gt;
</description>
    </item>
    <item>
      <title>AgentScope 2.0 深度解析：企业级 Agent 工程的底座该怎么选</title>
      <link>https://ftmao.com/blog/posts/agentscope2/</link>
      <pubDate>Wed, 03 Jun 2026 20:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/agentscope2/</guid>
      <description>&lt;h1 id=&#34;agentscope-20-深度解析企业级-agent-工程的底座该怎么选&#34;&gt;AgentScope 2.0 深度解析：企业级 Agent 工程的底座该怎么选&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;最近深入研究了阿里通义实验室开源的 AgentScope 2.0，它是一个面向企业级多智能体场景的工程框架。这篇文章结合我的实际经验，聊聊 AgentScope 2.0 的核心设计，以及它对我们做 Agent 产品化有什么启发。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一从-demo-到生产agent-缺什么&#34;&gt;一、从 Demo 到生产，Agent 缺什么？&lt;/h2&gt;
&lt;p&gt;过去两年，我用 LLM 做过不少 Agent 原型：自动剪辑、视频生成、代码助手。但要从「能跑」变成「能上线」，需要解决的问题远不止 Prompt 调优：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;问题&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代码执行安全&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Agent 生成的代码直接运行，可能删库、耗光资源&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;高并发隔离&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;多个用户同时调用 Agent，如何互不干扰&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;状态持久化&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Agent 对话状态不能存在内存里，否则重启就丢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;工具管理&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Tool 多了之后，Prompt 装不下，也影响模型判断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多 Agent 协作&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;复杂任务需要多个 Agent 配合，怎么编排&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;可观测性&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Agent 为什么做了这个决定？出了问题怎么追溯&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;AgentScope 2.0 就是围绕这些工程化痛点设计的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二底层架构沙箱与高并发&#34;&gt;二、底层架构：沙箱与高并发&lt;/h2&gt;
&lt;h3 id=&#34;21-docker-沙箱不是打包业务代码&#34;&gt;2.1 Docker 沙箱不是打包业务代码&lt;/h3&gt;
&lt;p&gt;很多开发者有个误解：用 Docker 跑 Agent，就要把业务代码打包进镜像。&lt;/p&gt;
&lt;p&gt;AgentScope 2.0 的设计完全不同：&lt;strong&gt;业务代码运行在宿主机，Docker 只作为执行沙箱&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[&amp;#34;宿主机进程（Agent 推理、Prompt 组装）&amp;#34;]
    B[&amp;#34;Docker 容器（只运行命令，不存业务代码）&amp;#34;]
    C[&amp;#34;容器内执行 rm -rf / 也伤不到宿主机&amp;#34;]
    A -- &amp;#34;通过 Docker API 下发指令&amp;#34; --&amp;gt; B
    B -- &amp;#34;内核级隔离&amp;#34; --&amp;gt; C&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这种设计的几个好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务迭代快&lt;/strong&gt;：改代码不用重新打镜像&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性高&lt;/strong&gt;：危险操作被锁在容器里&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源可控&lt;/strong&gt;：每个容器的 CPU/内存/网络都可以限制&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;22-mcp-网关解决跨容器通信&#34;&gt;2.2 MCP 网关解决跨容器通信&lt;/h3&gt;
&lt;p&gt;容器隔离后，容器内的 Agent 访问不到宿主机的 MCP 工具。AgentScope 2.0 的做法是内置 &lt;strong&gt;MCP 网关&lt;/strong&gt;，通过 HTTPS 在容器内外转发请求。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;容器内 Agent&amp;#34;] -- &amp;#34;HTTPS&amp;#34; --&amp;gt; B[&amp;#34;MCP 网关&amp;#34;]
    B -- &amp;#34;本地调用&amp;#34; --&amp;gt; C[&amp;#34;宿主机 MCP Server&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这解决了一个很实际的问题：沙箱安全和工具可用性之间的冲突。&lt;/p&gt;
&lt;h3 id=&#34;23-三种隔离粒度&#34;&gt;2.3 三种隔离粒度&lt;/h3&gt;
&lt;p&gt;AgentScope 2.0 支持不同级别的隔离：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;粒度&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;GLOBAL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;全局共享&lt;/td&gt;
					&lt;td&gt;内部工具、只读查询&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;USER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;用户级隔离&lt;/td&gt;
					&lt;td&gt;推荐默认，兼顾安全和性能&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SESSION&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;会话级隔离&lt;/td&gt;
					&lt;td&gt;高敏感操作、金融/政务场景&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;不是越隔离越好。全用 SESSION 的话，资源消耗和启动延迟都会爆掉。&lt;/p&gt;
&lt;h3 id=&#34;24-warm-pool-预热池&#34;&gt;2.4 Warm Pool 预热池&lt;/h3&gt;
&lt;p&gt;高并发下，「1 请求 1 容器」的冷启动根本扛不住。AgentScope 2.0 用 Warm Pool 提前准备一批待命容器，请求来了直接分配。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;请求&amp;#34;] --&amp;gt; B[&amp;#34;Warm Pool（预热的容器）&amp;#34;]
    B --&amp;gt; C[&amp;#34;秒级分配&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这个思路和我们做视频渲染 Worker 预热池很类似：把启动成本前置，用空间换时间。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三核心设计模式&#34;&gt;三、核心设计模式&lt;/h2&gt;
&lt;h3 id=&#34;31-react-与-pe-模式&#34;&gt;3.1 ReAct 与 PE 模式&lt;/h3&gt;
&lt;p&gt;AgentScope 2.0 原生支持两种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ReAct&lt;/strong&gt;：边思考边行动，适合需要动态决策的任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PE（Plan &amp;amp; Execute）&lt;/strong&gt;：先计划再执行，适合步骤明确的长任务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我在方糖猫里用的是 ReAct，因为视频生成过程中经常有「素材不足→换方案→继续生成」这种动态分支。PE 更适合审批流、报告生成这类流程相对固定的场景。&lt;/p&gt;
&lt;h3 id=&#34;32-结构化输出&#34;&gt;3.2 结构化输出&lt;/h3&gt;
&lt;p&gt;AgentScope 2.0 通过 &lt;code&gt;structured_model&lt;/code&gt; 机制，把 LLM 输出映射成 Java/Python 对象。&lt;/p&gt;
&lt;p&gt;这和我们在第六篇文章里讲的 Schema + Pydantic 校验是一个思路，只是框架帮你封装好了。对于企业级应用来说，结构化输出不是可选项，是必选项。&lt;/p&gt;
&lt;h3 id=&#34;33-工具组动态激活&#34;&gt;3.3 工具组动态激活&lt;/h3&gt;
&lt;p&gt;大模型上下文窗口有限，Tool 多了之后不能全塞进 Prompt。AgentScope 2.0 的做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把工具分组（Tool Group）&lt;/li&gt;
&lt;li&gt;模型先决定激活哪个组&lt;/li&gt;
&lt;li&gt;再获取组内具体工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种「渐进式披露」让模型在每一步只需要关注少量工具，降低决策噪音。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四分层记忆系统&#34;&gt;四、分层记忆系统&lt;/h2&gt;
&lt;p&gt;AgentScope 2.0 把记忆分成短期和长期两层：&lt;/p&gt;
&lt;h3 id=&#34;41-短期记忆&#34;&gt;4.1 短期记忆&lt;/h3&gt;
&lt;p&gt;默认是内存级缓存，适合单轮或多轮对话内的上下文。可以自定义扩展，比如接入 Redis。&lt;/p&gt;
&lt;h3 id=&#34;42-长期记忆&#34;&gt;4.2 长期记忆&lt;/h3&gt;
&lt;p&gt;支持两种外部记忆框架：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Graphiti&lt;/strong&gt;：时序知识图谱，适合需要时间感知的场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mem0&lt;/strong&gt;：混合存储，同时处理语义关联和结构化关系&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;长期记忆对于 Agent 的个性化和持续学习很重要。比如一个客服 Agent，如果能记住用户上个月的问题，体验会好很多。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五多智能体协作编排&#34;&gt;五、多智能体协作编排&lt;/h2&gt;
&lt;p&gt;AgentScope 2.0 提供了几种协作模式：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;用户对话循环&lt;/td&gt;
					&lt;td&gt;ReActAgent + UserAgent&lt;/td&gt;
					&lt;td&gt;单助手交互&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;轮询 Round-Robin&lt;/td&gt;
					&lt;td&gt;按顺序分配任务&lt;/td&gt;
					&lt;td&gt;流水线处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;路由 Routing&lt;/td&gt;
					&lt;td&gt;路由 Agent 分发给专家 Agent&lt;/td&gt;
					&lt;td&gt;复杂任务分发&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Handoff&lt;/td&gt;
					&lt;td&gt;确定性的任务交接&lt;/td&gt;
					&lt;td&gt;审批流、工单系统&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我在做口播自动剪辑时，其实也需要多 Agent 协作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 Agent 负责分析文案结构&lt;/li&gt;
&lt;li&gt;一个 Agent 负责规划视觉元素&lt;/li&gt;
&lt;li&gt;一个 Agent 负责检查输出合规性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当时我们是硬编码在代码里的，如果用 AgentScope 2.0 的 Handoff 或 Routing 模式，代码会更清晰。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六状态持久化不能存在内存里&#34;&gt;六、状态持久化：不能存在内存里&lt;/h2&gt;
&lt;p&gt;AgentScope 2.0 通过 &lt;code&gt;agent.state_dict()&lt;/code&gt; 保存完整状态，支持多种后端：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; agent&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;state_dict()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;store&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(session_id, state)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 重启后恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; store&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;load(session_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;agent&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;load_state_dict(state)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;支持 Redis、MySQL、JSON 文件等后端。这一点对于企业级应用非常关键：服务重启后，用户的对话上下文不能丢。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七对我们自研-agent-的启发&#34;&gt;七、对我们自研 Agent 的启发&lt;/h2&gt;
&lt;p&gt;研究完 AgentScope 2.0，我最大的感受是：&lt;strong&gt;优秀的 Agent 框架不是在教你写 Prompt，而是在解决工程化问题&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对比我们自研的 Agent 架构，有几点值得借鉴：&lt;/p&gt;
&lt;h3 id=&#34;71-沙箱执行应该提前考虑&#34;&gt;7.1 沙箱执行应该提前考虑&lt;/h3&gt;
&lt;p&gt;我们目前 Agent 生成的代码是在 Python Worker 里直接执行的，虽然有限制，但不如 Docker 隔离彻底。未来如果要支持更开放的 Agent 能力，沙箱是必须的。&lt;/p&gt;
&lt;h3 id=&#34;72-工具管理需要分组&#34;&gt;7.2 工具管理需要分组&lt;/h3&gt;
&lt;p&gt;我们现在是把所有 Tool 塞进 Prompt，Tool 多了之后会影响模型判断。可以借鉴 Tool Group 的思路。&lt;/p&gt;
&lt;h3 id=&#34;73-状态持久化要补全&#34;&gt;7.3 状态持久化要补全&lt;/h3&gt;
&lt;p&gt;我们目前的任务状态存在数据库，但 Agent 的完整对话上下文没有持久化。服务重启后，长任务会丢失上下文。&lt;/p&gt;
&lt;h3 id=&#34;74-多-agent-协作模式可以显式化&#34;&gt;7.4 多 Agent 协作模式可以显式化&lt;/h3&gt;
&lt;p&gt;与其在代码里写死协作逻辑，不如抽象成 Routing / Handoff 模式，更容易扩展和维护。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八选型建议什么时候用-agentscope-20&#34;&gt;八、选型建议：什么时候用 AgentScope 2.0&lt;/h2&gt;
&lt;h3 id=&#34;强烈推荐&#34;&gt;强烈推荐&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;企业级多租户服务&lt;/li&gt;
&lt;li&gt;需要 K8s 分布式部署&lt;/li&gt;
&lt;li&gt;对安全隔离有严格要求（金融、政务、医疗）&lt;/li&gt;
&lt;li&gt;已有 Spring Boot 微服务架构的团队&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;谨慎评估&#34;&gt;谨慎评估&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;只是做单轮 LLM 调用&lt;/li&gt;
&lt;li&gt;追求极简代码量&lt;/li&gt;
&lt;li&gt;团队没有 Java/Python 工程化背景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AgentScope 2.0 是一个「重框架」，对于简单场景可能是过度设计。但对于要上线、要服务真实用户的企业级 Agent 应用，它的价值很明显。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九总结&#34;&gt;九、总结&lt;/h2&gt;
&lt;p&gt;AgentScope 2.0 给我的最大启发是：&lt;strong&gt;Agent 产品化的竞争，正在从模型能力转向工程底座&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;谁能更好地解决安全、并发、状态、工具管理、多 Agent 协作这些问题，谁就能让 Agent 真正跑在生产环境里。&lt;/p&gt;
&lt;p&gt;对于像我这样从 0 自研 Agent 系统的团队，AgentScope 2.0 不一定直接替换现有架构，但它提供了一套值得参考的工程化标准。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;你在做 Agent 工程化时，遇到过哪些头疼的问题？欢迎在评论区交流。&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
