📚 系列文章导航
AI驱动的软件工程(上):人机协同的设计与建模
AI驱动的软件工程(中):文档驱动的编码与执行
AI驱动的软件工程(下):AI辅助的质检与交付


大家好,我是阿威。

在上一篇文章 《人机协同的设计与建模》 中,我们探讨了如何与AI协作,将一个模糊的想法,通过一个结构化的三阶段流程,打磨成一套完整、严谨的设计蓝图。我们得到了《需求规格说明书》、《系统设计说明书》以及每个模块的《详细设计说明书》。

这套设计文档,是我们项目的坚实地基。但一个更严峻、也更令人兴奋的挑战随之而来:我们能把这套蓝图直接交给AI,让它自己来完成所有的编码实现吗?

如果你的经验和我最初一样,那么答案可能是否定的。直接把设计文档丢给一个通用的AI助手,然后说“照着这个去写代码”,结果往往是一场灾难。AI会很快忘记文档的细节,它会用自己“喜欢”的方式组织代码,它会在不同模块间创造出不一致的接口。最终,你得到的会是一个难以维护的、拼接起来的“代码怪兽”。

问题出在哪里?问题在于,我们只给了AI一张“地图”(设计文档),却没有给它一套“导航系统和驾驶手册”(开发流程与规范)。一个人类开发者拿到设计文档后,会运用自己脑中的整个软件工程知识体系——版本控制、代码规范、测试、日志记录——来进行工作。而AI的脑中,没有这些隐性的纪律。

要让AI成为真正的核心开发者,我们就必须为它显式地构建这一整套工程纪律

这就是我在这篇文章中要分享的核心方法论:AIDC(AI-Driven Development and Collaboration)。它的精髓在于,我们不依赖AI那短暂、不可靠的内置记忆,而是通过一系列外部化的文档,为它打造一个持久的“外部大脑”和一套强制执行的“行为准则”。我们不再请求它“写代码”,而是指令它“遵循流程”。

欢迎来到整个体系的“发动机舱”。在这里,我们将见证,设计蓝图是如何被一个遵循严格纪律的AI,一行行地转化为真实可用的代码。

AIDC方法论:为AI打造开发“熔炉”

AIDC的核心,是承认并正视AI的固有局限性,然后用工程化的手段去系统性地解决它们。这个方法论建立在四大原则之上,它们共同构成了一个足以熔炼出高质量代码的“开发熔炉”。

1. 外部化记忆 (Externalized Memory)
AI的记忆是昂贵且善变的。因此,我们将所有关键信息——需求、设计、计划、规范、甚至开发过程中的每一次提交记录——全部持久化为项目内的Markdown文档。这些文档共同构成了AI的“外部长期记忆”。在每一次执行任务前,AI的第一个动作,必须是“阅读”这些记忆。

2. 指令驱动执行 (Instruction-Driven Execution)
我们与AI的交互,不再是开放式的“对话”,而是明确的“指令下达”。通过一份我称之为“标准作业程序(SOP)”的文档,我们将AI的每一步操作都固化为可预测、可重复的指令。这从根本上杜绝了AI在执行任务时的随机性和行为偏差。

3. 自动化守卫 (Automated Guardians)
我绝不会浪费时间去检查AI写的代码有没有遵循PEP8,或者括号是不是对齐了。这些低级但重要的工作,必须交由自动化工具来强制执行。通过在流程中嵌入Linter、格式化器、类型检查器等工具,我们为项目建立了一道“自动化防线”,AI必须自己确保它的产出能通过这道防线。

4. 人机角色明确 (Defined Human-AI Roles)
在编码阶段,我们的角色再次转换。我不再是“架构师”,而是**“项目经理”和“代码审查者”。我负责下达高级别的开发任务(比如“去实现这个模块”),并在关键节点审查代码的业务逻辑。而AI的角色,则是“软件开发者”和“DevOps助理”**,它负责执行SOP中定义的所有具体、繁琐的战术操作。

基于这四大原则,AIDC的开发生命周期被划分为四个清晰的阶段。

关键输入/产出
AIDC 生命周期
新功能/模块
循环或完成
人类需求
设计文档
项目骨架
SOP与规范文档
功能代码与更新日志
阶段二: 奠基与初始化
阶段一: 设计与构思
阶段三: 规范与流程定义
阶段四: 迭代开发循环
1. 上下文同步
2. 制定计划 (TODO)
3. 编码实现
4. 自我检查 (Linter/Test)
5. 版本提交 (Git)
6. 状态归档 (Log/Plan)

阶段一我们已经完成。现在,我们从阶段二开始,看看如何一步步为AI铺设好轨道。

奠基与初始化:AI的第一次DevOps任务

在正式编码前,我需要AI为我创建一个专业、规范的开发环境。这本身就是对AIDC方法论的一次小型演练。

我会给AI下达第一个指令:

“根据我们已经完成的设计,请初始化AgentWeaver项目。你需要:

  1. 创建标准的项目目录结构(例如 agentweaver/, docs/, tests/)。
  2. 将我们之前生成的所有设计文档,归档到 docs/ 目录下。
  3. 初始化Git仓库。
  4. 创建一份专业的 .gitignore 文件、一份包含基础依赖的 requirements.txt 和一份包含项目简介的 README.md。”

AI会像一个DevOps助理一样,使用它的文件操作和终端工具,精确地完成这些任务。这个过程的产出,是一个结构清晰、已纳入版本控制的项目仓库骨架。更重要的是,它让AI从一开始就进入了“被指令、被管理”的工作模式。

规范与流程定义:锻造AI的“SOP”

这是整个方法论最核心、最关键的一步。我们要在这里,和AI一起,创造出未来将要严格“统治”AI自身行为的一系列“法律文件”。这些文件将构成它的“外部大脑”,是后续所有开发活动的基石。

我会指示AI创建以下几份核心治理文档:

  1. 《AI开发者标准工作流程(SOP).md》:这是给AI自己看的“用户手册”,是“指令驱动执行”原则的最终体现。它用最明确的指令语言,规定了AI从接收任务到完成提交的每一个步骤。后文我们会详细拆解这份SOP的内容。
# AI 开发者标准工作流程 (SOP)**版本: 1.0**## 1. 核心指令本文档是指导你在 AgentWeaver 项目中执行开发任务的标准操作流程(SOP)。**你必须严格、完整地遵循以下所有步骤**。在每个新会话开始时,用户会将此文档作为核心指令提供给你。---## 2. 阶段一:上下文同步与理解 (强制执行)在开始任何编码之前,你必须首先完成对项目状态的全面同步。这是强制性步骤,不可跳过或部分执行。-   **指令 1.1:理解高层设计**-   [ ] 读取并完全理解 `docs/需求规格说明书.md`。-   [ ] 读取并完全理解 `docs/概要设计说明书.md`。-   **指令 1.2:理解模块详细设计**-   [ ] 读取并完全理解当前任务分配的模块详细设计文档,例如 `docs/详细设计-X-模块名.md`。-   **指令 1.3:遵循开发规范**-   [ ] 读取并完全理解 `docs/开发编码规范.md` 。你后续的所有代码输出都**必须**严格遵守此规范。-   **指令 1.4:回顾开发历史**-   [ ] 读取并完全理解 `docs/开发日志.md` ,了解项目此前的关键决策和问题。-   **指令 1.5:明确当前进度**-   [ ] 读取并完全理解 `docs/项目开发计划.md` ,找到你将要开发的任务条目,明确其当前状态和依赖关系。---## 3. 阶段二:计划制定与任务执行在完全理解上下文后,开始进行计划和编码。-   **指令 2.1:制定开发计划**-   [ ] 基于以上所有文档,为你当前要开发的模块制定一个详细的、分步骤的执行计划。-   [ ] **必须**使用你的 `todo_write` 工具,将此计划转化为一个代办事项清单。清单的粒度应足够细,例如到**函数级别**或**接口级别**。-   **指令 2.2:执行开发任务**-   [ ] 严格按照你创建的代办事项清单,逐项完成开发。-   [ ] 使用 `edit_file` 工具进行编码。-   [ ] 每完成一个清单项,立即使用 `todo_write` 工具更新其状态为 `completed`。---## 4. 阶段三:代码验证与版本提交在模块核心功能开发完成后,或在每个有意义的节点,执行以下验证和提交流程。-   **指令 3.1:代码质量检查**-   [ ] **必须**使用 `run_terminal_cmd` 工具执行以下命令:1.  格式化代码: `black .`2.  静态检查与修复: `ruff check . --fix`-   [ ] 如果命令执行后报告任何错误,你**必须**修复它们,并重新运行检查,直到所有检查都通过。-   **指令 3.2:提交到版本控制**-   [ ] 使用 `run_terminal_cmd` 工具执行 `git add .`。-   [ ] 执行 `git commit`。**提交信息(commit message)必须严格遵循以下格式**:-   **格式**: `<类型>(<范围>): <主题>`-   **示例**: `feat(api): 实现创建任务的POST端点`-   **类型**: `feat` (新功能), `fix` (bug修复), `docs` (文档), `style` (格式), `refactor` (重构), `test` (测试), `chore` (构建或工具)。-   **主题**: **必须使用中文书写**,简明扼要地描述本次提交的内容。---## 5. 阶段四:项目状态归档与更新每次成功提交后,你**必须**立即更新项目的状态记录,以确保信息的实时同步。-   **指令 4.1:更新开发日志**-   [ ] 使用 `edit_file` 工具打开 `docs/开发日志.md`。-   [ ] **必须**在文件**末尾追加一行**,记录本次开发。**严禁修改历史日志**。格式如下:-   `YYYY-MM-DD HH:MM - <模块名>: <本次开发的简要总结,包括遇到的关键问题和解决方案>`-   **指令 4.2:更新项目开发计划**-   [ ] 使用 `edit_file` 工具打开 `docs/项目开发计划.md`。-   [ ] 找到与本次开发相关的任务条目(可以是模块、功能或接口)。-   [ ] 将其状态从“待开发”更新为“**完成**”。-   [ ] 如果开发中遇到问题导致阻塞,则更新为“**搁置**”或“**错误**”,并**必须**在同一行附上简要原因。---
**流程结束。此工作流是确保你高效、可靠地参与本项目的核心。请在每次会话中严格遵循。** 
  1. 《项目开发计划.md》:这是一个高阶的路线图。我会让AI基于《系统设计说明书》中的模块列表,生成这份计划。它通常是一个Markdown表格,包含模块名、负责人(默认是AI)、状态(如:待开发、进行中、完成)、依赖关系和预计完成日期。这份文档是“外部化记忆”的一部分,用于宏观地追踪项目进度。
    在这里插入图片描述

该项目计划文档完全由AI自主生成并在开发完成某个模块时遵循《AI开发者标准工作流程(SOP).md》规则自主更新,无需人类干预

  1. 《开发日志.md》:这是一份严格按时间顺序、只增不改的日志文件。我要求AI在每一次代码提交后,都必须在这里追加一行记录,注明时间、开发的模块,以及对本次工作的简要总结。这份日志提供了宝贵的、可追溯的开发历史。
    在这里插入图片描述

开发日志文档也完全由AI遵循《AI开发者标准工作流程(SOP).md》自主生成、更新

  1. 《开发编码规范.md》:这份文档定义了代码风格、命名约定、注释标准等。我会提供一些初步的规则,然后让AI将其扩充和完善,并保存成正式文档。在后续的开发中,AI必须严格遵守这份它自己参与制定的规范。
    在这里插入图片描述

该规范文档由人类指导AI完成,在AI进行编码时会依据《AI开发者标准工作流程(SOP).md》定义的流程规则完全遵守该开发编码规范

当这四份文档创建完成后,我们就拥有了一套完整的项目治理体系。AI不再是一个自由的“艺术家”,而是一个有法可依、有章可循的“工程师”。

迭代开发循环:SOP驱动下的AI一日

现在,万事俱备。我们终于可以进入激动人心的编码阶段了。让我们以开发“AIFactory”模块为例,完整地走一遍AI在SOP驱动下的标准工作流程。

我的任务下达过程非常简单,我只需要对AI说:

“任务:实现‘AIFactory’模块。请严格遵循《AI开发者标准工作流程(SOP)》进行操作。”

接下来,所有事情都将由AI根据SOP自动完成。


步骤一:上下文同步(强制)

这是SOP中的第一条,也是最重要的一条指令。AI必须首先阅读所有相关的“记忆”文档,以构建完整的上下文。它会依次执行:

  • 读取 docs/需求规格说明书.md
  • 读取 docs/系统设计说明书.md
  • 读取 docs/详细设计-AIFactory模块.md (本次任务的核心依据)
  • 读取 docs/开发编码规范.md
  • 读取 docs/开发日志.md (了解历史)
  • 读取 docs/项目开发计划.md (明确当前任务的位置)

这个看似冗余的步骤,恰恰是解决AI“失忆症”的唯一有效方法。它确保了AI在开始工作时,脑子里装的是项目的全局视图,而不仅仅是我刚刚下达的一句简单指令。


步骤二:制定计划(TODO List)

在完全理解了上下文之后,SOP指令AI进行任务分解。
AI会基于详细设计-AIFactory模块.md中的内容,使用它的todo_write工具,为自己生成一份细粒度的、精确到函数级别的执行计划。

这份TODO清单可能会是这样:

  • [ ]agentweaver/core/ 目录下创建 ai_factory.py 文件。
  • [ ]ai_factory.py 中定义抽象基类 BaseLLM
  • [ ] 实现 OpenAIModel 类,继承自 BaseLLM
  • [ ] 实现 LocalHFModel 类,继承自 BaseLLM
  • [ ] 实现核心类 AIFactory
  • [ ]AIFactory 中实现 register_model 方法。
  • [ ]AIFactory 中实现核心方法 get_model,包含缓存逻辑。
  • [ ] 为模块添加必要的异常类,如 ModelNotFoundError

这份清单不仅让任务的执行过程变得透明、可控,也再次强化了AI的短期记忆,让它对即将开始的工作有了清晰的步骤规划。


步骤三:执行编码

AI会严格按照它自己创建的清单,逐项进行编码。它会使用edit_file工具,一次只专注于一个最小化的任务,比如创建文件、实现一个类或一个方法。

每当它完成一项,比如实现了BaseLLM类,它就会再次调用todo_write工具,将对应项的状态更新为completed

  • [x]agentweaver/core/ 目录下创建 ai_factory.py 文件。
  • [x]ai_factory.py 中定义抽象基类 BaseLLM
  • [ ] 实现 OpenAIModel 类,继承自 BaseLLM

这个过程会一直持续,直到清单上的所有任务都被勾选完成。


步骤四:自我检查(自动化守卫)

在模块的核心功能编码完成后,SOP中一个强制性的验证流程被触发。
AI必须使用run_terminal_cmd工具,在项目根目录下执行以下命令:

  1. black . (代码格式化)
  2. ruff check . --fix (静态检查与自动修复)

如果这些命令返回任何错误或警告,SOP要求AI必须自行修复这些问题,然后重新运行检查,直到所有检查都干净通过。我,作为人类,完全不需要介入这个过程。自动化工具成为了保证代码基础质量的第一道,也是最有效的一道防线。


步骤五:版本提交

通过所有自动化检查后,代码进入了提交阶段。
SOP要求AI使用run_terminal_cmd工具执行git add .git commit

其中,commit message必须严格遵循我在《开发编码规范.md》中定义的格式
例如:feat(core): 实现AI工厂模块的核心功能

  • 类型(type): feat (新功能), fix (bug修复), docs (文档) 等。
  • 范围(scope): 影响的模块,如core, api
  • 主题(subject): 用中文简明扼要地描述本次提交。

这种规范化的提交信息,使得我们的Git历史清晰、可读,为未来的代码考古和自动化工具集成打下了良好基础。


步骤六:状态归档

一次成功的提交,并不意味着一个开发循环的结束。SOP的最后一步,也是“外部化记忆”原则的最后一道保障,是让AI立即更新项目的状态记录。

AI会使用edit_file工具,执行两个操作:

  1. 更新开发日志: 在docs/开发日志.md文件的末尾追加一行新记录,严禁修改历史。

    2023-10-27 15:30 - AIFactory模块: 完成了核心功能的开发,包括模型注册和基于配置的动态加载。关键是实现了缓存机制以提高性能。

  2. 更新项目开发计划: 在docs/项目开发计划.md中,找到“AIFactory模块”这一行,将其状态从“进行中”更新为“完成”。

至此,一个完整的、闭环的、可追溯的开发循环才算真正结束。从上下文同步到状态归档,每一步都在SOP的严格规定下进行,AI的行为是可预测的,其产出是高质量且符合规范的。

结论:从“创作者”到“流水线工人”

通过AIDC方法论,特别是这套文档驱动的迭代开发循环,我们成功地改变了AI的角色。它不再是一个天马行空、难以捉摸的“创作者”,而更像是一个高效、精准、不知疲倦的“流水线工人”。

我们为它铺设了轨道(项目骨架),教会了它读懂图纸(设计文档),给了它一本操作手册(SOP),并设定了质检标准(自动化工具)。我们把复杂的软件开发过程,分解成了一系列AI可以理解并能精确执行的、标准化的“工序”。

这套体系的威力在于,它是可复制、可扩展的。每当有一个新模块要开发,我们只需要重复这个循环即可。整个项目的开发过程,变成了一系列稳定、高效的“事务”。

当然,代码写完,并不等于项目完工。AI生成的代码,即便通过了所有静态检查,其业务逻辑是否正确?在真实环境中能否顺利运行?当多个模块集成在一起时,是否会出现意想不到的问题?

这就引出了我们这个系列的最后一篇文章要解决的问题:终局质检。在下一篇中,我将分享一套人机协同的质检与交付流程,为我们这个由AI构建的项目,进行最终的质量把关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89136.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89136.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89136.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML应用指南:利用GET请求获取河南省胖东来超市门店位置信息

胖东来作为中国知名的零售企业&#xff0c;自1995年成立以来&#xff0c;始终致力于为消费者提供丰富、新鲜的商品选择与优质的购物体验。经过近30年的稳步发展&#xff0c;目前已在河南省内的许昌、新乡等地共开设13家门店&#xff0c;涵盖大型综合百货商场、中型社区超市及服…

8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核

让服务调用更优雅 在微服务架构中,服务间通信如同血液流动般重要。传统方式中,开发者需要手动拼接URL、处理负载均衡、管理连接池——这些重复性工作不仅效率低下,还容易出错。Spring Cloud OpenFeign 的诞生,正是为了解决这一核心痛点。它通过声明式接口将HTTP请求模板化…

Docker入门指南(超详细)

一、什么是docker 在云计算和微服务架构盛行的今天&#xff0c;Docker 作为容器技术的标杆&#xff0c;彻底改变了应用部署和运行的方式。简单来说&#xff0c;Docker 是一个开源的容器化平台&#xff0c;它通过将应用程序及其依赖环境打包成一个轻量级、可移植的容器&#xff…

学习秒杀系统-实现秒杀功能(商品列表,商品详情,基本秒杀功能实现,订单详情)

文章目录前言数据库设计秒杀商品列表页秒杀商品详情实现简单秒杀订单详情前言 由于慕课课程中是先实现最基本的功能然后对其压测&#xff0c;压测那个地方出问题&#xff0c;然后在对其优化。所以本文记录的也是实现的是简单的秒杀功能没有涉及到高并发的优化。 数据库设计 …

React 的常用钩子函数在Vue中是如何设计体现出来的。

1、定义响应式数据&#xff1a; React 通过 useState 和 useReducer Vue 通过 ref 和 reactiveconst [state, setState] useState(initialState)const [state, dispatch] useReducer(reducer, initialState)2、定义缓存数据&#xff1a; React 通过 memo 和 useMemo useCal…

开源的 H.264/AVC 视频编码器库-x264 的交叉编译 和 程序测试

一、环境准备 安装交叉编译工具链 根据目标ARM架构选择对应工具链&#xff08;如arm-linux-gnueabihf-&#xff09;&#xff1a;# Ubuntu/Debian系统 sudo apt-get install gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf# 验证安装 arm-linux-gnueabihf-gcc --version或者手动…

自由学习记录(69)

RectToPolar() 是 将直角坐标系 (笛卡尔坐标系) 的 uv 坐标&#xff0c;转化为极坐标系&#xff08;θ&#xff0c;r&#xff09; uv - centerUV&#xff1a;将坐标原点平移&#xff0c;使 (0.5, 0.5) 变成原点。 r length(uv)&#xff1a;距离中心点的半径&#xff08;从中…

Spring Boot 敏感信息入库加密全面解决方案

Spring Boot 敏感信息入库加密全面解决方案 在当今数据驱动的时代,保护用户隐私数据已成为系统设计的必备要求。本文将详细介绍 Spring Boot 应用中敏感数据加密存储的完整方案,涵盖从基础实现到生产级落地的全流程。 一、加密方案选型 1.1 常见加密类型对比 加密类型特点…

docker0网卡没有ip一步解决

正常查看ip的时候一直显示没有ip这里先删除docker0网卡ip link delete docker0然后重启服务systemctl restart docker再次查看显示有ip了并且查看配置文件也是正常的cat /etc/docker/daemon.json {"registry-mirrors": ["https://docker.m.daocloud.io",&q…

MYSQL-索引篇

索引结构概述MySQL 的索引是在存储引擎层实现的&#xff0c;不同的存储引擎有不同的索引结构&#xff0c;主要包含以下几种&#xff1a;索引结构描述BTree索引最常见的索引类型&#xff0c;大部分引擎都支持 B 树索引Hash索引底层数据结构是用哈希表实现的&#xff0c;只有精确…

(纯新手教程)HTML零基础教学

&#xff08;下一章&#xff1a;python网络爬虫&#xff09;HTML 简介HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是用于创建网页的标准标记语言。什么是 HTML&#xff1f;HTML 不是编程语言&#xff0c;而是一种标记语言使用标签来描述…

前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)

引言 在我参与智能问答项目中一个智能体回话并不会像豆包一样&#xff0c;每次新建会话都是是从头开始&#xff0c;而项目中你想创建新会话就像chatbox一样&#xff0c;是点击橡皮擦开启新的聊天上下文&#xff0c;但是直接的聊天记录依然存在&#xff0c;针对超过十万&#xf…

Python元组:不可变数据的强大用法

文章目录元组概念1.基本特性2.创建元组3.访问元素4.元组的不可变性5.元组操作6.元组解包7.命名元组8.元组与列表的比较9.元组的优势10.适用场景11.常用方法小结元组 概念 元组是 Python 中一个非常重要的内置数据结构&#xff0c;它与列表(list)相似但具有关键差异。下面我将…

若尔盖湿地的花湖

花湖位于若尔盖县和甘肃的郎木寺之间的213国道旁&#xff0c;属于若尔盖湿地国家级自然保护区内。又名“梅朵湖”&#xff0c;因阳光照射下湖面色彩斑斓如绚丽的花瓣得名。花湖的大门是梯形高大石柱搭成&#xff0c;我们需要过天桥到对面检票坐小交通。通过车窗看到一层一层的云…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleClickHeart(双击爱心)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DoubleClickHeart组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script se…

1-绪论-1-数据结构的基本概念

&#x1f389; 数据结构的魔法世界&#x1f4da;&#x1f468;‍&#x1f393;“数据就像大海中的浪花&#xff0c;结构则是那神秘的洋流。掌握数据结构&#xff0c;就是掌握在信息海洋中自由航行的力量&#xff01;”引言&#xff1a;为什么要学数据结构&#xff1f;&#x1f…

linux网络相关命令简介

目录 一、IP命令 1、Link或L:管理网络接口(网卡) 2、Address或Addr,A:管理Ip地址 3、Route或R:管理路由表

教育培训机构如何为课程视频添加防盗录的强水印?

在知识付费时代&#xff0c;教育培训机构的课程视频是核心资产&#xff0c;但盗录、非法传播等问题却让机构防不胜防。如何在不影响学员观看体验的前提下&#xff0c;为课程视频添加“强效防盗水印”&#xff0c;精准追踪泄露源头&#xff1f;本文将为您揭秘高安全性水印的添加…

python的形成性考核管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 摘要 随着…

A*算法详解

A*算法详解一、A*算法基础概念1.1 算法定位1.2 核心评估函数1.3 关键数据结构二、A*算法的核心步骤三、启发函数设计3.1 网格地图中的启发函数3.2 启发函数的选择原则三、Java代码实现四、启发函数的设计与优化4.1 启发函数的可采纳性4.2 启发函数的效率影响4.3 常见启发函数对…