MCPFlow:为AI代理构建结构化工作流编排与安全执行框架

news2026/5/4 8:36:08
1. 项目概述MCPFlow为AI代理构建结构化工作流如果你正在开发基于Model Context ProtocolMCP的工具并且希望让像Cursor或GitHub Copilot这样的AI代理能够以更可控、更安全的方式使用你的工具那么你很可能遇到过这样的困境代理直接执行操作缺乏一个“计划-批准-执行-跟进”的清晰流程。用户可能还没反应过来文件就已经被修改了或者操作因为一个简单的输入错误而卡住代理却不知道下一步该做什么。MCPFlow这个轻量级的.NET库就是为了解决这个问题而生的。简单来说MCPFlow定义了一种结构化的JSON响应格式。当你的MCP工具被调用时它不再只是返回一个简单的成功消息或错误代码而是返回一个完整的“编排计划”。这个计划清晰地告诉代理“我打算做这几件事可能会影响这些文件你批准吗” 如果遇到问题比如找不到某个资源它还能提供恢复路径比如“这里出错了你可以从这几个选项里选一个来修复”。这相当于在你的工具和AI代理之间建立了一套标准化的、可预测的对话协议。我最初接触这个想法是在尝试将一些复杂的脚手架和代码生成任务集成到Cursor中。直接让代理调用工具感觉就像把方向盘交给了它心里总是不踏实。MCPFlow提供的这套模式让我找回了那种“合作编程”的感觉——AI提出计划我审核批准它再执行最后我们还能讨论下一步。这不仅提升了安全性也让整个自动化流程变得更有条理、更易于调试。2. MCPFlow的核心设计理念与架构解析2.1 从“直接执行”到“编排计划”的范式转变在没有MCPFlow之前一个典型的MCP工具交互流程往往是线性的代理调用工具工具执行操作返回结果或错误。这种模式存在几个明显的短板。首先缺乏可见性用户或代理在操作执行前很难全面了解即将发生什么特别是可能产生的副作用如文件修改。其次错误处理僵化工具通常只能返回“成功”或“失败”对于可恢复的错误如缺少参数、资源不存在缺乏引导代理或用户进行修复的标准方式。最后流程断裂一个多步骤的任务如“创建页面-添加组件-连接API”往往需要多次独立的工具调用中间缺乏连贯的上下文和自然的跟进点。MCPFlow引入的“编排计划”范式正是为了弥补这些短板。它的核心思想是将工具的执行拆解为三个明确的阶段计划呈现与批准工具首先返回一个计划instruction描述意图并声明安全影响safety。这给了用户或代理一个明确的“刹车点”。有序执行与错误恢复计划中包含一个有序的下一步动作列表next_actions。执行过程中如果遇到可预见的错误如“未找到”计划可以包含恢复动作recovery_actions和收集缺失信息的表单ask引导流程回到正轨。执行后跟进所有动作成功完成后一个跟进问题follow_up可以自然地引导至下一个相关任务形成流畅的工作流。这种设计使得MCP工具从一个简单的“命令执行器”升级为一个“工作流协调器”。它赋予了工具表达复杂意图、处理异常分支和引导对话的能力。2.2 核心数据结构深度剖析MCPFlow定义了一个名为OrchestratedPlan的核心数据结构它通过JSON进行序列化。理解每个字段的用途和设计考量是有效使用它的关键。我们可以将其字段分为几个功能组身份与状态标识字段kind: 固定为orchestrated_plan。这是一个类型标识符让消费方如Cursor规则能快速识别出这是一个MCPFlow计划而不是普通的文本或错误信息。version: 模式版本号如1。这是一个前瞻性的设计为未来可能的结构变更提供了兼容性保障。如果你的工具升级了MCPFlow库并使用了新字段可以通过提升版本号来告知消费方需要新的解析逻辑。status: 这是计划当前的状态枚举是整个数据结构的“总开关”。它决定了消费方应该如何解读其余字段。ok表示一切就绪等待批准执行error表示遇到了可恢复的错误如资源未找到invalid表示输入数据有问题blocked表示因外部依赖或权限问题无法继续partial表示部分操作已成功部分失败。流程控制字段instruction: 这是展示给用户的、对计划目标的人类可读摘要。它应该简洁、清晰例如“为用户管理模块搭建CRUD界面及相关API模型”。这是用户做出“批准”决策的主要依据。next_actions: 一个有序的对象数组定义了在获得批准后要执行的具体步骤。每个动作指定要调用的MCP工具tool及其参数args。label和confirm字段提供了额外的UI和控制粒度。follow_up: 在所有next_actions成功完成后向用户提出的自然语言问题。例如“需要我为新创建的API模型生成Swagger文档吗”。这个字段是创造流畅、连贯的多步骤体验的关键它能将离散的工具调用串联成一个有意义的对话。错误处理与恢复字段errors: 当status为error,invalid,blocked时这里包含一个错误对象数组提供机器和人类可读的诊断信息。code,field,message,hint和关键的recoverable标志共同构成了丰富的错误上下文。missing: 当输入验证失败时列出缺失的必填字段名。这为自动生成补救性的用户输入表单提供了直接依据。ask: 定义一个用于收集缺失或修正信息的“微型表单”。包含提示语prompt和字段定义fields字段类型可以是字符串、选择列表等。这是实现交互式错误修复的核心。recovery_actions: 提供一组安全的、可选的工具调用用于尝试自动修复或提供更多上下文。例如当组件ID未找到时可以提供一个“列出所有可用组件”的恢复动作。安全与元数据字段safety: 包含writes_code和touches_files字段。这是在执行前向用户披露风险的重要机制。明确的文件路径模式如src/modules/**能让用户非常直观地了解影响范围。affected_paths: 与safety.touches_files的预测性不同这是在执行后填充的实际被影响的具体文件路径列表用于事后审计和日志。correlation_id: 一个可选的追踪ID用于将工具调用、聊天步骤和系统日志关联起来在调试分布式、多步骤的AI工作流时极其有用。这种结构化的设计使得计划本身成为了一个富含语义的数据契约而不仅仅是文本。消费方AI代理或规则引擎可以程序化地解析它并据此驱动复杂的交互逻辑。3. 使用Builder模式构建计划的实操指南MCPFlow库提供了强类型的FlowBuilder来创建OrchestratedPlan对象。使用Builder模式而非手动构造JSON能带来编译时类型检查、智能提示和防止字段拼写错误等巨大好处。下面我们深入看看如何构建各种状态的计划。3.1 构建一个标准的成功计划这是最常见的场景工具验证输入无误并制定出一个可执行的计划。using MCPFlow; var plan FlowBuilder.Orchestrated(PlanStatus.Ok) // 1. 声明计划状态为“就绪” .WithInstruction(为用户管理模块搭建CRUD界面及相关API模型。) // 2. 设置清晰的任务描述 .WithFollowUp(需要为这些新模型生成数据库迁移脚本吗) // 3. 预设下一步的引导问题 .WithSafety(writesCode: true, touchesFiles: new[] { src/features/user/**, src/api/models/** }) // 4. 声明安全影响 .AddNextAction(scaffold_feature, new { // 5. 添加第一个步骤搭建功能模块 featureName UserManagement, entities new[] { User, Role, Permission } }) .AddNextAction(generate_api_models, new { // 6. 添加第二个步骤生成API模型 feature UserManagement, format TypeScript }, label: 生成TypeScript接口定义) // 可选为步骤添加友好标签 .Build(); // 7. 构建最终计划对象 // 在MCP工具的Handler中返回 return FlowResult.Payload(plan);实操要点指令Instruction要具体避免模糊的“做一些事情”。好的指令应包含动作搭建、目标CRUD界面、API模型和范围用户管理模块。安全声明要准确touches_files使用Glob模式如**表示任意子目录来合理预估影响范围。过于宽泛如src/**会引发不必要的警惕过于狭窄则可能漏报。下一步动作要原子化每个next_action应代表一个逻辑上独立、可成功执行的小步骤。避免在一个动作中做太多事情这样有利于错误隔离和状态恢复。3.2 构建可恢复的错误计划当工具执行遇到预期内的障碍时如资源不存在返回一个错误状态计划并引导用户修复。// 假设在创建屏幕时传入的 themeId 在系统中不存在 var errorPlan FlowBuilder.Orchestrated(PlanStatus.Error) // 状态设为 Error .WithInstruction($无法继续未找到ID为 {request.ThemeId} 的主题配置。) .NotFound(themeId, request.ThemeId, 请从现有主题中选择或创建一个新的。) // 便捷方法添加错误详情 .AddMissing(themeId) // 标记该字段缺失需要用户提供 .WithAsk(请选择一个有效的主题或创建新主题, // 定义询问表单 new[] { new AskField { Name themeId, Type AskFieldType.Select, // 使用下拉选择提供选项 Required true, Options new[] { light, dark, high-contrast } // 从数据库或配置中动态获取更好 }, new AskField { Name createIfMissing, Type AskFieldType.Boolean, Required false, Label 如果不存在是否创建 // 友好的字段标签 } }) .AddRecoveryAction(list_available_themes, new { }) // 恢复动作列出所有主题 .AddRecoveryAction(create_theme, new { name CustomTheme }, label: 创建自定义主题安全, confirm: true) // 带确认的恢复动作 .WithFollowUp(选定主题后继续搭建UI组件) .Build(); return FlowResult.Payload(errorPlan);设计逻辑解析状态驱动流程消费方看到status: error就知道这不是一个可立即执行的计划而是一个需要先解决问题的中间状态。错误信息结构化NotFound辅助方法生成的错误条目包含了错误码、字段、具体信息和给用户的提示hint。recoverable: true是关键它告诉代理这个错误可以通过用户交互来修复。引导式修复ask字段定义了一个清晰的表单。Select类型的字段比纯文本输入更友好能减少用户输入错误。提供recovery_actions作为快捷方式用户可以直接选择“列出所有主题”来获取信息而无需手动输入。保持流程上下文即使出错了follow_up仍然预设了问题让用户在解决当前问题后能无缝回到主流程。这保持了工作流的连贯性。3.3 处理输入无效与流程阻塞除了“未找到”这类业务错误还有两种常见状态输入无效Invalid当用户提供的参数不符合工具要求的模式时使用。例如要求数字却传了字符串或缺少必填字段。var invalidPlan FlowBuilder.Orchestrated(PlanStatus.Invalid) .WithInstruction(输入数据验证失败。) .AddError(new ErrorInfo { Code REQUIRED, Field userEmail, Message 缺少必填字段 userEmail。 }) .AddError(new ErrorInfo { Code FORMAT, Field userEmail, Message userEmail 字段必须是有效的电子邮件格式。 }) .AddMissing(userEmail) .WithAsk(请提供有效的用户邮箱地址, new[] { new AskField { Name userEmail, Type AskFieldType.String, Required true } }) .Build();流程阻塞Blocked当遇到无法通过用户输入解决的外部障碍时使用如网络故障、磁盘只读、依赖服务不可用。var blockedPlan FlowBuilder.Orchestrated(PlanStatus.Blocked) .WithInstruction(操作被阻止目标目录没有写入权限。) .AddError(new ErrorInfo { Code PERMISSION_DENIED, Message 对路径 /var/www/project 的访问被拒绝。, Recoverable false }) .AddRecoveryAction(select_output_directory, new { }, label: 选择其他输出目录) .WithFollowUp(权限问题解决后重试生成操作) .Build();关键区别invalid状态通常意味着“请修正你的输入”而blocked状态意味着“存在外部障碍需要你手动干预如修改权限或选择替代方案”。recoverable标志在blocked状态下通常为false因为工具自身无法解决该问题。3.4 序列化与返回构建好OrchestratedPlan对象后需要使用FlowResult.Payload(plan)来将其包装并序列化。这个包装器会确保输出是符合MCPFlow模式的结构化JSON并且会自动忽略所有为null的字段保持响应的简洁。// 这是推荐方式直接返回给MCP服务器框架如 MCPSharp return FlowResult.Payload(myPlan); // 如果你需要获取JSON字符串例如用于日志记录或测试 string jsonString FlowResult.Json(myPlan, indented: true); Console.WriteLine(jsonString);关于枚举序列化为了在JSON中得到可读的字符串如ok而非数字0你需要在你的序列化配置中添加JsonStringEnumConverter。在System.Text.Json中可以这样配置// 在Program.cs或启动配置中 services.AddControllers().AddJsonOptions(options { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)); });4. 与AI代理集成以Cursor和Copilot为例MCPFlow计划本身是数据需要消费方AI代理来解读和执行。下面我们看看如何让主流的AI编码助手理解并遵循这个流程。4.1 在Cursor中实现自动化工作流Cursor通过其强大的规则Rules系统可以完美地解析和执行MCPFlow计划。你只需要添加一个简单的规则文件。第一步创建Cursor规则在项目根目录的.cursor/rules文件夹下创建一个文件例如mcpflow_plan_executor.md。--- type: Always description: MCPFlow计划执行器解析计划 - 请求批准 - 按序执行 - 跟进提问 alwaysApply: true --- 当检测到上一个工具调用的结果中包含 kind: orchestrated_plan 时 1. **呈现计划** * 从 instruction 字段提取1-3行摘要作为计划描述显示给用户。 * 如果存在 safety 字段明确告知用户 * writes_code: 此操作将**写入或修改代码**。 * touches_files: 可能影响的文件/路径模式{{ safety.touches_files | join(, ) }}。 * 最后清晰地向用户提问**是否继续执行此计划** 2. **处理用户响应** * 如果用户回答 **是**、**同意**、**执行**、**继续** 等肯定性词语 * 按顺序遍历 next_actions 列表中的每一项。 * 对于每一项先向用户简要说明即将执行的动作使用 label 或 tool 名称然后调用对应的MCP工具并传入 args 参数。 * 如果某个动作的 confirm 字段为 true则在调用该工具前额外询问用户一次“确定要执行 [label] 吗”。 * 所有动作执行成功后如果存在 follow_up 字段则将该问题直接抛给用户。 * 如果用户回答 **否**、**取消**、**停止** 等否定性词语 * 询问用户“您希望修改计划的哪个部分” 或 “请提供新的指令。” * 根据用户的反馈重新调用相关的规划工具或让用户直接修改输入。 3. **处理错误状态** * 如果计划的 status 是 error 或 invalid * 向用户展示 errors 数组中的每一条错误信息message 和 hint。 * 如果存在 ask 字段则根据其中定义的 fields引导用户逐一提供缺失或修正的信息。 * 用户提供信息后使用这些新信息重新调用最初触发该计划的工具。 * 如果 status 是 blocked * 展示阻塞原因并提示用户执行 recovery_actions 中建议的手动步骤或直接调用其中提供的工具。第二步体验工作流现在当你的MCP工具返回一个MCPFlow计划时Cursor会自动触发上述规则。你会看到类似这样的对话你“为订单模块创建一个详情页。”你的MCP工具返回一个status: ok的OrchestratedPlanCursor“计划为订单模块搭建详情页面包含订单信息、商品列表和状态跟踪组件。影响文件src/features/order/**。是否继续”你“继续。”Cursor“正在执行步骤1/2创建订单详情页... [调用工具] 完成。正在执行步骤2/2生成状态跟踪组件... [调用工具] 完成。所有步骤执行完毕。需要为这个新页面添加单元测试吗”这是follow_up进阶使用状态机文件进行更精细的控制对于极其复杂、多轮交互的工作流可以结合一个“状态机”Markdown文件如workflow_state.md来实现有状态的流程控制。Cursor规则可以读取和更新这个文件根据## State字段决定当前该做什么。这适合需要严格顺序、且步骤间有强依赖关系的场景。不过对于大多数用例上述的即时规则已经足够强大和灵活。4.2 在GitHub Copilot Chat或其他通用代理中集成GitHub Copilot Chat没有Cursor那样的内置规则引擎但你可以通过精心设计系统提示词System Instructions来指导其行为。核心思路是教代理识别MCPFlow的JSON结构并按照固定的流程与之交互。第一步暴露一个HTTP端点或CLI你的MCP工具可能需要通过一个Web服务来暴露。这个服务接收请求调用背后的工具逻辑并返回MCPFlow格式的JSON。// ASP.NET Core Minimal API 示例 app.MapPost(/api/mcp/plan-feature, async (FeatureRequest request) { // 1. 这里是你的业务逻辑验证请求制定计划... var validationResult ValidateRequest(request); if (!validationResult.IsValid) { // 返回一个 invalid 状态的计划 var invalidPlan FlowBuilder.Orchestrated(PlanStatus.Invalid) .WithInstruction(输入验证失败。) .WithErrors(validationResult.Errors.Select(e new ErrorInfo{...}).ToList()) .Build(); return Results.Json(FlowResult.Payload(invalidPlan).Content); } // 2. 制定成功计划 var plan FlowBuilder.Orchestrated(PlanStatus.Ok) .WithInstruction($为功能 {request.Name} 生成脚手架。) .WithSafety(true, new[]{$src/features/{request.Name}/**}) .AddNextAction(scaffold, new { feature request.Name }) .Build(); // 3. 返回MCPFlow JSON return Results.Json(FlowResult.Payload(plan).Content); });第二步编写代理系统指令将以下指令或根据你的需求调整后粘贴到你的Copilot Agent、Claude Desktop自定义指令或其他支持系统提示词的AI代理中。你是一个遵循MCPFlow协议的工作流助手。当你调用返回JSON的API且该JSON包含顶级字段 kind: orchestrated_plan 时请按以下流程操作 1. **解析与呈现** * 读取 status 字段。 * 如果 status 是 ok * 向用户清晰展示 instruction 字段的内容作为计划摘要。 * 如果存在 safety 字段务必告知用户“此操作将修改代码可能影响以下文件/目录[列出 safety.touches_files 中的路径]”。 * 然后询问用户“**是否批准并执行此计划**” * 如果 status 是 error 或 invalid * 告诉用户“计划遇到问题[instruction]”。 * 逐条列出 errors 数组中的 message 和 hint。 * 如果存在 ask 字段则根据 ask.prompt 提示用户并按照 ask.fields 的定义逐个向用户收集所需信息。收集完毕后使用这些新信息重新调用最初的API。 * 如果 status 是 blocked * 告知用户阻塞原因并建议他们手动检查或执行 recovery_actions 中描述的操作。 2. **执行计划** * 仅在用户明确批准回答“是”、“批准”、“执行”等后才执行 next_actions。 * 按顺序处理 next_actions 数组中的每一项 * 向用户简要说明“即将执行[使用 action.label 或 action.tool]”。 * 调用对应的工具/API端点传入 args 中的参数。 * 如果某个动作的 confirm 字段为 true则在调用前再次向用户确认。 3. **跟进** * 所有 next_actions 成功完成后如果存在 follow_up 字段直接将该问题作为下一个对话轮次抛给用户。 始终记住在用户批准前不要执行任何 next_actions 中的步骤。第三步测试交互流程配置好后你的对话可能如下所示你“调用 /api/mcp/plan-feature参数是 nameDashboard。”Copilot Agent调用API收到MCPFlow响应“计划为功能‘Dashboard’生成脚手架。安全提示此操作将修改代码可能影响src/features/Dashboard/**下的文件。是否批准并执行此计划”你“批准。”Copilot Agent“正在执行步骤脚手架功能‘Dashboard’... [调用API] 完成。功能脚手架已创建。是否立即为Dashboard功能配置路由和导航菜单”通过这种方式即使在没有内置工作流引擎的通用AI代理中你也能实现结构化的、安全的工具交互循环。5. 实战经验、避坑指南与高级模式在实际项目中集成MCPFlow几个月后我积累了一些宝贵的经验和踩过的坑这里分享给大家。5.1 工具设计的经验法则工具粒度要适中你的MCP工具应该保持相对较小的功能单元。一个工具最好只做一件事如“创建屏幕”、“添加组件”、“连接API”。这样next_actions列表才能灵活组合成复杂工作流。如果一个工具本身就是一个庞大的、多步骤的“黑盒”那么MCPFlow的计划和批准机制就失去了意义。指令Instruction是用户界面把instruction字段当作写给用户看的“执行摘要”。它应该足够清晰让非技术人员也能理解将要发生什么。避免使用内部技术术语。好的指令是建立信任的第一步。安全声明宁严勿宽对于safety.touches_files如果你不确定精确的路径使用稍宽泛的Glob模式如src/features/order/*.tsx比漏报要好。用户宁愿多一次确认也不愿看到意料之外的文件被修改。为所有可能的失败场景设计计划在工具开发初期就思考各种失败情况输入无效、资源不存在、权限不足、网络超时。为每种情况预先设计好对应的error、invalid或blocked计划并提供有意义的recovery_actions和ask表单。这能极大提升工具的健壮性和用户体验。5.2 常见问题与排查技巧问题1Cursor规则没有触发。检查点首先确认你的规则文件.cursor/rules/mcpflow_plan_executor.md是否放在了正确的位置并且文件后缀是.md。然后检查你的MCP工具返回的JSON最外层是否确实包含kind: orchestrated_plan字段。你可以通过添加日志或直接在Cursor中查看工具调用的原始输出来验证。技巧在规则开头添加一个简单的调试日志是一个好习惯。例如可以在规则中先写一句“检测到MCPFlow计划状态为{{ last_tool_result.status }}”看看它是否被打印出来。问题2follow_up问题在错误发生后仍然被提问。原因这是逻辑设计问题。follow_up字段在计划构建时就被确定了。如果你的工具在遇到错误时也设置了follow_up那么即使用户修复了错误代理也可能会问那个可能已经不合时宜的跟进问题。解决方案在构建错误状态error,invalid,blocked的计划时通常不应该设置follow_up。follow_up应该只用于成功的、线性的流程推进。错误恢复后的下一步应该由用户的新指令或修复后重新生成的计划来决定。问题3next_actions中的步骤有依赖关系但前一个步骤失败了。设计模式MCPFlow本身不处理步骤间的依赖或条件执行。如果一个步骤失败整个计划就停止了。对于有复杂依赖的场景你有两个选择方案A推荐设计更粗粒度的工具。让一个工具完成一组有强依赖的原子操作内部处理错误对外只返回最终成功或包含具体错误信息的失败计划。方案B高级使用partial状态。当第一个步骤成功第二个步骤失败时返回status: partial并在partial_results中详细说明每个步骤的结果。然后在recovery_actions中提供修复第二个步骤的选项。这需要更复杂的消费方代理逻辑来处理部分成功的情况。问题4如何测试MCPFlow的端到端流程使用烟雾测试计划项目README中提供的“Quick Smoke Test Plan”是一个极佳的起点。创建一个最简单的MCP工具让它固定返回那个测试用的JSON计划。然后分别在Cursor和Copilot中测试观察整个“计划-批准-执行-跟进”的循环是否如预期般运行。这是验证你的集成环境是否就绪的最快方法。单元测试你的Builder逻辑为你的工具中构建各种状态计划成功、各种错误的代码编写单元测试。确保生成的JSON结构正确字段齐全没有null值污染除了应该被忽略的字段。5.3 高级模式状态持久化与复杂工作流对于需要跨多个对话轮次、涉及复杂决策树的工作流仅靠单个OrchestratedPlan可能不够。这时可以结合一个外部的“状态存储”。模式Plan as a Stage将每个MCPFlow计划视为工作流中的一个“阶段”。消费方如增强的Cursor规则在执行完一个计划后将当前的工作流状态例如“阶段1完成”、“等待用户选择主题”和累积的结果存储在一个外部文件如workflow_state.json或数据库中。当用户给出后续指令时代理先读取状态再决定调用哪个工具并传入之前累积的上下文。你的MCP工具也需要被设计成可以接收这种“上下文”参数从而生成基于当前状态的新计划。这实际上是将一个长流程分解为多个由MCPFlow计划连接的、可暂停和可恢复的短流程。虽然MCPFlow库本身不提供这种状态管理但它输出的结构化数据尤其是correlation_id和partial_results为构建这样的上层系统提供了坚实的基础。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…