news 2026/9/4 18:59:20

本地部署多智能体框架QM:从环境搭建到工作流实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
本地部署多智能体框架QM:从环境搭建到工作流实战

这次我们来看一个来自 YC 的多智能体框架 QM。对于想快速搭建本地智能体应用、又不想被单一模型或工具链绑定的开发者来说,这类框架的价值在于“兼容”和“编排”。QM 的核心卖点很直接:它声称能兼容多种 AI 模型和外部工具,让开发者可以像搭积木一样,组合不同的智能体来完成复杂任务。

如果你关心的是:这东西能不能在本地跑起来?对硬件要求高不高?有没有现成的 API 可以调用?能不能处理批量任务?那么这篇文章会给你一个清晰的答案。本文不会停留在概念介绍,而是会带你走一遍从环境准备、框架启动、到实际构建一个多智能体工作流并验证其效果的完整流程。无论你是想用它做自动化内容生成、数据分析,还是构建一个私有的智能助手,都能从本文找到可落地的操作步骤。

1. 核心能力速览

在深入部署之前,我们先通过一个表格快速了解 QM 框架的核心特性,这能帮你判断它是否适合你的项目。

能力项说明
项目类型多智能体编排框架
核心功能智能体定义、任务编排、工具调用、多模型兼容
硬件门槛依赖后端模型。框架本身轻量,但若接入本地大模型(如 Llama、Qwen),则需相应 GPU 资源。纯 API 模式(如调用 OpenAI、DeepSeek)对本地硬件无要求。
启动方式通常为命令行启动服务,提供 WebUI 或 API 接口。
接口能力提供 RESTful API,支持以编程方式创建智能体、提交任务、获取结果。
批量任务支持通过 API 或工作流定义批量处理任务队列。
工具兼容框架亮点,支持集成多种外部工具(如搜索引擎、代码执行器、文件操作等)。
适合场景本地或云端部署的复杂任务自动化、多步骤决策流程、私有化智能应用开发。

从表格可以看出,QM 的重点在于“框架”和“兼容性”。它本身不是一个模型,而是一个调度中心。你的计算资源消耗主要取决于你为智能体后端配置的 AI 模型。这带来了极大的灵活性,也意味着部署的第一步是明确你的智能体将使用何种“大脑”。

2. 适用场景与使用边界

在投入时间部署之前,明确 QM 能做什么、不能做什么至关重要。

它非常适合以下场景:

  1. 复杂流程自动化:需要多个步骤、不同专业能力协作的任务。例如,一个任务先由“研究员”智能体搜索资料,再由“分析师”智能体总结,最后由“撰稿人”智能体生成报告。
  2. 私有化部署需求:希望完全在本地或内网环境中运行智能应用,保障数据隐私,同时能灵活切换不同的开源或商用模型。
  3. 工具链集成:已有一些现成的工具(如内部数据库查询接口、图像处理服务),希望用自然语言来驱动这些工具协同工作。
  4. 原型快速验证:想快速实验多智能体协作在不同业务场景下的效果,QM 的框架特性可以避免从零搭建通信和调度逻辑。

它的局限与边界:

  1. 非开箱即用模型:QM 不提供现成的、能力强大的通用 AI 智能体。你需要为其配置模型后端(API 或本地部署),并定义智能体的角色、指令和可用工具。效果上限取决于你接入的模型能力。
  2. 有一定的开发门槛:虽然框架简化了编排,但定义智能体、编写工具适配器、调试工作流仍需要一定的编程和 prompt 工程能力。
  3. 性能依赖后端:任务执行速度和稳定性高度依赖你所接入的模型 API 的响应速度与稳定性,或本地模型的推理性能。
  4. 合规与授权:当你为智能体集成网络搜索、文件读取、代码执行等工具时,必须严格遵守数据安全与隐私保护规定。使用 AI 模型生成内容时,需确保符合内容安全政策,并尊重知识产权。

简单说,QM 是一个强大的“舞台”,但“演员”(智能体)和“道具”(工具)需要你自己准备和训练。它降低了构建多智能体系统的工程复杂度,但并未降低对任务设计和模型能力的要求。

3. 环境准备与前置条件

部署 QM 框架本身相对简单,关键在于规划好整个运行环境。以下是通用的环境检查清单:

  1. 操作系统:支持 Linux (Ubuntu 20.04+ 推荐)、macOS 和 Windows (WSL2 推荐用于 Linux 兼容环境)。生产环境建议使用 Linux。
  2. Python 环境:QM 通常基于 Python 开发。确保安装Python 3.8 - 3.11版本。推荐使用condavenv创建独立的虚拟环境。
    # 创建并激活虚拟环境 (以 conda 为例) conda create -n qm_agent python=3.10 conda activate qm_agent
  3. 版本控制工具:安装 Git,用于克隆项目代码。
    # Ubuntu/Debian sudo apt-get install git # 验证安装 git --version
  4. 模型后端准备(二选一或混合)
    • API 模式:准备可用的模型 API 密钥和端点。例如 OpenAI API Key、DeepSeek API Key、或国内其他大模型平台的密钥。这是最快启动的方式。
    • 本地模式:如需本地推理,需准备相应的环境:
      • GPU 驱动与 CUDA:根据你的 NVIDIA 显卡型号,安装合适的驱动和 CUDA Toolkit(如 11.8 或 12.1)。
      • PyTorch:安装与 CUDA 版本匹配的 PyTorch。
      • 模型文件:下载你计划使用的开源大模型权重(如 Qwen、Llama 等系列),并确保有对应的推理框架(如 vLLM, Ollama, Transformers)。
  5. 网络与端口:确保主机防火墙开放 QM 服务将要使用的端口(默认可能是 8000 或 7860),以便通过浏览器访问 WebUI 或调用 API。

4. 安装部署与启动方式

假设我们从零开始部署。由于 QM 是一个示例项目名,具体命令需根据其官方仓库调整。以下流程以典型 Python 多智能体框架为例。

步骤 1:获取项目代码首先,从代码仓库克隆项目。

git clone <QM框架的Git仓库地址> cd qm-framework # 进入项目目录,目录名请按实际修改

步骤 2:安装 Python 依赖项目根目录通常会有requirements.txtpyproject.toml文件。

# 安装核心依赖 pip install -r requirements.txt # 如果依赖复杂,有时需要额外安装一些工具包 # pip install "langchain>=0.1.0" "openai>=1.0.0" # 示例

注意:如果遇到特定系统依赖错误,请根据报错信息搜索解决,例如在 Ubuntu 上可能需要apt-get install build-essential

步骤 3:配置环境变量QM 需要知道如何连接你的模型后端。常见方式是通过.env文件配置。 在项目根目录创建.env文件:

# 示例 .env 配置 # 使用 OpenAI 兼容 API MODEL_API_TYPE=openai OPENAI_API_KEY=sk-your-openai-key-here OPENAI_BASE_URL=https://api.openai.com/v1 # 或你的代理地址 # 或者使用本地模型 (例如通过 Ollama) # MODEL_API_TYPE=ollama # OLLAMA_BASE_URL=http://localhost:11434 # OLLAMA_MODEL=qwen2.5:7b # 框架服务配置 QM_HOST=0.0.0.0 QM_PORT=8000 DEBUG=False

请务必将示例密钥替换为你自己的,并且不要将.env文件提交到版本控制系统。

步骤 4:启动框架服务启动命令因项目设计而异,常见的是使用uvicorn启动一个 FastAPI 应用,或直接运行main.py

# 方式一:通过项目提供的启动脚本 python scripts/start_server.py # 方式二:如果项目使用 FastAPI,可能直接运行主应用文件 uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload # 方式三:通过命令行接口启动 qm start --port 8000

服务成功启动后,终端会显示类似Uvicorn running on http://0.0.0.0:8000的信息。

步骤 5:验证服务打开浏览器,访问http://localhost:8000/docs(如果框架提供了 OpenAPI 文档)或http://localhost:8000(如果有 WebUI)。你应该能看到 API 交互界面或管理页面。

至此,QM 框架的核心服务就运行起来了。但这只是一个空壳,接下来我们需要为其注入“灵魂”——创建智能体并赋予它们能力。

5. 功能测试与效果验证:构建你的第一个多智能体工作流

现在我们来实战测试。目标是创建一个简单的多智能体协作场景:一个“研究员”智能体负责获取信息,一个“写手”智能体负责整理成文。

5.1 定义智能体与工具

多智能体框架通常通过配置文件或 API 来定义智能体。我们假设 QM 支持 YAML 配置。

在项目配置目录(如config/agents/)下创建research_team.yaml

# research_team.yaml agents: - name: "researcher" role: "互联网信息研究员" # 指定该智能体使用的后端模型,引用 .env 中的配置或直接指定 model: "${OPENAI_MODEL:-gpt-4-turbo}" instructions: | 你是一名专业的研究员。你的任务是利用可用工具,高效、准确地查找用户问题的相关信息。 请只提供事实性信息,不要添加个人观点。将收集到的信息清晰罗列。 tools: ["web_search", "knowledge_base_query"] # 该智能体可以调用的工具列表 - name: "writer" role: "技术文章写手" model: "${OPENAI_MODEL:-gpt-4-turbo}" instructions: | 你是一名优秀的科技文章写手。你将收到研究员提供的信息要点。 你的任务是将这些信息组织成一篇结构清晰、语句流畅的简短文章(约300字)。 文章需包含引言、核心内容分点和总结。 tools: [] # 写手可能不需要调用外部工具 # 定义工具(假设框架支持内置工具) tools: - name: "web_search" type: "serpapi" # 或 searxng, duckduckgo 等 config: api_key: "${SERPAPI_KEY}" # 需要在 .env 中配置 num_results: 5 - name: "knowledge_base_query" type: "vectorstore" config: index_path: "./data/vector_index"

这个配置定义了两个智能体和一个搜索工具。接下来,我们需要通过框架的 API 来加载这个配置。

5.2 通过 API 创建智能体团队

使用curl或 Python 脚本调用 QM 的管理 API。

# 使用 curl 创建团队 curl -X POST "http://localhost:8000/api/v1/teams" \ -H "Content-Type: application/json" \ -d '{ "team_id": "tech_research_team", "config_path": "./config/agents/research_team.yaml" }'

如果成功,会返回团队 ID 和智能体列表。

5.3 执行多智能体协作任务

现在,向这个团队提交一个任务。框架会根据任务描述和智能体的角色,自动进行任务分配和接力。

# test_workflow.py import requests import json QM_API_BASE = "http://localhost:8000/api/v1" def run_agent_workflow(): # 1. 提交任务 task_payload = { "team_id": "tech_research_team", "task": "请调研‘多智能体框架在自动化测试领域的应用现状’,并撰写一份简要报告。", "max_turns": 4 # 限制交互轮次,防止无限循环 } submit_response = requests.post(f"{QM_API_BASE}/tasks/submit", json=task_payload) task_info = submit_response.json() task_id = task_info["task_id"] print(f"任务已提交,ID: {task_id}") # 2. 轮询获取任务结果 import time for i in range(30): # 最多轮询30次,每次间隔2秒 time.sleep(2) status_response = requests.get(f"{QM_API_BASE}/tasks/{task_id}/status") status_data = status_response.json() print(f"轮询 {i+1}: 状态 - {status_data['status']}") if status_data['status'] == 'completed': result_response = requests.get(f"{QM_API_BASE}/tasks/{task_id}/result") final_result = result_response.json() print("\n=== 任务完成 ===") print(f"最终输出:\n{final_result['output']}") print(f"执行日志:\n{json.dumps(final_result.get('logs'), indent=2, ensure_ascii=False)}") break elif status_data['status'] in ['failed', 'cancelled']: print(f"任务失败或取消: {status_data.get('error', 'No error info')}") break else: print("任务执行超时。") if __name__ == "__main__": run_agent_workflow()

运行这个脚本:

python test_workflow.py

5.4 验证结果与观察

成功的执行会输出类似以下内容:

  1. 任务状态:从pending->allocated->running->completed
  2. 最终输出:一篇由“写手”智能体生成的、基于“研究员”智能体搜索结果的简短报告。
  3. 执行日志:详细记录哪个智能体在何时被调用、调用了什么工具、输入输出是什么。这是调试多智能体协作逻辑的关键。

判断成功的标准:

  • API 调用返回正确的 HTTP 状态码(如 200, 201)。
  • 任务状态最终变为completed
  • 最终输出内容确实回答了任务问题,并且结构符合“写手”智能体的指令要求。
  • 日志显示“研究员”智能体成功调用了web_search工具并返回了摘要。

常见失败原因:

  • 模型 API 连接失败:检查.env配置的 API Key 和 Base URL 是否正确,网络是否通畅。
  • 工具调用错误:例如web_search工具的 API Key 未配置或失效。
  • 智能体指令冲突:智能体之间陷入循环对话或无法达成一致,可通过调整instructions或设置max_turns解决。
  • 框架内部错误:查看 QM 服务端的日志输出,通常会有更详细的错误堆栈信息。

6. 接口 API 与批量任务

QM 作为框架,其 API 是程序化集成的核心。除了上述任务提交接口,通常还会提供更细粒度的控制。

6.1 核心 API 端点示例

假设 QM 提供了如下 REST API(具体端点需查阅官方文档):

  • 智能体管理
    • POST /api/v1/agents- 创建智能体
    • GET /api/v1/agents- 列出所有智能体
    • PUT /api/v1/agents/{agent_id}- 更新智能体
  • 任务控制
    • POST /api/v1/tasks- 提交单条任务(上文已用)
    • POST /api/v1/tasks/batch- 提交批量任务
    • GET /api/v1/tasks- 查询任务列表
    • DELETE /api/v1/tasks/{task_id}- 取消任务
  • 工作流定义
    • POST /api/v1/workflows- 注册预定义的工作流(一种固定的智能体协作模式)
    • POST /api/v1/workflows/{workflow_id}/run- 运行指定工作流

6.2 批量任务处理

对于需要处理大量同类任务的场景(如分析100份文档),批量接口至关重要。

# batch_processing.py import requests import csv QM_API_BASE = "http://localhost:8000/api/v1" def submit_batch_tasks(input_file='tasks.csv'): """从CSV文件读取任务并批量提交""" tasks = [] with open(input_file, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: task_payload = { "team_id": row['team_id'], # CSV中指定使用哪个智能体团队 "task": row['task_description'], "metadata": {"source_file": row.get('source', '')} # 附加元数据 } tasks.append(task_payload) if not tasks: print("未读取到任务。") return batch_payload = { "tasks": tasks, "callback_url": "http://your-server.com/callback", # 可选:任务完成后的回调通知 "max_concurrent": 3 # 控制并发数,避免过载 } response = requests.post(f"{QM_API_BASE}/tasks/batch", json=batch_payload) if response.status_code == 202: batch_info = response.json() print(f"批量任务提交成功!批次ID: {batch_info['batch_id']}") print(f"共提交 {len(tasks)} 个任务。") # 可以存储 batch_id,用于后续查询进度 with open('batch_id.txt', 'w') as f: f.write(batch_info['batch_id']) else: print(f"批量提交失败: {response.status_code}, {response.text}") def check_batch_progress(batch_id): """查询批量任务进度""" response = requests.get(f"{QM_API_BASE}/tasks/batch/{batch_id}/progress") if response.status_code == 200: progress = response.json() print(f"批次 {batch_id} 进度:") print(f" 总计: {progress['total']}") print(f" 完成: {progress['completed']}") print(f" 失败: {progress['failed']}") print(f" 进行中: {progress['running']}") if progress['failed'] > 0: print(f" 失败任务ID示例: {progress['failure_samples'][:3]}") # 查看前三个失败任务 else: print(f"查询进度失败: {response.status_code}") if __name__ == "__main__": # 假设 tasks.csv 包含 `team_id,task_description,source` 列 submit_batch_tasks('tasks.csv') # 稍后,根据返回的 batch_id 查询进度 # check_batch_progress('your_batch_id_here')

批量任务最佳实践:

  1. 任务队列:使用max_concurrent参数限制并发,防止压垮模型 API 或本地 GPU。
  2. 回调机制:如果设置了callback_url,确保你的回调服务能正确处理完成/失败通知。
  3. 结果存储:批量任务的结果通常需要通过单独的 API (GET /api/v1/tasks/{task_id}/result) 逐个获取,或由框架统一归档到指定目录。务必设计好结果数据的存储和索引方案。
  4. 错误处理与重试:在批量任务中,部分任务失败是常态。框架应提供失败重试机制,或者你的客户端程序需要根据失败样本进行重试。

7. 资源占用与性能观察

QM 框架本身的资源消耗很低,主要开销来自智能体后端的模型推理。因此,性能观察的重点在于模型层和任务调度层。

  1. 框架服务进程监控

    # Linux/Mac 下查看 QM 进程资源占用 top -p $(pgrep -f "uvicorn.*qm\|python.*start_server") # 或使用 htop 更直观
    • CPU:框架逻辑处理会占用少量 CPU。
    • 内存:框架本身内存占用通常在几百 MB 以内,但如果加载了大量工具插件或缓存,可能会增长。
    • 网络 I/O:观察与模型 API 或工具服务之间的网络流量。
  2. 模型推理资源监控

    • API 模式:性能取决于网络延迟和 API 提供方的速率限制。关注请求响应时间 (response.elapsed.total_seconds()in Python requests) 和错误率。
    • 本地 GPU 模式:这是资源消耗大户。
      # 使用 nvidia-smi 监控 GPU watch -n 1 nvidia-smi
      • 显存占用:加载模型后会占用大量显存。7B 参数模型通常需要 14GB+ 显存(FP16),可通过量化(如 GPTQ, AWQ)降低到 6-8GB。
      • GPU 利用率:在任务执行时,GPU-Util 会升高。持续低利用率可能意味着任务调度或模型加载存在瓶颈。
      • 内存交换:如果系统内存不足,可能会发生交换,导致性能急剧下降。监控系统内存使用 (free -h)。
  3. 任务队列与延迟

    • 通过 QM 的 API 或管理界面查看任务排队数量、平均处理时间。
    • 如果任务积压严重,考虑:
      • 增加max_concurrent(如果后端承载能力足够)。
      • 优化智能体指令,减少不必要的交互轮次 (max_turns)。
      • 升级后端模型推理能力(更快的 GPU 或更高效的推理引擎)。

性能优化方向:

  • 模型侧:使用量化模型、启用注意力优化(如 FlashAttention)、使用更高效的推理引擎(如 vLLM, TensorRT-LLM)。
  • 框架侧:优化工具调用缓存、对智能体对话历史进行摘要压缩以减少 token 消耗、实现智能体结果缓存(对于相同输入)。
  • 部署侧:将负载重的工具(如向量数据库)部署为独立微服务,避免阻塞主框架。

8. 常见问题与排查方法

部署和使用多智能体框架时,你会遇到各种问题。下表列出了常见问题及其排查思路。

问题现象可能原因排查方式解决方案
服务启动失败端口被占用;Python 依赖冲突;环境变量缺失。1. 查看启动命令错误日志。
2.netstat -tulnp | grep :8000检查端口。
3.pip list检查关键包版本。
1. 更换端口 (--port 8001)。
2. 在干净的虚拟环境中重新安装依赖。
3. 检查并正确配置.env文件。
API 调用返回 404 或 500API 路径错误;服务未正常运行;请求格式错误。1. 确认服务地址和端口 (http://localhost:8000)。
2. 访问/docs/health端点确认服务状态。
3. 对照 API 文档检查请求体 JSON 格式。
1. 重启服务。
2. 使用 Postman 或 curl 发送最简请求测试。
3. 查看服务端日志获取详细错误。
智能体不调用工具工具配置错误;智能体指令未明确要求使用工具;模型“幻觉”选择不调用。1. 检查工具配置 YAML 语法和路径。
2. 查看任务执行日志,看智能体是否收到了工具列表。
3. 强化智能体instructions,明确要求“你必须使用XX工具”。
1. 修正工具配置,确保tools:下的名称与定义一致。
2. 在测试时使用更强大的模型(如 GPT-4)以确保工具调用能力。
3. 在日志中检查模型返回的function_call字段。
任务执行超时或卡住模型 API 响应慢或无响应;智能体间陷入循环对话;某个工具调用阻塞。1. 检查单个模型 API 调用的超时设置。
2. 分析任务日志,看对话是否在几个智能体间来回传递无进展。
3. 检查工具服务(如搜索API)是否可用。
1. 在框架配置或任务提交时设置合理的超时时间。
2. 设置max_turns限制。
3. 为工具调用增加超时和重试机制。
4. 实现看门狗(watchdog)监控长时间运行的任务。
本地模型显存不足 (OOM)模型过大;批量处理设置不当;未启用量化。1.nvidia-smi观察显存峰值。
2. 检查推理批处理大小 (batch_size)。
1. 换用更小的模型或量化版本(如 4bit, 8bit)。
2. 将batch_size设为 1。
3. 使用 CPU 卸载(如果支持,但速度慢)。
4. 升级显卡硬件。
批量任务大量失败输入数据格式问题;模型 API 达到速率限制;网络不稳定。1. 抽样检查失败任务的输入数据。
2. 查看模型 API 返回的错误信息(如rate_limit,invalid_request)。
3. 检查网络连接。
1. 清洗输入数据,增加格式校验。
2. 为批量任务添加指数退避重试逻辑。
3. 降低max_concurrent,避免触发速率限制。
WebUI 无法访问服务绑定到127.0.0.1而非0.0.0.0;防火墙阻止;路径错误。1. 确认服务启动命令中的--host参数。
2. 从服务器本机curl http://localhost:8000测试。
3. 检查浏览器控制台网络错误。
1. 启动时使用--host 0.0.0.0
2. 配置防火墙开放对应端口。
3. 确认访问的 URL 路径正确。

9. 最佳实践与使用建议

基于上述测试和问题排查经验,以下建议能帮助你更稳定、高效地使用 QM 这类多智能体框架:

  1. 从小开始,迭代验证

    • 不要一开始就设计复杂的多智能体工作流。先用一个智能体、一个工具跑通最简单的任务。
    • 验证每个工具单独调用是否正常。
    • 逐步增加智能体数量和协作复杂度。
  2. 配置与代码分离

    • 将智能体定义、工具配置、模型连接参数全部放在配置文件(如 YAML, JSON)或环境变量中。
    • 避免将 API Key 等敏感信息硬编码在代码里。使用.env文件并通过python-dotenv加载。
  3. 完善的日志与监控

    • 确保框架记录了每个智能体的输入输出、每次工具调用的请求和响应。这些日志是调试协作逻辑的黄金资料。
    • 为关键指标(如任务耗时、API调用失败率、工具调用成功率)设置监控和告警。
  4. 设计健壮的任务流程

    • 为每个任务设置唯一 ID 和超时时间。
    • 考虑实现任务优先级队列。
    • 对于关键任务,实现持久化存储,防止服务重启导致任务丢失。
  5. 安全与合规第一

    • 工具权限:严格限制智能体对文件系统、数据库和网络资源的访问权限。运行在沙箱或容器环境中是更安全的选择。
    • 内容审核:如果智能体生成的内容会对外发布,必须加入人工审核或自动内容安全过滤环节。
    • 数据隐私:如果处理用户数据,确保整个流水线符合数据保护法规。考虑对输出进行匿名化处理。
  6. 性能与成本优化

    • 缓存:对频繁查询的、结果不变的工具调用(如某些知识库查询)实施缓存。
    • 模型路由:根据任务复杂度,将简单任务路由到廉价/快速的模型(如 GPT-3.5),复杂任务路由到能力更强的模型(如 GPT-4)。
    • 异步处理:对于耗时长的任务,采用异步提交、回调通知的模式,避免 HTTP 请求阻塞。

QM 框架的价值在于提供了一个可编排、可扩展的骨架。它的上限取决于你如何定义智能体的“大脑”(模型)和“手脚”(工具)。在本地部署场景下,结合量化后的开源模型,你完全可以构建出一个数据不离库、能力可定制、成本可控的私有智能体系统。最先要验证的就是模型与工具的连接是否通畅,以及最基本的任务接力是否能跑通。最容易踩的坑往往是环境配置和智能体指令设计不当导致的循环或无效调用。

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

Notion数据库思维:开发者如何构建结构化知识库与项目管理

/* 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 18:55:35

软文推广平台推荐:2026年传声港软文推广服务深度介绍

软文推广平台推荐&#xff1a;2026年传声港软文推广服务深度介绍 2026年&#xff0c;AI搜索正在重塑企业与用户之间的信息连接方式&#xff0c;软文推广的价值判断标准也随之发生变化。当豆包等AI助手成为越来越多用户获取品牌信息的入口&#xff0c;企业软文推广不再只是"…

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

STM32嵌入式RGB灯光控制系统设计:从PWM调光到人机交互实战

/* 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 18:51:29

头歌实践教学平台:大数据存储2023(二十1)

二十、MongoDB 实验——数据备份和恢复第1关&#xff1a;数据备份任务描述 本关任务&#xff1a;按照编程要求备份数据库。相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.掌握 mongodump 备份工具的参数含义&#xff1b; 2.如何使用 mongodump 备份数据。mon…

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

风力发电沙盘模型控制系统设计与灯光联动实现方案——基于STM32与Modbus RTU,服务范围覆盖全国的多场景风力发电沙盘模型定制

一、项目背景 风力发电沙盘模型是新能源展会与风电企业展厅的核心展示载体。随着风电行业展会对展品互动性的要求持续提升&#xff0c;沙盘模型正从“静态展示”向“动态交互”演进。在风力发电沙盘模型定制中&#xff0c;控制系统是决定模型展示效果的核心模块。控制系统是否自…

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

Springboot学生信息管理系统【747756】 -附源码(开箱即用)

项目介绍&#xff1a; 本项目主题是学生信息管理系统 是一套前后端分离的学工后台&#xff1a;管学籍、班级、教师、课程、成绩、考勤和奖惩。登录、三角色权限、工作台统计、增删改查都有&#xff0c;体量适合课程设计和本科毕设&#xff0c;不适合当正式教务系统直接上线。 …

作者头像 李华