使用 Dify 和 Moonshot API 构建你的 AI 工作流(一):让不 AI 的应用 AI 化

有了之前的文章铺垫,这篇文章开始,我们聊聊如何折腾 AI 工作流,把不 AI 的应用,“AI 起来”。

写在前面

上个月,我们聊过了《使用 Dify 和 AWS Bedrock 玩转 Anthropic Claude 3》,里面介绍了如何使用交互体验较好的 Prompt IDE,来帮助我们方便的调试 AI 应用中的 Prompt,以及快速搭建一个 AI 应用。

半个月前,Dify 团队推出了包含 AI Workflow 新功能的 v0.6.0,这个功能虽然从去年年底就在做了,但是因为功能复杂,代码变更量巨大,直至今天 v0.6.4 正式发布,才算进入一个相对稳定期,所以适合写一篇新的文章来聊聊啦。

感受下 Dify 团队在过去两周的发布动作:

  • v0.6.0 (带有 AI Workflow 功能和一大堆更新,1241 个文件变动)
  • v0.6.0-fix (紧急修正:Agent 应用的添加功能)
  • v0.6.1 (修复了 23 项内容)
  • v0.6.2(支持了新的模型、新的图片 Agent,并且修复了 17 项内容)
  • v0.6.3(增加一堆新功能,比较有意思的是 PgVector,Workflow 支持快捷键操作,Prompt 中引用的变量可以自动改名字,修复了 14 项内容)
  • v0.6.4(支持了代码解释器、月之暗面模型的 FuncCall、SD3,修复了 20 项内容)

小步快跑,干的漂亮。

而获取 API Key 难度很低的 MoonShot,则在最近悄悄上线了 “Tool Use” 功能。在开源社区里,我们一般称这个功能为 Function Call,借助特殊构造的请求结构和提示词,来让模型自动的调用用户预定义的远程函数,实现智能的 RPA 调用。

能够调用“外部工具”的模型功能

我计划将工作流相关的事情拆分为两篇来聊,过程中不太想切换模型,所以就选择了支持 “Function Call” 的它。下篇相关的文章,我们展开聊聊,如何利用这个功能,结合“Workflow”来做一些有趣的自动化。本篇文章是基础篇,我们就先用它的基础功能就好,难度大概是 “有手就行”。

准备工作

我将本文用到的 Dify 和 WordPress 的 Docker “一键启动”配置相关文件开源在了 soulteary/dify-with-wordpress,如果你感兴趣一些使用和配置上不同于官方的小的优化、维护技巧,可以翻阅下文的“维护优化”小节。

我们先从基础实战开始。

Docker 运行环境

想顺滑的完成实践,我推荐你安装 Docker,不论你的设备是否有显卡,都可以根据自己的操作系统喜好,参考这两篇来完成基础环境的配置《基于 Docker 的深度学习环境:Windows 篇》、《基于 Docker 的深度学习环境:入门篇》。当然,使用 Docker 之后,你还可以做很多事情,比如:之前几十篇有关 Docker 的实践,在此就不赘述啦。

快速初始化 WordPress

在之前的两三篇文章《把 WordPress 变成 BaaS 服务:API 调用指南》、《WordPress 告别 MySQL:Docker SQLite WordPress》、《WordPress SQLite Docker 镜像封装细节》中,我介绍过轻量化的、能够在本地快速运行的 WordPress,以及能够提供 API 交互的 WordPress 方案。感兴趣可以自行翻阅,这里就不展开具体细节啦。

为了能够更简单的折腾本文的内容,我封装了一个开箱即用的、轻量化的、能够提供 API 交互的 WordPress Docker 镜像,项目开源在了 soulteary/docker-wp-api,使用方法非常简单:

docker pull soulteary/wp-api:6.5.2-sqlite

使用上面的命令完成 Docker 镜像的下载,然后使用类似下面的配置,可以快速启动这个镜像中的 WordPress:

version: '3'services:wordpress:image: soulteary/wp-api:6.5.2-sqliterestart: alwaysports:- 8080:80volumes:- ./wordpress:/var/www/html

完整的验证环境

当然,为了更简单一些,我将文章相关的代码和配置都开源到了 soulteary/dify-with-wordpress,你可以在项目中获取所有的代码。项目中的配置将 Dify 和它相关的依赖、WordPress 都打包到了一起:

version: '3'
services:# API serviceapi:image: langgenius/dify-api:0.6.4restart: alwaysenv_file:- ./config/api.env- ./config/middleware.envdepends_on:- db- redisvolumes:- ./volumes/app/storage:/app/api/storage# worker serviceworker:image: langgenius/dify-api:0.6.4restart: alwaysenv_file:- ./config/worker.env- ./config/middleware.envdepends_on:- db- redisvolumes:- ./volumes/app/storage:/app/api/storage# Frontend web application.web:image: langgenius/dify-web:0.6.4restart: alwaysenvironment:EDITION: SELF_HOSTEDCONSOLE_API_URL: ''APP_API_URL: ''SENTRY_DSN: ''# The postgres database.db:image: postgres:15-alpinerestart: alwaysenvironment:PGUSER: postgresPOSTGRES_PASSWORD: difyai123456POSTGRES_DB: difyPGDATA: /var/lib/postgresql/data/pgdatavolumes:- ./volumes/db/data:/var/lib/postgresql/datahealthcheck:test: [ "CMD", "pg_isready" ]interval: 1stimeout: 3sretries: 30# The redis cache.redis:image: redis:6-alpinerestart: alwaysvolumes:- ./volumes/redis/data:/datacommand: redis-server --requirepass difyai123456healthcheck:test: [ "CMD", "redis-cli", "ping" ]# The Weaviate vector store.weaviate:image: semitechnologies/weaviate:1.19.0restart: alwaysvolumes:- ./volumes/weaviate:/var/lib/weaviateenvironment:QUERY_DEFAULTS_LIMIT: 25AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false'PERSISTENCE_DATA_PATH: '/var/lib/weaviate'DEFAULT_VECTORIZER_MODULE: 'none'CLUSTER_HOSTNAME: 'node1'AUTHENTICATION_APIKEY_ENABLED: 'true'AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih'AUTHENTICATION_APIKEY_USERS: 'hello@dify.ai'AUTHORIZATION_ADMINLIST_ENABLED: 'true'AUTHORIZATION_ADMINLIST_USERS: 'hello@dify.ai'# The DifySandboxsandbox:image: langgenius/dify-sandbox:latestrestart: alwayscap_add:- SYS_ADMINenvironment:API_KEY: dify-sandboxGIN_MODE: releaseWORKER_TIMEOUT: 15nginx:image: nginx:latestrestart: alwaysvolumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- api- webports:- "8082:80"wordpress:image: soulteary/wp-api:6.5.2-sqliterestart: alwaysports:- 8083:80volumes:- ./wordpress:/var/www/html

当我们获取项目代码后,执行 docker-compose up -d 之后,稍等片刻,我们就可以在浏览器中分别访问:

  • http://localhost:8082 来初始化和访问 Dify
  • http://localhost:8083 来初始化和访问 WordPress

一路 “Next” 快速初始化 Dify

一路 “Next” 快速初始化 WordPress

当两个应用都初始化完毕后,我们就完成了所有的准备工作。

让 WordPress 拥有一个 AI 功能

如果你也经常写文章或者文字材料,那么我相信你或许和我一样,在给写好的内容起合适标题的时候,可能会发愁、挠头。

那么,我们就先来实现一个简单的功能,让 WordPress 能够在我们写好内容的时候,根据内容自动生成一个合适的标题。你可以举一反三,来让其他的“内容生成、优化”也都 AI 化。

初始化 Dify 中的模型配置

点击界面右上角的用户头像,在下拉菜单中点击“设置”,在弹出窗口中选择左侧的“模型供应商”菜单,能够看到 Dify 支持配置使用的所有模型类型。

在 Dify 模型配置中设置模型的 API Token

在列表中往下拉,找到“月之暗面”,然后把我们的模型 API Token 配置到 Dify 中。

设置默认的系统推理模型

配置完毕之后,在这个弹出窗口的顶端选择“系统模型设置”,将“系统推理模型”设置为反应最快、成本最低的 8K 模型。

在 Dify 中配置好的模型

当两个配置都设置完毕后,这个弹出窗中展示的模型在 Dify 中就完全可用啦。

创建一个“AI 文本生成”应用

创建一个文本生成应用

关闭上面的弹出窗口,我们创建一个新的文本生成应用,你可以根据你的喜好来填写应用的标题和描述。

编写我们的提示词内容

根据我们的设想,我们的模型应用应该能够根据我们提供的内容,来自动生成一个合适的标题,为了让模型干活符合预期,我们可以在 Dify 的 IDE 中完成 Prompt 的调试和编写工作。

这里建议使用相对有层次的 Markdown 语法来给模型“立一些规矩”,效果会相对好一些,这里假设模型是“机器之心”的记者,擅长挖掘内容和编写标题:

你是人工智能领域专业平台媒体机器之心的首席记者,擅长根据用户提供的内容,提炼合适的标题。## 生成要求- 标题尽量和 AI 相关
- 标题结果不超过 20 字
- 仅生成一条标题
- 只输出标题内容## 用户提供的内容{{content}}## 输出标题结果

在上面的提示词中,我们设置了一个名为 “content” 的变量,在随后的真实模型调用中,我们可以在 API 的请求参数中动态的调整这个数据内容,来让它解决不同的文章的标题生成任务。

设置模型的具体参数

因为我们希望标题生成的相对合理,和内容比较有相关性,并且标题字数比较少,所以我们可以参考上面的方式来进行模型调用参数设置,来让模型的调用时间更短一些。

选择一篇测试内容

既然我们的 Prompt 提示词都选择的人设都用了“机器之心”,那么验证测试的文章也选择机器之心的报道好啦,比如,这里我选择的是 “Linus 喷 AI 炒作的一篇报道”。

调试模型输出结果

将测试内容粘贴到调试对话框中,点击“运行”,我们就能够验证模型在这个 Prompt 和调用参数下的表现了,你乐意的话,可以打开好几家不同的模型进行调试比较。

这里可以看到,在之前的 Prompt 要求下,虽然没有生成出“机器之心”感觉的标题(模型生成的标题相比有些无聊),但是确实按照要求生成了一条符合字面要求的标题,满足继续往下折腾的要求。如果你有更高的要求,可以耐心调整上面的 Prompt 提示词。

那么,我们开始在 WordPress 中的折腾。

制作 WordPress 标题生成插件

访问 Dify 应用 API

在 Dify 配置的 AI 应用页面中,我们点击“发布”按钮,在下拉菜单中选择“访问 API”,我们就能得到如何通过 API 访问配置好的 AI 应用的文档说明了。

向模型应用发送请求

我们只需要调用 /completion-messages 接口,将刚刚 Prompt 中设置的 content 传入接口即可。

获取当前应用的 API Key

在调用 Dify API 的时候,我们需要进行身份验证,在这个页面的右上角,点击“API 密钥” 按钮,创建一个 API 密钥即可。

// 调用 dify 服务来生成标题
function generate_title_by_content($content)
{$ch = curl_init();curl_setopt($ch,CURLOPT_URL,"http://10.11.12.90:8082/v1/completion-messages");curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer app-YChjQYVOeEgiMR6tsmrXfVZM","Content-Type: application/json",]);$payload = ["inputs" => ["content" => $content,],"response_mode" => "blocking","user" => "soulteary",];curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode($payload, JSON_UNESCAPED_UNICODE));$response = curl_exec($ch);curl_close($ch);$data = json_decode($response, true);if (empty($data["answer"])) {return "AI 生成标题失败";}$title = $data["answer"];$title = str_replace('"', "", $title);return $title;
}

创建好 Dify AI 应用的 API Key 后,我们可以将上面文档中的调用写成一个简单的 PHP 模型调用函数。这个函数接收一个参数(文章内容),并将文章内容传入 Dify 的调用结构体中,当 Dify 调用 Moonshot 模型后,我们解析调用结果,取出返回内容中的 answer 字段,就得到了模型生成的标题内容。

而让 WordPress 能够在我们的文章有内容,没有标题的时候,调用上面的函数,就更简单了(借助 WordPress 定制能力中的 hooks/the_post):

// 当文章发布或更新时,如果标题为空,自动生成一个标题
add_action("the_post", "update_post_title");
function update_post_title($post)
{// 当标题存在,就不再生成if (!empty($post->post_title)) {return;}// 生成标题$post_title = generate_title_by_content($post->post_content);// 更新数据库中标题wp_update_post(["ID" => $post->ID, "post_title" => $post_title]);// 更新当前文章对象$post->post_title = $post_title;
}

完整的插件程序实现,可以在 soulteary/dify-with-wordpress/title-generate.php 找到,你可以将这个文件放置到你启动 WordPress 程序目录的 wordpress/wp-content/plugins/title-generate.php 位置,然后在你的 WordPress 后台的插件管理中启用这个插件。(注意替换 http://10.11.12.90:8082/v1/completion-messages 为你真正部署 Dify 的 IP 地址或域名)

启用 WordPress AI 插件

体验插件能力

这里,我们还是偷懒,暂且用机器之心的一篇文章来作为“标题生成素材”。

找另外一篇机器之心的文章做素材

打开机器之心的文章,复制一部分用于标题生成的文本内容。当然,你也可以自己写一些内容,替换我们直接从网上找的测试验证内容。

在 WordPress 中创建新的内容

接着,打开 WordPress 后台,创建一篇新文章,然后在内容中输入一些内容,我这里偷懒,选择了粘贴刚刚找到的机器之心的文章内容。既然要 AI 来生成标题,标题区域我们留空就好。

点击发布,AI 将迅速的生成标题

当我们点击“发布”按钮后,WordPress 会调用上文中我们配置好的 Dify AI 应用,将我们的文章内容发送给 Dify,构建出一个新的(完整的)提示词,然后向 Moonshot 的模型进行请求,并将模型生成结果填充到标题区域。

当然,因为我们上文中的模型参数设置的相对合理,这个时间应该在 1 秒到 2 秒之间。

因为我们的 Prompt 提示词和模型调用参数是维护在 Dify 中的,所以我们如果想完善模型的生成规则、风格、生成数量,我们只需要更新上文中 Dify IDE 中的 Prompt 提示词内容,而不需要修改程序,这是不是非常方便呢?

优化 Dify 项目配置

Dify 项目的默认配置目前有比较大的优化空间,可以让配置更简单、更易于长期使用的维护管理。

优化 Docker 配置文件

官方很贴心的在项目中提供了一键启动的配置文件,不过如果你认真浏览,你会发现官方尽可能给出了丰富的选项。

  • 你能够调整前端服务、后端 API 服务、实际干活的 Worker、代码执行沙盒环境的一些配置。后端服务和实际干活的 Worker 还是一个镜像,省却了一些下载的功夫。
  • 你能够设置或替换 Postgres 数据库、Redis 缓存、Weaviate(默认使用)和 Qdrant (支持全文索引)向量数据库,甚至还有网关程序 Nginx 的细节。

但是,Dify 相关服务的配置目前其实稍显复杂,API 和 Worker 虽然是同一份镜像,但是在不同的工作模式下,他们的配置是有一些不同的。

所以,我们可以通过 Compose File 的 env file 功能,来对官方的配置文件进行抽象和整理,让骨干配置文件更清晰和简洁,比如我们可以将原本 230 多行的配置简化为下面更简洁漂亮的格式:

version: '3'
services:# API serviceapi:image: langgenius/dify-api:0.6.4restart: alwaysenv_file:- ./config/api.env- ./config/middleware.envdepends_on:- db- redisvolumes:- ./volumes/app/storage:/app/api/storage# Worker serviceworker:image: langgenius/dify-api:0.6.4restart: alwaysenv_file:- ./config/worker.env- ./config/middleware.envdepends_on:- db- redisvolumes:- ./volumes/app/storage:/app/api/storage

根据服务需要的环境变量,我们分别将两个服务需要的环境变量(配置)保存在 config/api.envconfig/worker.env 两个文件中,而两个服务共享的数据库相关配置,我们可以保存在 config/middleware.env 中,做到“共享环境配置”,改一处文件两处服务都受益。

优化 Nginx 配置文件

官方的 Nginx 配置文件应该借鉴了 Nginx Docker 容器中被模块化处理过的配置示例,相关的配置文件一共使用了三个,使用了传统的嵌套配置,并且包含了冗余的反向代理配置,尽管已经努力的抽象了一个名为 proxy.conf 的配置。

我们可以用一个简洁的表达方式来完成相同的诉求,甚至让配置变的更加适合 “扩容”,抽象需要分发流量的 “前端” 和 “后端”,在必要的时候,只需要扩展 “服务数量即可”:

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;keepalive_timeout  65;client_max_body_size 15M;server {listen 80;server_name _;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_http_version 1.1;proxy_set_header Connection "";proxy_buffering off;proxy_read_timeout 3600s;proxy_send_timeout 3600s;location @backend {proxy_pass http://api:5001;}location @frontend {proxy_pass http://web:3000;}location /console/api {try_files $uri $uri/ @backend;}location /api {try_files $uri $uri/ @backend;}location /v1 {try_files $uri $uri/ @backend;}location /files {try_files $uri $uri/ @backend;}location / {try_files $uri $uri/ @frontend;}}
}

关于其他的配置优化、应用配置细节,我们在后面的文章中陆续展开,这里就先聊到这里。

最后

好啦,这篇文章就先聊到这里,后面的文章里,我们继续聊聊如何构建 “AI 工作流”,让你的不 AI 的应用,能够 AI 化。

关于本文中埋的一些未展开的伏笔,其实有很多有趣的玩法,比如可以将 WordPress 变成一个低成本的、简单的 RAG 知识库、带有版本管理的 CMS、搭配模型使用的带版本管理的图床。

我们下篇文章再见。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年04月24日
统计字数: 12884字
阅读时间: 26分钟阅读
本文链接: https://soulteary.com/2024/04/24/use-dify-and-moonshot-api-to-build-your-ai-workflow-make-non-ai-applications-goto-ai.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2980522.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

WPF4 数据模板

数据模板 数据模板常用在3种类型的控件, 下图形式: 1.Grid这种列表表格中修改Cell的数据格式, CellTemplate可以修改单元格的展示数据的方式。 2.针对列表类型的控件, 例如树形控件,下拉列表,列表控件, 可以修改其中的ItemTemplate。 3.修改ContentT…

Linux RTC驱动深入解析

目录标题 实时时钟(RTC)基础Linux内核中的RTC框架RTC设备类设备树(Device Tree) 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上,实时时钟…

图像哈希:全局+局部提取特征

文章信息 作者:梁小平,唐振军期刊:ACM Trans. Multimedia Comput. Commun. Appl(三区)题目:Robust Hashing via Global and Local Invariant Features for Image Copy Detection 目的、实验步骤及结论 目…

STM32的端口引脚的复用功能及重映射功能解析

目录 STM32的端口引脚的复用功能及重映射功能解析 复用功能 复用功能的初始化 重映射功能 重映射功能的初始化 复用功能和重映射的区别 部分重映射与完全重映射 补充 STM32的端口引脚的复用功能及重映射功能解析 复用功能 首先、我们可以这样去理解stm32引脚的复用功能…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

Adobe Photoshop CC 2017无法打开解决方案

Adobe Photoshop CC 2017双击无反应,右键以管理员身份运行也没有反应 解决方案: 事件查看器中查看应用程序的事件 如果找到程序报错事件,网上下载ZXPSignLib-minimal.dll文件替换错误模块路径位置的该文件即可 ZXPSignLib-minimal.dll下载地…

SpringBoot+Vue开发记录(三)

说明:本篇文章的主要内容为需求分析。需求分析这一部分很重要,也稍微有点子难搞,所以本篇文章里的有些内容会有失偏颇。 一、准备步骤 我打算做一个刷题项目,但是具体这个项目该怎么做,我是一头雾水。 所以就要先进行…

pytorch-trainvaltest划分

目录 1. 上一节回顾2. 数据集划分3. 完整代码 1. 上一节回顾 下列图中三种曲线分别代表了欠拟合、好的拟合和过拟合 下图为过拟合曲线,那么如何来检测过拟合呢?将数据集划分为train和val(validation)val是用来测试训练过程是否过…

CSS 04

去掉 li 前面的 项目符号(小圆点) 语法 list-style: none;圆角边框 border-radius 属性用于设置元素的外边框圆角。 语法 border-radius:length;参数值可以为数值或百分比的形式如果是正方形,想要设置为一个圆,把数值修改为高度或者宽度的一半即可&a…

Opencv_11_通道的分离与合并

void ColorInvert::channels_demo(Mat& image) { std::vector<Mat> mv; split(image, mv); imshow("蓝色", mv[0]); imshow("绿色", mv[1]); imshow("红色", mv[2]); Mat dst; mv[0] 0; merge(mv, dst);…

【Camera KMD ISP SubSystem笔记】CRM V4L2驱动模型

1. CRM为主设备 /dev/video0&#xff0c;先创建 v4l2_device 设备&#xff0c;再创建 video_device 设备&#xff0c;最后创建 media_device 设备/dev/media0 v4l2_device的mdev指向media_device&#xff0c;v4l2_device的entity链接到media_device的entities上&#xff08…

WEB服务的配置与使用 Apache HTTPD

服务端&#xff1a;服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功&#xff0c;如果不成功&#xff0c;则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有&#xff1a; Apache HTTP Server 、 Nginx 客户端&a…

【debug记录】有gpu,但是 pytorch仍显示 cpu【原来是新电脑没安装cuda】

原来是新电脑没安装cuda&#xff0c;以为安装了pytorch包就可以了。 检查过程&#xff1a; nvcc 不是内部或外部命令&#xff0c;也不是可运行的程序, 说明没有安装cuda。 查看电脑显卡最高支持cuda版本&#xff1a;nvidia-smi 安装cuda&#xff0c;选择版本&#xff1a;ht…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

系统安全与应用(1)

目录 1、账号安全管理 &#xff08;1&#xff09;禁止程序用户登录 &#xff08;2&#xff09;锁定禁用长期不使用的用户 &#xff08;3&#xff09;删除无用的账号 &#xff08;4&#xff09;禁止账号和密码的修改 2、密码安全管理 设置密码有效期 1&#xff09;针对已…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时&#xff0c;默认有个宽度 207px&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#xff1b; Element Plus 父元素不限制宽度时&#xff0c;默认100%&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#x…

【模电】常见经典运放电路(持续更新)

反相 反相输入比例电路 仿真文件 链接&#xff1a;https://pan.baidu.com/s/1nft1B3mgNpoPfgWo6pFE1g?pwdfpd2 提取码&#xff1a;fpd2 同相 同相输入比例电路 仿真文件 链接&#xff1a;https://pan.baidu.com/s/151OzVgJ2M1iLJ9GCH3xp_A?pwdelec 提取码&#xff1a;…

ROS1快速入门学习笔记 - 04创建工作环境与功能包

一、定义 工作空间(workspace)是一个存放工程开发相关文件的文件夹。 src:代码空间&#xff08;Source Space&#xff09;build: 编辑空间&#xff08;Build Space&#xff09;devel:开发空间&#xff08;Development Space&#xff09;install:安装空间&#xff08;Install …

OpenHarmony实战开发-页面布局检查器ArkUI Inspector使用指导

DevEco Studio内置ArkUI Inspector工具&#xff0c;开发者可以使用ArkUI Inspector&#xff0c;在DevEco Studio上查看应用在真机上的UI显示效果。利用ArkUI Inspector工具&#xff0c;开发者可以快速定位布局问题或其他UI相关问题&#xff0c;同时也可以观察和了解不同组件之间…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言&#xff0c;合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则&#xff0c;并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”&#xff0c;…