news 2026/9/3 17:18:40

Dify 从入门到精通:LLM 应用开发平台部署与核心功能实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Dify 从入门到精通:LLM 应用开发平台部署与核心功能实战指南

在实际 AI 应用开发中,从零开始构建一个具备对话、知识库、工作流等核心能力的系统,需要整合模型调用、提示工程、向量检索、状态管理等多个复杂模块,开发周期长且技术门槛高。Dify 作为一个开源的 LLM 应用开发平台,将上述能力进行了产品化封装,提供了可视化的编排界面,旨在让开发者能更专注于业务逻辑而非底层基础设施。然而,从“知道 Dify”到“用好 Dify”之间,依然存在巨大的实践鸿沟:如何部署、如何理解其核心概念、如何构建稳定可用的工作流、如何排查部署和运行中的各种问题,这些都需要系统的学习和实践。

本文将以工程实践为导向,为你拆解 Dify 从入门到应用于企业级场景的全过程。我们将从最基础的部署开始,逐步深入到工作流编排、知识库构建、智能体开发等核心功能,并结合常见的生产环境问题和最佳实践,帮助你构建起对 Dify 的完整认知和实操能力。无论你是想快速搭建一个内部问答机器人,还是希望构建复杂的多步骤 AI 应用,本文都将提供一条清晰的路径。

1. 理解 Dify 的核心定位与架构

在动手部署和写第一行配置之前,我们需要先厘清 Dify 究竟是什么,以及它如何简化 LLM 应用的开发流程。这有助于我们在后续实践中做出正确的技术选型和架构设计。

1.1 Dify 是什么?不是“又一个管理后台”

Dify 的核心定位是一个LLM 应用的全生命周期开发与运维平台。它不是一个简单的模型管理后台,也不是一个仅用于提示词调试的玩具工具。你可以将其理解为一个“低代码”或“可视化”的 LLM 应用集成开发环境(IDE)。

它的核心价值在于:

  • 可视化编排:通过拖拽节点的方式,将 LLM 调用、条件判断、代码执行、知识库检索等能力组合成复杂的工作流,无需编写胶水代码。
  • 统一抽象层:对接了数十种主流的大语言模型(如 OpenAI GPT、 Anthropic Claude、国内各大厂商模型),提供统一的 API 接口和参数配置,降低了模型切换的成本。
  • 开箱即用的组件:内置了知识库(RAG)、文本转语音(TTS)、联网搜索、函数调用等常见 AI 应用所需的核心能力模块。
  • 企业级特性:支持多租户、权限管理、审计日志、监控指标等,为团队协作和产品化部署提供了基础。

与 LangChain 这类开发框架相比,Dify 提供了更高层级的抽象和产品化的界面。LangChain 更像是一套强大的 SDK 和设计模式库,需要开发者编写代码来组装链条;而 Dify 则将这些模式固化成了可视化的节点和连接线,降低了使用门槛,但也意味着在极端定制化场景下,灵活性可能不如直接编码。与 n8n 这类通用自动化工具相比,Dify 更专注于 LLM 应用领域,其节点和数据处理逻辑都是为 AI 任务优化的。

1.2 Dify 的核心架构组件

理解 Dify 的架构,有助于后续的部署、问题排查和性能调优。一个典型的 Dify 部署包含以下核心服务:

组件作用关键技术栈
API Server提供核心的 RESTful API,处理应用创建、工作流运行、知识库管理等所有业务逻辑。FastAPI, PostgreSQL
Web Frontend提供用户操作界面,包括工作流编排、对话调试、应用管理等。Next.js, React
Worker异步任务执行者,负责处理耗时的任务,如知识库文档解析、向量化索引、工作流中的异步节点执行。Celery, Redis
向量数据库存储知识库文档的向量嵌入(Embeddings),用于相似性检索。Dify 支持多种向量库。Qdrant, PGVector, Weaviate 等
关系型数据库存储用户、应用、对话记录、配置等元数据。PostgreSQL (必须)
对象存储存储用户上传的文件,如图片、文档等。本地磁盘或 S3 兼容服务(MinIO, AWS S3)
消息队列/缓存用于 Worker 和 API Server 之间的任务分发和状态同步。Redis (必须)

这些组件通过 Docker Compose 或 Kubernetes 编排在一起。在开发或小规模部署时,所有组件可以运行在同一台机器上;在生产环境,建议将数据库、Redis、向量库等有状态服务进行独立部署。

2. 从零开始部署 Dify:环境准备与安装

部署是实践的第一步,也是最容易踩坑的环节。我们将分别介绍基于 Docker Compose 的部署(最推荐)和基于源码的部署,并重点讲解关键配置和常见问题。

2.1 环境准备与前置检查

在开始安装前,请确保你的服务器或本地开发机满足以下最低要求:

  • 操作系统:Linux (Ubuntu 20.04+/CentOS 7+), macOS, 或 Windows (WSL2 强烈推荐)。
  • Docker 与 Docker Compose:这是最简化的部署方式。确保已安装最新稳定版。
    # 检查 Docker 和 Docker Compose 版本 docker --version docker-compose --version
  • 硬件资源
    • CPU:2 核以上。
    • 内存:至少 4GB,建议 8GB 以上。运行向量模型进行嵌入计算时需求更高。
    • 磁盘:至少 20GB 可用空间,用于存储镜像、数据库和文档。
  • 网络:能够访问 Docker Hub 和所需的模型 API(如 OpenAI)。对于离线部署,需要提前准备所有镜像。

注意:如果你计划在 Windows 上直接运行(非 WSL2),可能会遇到路径权限、性能等问题。生产环境强烈建议使用 Linux 服务器。

2.2 使用 Docker Compose 一键部署(推荐)

这是官方推荐且最快捷的部署方式,适合绝大多数学习和生产场景。

  1. 获取部署文件: 从 Dify 的 GitHub 仓库下载最新的docker-compose.yaml.env配置文件。

    # 创建一个工作目录 mkdir dify && cd dify # 下载官方 docker-compose 文件 curl -O https://raw.githubusercontent.com/langgenius/dify/main/docker/docker-compose.yaml # 下载环境变量示例文件 curl -O https://raw.githubusercontent.com/langgenius/dify/main/docker/.env.example cp .env.example .env
  2. 关键环境变量配置: 编辑.env文件,这是配置的核心。以下是一些必须或建议修改的项:

    # 修改 .env 文件 vim .env
    # 数据库密码,务必修改为强密码 POSTGRES_PASSWORD=your_strong_password_here # Redis 密码,同样需要修改 REDIS_PASSWORD=your_redis_password_here # 设置 Dify 运行的外部访问地址,用于回调等 # 如果是本地学习,可以是 http://localhost # 如果是服务器部署,替换为你的服务器 IP 或域名 CONSOLE_API_URL=http://your-server-ip-or-domain:3000 CONSOLE_WEB_URL=http://your-server-ip-or-domain:3000 # 默认的密钥,建议修改 SECRET_KEY=your-secret-key-here # 文件存储位置,默认在容器内,生产环境建议挂载到宿主机 # FILES_DIR=/app/storage # 可以取消注释并修改为宿主机路径,例如: # FILES_DIR=/data/dify/storage

    对于向量数据库,Dify 默认使用Qdrant。如果你需要更改为PGVector(与 PostgreSQL 集成),则需要修改docker-compose.yaml文件,注释掉 Qdrant 服务,并启用 PGVector 相关配置。

  3. 启动服务: 配置完成后,使用 Docker Compose 启动所有服务。

    # 在后台启动所有服务 docker-compose up -d

    首次启动会拉取所有必要的 Docker 镜像,可能需要几分钟时间。你可以通过以下命令查看日志和启动状态:

    # 查看所有容器状态 docker-compose ps # 查看实时日志(组合日志) docker-compose logs -f # 查看特定服务日志,如 API 服务 docker-compose logs -f api
  4. 访问与初始化: 服务启动成功后,在浏览器中访问http://your-server-ip-or-domain:3000。首次访问会进入初始化页面,需要你:

    • 设置管理员账号和密码。
    • 配置初始的 LLM 供应商和模型。你可以先填入一个可用的 OpenAI API Key 和模型名(如gpt-3.5-turbo)进行测试。后续可以在设置中随时添加或修改。

至此,一个基础的 Dify 环境就已经部署完成了。

2.3 常见部署问题排查

部署过程很少一帆风顺,以下是一些典型问题及解决方案:

问题现象可能原因检查与解决步骤
访问3000端口无法连接1. 服务未成功启动。
2. 防火墙/安全组未开放端口。
3. 容器端口映射错误。
1. 运行docker-compose ps检查所有容器状态是否为Up
2. 运行docker-compose logs api查看 API 服务是否有启动错误。
3. 检查服务器防火墙:sudo ufw status(Ubuntu)。
4. 检查docker-compose.yamlweb服务的端口映射3000:3000
日志中出现database “dify” does not exist或数据库连接失败PostgreSQL 容器初始化失败或网络问题。1. 检查.env中的POSTGRES_PASSWORD是否已设置且一致。
2. 尝试重启服务:docker-compose down && docker-compose up -d
3. 检查 PostgreSQL 容器日志:docker-compose logs db
前端构建卡在creating an optimized production build构建 Next.js 应用时内存不足或网络问题。1.这是最常见的问题。增加 Docker 可用内存(在 Docker Desktop 设置中,或服务器增加 SWAP)。
2. 检查 Node 环境,有时需要清理缓存。可以尝试进入web容器手动构建:
docker-compose exec web pnpm install --frozen-lockfile(如果可用)
但更简单的办法是等待,或使用预构建的镜像。
上传文档到知识库后,状态一直显示“索引中”Worker 服务未正常运行,或向量数据库连接失败。1. 检查 Worker 容器状态:docker-compose ps | grep worker
2. 查看 Worker 日志:docker-compose logs worker,看是否有向量库连接错误或嵌入模型下载失败。
3. 检查 Qdrant 或 PGVector 服务是否健康。
修改模型参数(如top_p)不生效1. 修改位置错误(可能在模型供应商级别,而非应用级别)。
2. 缓存问题。
3. 部分模型不支持某些参数。
1. 确认修改位置:在“模型供应商”设置中修改的是全局默认值;在具体应用的“提示词编排”或“工作流”的 LLM 节点中,可以覆盖这些参数。
2. 清理浏览器缓存或尝试无痕模式。
3. 查阅对应模型 API 文档,确认top_p参数是否被支持。

3. 核心功能实战:从工作流到知识库

部署成功后,我们进入核心功能的使用阶段。我们将通过构建一个“智能客服工单分类与处理建议”工作流,来串联 Dify 的几个关键概念。

3.1 创建你的第一个 AI 应用:对话型应用

  1. 登录并创建应用:进入 Dify 控制台,点击“创建新应用”,选择“对话型应用”。给它起个名字,比如“工单处理助手”。
  2. 配置提示词:在“提示词编排”页面,系统已经提供了一个简单的对话模板。我们可以修改系统提示词来定义 AI 的角色和能力。
    你是一个专业的 IT 客服助手。你的任务是: 1. 分析用户描述的工单问题。 2. 将问题分类为:【网络问题】、【软件问题】、【硬件问题】、【账号问题】或【其他】。 3. 根据分类,提供初步的排查步骤或解决方案建议。 4. 你的回答应该清晰、有条理,并以友好的语气结束。 用户问题:{{query}}
    这里的{{query}}是一个变量,会被用户的实际问题替换。
  3. 连接模型:在右侧的“模型”区域,选择你之前配置好的模型供应商和模型(例如 OpenAI 的 gpt-3.5-turbo)。你可以调整温度(Temperature)、最大生成长度等参数。
  4. 预览与调试:点击右上角的“预览”按钮,在右侧对话框输入一个测试问题,如“我的电脑无法连接公司Wi-Fi”,查看 AI 的回复是否符合预期。通过调试,不断优化你的提示词。

这个简单的对话应用已经具备了基础能力。但它的逻辑是固定的,无法进行多步骤判断或调用外部工具。接下来,我们使用更强大的“工作流”来增强它。

3.2 构建复杂逻辑:工作流编排

工作流是 Dify 的精华。我们构建一个工单处理工作流,它不仅能分类,还能根据分类结果查询知识库获取标准处理流程,甚至调用一个模拟的“创建工单”接口。

  1. 创建工作流:在应用概览页,切换到“工作流”标签页,点击“创建新工作流”。

  2. 添加节点:从左侧的节点库中拖拽需要的节点到画布。

    • 开始节点:代表工作流的触发入口。
    • LLM 节点:用于分析用户输入并进行分类。我们将其重命名为“问题分类器”。
    • 知识库节点:根据分类结果,检索对应的标准操作流程(SOP)文档。
    • 代码节点:模拟一个 HTTP 调用,向外部系统创建工单(此处我们用 Python 代码模拟)。
    • 结束节点:汇总信息并返回给用户。
  3. 连接并配置节点

    • 将“开始节点”的输出(用户问题)连接到“问题分类器”节点的输入。
    • 配置“问题分类器”节点:
      • 模型:选择你的 LLM。
      • 提示词:编写一个让 LLM 进行结构化输出的提示词。
      请严格按以下 JSON 格式输出,只输出 JSON,不要有任何额外解释。 { "category": "问题分类,必须是【网络问题】、【软件问题】、【硬件问题】、【账号问题】或【其他】中的一个", "urgency": "紧急程度,高、中、低", "summary": "对问题的简要总结" } 用户问题:{{input}}
    • 将“问题分类器”的输出变量(如category)连接到“知识库节点”的查询条件。配置知识库节点,选择你提前创建好的、包含各类问题 SOP 的知识库。
    • 将“知识库节点”的检索结果和分类器的结果一起输入到“代码节点”。
    • 配置“代码节点”(Python):
      # 模拟创建工单的 API 调用 import json # 获取上游变量 user_input = inputs.get('input') category = inputs.get('category') knowledge = inputs.get('retrieved_knowledge') # 假设知识库节点输出变量名为 retrieved_knowledge # 模拟工单数据 ticket_data = { "title": f"[{category}] {user_input[:50]}...", "description": user_input, "category": category, "sop_reference": knowledge[:200] if knowledge else "无相关SOP", "status": "待处理" } # 这里本应是 requests.post(url, json=ticket_data) # 现在我们模拟一个成功响应 mock_response = { "success": True, "ticket_id": "TICKET-2023-001", "message": "工单创建成功" } # 输出到下游 print(f"模拟创建工单: {json.dumps(ticket_data, ensure_ascii=False)}") outputs = { "ticket_info": mock_response, "assistant_summary": f"您的问题已被归类为【{category}】。已根据知识库为您生成了处理建议,并创建了工单(ID: {mock_response['ticket_id']}),客服将尽快跟进。" }
    • 最后,将“代码节点”的输出连接到“结束节点”,作为工作流的最终回复。
  4. 运行与测试:保存工作流后,点击“运行此工作流”,在测试框中输入问题,观察每个节点的执行状态和变量传递,最终查看输出结果。

通过这个工作流,你将直观地感受到 Dify 如何将 LLM 的推理能力、外部知识检索和自定义代码逻辑无缝地串联起来。

3.3 构建企业知识库:RAG 实践

知识库是 Dify 实现“基于文档问答”的核心。其流水线通常包括:文档上传 -> 文本分割 -> 向量化 -> 索引存储 -> 检索。

  1. 创建知识库:在侧边栏进入“知识库”,点击“创建”。
  2. 上传文档:支持 txt, md, pdf, docx, pptx, excel 等多种格式。上传一份你准备好的 IT 问题处理 SOP 文档。
  3. 配置索引参数
    • 分词与清洗:Dify 会自动处理,你也可以选择是否启用中文增强分词。
    • 嵌入模型:这是关键。Dify 内置了text-embedding-ada-002(OpenAI)等在线模型,也支持本地部署的BGEM3E等开源模型。选择在线模型更简单,但会产生 API 调用费用和网络依赖。选择本地模型需要在部署时额外配置。
    • 向量数据库:使用你在.env中配置的向量库(如 Qdrant)。
  4. 处理与索引:点击“处理”,Dify 的后台 Worker 会开始执行文档解析、分块、向量化并存入向量数据库。你可以在“文件列表”中查看每个文档的处理状态。
  5. 在应用中使用:回到之前创建的应用或工作流,添加一个“知识库检索”节点,并选择你创建的知识库。在提示词中,你可以通过类似{{#context}}...{{/context}}的模板语法将检索到的内容注入。

常见问题:文档状态一直“索引中”

  • 原因1:Worker 服务异常。检查docker-compose logs worker是否有错误。
  • 原因2:嵌入模型下载或调用失败。如果使用本地模型,确认模型文件已正确放置且路径配置正确;如果使用在线模型,确认 API Key 有效且网络通畅。
  • 原因3:向量数据库连接失败。检查 Qdrant 等服务的日志。
  • 解决:尝试重新上传文档,或进入知识库的“文件列表”手动重试处理失败的文档。

4. 进阶配置与生产环境考量

当你的应用从学习环境走向测试和生产环境时,需要考虑更多稳定性、安全性和性能问题。

4.1 模型与供应商管理

  • 多模型负载均衡与降级:在“模型供应商”设置中,你可以为同一类模型(如 Chat)配置多个供应商。Dify 支持设置优先级和故障转移。例如,你可以将 GPT-4 设为主要模型,GPT-3.5 为次要模型,当主要模型调用失败或达到速率限制时,自动切换到次要模型。
  • API 密钥管理:切勿在前端代码或配置文件中硬编码 API Key。Dify 在后台管理这些密钥。生产环境中,确保你的.env文件不被泄露,并定期轮换密钥。
  • 使用本地模型:为了数据隐私和成本控制,你可能需要部署本地开源模型(如 Llama 系列、Qwen、ChatGLM 等)。这通常需要:
    1. 使用OllamavLLMXinference等框架部署模型服务,提供兼容 OpenAI API 的接口。
    2. 在 Dify 的“模型供应商”中,选择“自定义”,填入你的本地模型服务地址和 API Key(如果需要)。

4.2 性能优化与监控

  • 工作流优化
    • 避免循环与长链:过于复杂的工作流会影响响应时间。尽量将可并行的节点(如多个知识库检索)并行化。
    • 使用变量缓存:对于不经常变化且计算成本高的数据,可以考虑使用“变量”节点进行缓存,或在外部系统中实现缓存。
  • 知识库优化
    • 调整文本分块策略:默认分块大小可能不适合你的文档。对于技术文档,可以适当增大块大小;对于对话记录,可能需要减小块大小。这需要在知识库创建时选择或自定义处理方式。
    • 优化检索 Top-K:在知识库检索节点中,调整返回的相似文本片段数量(top_k)。太大会引入噪声,太小可能遗漏关键信息。需要通过测试找到平衡点。
  • 监控与日志
    • 查看应用日志:Dify 控制台提供了应用级别的对话日志,可以查看每次请求的输入、输出和所用工作流。
    • 服务监控:监控 Docker 容器的资源使用情况(CPU、内存)。对于生产环境,建议将日志(stdout/stderr)收集到 ELK 或 Loki 等集中式日志系统,并设置 Prometheus 监控关键指标(如 API 响应延迟、错误率)。

4.3 安全加固

  • 网络隔离:将 Dify 的访问端口(3000)置于防火墙或反向代理(如 Nginx)之后,配置 HTTPS。
  • 权限控制:利用 Dify 的企业版功能或基于其 API 自行开发,实现团队、应用、知识库级别的权限管理。
  • 输入输出过滤:在“代码节点”或通过前置代理,对用户输入进行必要的清洗和过滤,防止提示词注入攻击。对模型的输出内容也可进行合规性检查。
  • 依赖组件安全:定期更新 Docker 镜像、PostgreSQL、Redis 等基础组件的版本,修复已知漏洞。关注 Dify 社区的安全公告。

5. 故障排查清单与最佳实践

5.1 通用问题排查清单

当遇到问题时,可以按以下顺序排查:

  1. 检查服务状态docker-compose ps确认所有容器是否运行正常。
  2. 查看错误日志
    • docker-compose logs api(API 服务)
    • docker-compose logs worker(异步任务)
    • docker-compose logs db(数据库)
    • docker-compose logs vector_db(向量数据库,如 qdrant)
  3. 检查网络与连接
    • 容器间通信:确保docker-compose.yaml中服务名称能正确解析。
    • 外部 API 连接:如果使用在线模型,从容器内测试是否能访问api.openai.com等地址。
  4. 检查配置:确认.env文件中的关键配置(数据库密码、外部 URL、API Key)是否正确,特别是部署后修改了配置是否执行了docker-compose down && docker-compose up -d重启服务。
  5. 检查资源docker stats查看容器是否因内存不足(OOM)而崩溃。前端构建卡住通常是内存不足。
  6. 检查数据持久化:如果容器重启后数据丢失,检查docker-compose.yaml中的卷(volumes)挂载配置是否正确。

5.2 核心功能问题速查表

功能模块常见问题排查方向
工作流HTTP 节点报错reached maximum retries (0) for url1. 目标 URL 是否可达(从容器内测试)。
2. 网络策略是否允许。
3. 检查 HTTP 节点的超时和重试配置。
知识库检索结果不相关或为空1. 确认文档已成功处理并索引(状态为“可用”)。
2. 调整检索的top_k值。
3. 检查查询问题是否与文档内容语义相关。
4. 考虑更换或微调嵌入模型。
模型调用响应慢或超时1. 检查模型供应商的 API 状态和速率限制。
2. 如果是本地模型,检查模型服务(如 Ollama)的负载和日志。
3. 在 Dify 中调整模型调用的超时时间。
应用发布API 调用返回 404 或认证错误1. 确认应用已发布。
2. 检查调用时使用的 API Key 是否正确(应用密钥或用户会话)。
3. 确认 API 地址端口是否正确。

5.3 持续学习与实践建议

Dify 是一个快速迭代的项目,其功能和生态都在不断丰富。要真正掌握它,建议遵循以下路径:

  1. 基础掌握:完成本文的部署和第一个工作流构建,理解节点、变量、连接的概念。
  2. 深度探索:尝试 Dify 的所有内置节点类型,特别是“条件判断”、“循环”、“变量赋值”等,构建更动态的工作流。
  3. 集成实践:尝试将 Dify 与你的实际业务系统集成,例如通过“代码节点”调用内部 API,或通过“Webhook”节点接收外部事件触发工作流。
  4. 关注社区:GitHub Issues、Discord 或官方论坛是解决问题的宝贵资源。许多特定场景的配置(如连接 SQL Server 本地实例)都有社区讨论和解决方案。
  5. 源码研究:对于高级开发者,阅读 Dify 的源码(特别是apiworker部分)能让你更深刻地理解其运行机制,便于进行二次开发或深度定制。

从部署到第一个工作流,再到处理生产环境的问题,每一步都需要耐心和实践。Dify 降低了 LLM 应用开发的门槛,但构建一个稳定、高效、安全的 AI 应用,仍然需要对底层组件、业务逻辑和运维细节有扎实的理解。

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

AI工程化实战:从模型部署到Agent工作流的效率革命

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

作者头像 李华
网站建设 2026/9/3 17:18:10

【原创】基于AI大模型+SpringBoot+Vue的电子产品商城(设计与实现)

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

作者头像 李华
网站建设 2026/9/3 17:13:27

圆锥曲线解题:齐次化与倒角公式的核心应用

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

作者头像 李华
网站建设 2026/9/3 17:12:13

别让不靠谱的降重服务毁了你的毕业论文:识别风险与自主修改指南

别让不靠谱的降重服务毁了你的毕业论文 在写毕业论文的过程中,很多同学可能会尝试使用论文降重或文本改写服务来避免查重带来的麻烦。然而,这些服务的质量良莠不齐,识别其中的不可靠服务显得尤为重要。以下是我结合个人经验整理的一些观察与…

作者头像 李华
网站建设 2026/9/3 17:00:19

FPGA车牌识别实战:从传感器到串口输出的完整硬件流水线

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

作者头像 李华