news 2026/9/4 13:49:08

LLM应用架构:单一模型与动态路由的工程权衡与实战对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LLM应用架构:单一模型与动态路由的工程权衡与实战对比

这次我们来看一个在 LLM 应用架构领域引发讨论的技术决策:Manifest 团队弃用了其自研的“LLM 路由器”,转而采用单一模型策略。这个决定的核心观点是,在某些场景下,精心调优的单一大型语言模型,其综合表现可能优于依赖动态路由在多个模型间进行选择的复杂系统。

对于开发者而言,这不仅仅是一个架构上的取舍,更是一个关于成本、复杂性与最终效果如何平衡的实战案例。如果你正在构建基于 LLM 的 Agent、工作流或复杂应用,纠结于是否要引入模型路由层,或者担心多模型管理的开销,那么这篇文章将为你提供一个值得深思的视角。本文将拆解“LLM路由器”的概念、分析Manifest团队决策背后的逻辑,并探讨单一模型与动态路由各自的适用边界。

1. 核心能力速览:单一模型 vs. 动态路由

在深入细节之前,我们先通过一个快速对比表,厘清这两种技术路线的核心差异,这有助于你快速判断哪种方案更适合你的项目。

对比维度动态路由 (LLM Router)单一模型 (Single LLM)
核心思想根据输入问题类型、复杂度、领域,动态选择最合适的模型(如 GPT-4、Claude、本地模型)进行处理。使用一个统一的、能力全面的模型处理所有类型的请求。
架构复杂度。需要路由决策逻辑、多模型API管理、负载均衡、失败回退机制。。架构简单,只需与一个模型端点交互。
成本控制潜力理论上高。可将简单任务路由到廉价模型,复杂任务留给昂贵模型。固定。成本取决于所选单一模型的定价。
性能表现取决于路由精度。路由准确则整体更优;路由错误则效果下降甚至失败。稳定可预期。性能上限即该模型的能力上限,无路由开销。
维护开销。需持续维护路由策略、模型列表、兼容性,并随模型更新而调整。。只需跟进单一模型的更新与最佳实践。
适用场景任务类型差异巨大、对成本极度敏感、且能清晰定义路由规则的场景。任务类型相对统一、追求系统稳定性与简化、或单一模型已能很好覆盖需求的场景。
硬件/API门槛无特殊硬件要求,但依赖多个云API或本地模型的可用性。无特殊硬件要求,依赖单一云API或足够强大的本地模型资源。

从 Manifest 团队的实践来看,他们发现维护一个高效、精准的路由器所带来的认知负担和系统复杂度,超过了其带来的成本节省和性能收益,因此选择了回归单一模型的简洁性。

2. 适用场景与使用边界

在技术选型前,明确每种方案的适用场景和潜在陷阱至关重要。

动态路由 (LLM Router) 适合以下情况:

  • 任务光谱极宽:你的应用同时需要处理创意写作、复杂逻辑推理、代码生成和简单分类,且已有明确指标能区分这些任务。
  • 成本敏感型生产环境:流量巨大,将大量简单查询(如:问候语、事实问答)从 GPT-4 分流到 GPT-3.5-Turbo 或 Claude Haiku,能产生显著的经济效益。
  • 具备强大的评估体系:拥有自动化管道能持续评估路由决策的正确性及各模型输出的质量,用于迭代优化路由策略。

单一模型 (Single LLM) 更适合这些场景:

  • 追求开发与运维效率:团队资源有限,希望快速构建并稳定运行一个 LLM 应用,不愿陷入多模型调试和路由策略的泥潭。
  • 任务边界模糊:用户请求难以被简单分类,路由规则容易失效,导致“差之毫厘,谬以千里”的效果下降。
  • 用户体验一致性优先:希望为用户提供稳定、可预期的交互体验,避免因模型切换导致回答风格、格式或能力的跳跃。
  • 所选模型能力足够强大:如 GPT-4、Claude 3 Opus 等顶级模型,其本身已具备处理绝大多数任务的能力,引入路由的边际收益很小。

重要的安全与合规边界:无论采用哪种方案,都必须注意:

  1. 数据隐私:如果使用云端模型 API,需了解数据出境和隐私政策。对敏感数据,考虑使用可本地部署的模型。
  2. 内容安全:确保模型输出符合法律法规和平台内容政策,需要配置审核层。
  3. 授权与版权:基于模型生成内容进行商用时,需留意模型服务商的条款。

3. 环境准备与前置条件

虽然本文讨论的是架构理念,但若要动手验证或构建自己的原型,你需要准备以下环境。这里以构建一个简单的 Python 测试项目为例。

基础开发环境:

  • 操作系统:Windows 10/11, macOS, 或 Linux (推荐 Ubuntu 20.04+)。
  • Python:版本 3.8 - 3.11。建议使用condavenv创建虚拟环境。
  • 包管理工具pip
  • 代码编辑器:VS Code, PyCharm 等。

API 访问权限(如果测试云端模型):

  • OpenAI API Key:用于访问 GPT 系列模型。
  • Anthropic API Key:用于访问 Claude 系列模型。
  • 其他模型平台 API Key:如 Google Gemini, 智谱AI, 月之暗面等。
  • 重要:妥善保管 API Key,不要上传至公开仓库。建议使用环境变量管理。

本地模型资源(如果测试本地部署):

  • 足够的硬件:测试较小的本地模型(如 Qwen2.5-7B-Instruct 的量化版)至少需要 8GB 以上显存。更大的模型需要更多资源。
  • 模型框架:熟悉ollama,vLLM,Transformers(by Hugging Face) 等其中一种部署和推理框架。
  • 磁盘空间:预留 10-40GB 空间用于下载模型文件。

4. 概念验证:构建一个极简动态路由

为了理解动态路由的复杂性,我们先动手实现一个最简单的、基于规则的路由器。这将直观地展示其工作原理和潜在问题。

项目结构:

llm_router_demo/ ├── router.py # 路由逻辑核心 ├── client.py # 调用演示 ├── requirements.txt └── .env # 存储API密钥(切勿提交)

1. 安装依赖创建requirements.txt文件:

openai>=1.0.0 anthropic>=0.25.0 python-dotenv>=1.0.0

安装依赖:

pip install -r requirements.txt

2. 实现路由逻辑 (router.py)这个路由器根据输入问题的长度和关键词,决定调用哪个模型。

import os import re from typing import Literal from dotenv import load_dotenv from openai import OpenAI from anthropic import Anthropic # 加载环境变量 load_dotenv() class SimpleLLMRouter: def __init__(self): self.openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) self.anthropic_client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) def _classify_query(self, query: str) -> Literal["simple", "creative", "reasoning"]: """一个非常简单的规则分类器""" query_lower = query.lower() # 规则1:非常短的问题,可能是简单问答 if len(query.split()) < 5: return "simple" # 规则2:包含创意类关键词 creative_keywords = ["写一首诗", "编一个故事", "创意", "想象", "比喻"] if any(keyword in query_lower for keyword in creative_keywords): return "creative" # 规则3:包含逻辑推理关键词 reasoning_keywords = ["为什么", "如何解释", "步骤", "逻辑", "推导", "解决"] if any(keyword in query_lower for keyword in reasoning_keywords): return "reasoning" # 默认归类为需要推理 return "reasoning" def route_and_call(self, query: str) -> str: """路由并调用相应模型""" query_type = self._classify_query(query) print(f"[Router] 问题分类: {query_type}") print(f"[Router] 原始问题: {query}") if query_type == "simple": # 路由到成本较低的模型,例如 GPT-3.5-Turbo response = self.openai_client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": query}], max_tokens=500 ) model_used = "gpt-3.5-turbo" answer = response.choices[0].message.content elif query_type == "creative": # 路由到擅长创意写作的模型,例如 Claude 3 Haiku response = self.anthropic_client.messages.create( model="claude-3-haiku-20240307", max_tokens=500, messages=[{"role": "user", "content": query}] ) model_used = "claude-3-haiku" answer = response.content[0].text else: # reasoning # 路由到能力更强的推理模型,例如 GPT-4 response = self.openai_client.chat.completions.create( model="gpt-4-turbo-preview", messages=[{"role": "user", "content": query}], max_tokens=500 ) model_used = "gpt-4-turbo" answer = response.choices[0].message.content print(f"[Router] 调用模型: {model_used}") return answer, model_used if __name__ == "__main__": router = SimpleLLMRouter() test_queries = [ "今天的天气怎么样?", # 预期:simple -> gpt-3.5-turbo "写一首关于春天的七言绝句。", # 预期:creative -> claude-3-haiku "请解释牛顿第二定律,并推导其公式。", # 预期:reasoning -> gpt-4 "这个问题既需要创意也需要深度推理,比如设计一个可持续发展的城市交通方案。" # 分类可能出错 ] for q in test_queries: print("\n" + "="*50) answer, model = router.route_and_call(q) print(f"[Result] 回答摘要: {answer[:100]}...")

3. 运行与观察.env文件中配置你的 API Key:

OPENAI_API_KEY=sk-your-openai-key-here ANTHROPIC_API_KEY=your-anthropic-key-here

然后运行:

python router.py

你会看到路由器根据规则做出决策。重点观察最后一个复杂问题,它很可能被错误地分类到creativereasoning,从而未能调用“最优”模型。这就是规则路由器的固有缺陷:规则难以覆盖所有复杂、模糊的实际情况

5. 功能测试与效果验证:路由 vs. 单模型

现在,我们来设计一个更系统的测试,对比动态路由和单一顶级模型(如 GPT-4)在实际问答中的表现。

测试目标:

  1. 验证简单路由器在成本节省上的潜力。
  2. 评估路由器在复杂、模糊问题上的决策质量。
  3. 对比单一顶级模型(GPT-4)的稳定性和综合表现。

测试脚本 (benchmark.py):

import time from router import SimpleLLMRouter from openai import OpenAI from dotenv import load_dotenv import os load_dotenv() class Benchmark: def __init__(self): self.router = SimpleLLMRouter() self.openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) self.results = [] def test_single_query(self, query: str, query_id: int): """对单个问题测试两种方案""" print(f"\n[测试 {query_id}] 问题: {query}") # 方案A: 动态路由 start = time.time() try: router_answer, router_model = self.router.route_and_call(query) router_time = time.time() - start router_success = True except Exception as e: router_answer, router_model, router_time = f"路由失败: {e}", "None", 0 router_success = False # 方案B: 单一模型 (GPT-4) start = time.time() try: single_response = self.openai_client.chat.completions.create( model="gpt-4-turbo-preview", messages=[{"role": "user", "content": query}], max_tokens=500 ) single_answer = single_response.choices[0].message.content single_time = time.time() - start single_success = True except Exception as e: single_answer, single_time = f"调用失败: {e}", 0 single_success = False # 记录结果 result = { "query": query, "router_model": router_model, "router_time": round(router_time, 2), "router_success": router_success, "single_model": "gpt-4-turbo", "single_time": round(single_time, 2), "single_success": single_success, } self.results.append(result) return result def run_benchmark(self, queries): print("开始基准测试...") for idx, q in enumerate(queries): self.test_single_query(q, idx+1) self.print_summary() def print_summary(self): print("\n" + "="*60) print("测试结果摘要") print("="*60) for r in self.results: print(f"问题: {r['query'][:50]}...") print(f" 路由 -> 模型: {r['router_model']:20} 耗时: {r['router_time']}s 成功: {r['router_success']}") print(f" 单模 -> 模型: {r['single_model']:20} 耗时: {r['single_time']}s 成功: {r['single_success']}") print("-"*40) if __name__ == "__main__": # 设计一组测试问题 test_queries = [ "你好,请介绍一下你自己。", "将‘Hello, world!’翻译成法语。", "写一个Python函数计算斐波那契数列。", "请用比喻的手法描述‘人工智能’这个概念。", "如果我想从零开始学习机器学习,请给我一个为期三个月的学习计划,并解释每个阶段的核心目标。", "分析一下当前全球新能源汽车市场的竞争格局,并预测未来两年的技术发展趋势。" ] benchmark = Benchmark() benchmark.run_benchmark(test_queries)

预期结果与验证:运行此脚本,你将得到一份对比报告。重点关注以下几点:

  1. 成本模拟:观察简单问题(如问候、翻译)是否被正确路由到了gpt-3.5-turboclaude-3-haiku。如果成功,理论上降低了单次调用成本。
  2. 路由准确性:对于复杂问题(如制定学习计划、市场分析),路由器是否错误地将其分类为“简单”或“创意”,从而调用了能力不足的模型?这会导致回答质量下降。
  3. 响应时间:比较路由方案(包含分类时间+模型调用时间)与单一模型方案的耗时。路由决策本身会引入额外延迟。
  4. 系统稳定性:单一模型方案只依赖一个服务,而路由方案依赖多个服务,任何一个服务故障(如某个API暂时不可用)都会导致部分请求失败,需要额外的错误处理逻辑。

通过这个测试,你就能切身感受到 Manifest 团队可能遇到的困境:为了节省一点成本,引入了分类错误、延迟增加、系统复杂度飙升和稳定性风险,而最终的用户体验可能还不如直接使用一个强大的单一模型。

6. 进阶思考:何时以及如何优化路由策略

如果经过评估,你的场景确实需要且值得引入动态路由,那么一个简单的规则路由器是远远不够的。你需要考虑更高级的策略。

1. 基于模型评分的路由不依赖硬规则,而是让多个模型同时(或抽样)处理同一个问题的“草稿”,由一个轻量级评估模型(或一套评估标准)快速评分,选择得分最高的模型输出来作为最终答案。这虽然增加了计算开销,但决策更准。

2. 基于嵌入向量的语义路由将用户查询转换为向量(Embedding),并与预先定义好的、代表不同任务类型的“原型向量”进行相似度计算(如余弦相似度),选择最相似的任务类型所对应的模型。这比关键词规则更能理解语义。

3. 混合路由策略结合多种方法:

  • 第一层:简单规则过滤(如长度、敏感词)。
  • 第二层:语义路由处理模糊请求。
  • 第三层:对于高价值或高难度请求,使用评分路由或直接调用顶级模型。
  • 降级策略:当首选模型失败时,自动降级到备用模型。

一个语义路由的简化示例:

# 假设我们使用 sentence-transformers 计算语义相似度 from sentence_transformers import SentenceTransformer import numpy as np class SemanticRouter: def __init__(self): self.encoder = SentenceTransformer('all-MiniLM-L6-v2') # 轻量级句子编码器 # 定义任务原型和对应的推荐模型 self.task_prototypes = { "creative_writing": ["写故事", "诗歌创作", "广告文案", "头脑风暴"], "technical_qa": ["代码解释", "错误调试", "算法实现", "技术原理"], "factual_qa": ["历史事件", "科学事实", "数据查询", "定义解释"], "analysis_reasoning": ["市场分析", "逻辑论证", "方案比较", "预测推断"] } # 为每个任务类型生成一个平均向量作为“原型向量” self.prototype_vectors = {} for task, examples in self.task_prototypes.items(): example_embeddings = self.encoder.encode(examples) self.prototype_vectors[task] = np.mean(example_embeddings, axis=0) self.model_mapping = { "creative_writing": "claude-3-sonnet", "technical_qa": "gpt-4", "factual_qa": "gpt-3.5-turbo", "analysis_reasoning": "gpt-4" } def route(self, query: str) -> str: query_vector = self.encoder.encode([query])[0] best_task = None best_similarity = -1 for task, proto_vec in self.prototype_vectors.items(): sim = np.dot(query_vector, proto_vec) / (np.linalg.norm(query_vector) * np.linalg.norm(proto_vec)) if sim > best_similarity: best_similarity = sim best_task = task print(f"[语义路由] 查询: ‘{query}’") print(f"[语义路由] 最匹配任务: {best_task} (相似度: {best_similarity:.3f})") recommended_model = self.model_mapping.get(best_task, "gpt-4") # 默认回退 print(f"[语义路由] 推荐模型: {recommended_model}") return recommended_model # 使用示例 router = SemanticRouter() router.route("帮我写一段吸引人的产品介绍文案") # 应指向 creative_writing -> claude router.route("Python中async/await的工作原理是什么?") # 应指向 technical_qa -> gpt-4 router.route("拿破仑在哪一年加冕为皇帝?") # 应指向 factual_qa -> gpt-3.5

可以看到,即使更高级的路由策略,也需要大量的前期定义(任务原型、示例、模型映射)和持续的调优,维护成本不低。

7. 资源占用与性能观察

对于本地部署的模型路由方案,性能考量更为关键。

1. 显存与内存占用

  • 路由决策层:如果使用轻量级本地模型(如 Sentence-BERT)做语义路由,通常需要 1-2GB 显存。
  • 多模型加载:如果要在本地同时驻留多个模型以备快速切换,显存需求是各模型峰值显存之和,这对硬件是巨大挑战。通常采用“按需加载”策略,但这会引入模型加载延迟。
  • CPU推理:对于成本极度敏感的场景,可能将部分简单任务路由到在CPU上运行的量化小模型。这需要关注内存占用和推理速度。

2. 延迟分析动态路由的端到端延迟 (T_total) 由以下几部分构成:

T_total = T_classify(分类/路由决策时间) + T_model_load(如需加载模型) + T_inference(模型推理时间) + T_fallback(如果主模型失败,重试时间)

而单一模型方案只有T_inference只有当T_classify和潜在的T_fallback开销远小于因使用廉价模型节省的T_inference时间时,路由方案在延迟上才有优势。对于云端API,网络延迟是主要部分,使用更近或更稳定的单一服务可能比路由到多个服务更可靠。

3. 监控指标在生产环境中部署路由方案,必须监控:

  • 路由决策分布:各模型被调用的比例。
  • 路由准确率:需要通过人工评估或自动化评估(如用GPT-4评估)来持续衡量。
  • 各模型API的可用性与延迟
  • 成本变化:对比路由方案与单一顶级模型方案的实际开销。

8. 常见问题与排查方法

在实现或使用LLM路由方案时,你会遇到一些典型问题。

问题现象可能原因排查方式解决方案
路由决策始终偏向某个模型分类规则有偏差或原型向量不均衡。分析路由日志,检查不同类别问题的分布。重新校准规则或补充、调整任务原型示例。
复杂问题被错误路由,导致回答质量差规则或语义分类无法处理问题的模糊性和复杂性。收集被错误路由的案例,进行人工分析。1. 引入更复杂的分类模型(小成本)。
2. 为高难度问题设置“直接通道路由”到顶级模型。
系统整体响应时间变慢路由决策耗时过长,或频繁加载/切换模型。使用 profiling 工具分析各阶段耗时。优化分类模型,缓存路由结果,或采用模型预热策略。
某个模型API频繁失败导致部分请求失败该模型服务不稳定或达到速率限制。监控各API端点的错误率和响应码。实现健壮的重试和熔断机制,并设置备用模型。
成本并未如预期下降路由不准确,大量本应使用廉价模型的任务用在了昂贵模型上。详细审计API调用日志和费用账单。精细化路由策略,或考虑放弃路由,回归单一高性价比模型。
本地模型路由显存溢出同时驻留的模型总大小超过显存容量。监控nvidia-smi或相关内存监控工具。采用动态加载/卸载策略,或使用CPU卸载部分模型。

9. 最佳实践与使用建议

基于 Manifest 团队的经验和上述分析,为你提供以下实践建议:

  1. 从简单开始,用数据决策:不要一开始就设计复杂的路由系统。先用一个最好的单一模型(如 GPT-4)跑通全部业务流程,并收集真实的用户查询日志。
  2. 分析日志,寻找模式:分析收集到的查询,看是否存在明显的、可机器区分的类别(如“短问答”、“创意生成”、“深度分析”),以及各类别的比例和成本敏感性。
  3. 建立评估基线:定义如何评估回答质量(例如,人工评分、基于GPT-4的自动评分)。这是衡量路由方案是否成功的唯一标准。
  4. 进行小规模对照实验:在流量中切分一小部分(如5%),实施你的路由策略,与使用单一模型的对照组在成本质量两个维度上进行严格的A/B测试。
  5. 复杂度是隐形成本:每增加一个模型、一条规则、一个判断分支,都意味着未来的调试、维护和升级成本。问自己:增加的这点收益,值得付出这些长期成本吗?
  6. 考虑“智能降级”而非“智能路由”:一种更稳健的模式是,默认使用一个强大的单一模型。仅当该服务不可用或响应超时时,才降级到备用模型。这保证了体验基线,同时提供了容错能力。
  7. 合规与数据安全:如果路由涉及将数据发送给不同厂商的API,务必确认各厂商的数据处理协议是否符合你的合规要求。

10. 总结与下一步

Manifest 团队放弃自研 LLM 路由器的决定,给我们上了一堂生动的“工程权衡”课。它提醒我们,在追求技术新颖性和理论最优解时,不能忽视系统的复杂度、维护成本和实际收益。

对于大多数团队和项目,尤其是在早期阶段,选择一个能力足够强大的单一模型作为核心,往往是性价比最高、最稳妥的方案。它能让你集中精力优化提示词工程、构建业务逻辑、改善用户体验,而不是纠结于模型间的调度问题。

如果你的应用场景确实满足“任务类型极度分化”、“成本压力极大”且“具备强大的评估和迭代能力”这三个条件,那么再考虑引入动态路由。即使如此,也建议从最简单的规则路由开始验证,用真实数据说话,并时刻准备着在复杂度失控前回归简洁。

下一步,你可以:

  1. 使用本文的示例代码,在自己的业务问题上运行一个微型路由实验,亲身体验其利弊。
  2. 深入研究更高级的路由技术,如基于LLM的元分类器(让一个小模型来决定把问题交给哪个大模型),或强化学习优化路由策略。
  3. 关注模型本身的发展:随着模型能力的持续进化(如 GPT-4o 在速度、成本和能力上的平衡),许多过去需要路由的场景,未来可能被一个更强大的通用模型直接覆盖。

技术选型的艺术,往往在于在“够用”和“最优”之间找到那个最省力的平衡点。希望本文的分析和实战演示,能帮助你在构建自己的LLM应用时,做出更明智的架构决策。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 13:47:17

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况三、源码Pro文件mian.cppMainWindowUi文件总结一、Pdb生成及Dump文件使用示例图 1.Pdb文件生成 下图先通过构建生…

作者头像 李华
网站建设 2026/9/4 13:45:13

AI安全风险评估与应对:从隐私泄露到深度伪造的技术防线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 13:44:18

移相混合控制LLC谐振变换器:低压增益下的Simulink仿真与特性分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 13:43:48

STM32F350R7在激光打靶系统中的应用与调试指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 13:43:15

Qt UDP网络编程实战:从QUdpSocket基础到高性能通信工具开发

简介&#xff1a;本资源是一个基于Qt框架实现UDP网络通信的完整示例项目&#xff0c;面向Qt初学者与嵌入式/跨平台实时通信开发人员&#xff0c;解决在Qt中快速搭建无连接、低延迟数据传输模块的核心问题。压缩包共18个文件&#xff0c;包含3个头文件&#xff08;.h&#xff09…

作者头像 李华
网站建设 2026/9/4 13:42:45

Dify工作流实战:零代码接入外部API,快速扩展AI应用能力

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华