<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; DeepSeek</title>
	<atom:link href="https://www.phppan.com/tag/deepseek/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sun, 10 May 2026 02:26:45 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>DeepSeek 和腾讯元宝都选择在用的SSE 到底是什么？</title>
		<link>https://www.phppan.com/2025/06/deepseek-and-tencent-yuanbao-sse/</link>
		<comments>https://www.phppan.com/2025/06/deepseek-and-tencent-yuanbao-sse/#comments</comments>
		<pubDate>Sat, 14 Jun 2025 05:52:21 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[DeepSeek]]></category>
		<category><![CDATA[SSE]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2382</guid>
		<description><![CDATA[在我们和 AI 聊天中，AI Chat 都采用了一种「打字机」式效果的实时响应方式，AI 的回答逐字逐句地呈现 [&#8230;]]]></description>
				<content:encoded><![CDATA[<div>
<p>在我们和 AI 聊天中，AI Chat 都采用了一种「打字机」式效果的实时响应方式，AI 的回答逐字逐句地呈现在我们眼前。</p>
<p>在实现这个功能的技术方案选择上，不管是 DeepSeek ，还是腾讯元宝都在这个对话逻辑中选择了使用 SSE，如下面 4 张图：</p>
<p><img class="medium-zoom-image" src="https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/210d4c551ad04417bd5021d4964767a8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1749996857&amp;x-signature=d%2FnzFP0FzMtWTHxvPaHkxjTe7v0%3D" alt="" /></p>
<p><img class="medium-zoom-image" src="https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/06a2f33b0fe94973a737d036e443db79~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1749996857&amp;x-signature=Zk26UC8HbQYKhNTJApBJfEexpho%3D" alt="" /></p>
<p><img class="medium-zoom-image" src="https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7e3a27c0b99541229e7dd1af77505a0d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1749996857&amp;x-signature=UybqtP9x6nc3Bd4VqRmN7pC6Ze4%3D" alt="" /></p>
<p><img class="medium-zoom-image" src="https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d93ef424c557496e91b2835cb4e85280~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1749996857&amp;x-signature=hA7vPTueQboxlZahwc%2FishN60BM%3D" alt="" /></p>
<p>这是为啥，它有什么优势，以及如何实现的。</p>
<h2 data-id="heading-0">SSE 的优势</h2>
<p>因为它在该场景下的优势非常明显，主要是以下 4 点：</p>
<p><strong>1.场景的高度匹配。</strong></p>
<p>AI 对话的核心交互模式是：</p>
<ol>
<li><strong>用户发起一次请求</strong>（发送问题）。</li>
<li><strong>AI 进行一次持续的、单向的响应输出</strong>（生成回答）。</li>
</ol>
<p>SSE 的<strong>单向通信</strong>（服务器 → 客户端）模型与这个场景高度切尔西。它就像一条专门为服务器向客户端输送数据的「单行道」，不多一分功能，也不少一毫关键。</p>
<p>相比之下，WebSocket 提供的是<strong>全双工通信</strong>，即客户端和服务器可以随时互相发送消息，这是一条「双向八车道高速公路」。为了实现 AI 的流式回答，我们只需要其中一个方向的车道，而另一方向的车道（客户端 → 服务器）在 AI 回答期间是闲置的。在这种场景下使用 WebSocket，无异于「杀鸡用牛刀」，引入了不必要的复杂性。用户的提问完全可以通过另一个<strong>独立的、常规的 HTTP POST 请求</strong>来完成，这让整个系统的架构更加清晰和解耦。</p>
<p><strong>2.HTTP 原生支持，与生俱来的优势</strong></p>
<p>SSE 是建立在标准 HTTP 协议之上的。这意味着：</p>
<ul>
<li><strong>无需协议升级</strong>：SSE 连接的建立就是一个普通的 HTTP GET 请求，服务器以 <code>Content-Type: text/event-stream</code> 响应。而 WebSocket 则需要一个特殊的「协议升级」（Upgrade）握手过程，从 HTTP 切换到 <code>ws://</code> 或 <code>wss://</code> 协议，过程相对复杂。</li>
<li><strong>兼容性极佳</strong>：由于它就是 HTTP，所以它能天然地穿透现有的网络基础设施，包括防火墙、企业代理、负载均衡器等，几乎不会遇到兼容性问题。WebSocket 有时则会因为代理服务器不支持其协议升级而被阻断。并且云服务商对于 Websocket 的支持并不是很完善。</li>
<li><strong>实现轻量</strong>：无论是前端还是后端，实现 SSE 都非常简单。前端一个 <code>EventSource</code> API 即可搞定，后端也只需遵循简单的文本格式返回数据流。这大大降低了开发和维护的成本。</li>
</ul>
<p><strong>3.断网自动重连，原生容错</strong></p>
<p>这是 SSE 的「王牌特性」，尤其在网络不稳定的移动端至关重要。</p>
<p>想象一下，当 AI 正在为我们生成一篇长文时，我们的手机网络突然从 Wi-Fi 切换到 5G，造成了瞬间的网络中断。</p>
<ul>
<li><strong>如果使用 WebSocket</strong>：连接会断开，我们需要手动编写复杂的 JavaScript 代码来监听断开事件、设置定时器、尝试重连、并在重连成功后告知服务器从哪里继续，实现起来非常繁琐。</li>
<li><strong>如果使用 SSE</strong>：<strong>浏览器会自动处理这一切</strong>。<code>EventSource</code> API 在检测到连接中断后，会自动在几秒后（这个间隔可以通过 <code>retry</code> 字段由服务器建议）发起重连。更棒的是，它还会自动将最后收到的消息 <code>id</code> 通过 <code>Last-Event-ID</code> 请求头发送给服务器，让服务器可以从中断的地方继续推送数据，实现无缝的「断点续传」。当然，Last-Event-ID 的处理逻辑需要服务端来处理。</li>
</ul>
<p>这种由浏览器原生提供的、可靠的容错机制，为我们省去了大量心力，并极大地提升了用户体验。</p>
<p><strong>4. 易于调试</strong></p>
<p>因为 SSE 的数据流是纯文本并通过标准 HTTP 传输，调试起来异常方便：</p>
<ul>
<li>我们可以直接在浏览器地址栏输入 SSE 端点的 URL，就能在页面上看到服务器推送的实时文本流。</li>
<li>我偿可以使用任何 HTTP 调试工具，如 <code>curl</code> 命令行或者 Chrome 开发者工具的「网络」面板，清晰地看到每一次数据推送的内容。</li>
</ul>
<p>而 WebSocket 的数据传输基于帧，格式更复杂，通常需要专门的工具来调试和分析。</p>
<h2 data-id="heading-1">使用 SSE 实现「打字机」效果</h2>
<p><strong>1.后端——调用大模型并开启「流式」开关</strong></p>
<p>当后端服务器收到用户的问题后，它并不等待大语言模型生成完整的答案。相反，它在调用 LLM 的 API 时，会传递一个关键参数：<code>stream=True</code>。</p>
<p>这个参数告诉 LLM：「请不要等全部内容生成完再给我，而是每生成一小部分（通常是一个或几个‘词元’/Token），就立刻通过数据流发给我。」</p>
<p>下面是一个使用 Python 和 OpenAI API 的后端伪代码示例：</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="code-block-extension-foldBtn"></div>
<p><span class="code-block-extension-lang">python</span></div>
<div class="code-block-extension-headerRight">
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs language-python code-block-extension-codeShowNum" lang="python"><span class="code-block-extension-codeLine" data-line-num="1"><span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask, Response, request</span>
<span class="code-block-extension-codeLine" data-line-num="2"><span class="hljs-keyword">import</span> openai</span>
<span class="code-block-extension-codeLine" data-line-num="3"><span class="hljs-keyword">import</span> json</span>

<span class="code-block-extension-codeLine" data-line-num="5">app = Flask(__name__)</span>

<span class="code-block-extension-codeLine" data-line-num="7"><span class="hljs-comment"># 假设 OpenAI 的 API Key 已经配置好</span></span>
<span class="code-block-extension-codeLine" data-line-num="8"><span class="hljs-comment"># openai.api_key = "YOUR_API_KEY"</span></span>

<span class="code-block-extension-codeLine" data-line-num="10"><span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">'/chat-stream'</span></span>)</span></span>
<span class="code-block-extension-codeLine" data-line-num="11"><span class="hljs-keyword">def</span> <span class="hljs-title function_">chat_stream</span>():</span>
<span class="code-block-extension-codeLine" data-line-num="12">    prompt = request.args.get(<span class="hljs-string">'prompt'</span>)</span>

<span class="code-block-extension-codeLine" data-line-num="14">    <span class="hljs-keyword">def</span> <span class="hljs-title function_">generate_events</span>():</span>
<span class="code-block-extension-codeLine" data-line-num="15">        <span class="hljs-keyword">try</span>:</span>
<span class="code-block-extension-codeLine" data-line-num="16">            <span class="hljs-comment"># 关键：设置 stream=True</span></span>
<span class="code-block-extension-codeLine" data-line-num="17">            response_stream = openai.ChatCompletion.create(</span>
<span class="code-block-extension-codeLine" data-line-num="18">                model=<span class="hljs-string">"gpt-4"</span>, <span class="hljs-comment"># 或其他模型</span></span>
<span class="code-block-extension-codeLine" data-line-num="19">                messages=[{<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: prompt}],</span>
<span class="code-block-extension-codeLine" data-line-num="20">                stream=<span class="hljs-literal">True</span> </span>
<span class="code-block-extension-codeLine" data-line-num="21">            )</span>

<span class="code-block-extension-codeLine" data-line-num="23">            <span class="hljs-comment"># 遍历从大模型返回的数据流</span></span>
<span class="code-block-extension-codeLine" data-line-num="24">            <span class="hljs-keyword">for</span> chunk <span class="hljs-keyword">in</span> response_stream:</span>
<span class="code-block-extension-codeLine" data-line-num="25">                <span class="hljs-comment"># 提取内容部分</span></span>
<span class="code-block-extension-codeLine" data-line-num="26">                content = chunk.choices[<span class="hljs-number">0</span>].delta.get(<span class="hljs-string">'content'</span>, <span class="hljs-string">''</span>)</span>
<span class="code-block-extension-codeLine" data-line-num="27">                <span class="hljs-keyword">if</span> content:</span>
<span class="code-block-extension-codeLine" data-line-num="28">                    <span class="hljs-comment"># 关键：将每个内容块封装成 SSE 格式并 yield 出去</span></span>
<span class="code-block-extension-codeLine" data-line-num="29">                    <span class="hljs-comment"># 使用 json.dumps 保证数据格式正确</span></span>
<span class="code-block-extension-codeLine" data-line-num="30">                    sse_data = <span class="hljs-string">f"data: <span class="hljs-subst">{json.dumps({<span class="hljs-string">'token'</span>: content}</span>)}\n\n"</span></span>
<span class="code-block-extension-codeLine" data-line-num="31">                    <span class="hljs-keyword">yield</span> sse_data</span>

<span class="code-block-extension-codeLine" data-line-num="33">            <span class="hljs-comment"># (可选) 发送一个结束信号</span></span>
<span class="code-block-extension-codeLine" data-line-num="34">            <span class="hljs-keyword">yield</span> <span class="hljs-string">"event: done\ndata: [STREAM_END]\n\n"</span></span>

<span class="code-block-extension-codeLine" data-line-num="36">        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:</span>
<span class="code-block-extension-codeLine" data-line-num="37">            <span class="hljs-comment"># 错误处理</span></span>
<span class="code-block-extension-codeLine" data-line-num="38">            error_message = <span class="hljs-string">f"event: error\ndata: <span class="hljs-subst">{json.dumps({<span class="hljs-string">'error'</span>: <span class="hljs-built_in">str</span>(e)}</span>)}\n\n"</span></span>
<span class="code-block-extension-codeLine" data-line-num="39">            <span class="hljs-keyword">yield</span> error_message</span>

<span class="code-block-extension-codeLine" data-line-num="41">    <span class="hljs-comment"># 返回一个流式响应，并设置正确的 MIME 类型</span></span>
<span class="code-block-extension-codeLine" data-line-num="42">    <span class="hljs-keyword">return</span> Response(generate_events(), mimetype=<span class="hljs-string">'text/event-stream'</span>)</span>

<span class="code-block-extension-codeLine" data-line-num="44"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:</span>
<span class="code-block-extension-codeLine" data-line-num="45">    app.run(threaded=<span class="hljs-literal">True</span>)</span>
</code></pre>
<p>在这段代码中，有几个关键点：</p>
<ol>
<li><strong>stream=True</strong>：向 LLM 请求流式数据。</li>
<li><strong>生成器函数（<code>generate_events</code>）</strong>：使用 <code>yield</code> 关键字，每从 LLM 收到一小块数据，就立即将其处理成 SSE 格式（<code>data: ...\n\n</code>）并发送出去。</li>
<li><code>Response(..., mimetype='text/event-stream')</code>：告诉浏览器，这是一个 SSE 流，请保持连接并准备接收事件。</li>
</ol>
<h5 data-id="heading-2"><strong>2.SSE 格式的约定</strong></h5>
<p>后端 <code>yield</code> 的每一条 <code>data:</code> 都像是一个个装着文字的信封，通过 HTTP 长连接这个管道持续不断地寄给前端。</p>
<p>前端收到的原始数据流看起来就像这样：</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="code-block-extension-foldBtn"></div>
<p><span class="code-block-extension-lang">vbnet</span></div>
<div class="code-block-extension-headerRight">
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs language-vbnet code-block-extension-codeShowNum" lang="vbnet"><span class="code-block-extension-codeLine" data-line-num="1"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"当"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="3"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"然"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="5"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"，"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="7"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"很"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="9"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"乐"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="11"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"意"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="13"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"为"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="15"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"您"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="17"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"解"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="19"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"答"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="21"><span class="hljs-symbol">data:</span> {<span class="hljs-string">"token"</span>: <span class="hljs-string">"。"</span>}</span>

<span class="code-block-extension-codeLine" data-line-num="23"><span class="hljs-symbol">event:</span> done</span>
<span class="code-block-extension-codeLine" data-line-num="24"><span class="hljs-symbol">data:</span> [STREAM_END]</span>
</code></pre>
<p>看 DeepSeek 和腾讯元宝的数据格式，略有不同，不过有一点，都是直接用的 JSON 格式，且元宝的返回值相对冗余一些。 且都没有 data: 的前缀。</p>
<p><strong>3.前端监听并拼接成「打字机」</strong></p>
<p>前端的工作就是接收这些「信封」，拆开并把里面的文字一个个地追加到聊天框里。</p>
<div class="code-block-extension-header">
<div class="code-block-extension-headerLeft">
<div class="code-block-extension-foldBtn"></div>
<p><span class="code-block-extension-lang">html</span></div>
<div class="code-block-extension-headerRight">
<div class="render" data-v-159ebe90=""><span class="txt" data-v-159ebe90="">代码解读</span></div>
<div class="code-block-extension-copyCodeBtn">复制代码</div>
</div>
</div>
<pre><code class="hljs language-html code-block-extension-codeShowNum" lang="html"><span class="code-block-extension-codeLine" data-line-num="1"><span class="hljs-comment">&lt;!-- HTML 结构 --&gt;</span></span>
<span class="code-block-extension-codeLine" data-line-num="2"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"chat-box"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
<span class="code-block-extension-codeLine" data-line-num="3"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user-input"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>&gt;</span></span>
<span class="code-block-extension-codeLine" data-line-num="4"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">"sendMessage()"</span>&gt;</span>发送<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></span>

<span class="code-block-extension-codeLine" data-line-num="6"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span></span>
<span class="code-block-extension-codeLine" data-line-num="7">    <span class="hljs-keyword">let</span> eventSource;</span>

<span class="code-block-extension-codeLine" data-line-num="9">    <span class="hljs-keyword">function</span> <span class="hljs-title function_">sendMessage</span>() {</span>
<span class="code-block-extension-codeLine" data-line-num="10">        <span class="hljs-keyword">const</span> input = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'user-input'</span>);</span>
<span class="code-block-extension-codeLine" data-line-num="11">        <span class="hljs-keyword">const</span> prompt = input.<span class="hljs-property">value</span>;</span>
<span class="code-block-extension-codeLine" data-line-num="12">        input.<span class="hljs-property">value</span> = <span class="hljs-string">''</span>;</span>

<span class="code-block-extension-codeLine" data-line-num="14">        <span class="hljs-keyword">const</span> chatBox = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'chat-box'</span>);</span>
<span class="code-block-extension-codeLine" data-line-num="15">        <span class="hljs-comment">// 创建一个新的 p 标签来显示 AI 的回答</span></span>
<span class="code-block-extension-codeLine" data-line-num="16">        <span class="hljs-keyword">const</span> aiMessageElement = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'p'</span>);</span>
<span class="code-block-extension-codeLine" data-line-num="17">        aiMessageElement.<span class="hljs-property">textContent</span> = <span class="hljs-string">"AI: "</span>;</span>
<span class="code-block-extension-codeLine" data-line-num="18">        chatBox.<span class="hljs-title function_">appendChild</span>(aiMessageElement);</span>

<span class="code-block-extension-codeLine" data-line-num="20">        <span class="hljs-comment">// 建立 SSE 连接</span></span>
<span class="code-block-extension-codeLine" data-line-num="21">        eventSource = <span class="hljs-keyword">new</span> <span class="hljs-title class_">EventSource</span>(<span class="hljs-string">`/chat-stream?prompt=<span class="hljs-subst">${<span class="hljs-built_in">encodeURIComponent</span>(prompt)}</span>`</span>);</span>

<span class="code-block-extension-codeLine" data-line-num="23">        <span class="hljs-comment">// 监听 message 事件，这是接收所有 "data:" 字段的地方</span></span>
<span class="code-block-extension-codeLine" data-line-num="24">        eventSource.<span class="hljs-property">onmessage</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params">event</span>) {</span>
<span class="code-block-extension-codeLine" data-line-num="25">            <span class="hljs-comment">// 解析 JSON 字符串</span></span>
<span class="code-block-extension-codeLine" data-line-num="26">            <span class="hljs-keyword">const</span> data = <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">parse</span>(event.<span class="hljs-property">data</span>);</span>
<span class="code-block-extension-codeLine" data-line-num="27">            <span class="hljs-keyword">const</span> token = data.<span class="hljs-property">token</span>;</span>

<span class="code-block-extension-codeLine" data-line-num="29">            <span class="hljs-keyword">if</span> (token) {</span>
<span class="code-block-extension-codeLine" data-line-num="30">                <span class="hljs-comment">// 将新收到的文字追加到 p 标签末尾</span></span>
<span class="code-block-extension-codeLine" data-line-num="31">                aiMessageElement.<span class="hljs-property">textContent</span> += token;</span>
<span class="code-block-extension-codeLine" data-line-num="32">            }</span>
<span class="code-block-extension-codeLine" data-line-num="33">        };</span>

<span class="code-block-extension-codeLine" data-line-num="35">        <span class="hljs-comment">// 监听自定义的 done 事件，表示数据流结束</span></span>
<span class="code-block-extension-codeLine" data-line-num="36">        eventSource.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'done'</span>, <span class="hljs-keyword">function</span>(<span class="hljs-params">event</span>) {</span>
<span class="code-block-extension-codeLine" data-line-num="37">            <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'Stream finished:'</span>, event.<span class="hljs-property">data</span>);</span>
<span class="code-block-extension-codeLine" data-line-num="38">            <span class="hljs-comment">// 关闭连接，释放资源</span></span>
<span class="code-block-extension-codeLine" data-line-num="39">            eventSource.<span class="hljs-title function_">close</span>();</span>
<span class="code-block-extension-codeLine" data-line-num="40">        });</span>

<span class="code-block-extension-codeLine" data-line-num="42">        <span class="hljs-comment">// 监听错误</span></span>
<span class="code-block-extension-codeLine" data-line-num="43">        eventSource.<span class="hljs-property">onerror</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params">err</span>) {</span>
<span class="code-block-extension-codeLine" data-line-num="44">            <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">"EventSource failed:"</span>, err);</span>
<span class="code-block-extension-codeLine" data-line-num="45">            aiMessageElement.<span class="hljs-property">textContent</span> += <span class="hljs-string">" [出现错误，连接已断开]"</span>;</span>
<span class="code-block-extension-codeLine" data-line-num="46">            eventSource.<span class="hljs-title function_">close</span>();</span>
<span class="code-block-extension-codeLine" data-line-num="47">        };</span>
<span class="code-block-extension-codeLine" data-line-num="48">    }</span>
<span class="code-block-extension-codeLine" data-line-num="49"><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span>
</code></pre>
<p>这段代码主要有如下的点：</p>
<ol>
<li><code>new EventSource(...)</code>：发起连接。</li>
<li><code>eventSource.onmessage</code>：这是主要的处理函数。每当收到一条 <code>data:</code> 消息，它就会被触发。</li>
<li><code>aiMessageElement.textContent += token;</code>：这就是「打字机」效果的精髓所在——<strong>持续地在同一个 DOM 元素上追加内容</strong>，而不是创建新的元素。</li>
<li><code>eventSource.close()</code>：在接收到结束信号或发生错误后，务必关闭连接，以避免不必要的资源占用。</li>
</ol>
<h2 data-id="heading-3">EventSource 的来源与发展</h2>
<p>在 SSE 标准化之前，Web 的基础是 HTTP 的请求-响应模型：客户端发起请求，服务器给予响应，然后连接关闭。这种模式无法满足服务器主动向客户端推送信息的需求。为了突破这一限制，开发者们创造了多种「模拟」实时通信的技术。</p>
<ol>
<li><strong>短轮询</strong>：这是最简单直接的方法。客户端通过 JavaScript 定时（如每隔几秒）向服务器发送一次 HTTP 请求，询问是否有新数据。无论有无更新，服务器都会立即返回响应。这种方式实现简单，但缺点显而易见：存在大量无效请求，实时性差，并且对服务器造成了巨大的负载压力。</li>
<li><strong>长轮询</strong>：为了改进短轮询，长轮询应运而生。客户端发送一个请求后，服务器并不会立即响应，而是会保持连接打开，直到有新数据产生或者连接超时。一旦服务器发送了数据并关闭了连接，客户端会立即发起一个新的长轮询请求。这大大减少了无效请求，提高了数据的实时性，但仍然存在 HTTP 连接的开销，并且实现起来相对复杂。</li>
<li><strong>Comet：一个时代的统称</strong>：在 HTML5 标准化之前，像长轮询和 HTTP 流（HTTP Streaming）这样的技术被统称为 <strong>Comet</strong>。 Comet 是一种设计模式，它描述了使用原生 HTTP 协议在服务器和浏览器之间实现持续、双向交互的多种技术集合。 它是对实现实时 Web 应用的早期探索，为后来更成熟的标准化技术（如 SSE 和 WebSockets）奠定了基础。</li>
</ol>
<p>随着 Web 应用对实时性要求的日益增长，需要一种更高效、更标准的解决方案。</p>
<ul>
<li><strong>WHATWG 的早期工作</strong>：SSE 机制最早由 Ian Hickson 作为「WHATWG Web Applications 1.0」提案的一部分，于 2004 年开始进行规范制定。</li>
<li><strong>Opera 的先行实践</strong>：2006 年 9 月，Opera 浏览器在一项名为“Server-Sent Events”的功能中，率先实验性地实现了这项技术，展示了其可行性。</li>
<li><strong>HTML5 标准化</strong>：最终，SSE 作为 HTML5 标准的一部分被正式确立。它通过定义一种名为 <code>text/event-stream</code> 的 MIME 类型，让服务器可以通过一个持久化的 HTTP 连接向客户端发送事件流。 客户端一旦与服务器建立连接，就会保持该连接打开，持续接收服务器发送的数据。</li>
</ul>
<p>SSE 的本质是利用了 HTTP 的流信息机制。服务器向客户端声明接下来要发送的是一个数据流，而不是一次性的数据包，从而实现了一种用时很长的「下载」过程，服务器得以在此期间不断推送新数据。</p>
<p>其返回内容标准大概如下：</p>
<p>event-source 必须编码成 utf8 的格式，消息的每个字段都是用&#8221;\n&#8221;来做分割，下面 4 个规范定义好的字段：</p>
<ol>
<li>Event: 事件类型</li>
<li>Data: 发送的数据</li>
<li>ID：每一条事件流的ID</li>
<li>Retry: 告知浏览器在所有的连接丢失之后重新开启新的连接等待的事件，在自动重连连接的过程中，之前收到的最后一个事件流ID会被发送到服务器</li>
</ol>
<p>在实际中，大概率不一定按这个标准来实现。对于一些重连的逻辑需要自行实现。</p>
<p>现在大部分的浏览器都兼容这个特性，如图：</p>
<p><img class="medium-zoom-image" src="https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4bec52249e5340438e31bda65cbb9daa~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1749996857&amp;x-signature=tKm3vUmW9Qg2R9Gk4g0rS5PVMRQ%3D" alt="" /></p>
<h2 data-id="heading-4">参考资料：</h2>
<ol>
<li><a title="https://en.wikipedia.org/wiki/Server-sent_events" href="https://link.juejin.cn?target=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FServer-sent_events" target="_blank">en.wikipedia.org/wiki/Server…</a></li>
<li><a title="https://learn.microsoft.com/zh-cn/azure/application-gateway/for-containers/server-sent-events?tabs=server-sent-events-gateway-api" href="https://link.juejin.cn?target=https%3A%2F%2Flearn.microsoft.com%2Fzh-cn%2Fazure%2Fapplication-gateway%2Ffor-containers%2Fserver-sent-events%3Ftabs%3Dserver-sent-events-gateway-api" target="_blank">learn.microsoft.com/zh-cn/azure…</a></li>
<li><a title="https://www.cnblogs.com/openmind-ink/p/18706352" href="https://link.juejin.cn?target=https%3A%2F%2Fwww.cnblogs.com%2Fopenmind-ink%2Fp%2F18706352" target="_blank">www.cnblogs.com/openmind-in…</a></li>
<li><a title="https://javascript.ruanyifeng.com/htmlapi/eventsource.html" href="https://link.juejin.cn?target=https%3A%2F%2Fjavascript.ruanyifeng.com%2Fhtmlapi%2Feventsource.html" target="_blank">javascript.ruanyifeng.com/htmlapi/eve…</a></li>
</ol>
<p>以上。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/06/deepseek-and-tencent-yuanbao-sse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>这句话 DeepSeek 一定和你说过</title>
		<link>https://www.phppan.com/2025/02/deepseek-ai/</link>
		<comments>https://www.phppan.com/2025/02/deepseek-ai/#comments</comments>
		<pubDate>Thu, 06 Feb 2025 13:17:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[DeepSeek]]></category>
		<category><![CDATA[高可用]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2329</guid>
		<description><![CDATA[春节期间，DeepSeek 的相关信息铺天盖地。从应用场景到实战演练，从论文解读到原理分析，从行业发展到国际局 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #000000;" data-tool="mdnice编辑器">春节期间，DeepSeek 的相关信息铺天盖地。从应用场景到实战演练，从论文解读到原理分析，从行业发展到国际局势，各路神仙各有观点，应接不暇，都看不完了。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">我自己也深度使用了，包括文章撰写和代码输出，说实话，思考的过程确实惊艳了我。它的思考逻辑比我更完善，推导路径也更显性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">但今天我们聊的不是这些「高光时刻」，而是我们在实际使用过程中常常遇到的不可用场景：</p>
<blockquote style="color: var(--weui-fg-1);"><p><span style="font-weight: bold; color: #0e88eb;">“服务器繁忙，请稍后再试。”</span></p></blockquote>
<p style="color: #000000;" data-tool="mdnice编辑器">是的，DeepSeek 的繁忙（也可以叫故障？）提示几乎成了高频词。无论是免费用户还是付费 API 调用者，都可能在关键时刻遭遇「空文本返回」、「响应超时」、「重试多次仍异常」等问题。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1. DeepSeek 的可用性表现</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">首先我们看一下官方的记录： https://status.deepseek.com/</p>
<p style="color: #000000;" data-tool="mdnice编辑器">总结起来如下：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">网页/API 性能异常（Web/API Degraded Performance）</strong></section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">持续时间： 2025 年 1 月 27 日至今（2 月 5 日仍在监控中）</section>
</li>
<li>
<section style="color: #010101;">影响范围： API 和网页服务同时出现性能下降，部分用户请求超时或失败。从实际使用体验来看，基本属于不可用的状态了，但是官方的状态还是可用，仅性能问题，这里的状态指标和实际还是有一些出入。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">API 持续故障（Major outage/Partial outage）</strong>：</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">持续时间：2025 年 1 月 27 日到 2 月 5 日</section>
</li>
<li>
<section style="color: #010101;">影响范围：持续影响 API 调用，故障持续时间较长，<strong style="color: #0e88eb;">作为一个付费的能力，这是不合格的</strong>。</section>
</li>
</ul>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">网页对话服务不间断故障</strong>：</section>
<ul class="list-paddingleft-1">
<li>
<section style="color: #010101;">持续时间：2025 年 1 月 27 日到 1 月 31 日</section>
</li>
<li>
<section style="color: #010101;">影响范围：持续影响网页用户的使用，在用户的反馈中</section>
</li>
</ul>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">从结果来看，<strong style="color: #0e88eb;">DeepSeek 还没有做好应对海量用户的情况，不管是从资源部署，还是工程建设方面，都不是一个合格的状态</strong>。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在写这篇文章的时候，除了第一次正常返回，后续都是「服务器繁忙，请稍后再试。」 如下图所示：</p>
<figure style="color: #000000;" data-tool="mdnice编辑器"><img class="rich_pages wxw-img" src="https://mmbiz.qpic.cn/sz_mmbiz_png/suE0Ye6UeMwbiaEzryuCanpPukFxaSeTecKvshyV5nsHibn90E76RZAB8Sq4pNYWurVooXQ1bUGH7NLmnPWrvLfw/640?wx_fmt=png&amp;from=appmsg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" crossorigin="anonymous" data-src="https://mmbiz.qpic.cn/sz_mmbiz_png/suE0Ye6UeMwbiaEzryuCanpPukFxaSeTecKvshyV5nsHibn90E76RZAB8Sq4pNYWurVooXQ1bUGH7NLmnPWrvLfw/640?wx_fmt=png&amp;from=appmsg" data-ratio="0.42005420054200543" data-type="png" data-w="738" data-imgfileid="100000825" data-original-style="display: block;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;max-width: 100%;border-top-style: none;border-bottom-style: none;border-left-style: none;border-right-style: none;border-top-width: 3px;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-top-color: rgba(0, 0, 0, 0.4);border-bottom-color: rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-right-color: rgba(0, 0, 0, 0.4);border-top-left-radius: 0px;border-top-right-radius: 0px;border-bottom-right-radius: 0px;border-bottom-left-radius: 0px;object-fit: fill;box-shadow: rgb(133, 161, 201) 0px 0px 5px 0px;" data-index="1" data-fail="0" /></figure>
<p style="color: #000000;" data-tool="mdnice编辑器">从用户能看到的表象来看，自 2025 年 1 月底至 2 月初，DeepSeek 多次出现服务中断：</p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">深度思考与联网搜索功能失效</strong>：用户使用核心功能时频繁提示「技术原因暂不可用」，仅保留基础对话能力。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">API 服务波动</strong>：付费用户调用接口时返回空文本或延迟异常，甚至因「服务器资源紧张」暂停充值。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">注册与登录拥堵</strong>：因恶意攻击导致注册功能瘫痪。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">DeepSeek 官方将问题归因于<strong style="color: #0e88eb;">突发流量、系统升级适配、底层基础设施波动</strong>，并强调「稳定性是首要任务」。但用户更直观的感受是：<strong style="color: #0e88eb;">服务可用性不足，容错机制缺失</strong>。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2. AIGC 产品和互联网产品的天然差异</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">DeepSeek 作为一个 AIGC 的产品，其和传统的互联网产品就存在天然的差异：</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.1 响应时间与计算资源消耗</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">主要依赖数据库查询、预定义的业务逻辑和缓存，响应时间通常较短，且可预测。</section>
</li>
<li>
<section style="color: #010101;">计算资源需求相对稳定，系统可扩展性较强。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">依赖深度学习模型进行推理，计算量大，响应时间较传统产品长，且可能因模型复杂度、输入长度等因素波动。</section>
</li>
<li>
<section style="color: #010101;">需要强大的 GPU 计算资源，服务器负载高，可能导致响应延迟或服务不可用。</section>
</li>
<li>
<section style="color: #010101;">可能需要异步处理或流式输出（如 ChatGPT 的逐字生成），以改善用户体验。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.2 可靠性与稳定性</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">由于功能是规则驱动的，系统行为可预测，崩溃或异常情况较少。</section>
</li>
<li>
<section style="color: #010101;">依赖负载均衡、CDN、数据库复制等机制，保障高可用性（通常可达 99.99% 以上）。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">生成式AI的<strong style="color: #0e88eb;">输出不确定</strong>，在不同运行环境、不同模型版本下可能产生不同结果，影响用户体验的一致性。</section>
</li>
<li>
<section style="color: #010101;">可能受到<strong style="color: #0e88eb;">模型崩溃、推理失败、内存爆炸、API 速率限制</strong>等问题的影响，导致服务不可用或部分功能异常。</section>
</li>
<li>
<section style="color: #010101;">需要额外的<strong style="color: #0e88eb;">故障检测、自动重试、回退机制</strong>（如降级到预定义模板或缓存内容）来提升系统可用性。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.3 可控性与一致性</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">业务逻辑是<strong style="color: #0e88eb;">确定性</strong>的，相同输入通常会产生相同输出，保证用户体验的一致性。虽然有「千人千面」的算法，但是其本质上是可控的</section>
</li>
<li>
<section style="color: #010101;">开发人员可以精确控制系统行为，便于调试和优化。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">AI 生成内容的<strong style="color: #0e88eb;">不可预测性</strong>导致相同输入可能产生不同的输出，影响<strong style="color: #0e88eb;">可控性</strong>和<strong style="color: #0e88eb;">一致性</strong>。</section>
</li>
<li>
<section style="color: #010101;">需要<strong style="color: #0e88eb;">温度参数（Temperature）、Top-K 采样</strong>等技术来调整生成稳定性，但仍无法完全保证一致性。</section>
</li>
<li>
<section style="color: #010101;">可能需要<strong style="color: #0e88eb;">缓存机制、提示词优化（Prompt Engineering）或微调模型</strong>来提高可控性。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.4 可扩展性</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">主要依赖水平扩展（如增加服务器、数据库分片）来提升性能。</section>
</li>
<li>
<section style="color: #010101;">由于业务逻辑固定，扩展后的系统可保持较高的一致性。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">由于<strong style="color: #0e88eb;">深度学习推理的计算密集型特性</strong>，水平扩展难度较高，需要依赖专用硬件（如 GPU）。</section>
</li>
<li>
<section style="color: #010101;">高并发场景下，可能需要<strong style="color: #0e88eb;">分布式推理、模型量化、边缘计算</strong>等优化策略来提升可扩展性。</section>
</li>
<li>
<section style="color: #010101;">可能采用<strong style="color: #0e88eb;">多级缓存（如存储常见问题的预生成答案，在产品中是否能使用待确认）</strong>来减少推理开销。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.5 错误处理与恢复机制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">由于逻辑清晰，错误通常可以通过<strong style="color: #0e88eb;">日志分析、异常处理机制</strong>快速排查和修复。</section>
</li>
<li>
<section style="color: #010101;">具备<strong style="color: #0e88eb;">回滚机制</strong>，当系统发生故障时，可以回退到稳定版本。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">由于模型的<strong style="color: #0e88eb;">黑箱特性</strong>，错误较难追踪。</section>
</li>
<li>
<section style="color: #010101;">可能需要<strong style="color: #0e88eb;">人机协同（Human-in-the-loop）</strong>机制，让人工审核关键任务的生成内容。</section>
</li>
<li>
<section style="color: #010101;">需要<strong style="color: #0e88eb;">自动调整机制（如 RAG，Retrieval-Augmented Generation）</strong>，结合外部知识库提高准确性。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.6 可维护性与升级</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">传统互联网产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">代码和数据库可以<strong style="color: #0e88eb;">模块化升级</strong>，通常只影响部分功能。</section>
</li>
<li>
<section style="color: #010101;">版本管理清晰，可通过<strong style="color: #0e88eb;">灰度发布、A/B 测试</strong>等方式进行平滑更新。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">AIGC 产品</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">模型升级可能导致行为变化</strong>，新模型可能生成完全不同的内容，影响可用性。</section>
</li>
<li>
<section style="color: #010101;">需要<strong style="color: #0e88eb;">持续微调（Fine-tuning）或增强检索（RAG）</strong>，以适应新需求。</section>
</li>
<li>
<section style="color: #010101;">可能需要<strong style="color: #0e88eb;">模型版本管理（如 OpenAI API 的 GPT-4.0 vs. GPT-3.5）</strong>，让用户可选择不同模型版本，以保证兼容性。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">AIGC 产品在系统可用性上面临更大的挑战，主要在于<strong style="color: #0e88eb;">响应时间、可靠性、可控性和错误处理</strong>等方面。为了提升可用性，需要结合<strong style="color: #0e88eb;">缓存优化、模型优化、人工审核、错误监测、版本管理</strong>等策略，从而确保系统的高效性和稳定性。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3. 借鉴传统互联网产品的可用性策略</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">在面对 DeepSeek 这样 AIGC 产品的可用性挑战时，我们可以借鉴传统互联网产品的高可用性策略。以下是三种核心策略：隔离、限流和弹性扩展，它们对于提升整体服务的稳定性和可靠性至关重要。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.1 隔离</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">隔离</strong> 是指将不同类型的流量、服务和资源进行物理或逻辑上的分离，以减少单点故障的影响，提高系统的稳定性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（1）传统互联网产品的隔离策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据库读写分离</strong>：使用主从数据库架构，将读请求和写请求分离，提高数据库吞吐能力。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">微服务架构</strong>：将不同的业务模块拆分为独立的微服务，避免单个模块的故障影响整个系统。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">多数据中心部署</strong>：在不同地域部署多个数据中心，确保某个数据中心故障时，服务仍然可用。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（2）AIGC 产品中的隔离策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">模型推理服务隔离</strong>：不同的 AI 任务（如文本生成、代码补全、图像生成）使用独立的推理服务，以避免相互影响。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">缓存与实时推理分离</strong>：对于常见问题或高频请求，使用缓存存储预生成的答案，减少对 AI 推理的依赖。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">免费用户和付费用户隔离</strong>：将高优先级的计算资源分配给付费用户，确保他们在高负载时仍能获得稳定的服务。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">企业用户和个人用户隔离</strong>：针对企业用户的部署资源和个人用户的资源做隔离，甚至对于企业用户做多个隔离泳道。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（3）隔离策略解决的问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">减少单点故障</strong>，避免某个服务异常影响整个系统。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">优化资源利用</strong>，确保高优先级任务不会被低优先级任务拖累。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">提高系统韧性</strong>，即使部分服务故障，核心功能仍可正常运行。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（4）隔离策略的注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">隔离的粒度需要合理设计</strong>，过度拆分可能导致管理复杂度上升，系统之间的通信成本增加。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">监控与调度</strong>，确保不同隔离层的资源调度合理，避免出现某些区域资源过载，而其他区域资源空闲的情况。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.2 限流</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">限流</strong> 是指在高并发情况下，对请求进行限制，以防止系统过载，保障关键用户和服务的稳定性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（1）传统互联网产品的限流策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">令牌桶/漏桶算法</strong>：限制请求速率，确保系统不会被短时间内的流量高峰压垮。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">IP 级限流</strong>：对单个 IP 地址的请求频率进行限制，防止恶意爬虫或 DDoS 攻击。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户级限流</strong>：根据用户级别（普通用户、VIP 用户）设置不同的 QPS 上限。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（2）AIGC 产品中的限流策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">API 访问限流</strong>：对于 DeepSeek 这样的 AI API，限制每个用户的最大请求频率，防止个别用户占用过多计算资源。以及对于 IP 的访问限流。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">任务队列管理</strong>：对于高计算消耗的任务（如长文本生成、复杂代码推理），采用任务排队机制，避免瞬时请求超载。排队机制在文生图的场景下属于通用方案，以 MJ 为例，其商业模式就在于任务数，任务能力的不同，底层还是资源的不同。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户限流</strong>：以某种代币的方式发放给免费用户，使其有一定的使用次数限制，增加浏览器指纹等用户级的限制，减少用户的并发使用情况，以及增加对话数的限制等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">动态限流</strong>：根据服务器的当前负载自动调整限流策略，在资源紧张时降低 QPS，在资源充足时放宽限制。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（3）限流策略解决的问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">防止系统崩溃</strong>，确保 AI 服务在高并发情况下仍能稳定运行。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">优化资源分配</strong>，优先保证高价值用户的服务体验。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">抵御恶意攻击</strong>，防止 DDoS 攻击或恶意爬取 API 造成的资源滥用。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（4）限流策略的注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流策略需要动态调整</strong>，不能一刀切，否则可能导致正常用户体验下降。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">需要提供合理的错误反馈</strong>，例如「当前请求过多，请稍后重试」而不是简单的「服务器错误」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">与缓存结合使用</strong>，对于常见请求，优先返回缓存结果，减少对 AI 推理的调用次数。这个点在产品层面需要考虑，确实，和传统互联网产品相比，缓存在 AIGC 产品中的使用需要更谨慎一些。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.3. 弹性扩展</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">弹性扩展</strong> 是指根据实际流量动态调整计算资源，以提高系统的可用性和响应速度。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（1）传统互联网产品的弹性扩展策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">自动扩容</strong>：使用云计算（如 AWS Auto Scaling、Kubernetes HPA）自动增加或减少服务器实例。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">负载均衡</strong>：使用 Nginx、CDN、反向代理等技术，将流量均匀分配到不同的服务器节点上。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">冷/热数据分离</strong>：将访问频率高的数据放入高速缓存，减少数据库查询压力。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（2）AIGC 产品中的弹性扩展策略</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">GPU 资源动态调度</strong>：由于 AI 推理高度依赖 GPU，可以采用动态 GPU 分配策略，根据请求量调整 GPU 负载。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">多模型并行推理</strong>：对于高负载场景，可以部署多个副本的 AI 模型，采用负载均衡策略分配请求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">推理任务分批处理</strong>：对于大规模生成任务，采用批处理方式，提高计算效率，减少单次推理的成本。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（3）弹性扩展策略解决的问题</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">避免资源浪费</strong>，在低流量时减少计算资源，降低运营成本。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">提升系统吞吐能力</strong>，在高流量时快速扩展计算能力，确保服务稳定。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">提升响应速度</strong>，减少高并发情况下的请求排队时间，提高用户体验。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">（4）弹性扩展策略的注意事项</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">扩容速度需要优化</strong>，如果扩容响应过慢，可能导致短时间内大量请求失败。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">成本控制</strong>，GPU 计算资源昂贵，需要权衡服务质量与成本。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">监控与预警</strong>，需要实时监控系统负载，提前预测流量高峰，避免突发情况导致系统崩溃。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">AIGC 更多的问题还是算力资源的问题，从 DeepSeek 的服务器 IP 来看，其使用的是华为云，后端推理算力不确定是哪家的。基于多云的弹性调度是一个可以考虑的方案，当然，前提是成本能够扛得住。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4. 从故障看 AIGC 可用性策略的四大核心矛盾</span></h1>
<ol class="list-paddingleft-1" style="color: #000000;">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">算力需求与资源调度的失衡</strong><br />
AIGC 模型的推理成本极高。当用户量激增或遭遇攻击时，<strong style="color: #0e88eb;">弹性伸缩能力不足</strong>可能直接导致服务崩溃。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">功能复杂度与稳定性的博弈</strong><br />
DeepSeek 的「深度思考」依赖多模态数据处理和强化学习技术，但功能越复杂，系统耦合性越高，单点故障风险越大。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">用户预期与容灾能力的落差</strong><br />
用户对 AIGC 的期待是「类人级响应」，但实际服务常因网络抖动、模型加载延迟等问题降级为「机械式回复」。</p>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">商业化压力与技术投入的冲突</strong><br />
尽管 DeepSeek 登顶多国应用商店榜单，但其快速扩张可能透支了技术团队的运维能力，导致故障频发后被迫暂停 API 充值。</p>
</section>
</li>
</ol>
<p style="color: #000000;" data-tool="mdnice编辑器">DeepSeek 的故障并非个例，而是 AIGC 行业集体面临的挑战。从技术角度看，<strong style="color: #0e88eb;">模型能力与系统稳定性需同步进化</strong>；从用户角度看，<strong style="color: #0e88eb;">容忍度与预期管理同样关键</strong>。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">未来，AIGC 服务的竞争不仅是「谁更聪明」，更是「谁更可靠」，特别是在企业应用的场景。毕竟，再惊艳的思考过程，若总以「服务器繁忙」收场，终将消磨用户的耐心与信任。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">以上。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/02/deepseek-ai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
