<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DeepSeek on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/deepseek/</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/deepseek/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>生成式AI原理与实战（Part 4）学习笔记：推理模型、DeepSeek-R1 与高效训练架构</title>
      <link>https://ftmao.com/blog/posts/llm-interview-notes-part4/</link>
      <pubDate>Tue, 11 Nov 2025 17:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/llm-interview-notes-part4/</guid>
      <description>&lt;h1 id=&#34;生成式ai原理与实战part-4学习笔记推理模型deepseek-r1-与高效训练架构&#34;&gt;生成式AI原理与实战（Part 4）学习笔记：推理模型、DeepSeek-R1 与高效训练架构&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这是《生成式AI原理与实战》学习笔记的第四篇，也是这个系列的收尾篇。Part 4 的问题非常“硬核”，集中在&lt;strong&gt;推理模型（Reasoning Model）&lt;/strong&gt;、&lt;strong&gt;强化学习训练&lt;/strong&gt;、&lt;strong&gt;DeepSeek-R1 系列&lt;/strong&gt;以及&lt;strong&gt;DeepSeek 的高效训练架构&lt;/strong&gt;上。目标读者仍然是&lt;strong&gt;刚接触 AI 的初中级开发者&lt;/strong&gt;：我会尽量用工程直觉和生活化类比，把这些问题串成一条可理解的脉络。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;写在前面为什么推理模型这么重要&#34;&gt;写在前面：为什么推理模型这么重要？&lt;/h2&gt;
&lt;p&gt;过去两年，大模型领域最大的变化之一，就是从“问什么答什么”的聊天模型，演进到“会思考”的推理模型。DeepSeek-R1、OpenAI o1/o3、QwQ-32B 等模型展示了一个趋势：&lt;strong&gt;让模型在回答前多“想一会儿”，能显著提升复杂任务的准确率&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但这背后涉及很多问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型为什么会“思考”？这和写 &lt;code&gt;let&#39;s think step by step&lt;/code&gt; 有什么区别？&lt;/li&gt;
&lt;li&gt;推理模型是怎么训练出来的？为什么它贵？&lt;/li&gt;
&lt;li&gt;DeepSeek-R1 为什么要先做 SFT 冷启动？&lt;/li&gt;
&lt;li&gt;训练大模型要花多少数据和算力？&lt;/li&gt;
&lt;li&gt;DeepSeek 的 MLA、MoE、FP8、DualPipe 到底在解决什么问题？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这篇文章会按四个主题展开：&lt;strong&gt;推理模型基础&lt;/strong&gt;、&lt;strong&gt;训练与对齐方法选择&lt;/strong&gt;、&lt;strong&gt;DeepSeek-R1 解析&lt;/strong&gt;、&lt;strong&gt;DeepSeek 架构与训练系统&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一推理模型基础从直接回答到测试时计算&#34;&gt;一、推理模型基础：从“直接回答”到“测试时计算”&lt;/h2&gt;
&lt;h3 id=&#34;11-缩放定律训练一个模型需要多少数据和算力&#34;&gt;1.1 缩放定律：训练一个模型需要多少数据和算力？&lt;/h3&gt;
&lt;p&gt;缩放定律（Scaling Laws）告诉我们：模型的性能大致随&lt;strong&gt;参数量&lt;/strong&gt;、&lt;strong&gt;训练数据量&lt;/strong&gt;和&lt;strong&gt;计算量&lt;/strong&gt;一起提升。Chinchilla 论文给出的经验是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;给定固定算力预算，模型参数量 N 和训练 token 数 D 应该大致成比例增长，即 &lt;strong&gt;D ≈ 20N&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，一个 70B 参数的模型，理想情况下需要用约 &lt;strong&gt;1.4 万亿 token&lt;/strong&gt; 来训练。&lt;/p&gt;
&lt;p&gt;算力估算：每个 token 的前向 + 反向传播大约需要 &lt;strong&gt;6 × 参数量&lt;/strong&gt; 次浮点运算（FLOPs）。所以训练 70B 模型用 1.4T token，总计算量约为：&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&gt;6 × 70B × 1.4T ≈ 5.9 × 10^23 FLOPs&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&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[参数量 N] --&amp;gt; C[计算量 C ~ 6ND]
    B[数据量 D] --&amp;gt; C
    C --&amp;gt; P[模型能力]
    style C fill:#fff2cc&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;工程直觉&lt;/strong&gt;：大模型训练就像烧开水——水壶越大（参数越多）、火越旺（数据越多）、烧得越久（训练越久），水温才越高。但三者的配比要合理，否则就是浪费。&lt;/p&gt;
&lt;h3 id=&#34;12-为什么普通大模型不能可靠解决-24-点&#34;&gt;1.2 为什么普通大模型不能可靠解决 24 点？&lt;/h3&gt;
&lt;p&gt;24 点问题需要：给定 4 个整数，通过加减乘除得到 24。这本质上是一个&lt;strong&gt;搜索 + 验证&lt;/strong&gt;问题。&lt;/p&gt;
&lt;p&gt;普通大模型（如 Llama-3 70B）在不输出思维链的情况下，只能做&lt;strong&gt;一次前向传播&lt;/strong&gt;，每个位置预测一个 token。Transformer 没有内置的“试错-回溯”机制，无法枚举所有数字组合并验证结果。因此它可能猜对，但不能&lt;strong&gt;可靠地&lt;/strong&gt;保证正确。&lt;/p&gt;
&lt;p&gt;而一旦允许输出思维链，模型就可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;写出候选算式；&lt;/li&gt;
&lt;li&gt;逐步计算；&lt;/li&gt;
&lt;li&gt;检查结果是否为 24；&lt;/li&gt;
&lt;li&gt;错了就换一条路。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这就是“测试时计算（Test-Time Compute）”的威力：&lt;strong&gt;用更多的生成 token 换取更高的准确率&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;13-cot-提示词-vs-推理模型同样是多想一会儿区别在哪&#34;&gt;1.3 CoT 提示词 vs 推理模型：同样是“多想一会儿”，区别在哪？&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;flowchart TD
    subgraph CoT 提示工程
        P1[用户问题] --&amp;gt; T1[写 let&amp;#39;s think step by step]
        T1 --&amp;gt; G1[模型按已有习惯推理]
    end

    subgraph 推理模型
        P2[用户问题] --&amp;gt; T2[模型自动生成&amp;lt;br/&amp;gt;长思维链]
        T2 --&amp;gt; R2[自我验证/修正]
        R2 --&amp;gt; G2[更高质量答案]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对比项&lt;/th&gt;
					&lt;th&gt;CoT 提示词&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;训练出来的推理能力&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;思维链质量&lt;/td&gt;
					&lt;td&gt;依赖模型原始能力&lt;/td&gt;
					&lt;td&gt;被 RL 训练专门优化&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;通过测试时计算持续提升&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;推理模型上限更高的原因是：它在训练时被&lt;strong&gt;显式激励&lt;/strong&gt;去生成更多推理步骤、进行自我验证、尝试不同路径。而普通模型只是被训练成“预测下一个词”，没有专门被优化去“想得更深”。&lt;/p&gt;
&lt;h3 id=&#34;14-推理模型的-rl-与非推理模型的-rlhf-有什么区别&#34;&gt;1.4 推理模型的 RL 与非推理模型的 RLHF 有什么区别？&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对比项&lt;/th&gt;
					&lt;th&gt;推理模型 RL&lt;/th&gt;
					&lt;th&gt;普通模型 RLHF&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;人类偏好（好坏、有用、安全）&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;对话、写作、问答&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;奖励模型&lt;/td&gt;
					&lt;td&gt;可以直接用规则/单元测试&lt;/td&gt;
					&lt;td&gt;需要训练 Reward Model&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;推理模型 RL 更像是“做数学题对答案”：对了加分，错了扣分。RLHF 更像是“写作文给老师看”：老师打分，模型学着更符合人类口味。&lt;/p&gt;
&lt;h3 id=&#34;15-alphazero-的启示训练时计算-vs-测试时计算的最优配比&#34;&gt;1.5 AlphaZero 的启示：训练时计算 vs 测试时计算的最优配比&lt;/h3&gt;
&lt;p&gt;AlphaZero 下围棋时，&lt;strong&gt;训练阶段&lt;/strong&gt;通过自我对弈生成大量棋谱、更新策略网络；&lt;strong&gt;测试阶段&lt;/strong&gt;用 MCTS 在每一步搜索最佳落子。&lt;/p&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有研究认为，在可验证推理任务上，&lt;strong&gt;训练时计算 : 测试时计算&lt;/strong&gt; 的最优配比可能在 &lt;strong&gt;1000:1 到 10000:1&lt;/strong&gt; 量级。但这不是固定值，更多是一种设计哲学：&lt;strong&gt;先让模型学到好的“直觉”，再让它在推理时多花时间验证&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二训练推理模型奖励模型mcts-与-star&#34;&gt;二、训练推理模型：奖励模型、MCTS 与 STaR&lt;/h2&gt;
&lt;h3 id=&#34;21-过程奖励模型-vs-结果奖励模型&#34;&gt;2.1 过程奖励模型 vs 结果奖励模型&lt;/h3&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;ORM（结果奖励模型）&lt;/td&gt;
					&lt;td&gt;最终答案&lt;/td&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;PRM（过程奖励模型）&lt;/td&gt;
					&lt;td&gt;中间推理步骤&lt;/td&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;ORM 像期末考试只看最终分数；PRM 像老师批改作业，每步都打分。PRM 更好，但标注成本更高。&lt;/p&gt;
&lt;h3 id=&#34;22-mcts-中的探索与利用&#34;&gt;2.2 MCTS 中的探索与利用&lt;/h3&gt;
&lt;p&gt;MCTS（蒙特卡洛树搜索）在推理中用于探索不同解题路径。每选择一个节点时，需要平衡：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;利用（Exploitation）&lt;/strong&gt;：选择当前平均奖励高的节点；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;探索（Exploration）&lt;/strong&gt;：选择访问次数少、潜力未知的节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用 UCB1 公式：&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&gt;UCB = Q/N + c × sqrt(ln(N_parent) / N)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;其中 Q 是累计奖励，N 是访问次数，c 是探索系数。&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;graph TD
    Root[根节点] --&amp;gt; A[节点 A&amp;lt;br/&amp;gt;Q=10 N=5]
    Root --&amp;gt; B[节点 B&amp;lt;br/&amp;gt;Q=3 N=1]
    Root --&amp;gt; C[节点 C&amp;lt;br/&amp;gt;Q=8 N=4]
    B --&amp;gt;|探索加分高| B1[优先探索 B]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;23-star让模型自己教自己推理&#34;&gt;2.3 STaR：让模型自己教自己推理&lt;/h3&gt;
&lt;p&gt;STaR（Self-Taught Reasoner）的核心流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型自己生成大量推理过程和答案；&lt;/li&gt;
&lt;li&gt;只保留答案正确的样本；&lt;/li&gt;
&lt;li&gt;用这些正确的 &lt;code&gt;(问题, 推理, 答案)&lt;/code&gt; 数据微调模型；&lt;/li&gt;
&lt;li&gt;迭代重复。&lt;/li&gt;
&lt;/ol&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
    Q[问题] --&amp;gt; G[模型生成推理+答案]
    G --&amp;gt; F{答案正确？}
    F --&amp;gt;|是| S[加入训练数据]
    F --&amp;gt;|否| D[丢弃]
    S --&amp;gt; T[微调模型]
    T --&amp;gt; Q&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;优点：不需要人工标注推理链；缺点：如果模型一开始生成能力差，容易陷入“错误循环”。&lt;/p&gt;
&lt;h3 id=&#34;24-推理深度与响应延迟的权衡&#34;&gt;2.4 推理深度与响应延迟的权衡&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;：设置最大思考 token 数。&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;hr&gt;
&lt;h2 id=&#34;三方法论选择什么时候用什么技术&#34;&gt;三、方法论选择：什么时候用什么技术？&lt;/h2&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;原因&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;成本低、见效快&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;RAG&lt;/td&gt;
					&lt;td&gt;外挂知识库，减少幻觉&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;输出格式和语言风格&lt;/td&gt;
					&lt;td&gt;SFT&lt;/td&gt;
					&lt;td&gt;用成对数据训练模型习惯&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;领域基础能力&lt;/td&gt;
					&lt;td&gt;SFT&lt;/td&gt;
					&lt;td&gt;让模型学会领域表达和常识&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;领域深度思考能力&lt;/td&gt;
					&lt;td&gt;RL / 推理模型 RL&lt;/td&gt;
					&lt;td&gt;用可验证奖励优化推理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;领域工具调用能力&lt;/td&gt;
					&lt;td&gt;RL + Tool Calling&lt;/td&gt;
					&lt;td&gt;奖励正确的工具使用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;根据用户反馈持续优化&lt;/td&gt;
					&lt;td&gt;RLHF / DPO&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 TD
    Need{需求是什么？} --&amp;gt;|知识/事实| RAG[RAG]
    Need --&amp;gt;|格式/风格| SFT[SFT]
    Need --&amp;gt;|快速验证| PE[提示工程]
    Need --&amp;gt;|深度推理| RL[RL 推理训练]
    Need --&amp;gt;|用户偏好| RLHF[RLHF/DPO]
    Need --&amp;gt;|工具使用| Tool[RL + Tool Calling]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;四deepseek-r1-深度解析&#34;&gt;四、DeepSeek-R1 深度解析&lt;/h2&gt;
&lt;h3 id=&#34;41-r1-与-r1-zero两条路径&#34;&gt;4.1 R1 与 R1-Zero：两条路径&lt;/h3&gt;
&lt;p&gt;DeepSeek-R1-Zero 是&lt;strong&gt;纯强化学习&lt;/strong&gt;的产物：直接在基座模型上用 GRPO 做 RL，没有任何 SFT 冷启动。它证明了：即使没有人工标注的推理数据，模型也能自发学会长思维链推理。&lt;/p&gt;
&lt;p&gt;但它有两个明显问题：&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;DeepSeek-R1 则先用少量高质量 CoT 数据做 &lt;strong&gt;SFT 冷启动&lt;/strong&gt;，然后再用 GRPO 做 RL。这样既保留了推理能力，又改善了可读性和通用能力。&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
    subgraph R1-Zero
        B1[基座模型] --&amp;gt; RL1[纯 RL]
        RL1 --&amp;gt; M1[推理强但可读性差]
    end

    subgraph R1
        B2[基座模型] --&amp;gt; SFT[SFT 冷启动]
        SFT --&amp;gt; RL2[RL 优化]
        RL2 --&amp;gt; M2[推理强 + 可读 + 通用]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;R1-Zero 的价值&lt;/strong&gt;：它证明了大模型可以通过纯 RL 自发涌现复杂推理能力。这是通向“超越人类智能”的一条可能路径——因为模型不再依赖人类标注的解题思路，而是可以自己探索策略。&lt;/p&gt;
&lt;h3 id=&#34;42-为什么-r1-在创意写作上也比基座模型更好&#34;&gt;4.2 为什么 R1 在创意写作上也比基座模型更好？&lt;/h3&gt;
&lt;p&gt;这看似违反直觉：推理模型不是做数学题的吗？&lt;/p&gt;
&lt;p&gt;实际上，R1 学到的不仅是“数学推理”，更是一种&lt;strong&gt;问题分解和自我评估&lt;/strong&gt;的元能力。在创意写作中，它会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;分析用户需求和潜在情绪；&lt;/li&gt;
&lt;li&gt;构思多个创意方向；&lt;/li&gt;
&lt;li&gt;快速评估哪个更有趣；&lt;/li&gt;
&lt;li&gt;输出最终内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种“先想后写”的能力，让它即使思考过程较短，也能产出更有趣的内容。&lt;/p&gt;
&lt;h3 id=&#34;43-为什么-r1-不用-prmmctsbeam-search&#34;&gt;4.3 为什么 R1 不用 PRM、MCTS、Beam Search？&lt;/h3&gt;
&lt;p&gt;DeepSeek 的论文明确提到，他们尝试过 PRM 和 MCTS，但效果不佳。原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PRM&lt;/strong&gt;：需要大量高质量的过程标注，成本高，且很难定义“哪一步好”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCTS&lt;/strong&gt;：在开放文本生成中，搜索空间是组合爆炸的，每一步的“走法”太多了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beam Search&lt;/strong&gt;：同样受限于巨大的候选空间，且不利于探索非确定性推理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GRPO + 可验证奖励（如答案正确性）更简单、更可扩展。&lt;/p&gt;
&lt;h3 id=&#34;44-grpo-vs-ppo为什么-r1-选择-grpo&#34;&gt;4.4 GRPO vs PPO：为什么 R1 选择 GRPO？&lt;/h3&gt;
&lt;p&gt;PPO 训练时需要维护多个模型：Actor、Critic、Reward Model、Reference Model。其中 Critic 模型通常和 Actor 一样大，显存开销很高。&lt;/p&gt;
&lt;p&gt;GRPO（Group Relative Policy Optimization）的改进：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不需要 Critic 模型&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;对同一个问题采样一组回答；&lt;/li&gt;
&lt;li&gt;用组内相对奖励计算优势函数（减去组内均值，除以标准差）。&lt;/li&gt;
&lt;/ul&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
    subgraph PPO
        P[Prompt] --&amp;gt; A[Actor]
        P --&amp;gt; C[Critic]
        A --&amp;gt; R[Reward Model]
        A --&amp;gt; Ref[Reference Model]
    end

    subgraph GRPO
        G[Prompt] --&amp;gt; GA[Actor]
        GA --&amp;gt;|采样 N 个回答| GR[组内相对奖励]
        GR --&amp;gt; GN[归一化优势]
        GA --&amp;gt; GRef[Reference Model]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;优势值归一化解决了 PPO 中 Critic 估计不准的问题，同时大幅降低了显存和计算成本。&lt;/p&gt;
&lt;h3 id=&#34;45-grpo-中的-kl-惩罚项&#34;&gt;4.5 GRPO 中的 KL 惩罚项&lt;/h3&gt;
&lt;p&gt;KL 惩罚项衡量当前策略与参考策略（通常是 SFT 模型）的差异，防止模型在 RL 训练中“跑偏”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KL 太大&lt;/strong&gt;：策略更新保守，学不到新能力；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KL 太小&lt;/strong&gt;：策略可能崩溃，输出乱码或 reward hacking。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;合适的 KL 系数需要在探索能力和稳定性之间找平衡。&lt;/p&gt;
&lt;h3 id=&#34;46-为什么-r1-的-sft-要加-20-万条非推理样本&#34;&gt;4.6 为什么 R1 的 SFT 要加 20 万条非推理样本？&lt;/h3&gt;
&lt;p&gt;如果只用推理数据做 SFT，模型会变成“只会做题的偏科生”。加入非推理样本（写作、翻译、对话、常识问答）可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保持通用语言能力；&lt;/li&gt;
&lt;li&gt;防止模型在非推理任务上退化；&lt;/li&gt;
&lt;li&gt;让最终模型既能深度思考，也能正常聊天。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;47-如何把-r1-蒸馏到小模型&#34;&gt;4.7 如何把 R1 蒸馏到小模型？&lt;/h3&gt;
&lt;p&gt;蒸馏的核心是用 R1 生成的高质量数据（包括长思维链）去监督微调一个小模型。步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 R1 在目标领域生成大量 &lt;code&gt;(问题, 思维链, 答案)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;清洗和筛选高质量样本；&lt;/li&gt;
&lt;li&gt;在小模型上做 SFT；&lt;/li&gt;
&lt;li&gt;在垂直领域任务上评估。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要保留特定领域能力，关键是&lt;strong&gt;蒸馏数据要覆盖该领域的典型问题和推理模式&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;48-r1-zero-为什么会多语言混杂&#34;&gt;4.8 R1-Zero 为什么会多语言混杂？&lt;/h3&gt;
&lt;p&gt;R1-Zero 的奖励函数只关心最终答案是否正确，不关心中间过程用什么语言。由于基座模型是多语言训练的，它会自发选择任何能表达推理的语言。中文 prompt 可能触发英文思考，反之亦然。&lt;/p&gt;
&lt;p&gt;R1 通过 SFT 冷启动，让模型先学会用规范、统一的语言输出思维链，解决了这个问题。&lt;/p&gt;
&lt;h3 id=&#34;49-如何把-r1-zero-方法扩展到主观领域&#34;&gt;4.9 如何把 R1-Zero 方法扩展到主观领域？&lt;/h3&gt;
&lt;p&gt;R1-Zero 依赖&lt;strong&gt;可验证奖励&lt;/strong&gt;，所以最适合数学、编程。扩展到创意写作、战略分析等主观领域，需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定义可自动评估的代理指标（如多样性、一致性、可读性）；&lt;/li&gt;
&lt;li&gt;用 LLM-as-Judge 作为奖励信号；&lt;/li&gt;
&lt;li&gt;用人工偏好数据做 RLHF/DPO；&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;五deepseek-架构与训练系统创新&#34;&gt;五、DeepSeek 架构与训练系统创新&lt;/h2&gt;
&lt;h3 id=&#34;51-mla低秩压缩的-kv-缓存&#34;&gt;5.1 MLA：低秩压缩的 KV 缓存&lt;/h3&gt;
&lt;p&gt;多头注意力（MHA）每一层都要保存 Query、Key、Value。KV 缓存是推理时显存占用的主要来源。&lt;/p&gt;
&lt;p&gt;MLA（Multi-head Latent Attention）的核心思想：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;把 KV 压缩到一个低维“潜空间”，需要时再解压。&lt;/p&gt;
&lt;/blockquote&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
    X[输入] --&amp;gt; Q[生成 Query]
    X --&amp;gt; K[生成 Key]
    X --&amp;gt; V[生成 Value]
    K --&amp;gt; C[低秩压缩]
    V --&amp;gt; C
    C --&amp;gt; KV[小 KV 缓存]
    KV --&amp;gt; D[解压]
    Q --&amp;gt; A[Attention]
    D --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;虽然 MLA 单 token 的 KV 可能比 MQA（Multi-Query Attention）多一点，但它保留了更多信息，模型性能更好。它本质上是对 &lt;strong&gt;(注意力头数, 隐藏维度)&lt;/strong&gt; 这个高维空间做低秩压缩。&lt;/p&gt;
&lt;h3 id=&#34;52-mla-与-rope-位置编码的兼容性&#34;&gt;5.2 MLA 与 RoPE 位置编码的兼容性&lt;/h3&gt;
&lt;p&gt;RoPE（旋转位置编码）把位置信息直接编码进 Q/K 向量中。如果直接对 KV 做低秩压缩，位置信息会被破坏。&lt;/p&gt;
&lt;p&gt;DeepSeek 的解决方案是把位置编码部分和可压缩部分&lt;strong&gt;解耦&lt;/strong&gt;：保留一个带位置信息的短向量，把其余信息压缩到潜空间。这样既能低秩压缩，又不丢失位置信息。&lt;/p&gt;
&lt;p&gt;如果用 ALiBi 等基于注意力偏置的位置编码，低秩压缩会引入与位置相关的偏置，更难处理。&lt;/p&gt;
&lt;h3 id=&#34;53-deepseek-moe为什么前-3-层用稠密连接&#34;&gt;5.3 DeepSeek MoE：为什么前 3 层用稠密连接？&lt;/h3&gt;
&lt;p&gt;MoE（Mixture of Experts）把每一层换成多个“专家网络”，每次只激活一部分。DeepSeek 的设计是：前 3 层保持稠密，后面用 MoE。&lt;/p&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前几层负责提取基础特征（词法、句法、低级语义）；&lt;/li&gt;
&lt;li&gt;这些基础特征需要稳定、共享的表示；&lt;/li&gt;
&lt;li&gt;如果早期就用 MoE，不同 token 可能路由到不同专家，导致基础表示不一致，影响后续层。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;54-deepseek-moe-vs-mixtral-moe&#34;&gt;5.4 DeepSeek MoE vs Mixtral MoE&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;Mixtral MoE&lt;/th&gt;
					&lt;th&gt;DeepSeek MoE&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;专家数量&lt;/td&gt;
					&lt;td&gt;较少（如 8 个）&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;较小&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;Top-2&lt;/td&gt;
					&lt;td&gt;更细粒度的负载均衡路由&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;DeepSeek 的&lt;strong&gt;细粒度专家分割&lt;/strong&gt;让模型能组合更多专家能力；&lt;strong&gt;共享专家隔离&lt;/strong&gt;确保通用知识始终可用，避免所有 token 都涌向少数专家。&lt;/p&gt;
&lt;h3 id=&#34;55-专家负载均衡防止路由崩溃&#34;&gt;5.5 专家负载均衡：防止“路由崩溃”&lt;/h3&gt;
&lt;p&gt;如果所有 token 都选择同一个专家，其他专家就浪费了，这叫“路由崩溃”。DeepSeek 通过&lt;strong&gt;辅助损失函数&lt;/strong&gt;解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;专家级平衡损失&lt;/strong&gt;：鼓励每个专家处理的 token 数量均衡；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通信平衡损失&lt;/strong&gt;：减少节点间通信开销；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备级平衡损失&lt;/strong&gt;：让不同 GPU 上的负载均衡。&lt;/li&gt;
&lt;/ul&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
    T[Token] --&amp;gt; R[路由网络]
    R --&amp;gt; E1[专家 1]
    R --&amp;gt; E2[专家 2]
    R --&amp;gt; E3[专家 3]
    E1 --&amp;gt; L[负载均衡损失]
    E2 --&amp;gt; L
    E3 --&amp;gt; L&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;56-多词元预测一次预测多个未来-token&#34;&gt;5.6 多词元预测：一次预测多个未来 token&lt;/h3&gt;
&lt;p&gt;传统模型一次只预测下一个 token。DeepSeek-V3 的多词元预测（Multi-Token Prediction）会同时预测后面几个 token。&lt;/p&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;：可以配合投机解码，一次验证多个 token。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;57-fp8-混合精度训练&#34;&gt;5.7 FP8 混合精度训练&lt;/h3&gt;
&lt;p&gt;DeepSeek-V3 在大量矩阵计算中使用 FP8（8 位浮点）量化，包括 Linear 层和 Attention 中的矩阵乘法。为了降低精度损失，它采用了&lt;strong&gt;分组量化（tile/block-wise quantization）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把大矩阵切成小块；&lt;/li&gt;
&lt;li&gt;每块独立计算 scale 和 zero-point；&lt;/li&gt;
&lt;li&gt;对激活值和权重都这样做。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样比全局量化更精细，损失更小。&lt;/p&gt;
&lt;h3 id=&#34;58-dualpipe双向流水线并行&#34;&gt;5.8 DualPipe：双向流水线并行&lt;/h3&gt;
&lt;p&gt;训练超大模型时，流水线并行把模型分层放到不同 GPU 上。传统流水线有“气泡时间”——GPU 在等待上下游数据时空闲。&lt;/p&gt;
&lt;p&gt;DualPipe 的创新是&lt;strong&gt;双向流水线&lt;/strong&gt;：同时从前后两个方向传递数据，让 GPU 尽可能不空闲。结合专家并行，它还能平衡 MoE 中不同专家的负载，提高整体训练效率。&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
    subgraph 传统流水线
        A[GPU 1] --&amp;gt; B[GPU 2]
        B --&amp;gt; C[GPU 3]
        C --&amp;gt; D[GPU 4]
        style B fill:#f8cecc
        style C fill:#f8cecc
    end

    subgraph DualPipe
        E[GPU 1] --&amp;gt; F[GPU 2]
        F --&amp;gt; G[GPU 3]
        G --&amp;gt; H[GPU 4]
        H -.-&amp;gt; E
        style F fill:#e1f5e1
        style G fill:#e1f5e1
    end&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;61-在-qwq-32b-上强化-deep-research-能力&#34;&gt;6.1 在 QwQ-32B 上强化 Deep Research 能力&lt;/h3&gt;
&lt;p&gt;Deep Research 场景需要模型：搜索 → 浏览 → 总结 → 再搜索。构建 RL 训练数据时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;准备多轮搜索-总结任务；&lt;/li&gt;
&lt;li&gt;奖励函数包括：最终答案正确性、引用来源覆盖度、信息是否过时、是否完成任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;62-让-r1-支持图片推理&#34;&gt;6.2 让 R1 支持图片推理&lt;/h3&gt;
&lt;p&gt;要把 R1 扩展到多模态，需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增加视觉编码器（如 ViT）；&lt;/li&gt;
&lt;li&gt;构建图片 + 问题 + CoT + 答案的训练数据；&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;ol&gt;
&lt;li&gt;&lt;strong&gt;不要迷信大模型参数&lt;/strong&gt;。同样参数的推理模型和普通模型，能力侧重点完全不同。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可验证奖励是 RL 训练的关键&lt;/strong&gt;。数学、编程适合 RL；开放域生成更适合 RLHF/DPO。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试时计算是新的 scaling 维度&lt;/strong&gt;。未来提升模型能力，不一定只靠堆参数量，也可以让它“想得更久”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;架构创新是为了训练和服务更便宜&lt;/strong&gt;。MLA、MoE、FP8、DualPipe 的目标都是在保持性能的同时降低成本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;蒸馏是把大模型能力落地到小场景的有效路径&lt;/strong&gt;。关键是要有高质量的教师数据。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;结语&#34;&gt;结语&lt;/h2&gt;
&lt;p&gt;Part 4 把我们从“怎么用大模型”带到了“怎么训练和优化大模型”的深处。对初级开发者来说，不必一次性掌握所有细节，但要建立几个核心直觉：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;推理模型的本质是&lt;strong&gt;用更多测试时计算换准确率&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;RL 训练的关键是&lt;strong&gt;奖励信号设计&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;DeepSeek-R1 的成功说明：&lt;strong&gt;SFT 冷启动 + 可验证奖励的 RL&lt;/strong&gt; 是一条务实的路径；&lt;/li&gt;
&lt;li&gt;大模型训练不只是算法问题，更是&lt;strong&gt;系统工程问题&lt;/strong&gt;（MLA、MoE、FP8、DualPipe 都在解决工程效率）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你能理解这些，就已经具备了参与大模型应用和训练工程的基本视野。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：《生成式AI原理与实战 —— Part 4》，答案基于公开论文与工程实践整理。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
