当前位置: 首页 > article >正文

Spring AI 代理模式(Agent Agentic Patterns)

一、Agentic Patterns 核心思想

根据Anthropic《构建高效代理》研究报告,高效LLM代理的设计应遵循两大核心原则:

  1. 简单性优先:避免过度设计,从最简单的解决方案开始
  2. 可组合性:通过模块化设计实现灵活组合而非复杂框架
业务需求
是否需要代理?
单一LLM调用+上下文优化
任务是否明确?
工作流模式
代理模式
可预测性+一致性
灵活性+自主决策

二、智能体 vs 工作流关键区别

特性工作流(Workflow)智能体(Agent)
控制流预定义代码路径模型动态决策
适用场景定义明确的任务开放复杂任务
优势可预测性、一致性、低成本灵活性、适应性
劣势缺乏灵活性高延迟、高成本

三、Spring AI 五大基础模式实现

1. 单一LLM优化模式

适用场景:简单查询、分类等明确任务

@Service
public class OptimizedLlmService {private final ChatClient chatClient;// 通过Prompt模板优化public String optimizedQuery(String input) {PromptTemplate template = new PromptTemplate("""请根据以下上下文回答问题:上下文: {context}问题: {question}""");Prompt prompt = template.create(Map.of("context", loadRelevantContext(input),"question", input));return chatClient.call(prompt).getResult().getOutput().getContent();}
}

优势

  • 低延迟
  • 成本效益高
  • 实现简单

2. 链式工作流模式

适用场景:需要分步处理的明确任务

输入
拼写检查
情感分析
响应生成
格式化输出
public class ChainedWorkflow {private final List<ProcessingStep> steps;public Response execute(Request request) {Context context = new Context();for (ProcessingStep step : steps) {request = step.execute(request, context);}return finalizeResponse(request, context);}
}

设计要点

  • 每个步骤明确定义输入/输出
  • 支持步骤短路(某步失败可终止)
  • 上下文传递使用不可变对象

3. 路由工作流模式

适用场景:多领域问题处理

public class RouterWorkflow {private final Map<String, Workflow> workflowMap;public Response route(Request request) {String domain = DomainDetector.detect(request);return workflowMap.getOrDefault(domain, defaultWorkflow).execute(request);}
}

性能优化技巧

  • 缓存路由决策结果
  • 并行预处理可能路径
  • 设置超时机制

4. 自主代理模式

适用场景:开放复杂任务

public class AutonomousAgent {private final ToolRepository tools;public Response handle(Task task) {Plan plan = llm.generatePlan(task, tools.listCapabilities());while (!plan.isComplete()) {StepResult result = executeNextStep(plan);plan = llm.updatePlan(plan, result);}return plan.getFinalResult();}
}

关键机制

  • 动态规划生成
  • 执行反馈循环
  • 工具使用验证

5. 混合代理-工作流模式

适用场景:部分明确+部分开放任务

输入
是否明确路径?
预定义工作流
代理动态决策
结果
public class HybridSystem {public Response handle(Request request) {if (WorkflowRegistry.hasWorkflow(request)) {return workflowEngine.execute(request);} else {return agentEngine.handle(request);}}
}

平衡策略

  • 监控工作流/代理使用比例
  • 将常用代理路径转化为工作流
  • 设置回退机制

四、企业级实现建议

  1. 可观测性增强
@Aspect
public class MonitoringAspect {@Around("execution(* com..agent..*(..))")public Object monitor(ProceedingJoinPoint pjp) {long start = System.currentTimeMillis();try {Object result = pjp.proceed();metrics.recordSuccess(pjp.getSignature(), System.currentTimeMillis()-start);return result;} catch (Exception e) {metrics.recordFailure(pjp.getSignature(), e);throw e;}}
}
  1. 弹性模式实现
@Retryable(maxAttempts=3, backoff=@Backoff(delay=1000))
public Response reliableExecution(Request req) {return agent.execute(req);
}
  1. 成本控制策略
public class CostAwareAgent {private final BudgetTracker tracker;public Response execute(Request req) {if (!tracker.checkBudget(req.getUserId())) {throw new BudgetExceededException();}EstimatedCost cost = llm.estimateCost(req);tracker.reserveBudget(req.getUserId(), cost);try {Response res = doExecute(req);tracker.recordActualCost(req.getUserId(), res.getCost());return res;} catch (Exception e) {tracker.releaseBudget(req.getUserId(), cost);throw e;}}
}

五、演进路线图

  1. 成熟度模型
级别特征技术指标
L1单一LLM调用响应时间<1s, 零状态
L2预定义工作流流程可视化, SLA保证
L3条件路由决策日志, 路由准确率>95%
L4自主代理工具使用率, 任务完成率
L5自优化系统闭环学习, 自动异常恢复
  1. 演进策略
  • 从明确场景的工作流开始
  • 逐步引入代理处理异常路径
  • 通过监控识别转化机会(将代理路径固化为工作流)
  • 建立自动化测试保障体系

六、性能对比数据

根据实际项目测量(基于GPT-4级别模型):

模式平均延迟成本系数任务完成率
单一LLM0.8s1.0x65%
链式工作流2.5s1.8x89%
自主代理12s5.0x93%
混合模式4s2.5x91%

注:数据随任务复杂度变化较大,建议实际基准测试

七、最佳实践总结

  1. 从右开始:始终从最简单的可行方案(单一LLM)开始评估
  2. 渐进复杂:仅当明确需求未被满足时才增加复杂性
  3. 监控驱动:基于实际指标而非假设做架构决策
  4. 模式混合:大多数生产系统需要组合多种模式
  5. 成本透明:实现细粒度的成本监控和分配

“构建AI系统就像烹饪 - 最好的结果来自使用恰到好处的配料,而不是把所有东西都扔进锅里。” - Anthropic研究团队

八、Spring AI 代理模式实现

1. 基础代理模式 (Basic Agent Pattern)

介绍

基础代理模式是最简单的AI代理实现,它封装了与AI模型的直接交互,为客户端提供统一的接口。

流程图

客户端
基础代理
AI模型

代码示例

// 定义请求响应DTO
public record AgentRequest(String prompt, Map<String, Object> context) {}
public record AgentResponse(String content, Map<String, Object> metadata) {}// 基础代理接口
public interface AiAgent {AgentResponse execute(AgentRequest request);
}// 实现类 - 使用OpenAI API
@Service
@Primary
public class OpenAiAgent implements AiAgent {private final OpenAiClient openAiClient;@Autowiredpublic OpenAiAgent(OpenAiClient openAiClient) {this.openAiClient = openAiClient;}@Overridepublic AgentResponse execute(AgentRequest request) {String response = openAiClient.generateCompletion(request.prompt());return new AgentResponse(response, Map.of("model", "gpt-4"));}
}// 使用示例
@RestController
@RequestMapping("/api/ai")
public class AiController {@Autowiredprivate AiAgent aiAgent;@PostMapping("/ask")public ResponseEntity<AgentResponse> askQuestion(@RequestBody AgentRequest request) {AgentResponse response = aiAgent.execute(request);return ResponseEntity.ok(response);}
}

优点

  • 简单易实现
  • 与业务逻辑解耦
  • 便于替换底层AI实现

缺点

  • 功能有限
  • 缺乏复杂处理能力

使用场景

  • 简单的问答系统
  • 不需要复杂逻辑的AI交互
  • 快速原型开发

使用心得

基础代理模式是我们项目初期采用的方案,它让我们快速集成了AI能力。但随着业务复杂化,我们发现需要更高级的模式来处理复杂场景。建议在简单场景或项目初期使用此模式。

2. 链式代理模式 (Chained Agent Pattern)

介绍

链式代理将多个单一职责的代理按顺序连接,每个代理处理输入并传递给下一个代理,形成处理流水线。

流程图

输入
代理1
代理2
代理3
输出

代码示例

@Service
public class ChainedAgent implements AiAgent {private final List<AiAgent> agents;@Autowiredpublic ChainedAgent(@Qualifier("spellingCheckerAgent") AiAgent spellingChecker,@Qualifier("sentimentAnalyzerAgent") AiAgent sentimentAnalyzer,@Qualifier("responseGeneratorAgent") AiAgent responseGenerator) {this.agents = List.of(spellingChecker, sentimentAnalyzer, responseGenerator);}@Overridepublic AgentResponse execute(AgentRequest request) {AgentResponse currentResponse = null;AgentRequest currentRequest = request;for (AiAgent agent : agents) {currentResponse = agent.execute(currentRequest);currentRequest = new AgentRequest(currentResponse.content(),mergeContexts(currentRequest.context(), currentResponse.metadata()));}return currentResponse;}private Map<String, Object> mergeContexts(Map<String, Object> original, Map<String, Object> additions) {Map<String, Object> merged = new HashMap<>(original);merged.putAll(additions);return merged;}
}// 使用示例
@Service
public class OrderProcessingService {@Autowiredprivate AiAgent orderProcessingChain;public String processOrder(String customerQuery) {AgentRequest request = new AgentRequest(customerQuery, Map.of("process", "order"));AgentResponse response = orderProcessingChain.execute(request);return response.content();}
}

优点

  • 关注点分离
  • 易于维护和扩展
  • 可重用单个处理单元

缺点

  • 顺序固定不够灵活
  • 错误处理复杂
  • 可能产生性能瓶颈

使用场景

  • 需要多步骤处理的场景
  • 明确处理流程的业务
  • 如订单处理、内容生成等

使用心得

在我们的客服系统中,链式代理处理用户问题非常有效:拼写检查→意图识别→回答生成。但需要注意错误处理和性能监控,我们为每个环节添加了熔断机制。

3. 路由代理模式 (Router Agent Pattern)

介绍

路由代理根据输入内容动态选择最合适的子代理处理请求,类似条件路由。

流程图

类型1
类型2
类型3
输入
路由决策
代理1
代理2
代理3
输出

代码示例

@Service
public class RouterAgent implements AiAgent {private final Map<String, AiAgent> agentMap;@Autowiredpublic RouterAgent(@Qualifier("faqAgent") AiAgent faqAgent,@Qualifier("technicalSupportAgent") AiAgent techSupportAgent,@Qualifier("salesAgent") AiAgent salesAgent) {this.agentMap = Map.of("FAQ", faqAgent,"TECH", techSupportAgent,"SALES", salesAgent);}@Overridepublic AgentResponse execute(AgentRequest request) {String intent = detectIntent(request.prompt());AiAgent selectedAgent = agentMap.getOrDefault(intent, agentMap.get("FAQ"));return selectedAgent.execute(request);}private String detectIntent(String prompt) {// 简化的意图检测逻辑 - 实际项目中可以使用ML模型if (prompt.toLowerCase().contains("how to") || prompt.contains("?")) {return "FAQ";} else if (prompt.toLowerCase().contains("error") || prompt.contains("not working")) {return "TECH";} else if (prompt.toLowerCase().contains("buy") || prompt.contains("price")) {return "SALES";}return "FAQ";}
}// 使用示例
@Service
public class CustomerSupportService {@Autowiredprivate AiAgent routerAgent;public String handleCustomerQuery(String query) {AgentRequest request = new AgentRequest(query, Map.of());return routerAgent.execute(request).content();}
}

优点

  • 灵活高效
  • 专业化处理
  • 易于扩展新路由

缺点

  • 路由逻辑可能复杂
  • 需要维护多个代理
  • 决策错误影响结果

使用场景

  • 多领域问答系统
  • 需要专业处理的场景
  • 如客服系统、多领域咨询

使用心得

路由代理极大提高了我们系统的专业性。我们使用机器学习模型替代了简单的关键词路由,准确率提升了40%。建议定期评估路由准确性。

4. 反思代理模式 (Reflective Agent Pattern)

介绍

反思代理通过自我评估和改进机制来提高输出质量,包含生成-评估-改进的循环。

流程图

需要改进
质量合格
输入
生成响应
评估质量
改进响应
输出

代码示例

@Service
public class ReflectiveAgent implements AiAgent {private final AiAgent primaryAgent;private final AiAgent criticAgent;@Autowiredpublic ReflectiveAgent(@Qualifier("primaryAgent") AiAgent primaryAgent,@Qualifier("criticAgent") AiAgent criticAgent) {this.primaryAgent = primaryAgent;this.criticAgent = criticAgent;}@Overridepublic AgentResponse execute(AgentRequest request) {// 初始响应AgentResponse initialResponse = primaryAgent.execute(request);// 反思和批评AgentRequest critiqueRequest = new AgentRequest("Please critique the following response to the query: " + request.prompt() + "\nResponse: " + initialResponse.content(),request.context());AgentResponse critique = criticAgent.execute(critiqueRequest);// 改进响应if (critique.content().contains("good") || critique.content().contains("adequate")) {return initialResponse;} else {AgentRequest refinementRequest = new AgentRequest("Original query: " + request.prompt() + "\nInitial response: " + initialResponse.content() + "\nCritique: " + critique.content() + "\nPlease provide an improved response",request.context());return primaryAgent.execute(refinementRequest);}}
}// 使用示例
@Service
public class ContentGenerationService {@Autowiredprivate AiAgent reflectiveWriter;public String generateRefinedContent(String topic) {AgentRequest request = new AgentRequest("Write a comprehensive article about: " + topic,Map.of("tone", "professional"));return reflectiveWriter.execute(request).content();}
}

优点

  • 输出质量高
  • 自我改进能力
  • 减少人工干预

缺点

  • 响应延迟高
  • 计算资源消耗大
  • 可能过度修正

使用场景

  • 高质量内容生成
  • 关键业务决策支持
  • 如报告撰写、法律咨询

使用心得

反思代理让我们的内容质量显著提升,但代价是响应时间增加2-3倍。我们最终只在关键业务上使用此模式,并设置了反思深度限制。

5. 规划代理模式 (Planning Agent Pattern)

介绍

规划代理先制定行动计划,再执行计划,适合复杂任务分解。

流程图

任务
制定计划
执行计划
输出结果

代码示例

@Service
public class PlanningAgent implements AiAgent {private final AiAgent planner;private final AiAgent executor;@Autowiredpublic PlanningAgent(@Qualifier("plannerAgent") AiAgent planner,@Qualifier("executorAgent") AiAgent executor) {this.planner = planner;this.executor = executor;}@Overridepublic AgentResponse execute(AgentRequest request) {// 第一步:创建计划AgentRequest planRequest = new AgentRequest("Create a step-by-step plan to: " + request.prompt(),request.context());AgentResponse planResponse = planner.execute(planRequest);// 第二步:执行计划AgentRequest executeRequest = new AgentRequest("Execute the following plan: " + planResponse.content(),mergeContexts(request.context(), planResponse.metadata()));return executor.execute(executeRequest);}private Map<String, Object> mergeContexts(Map<String, Object> original, Map<String, Object> additions) {Map<String, Object> merged = new HashMap<>(original);merged.putAll(additions);return merged;}
}// 使用示例
@Service
public class ProjectManagementService {@Autowiredprivate AiAgent planningAgent;public String handleProjectRequest(String projectDescription) {AgentRequest request = new AgentRequest(projectDescription,Map.of("deadline", "2023-12-31"));AgentResponse response = planningAgent.execute(request);return response.content();}
}

优点

  • 处理复杂任务能力强
  • 可解释性好
  • 结果更可靠

缺点

  • 双重调用成本高
  • 计划可能不切实际
  • 需要良好提示工程

使用场景

  • 复杂问题解决
  • 项目管理
  • 如研发计划、业务流程设计

使用心得

规划代理在我们的项目管理工具中表现出色。我们添加了计划验证步骤,拒绝不切实际的计划,提高了成功率约35%。

6. 多代理协作模式 (Multi-Agent Collaboration)

介绍

多个专业代理并行工作,协调代理整合结果,模拟团队协作。

流程图

任务
协调代理
代理1
代理2
代理3
整合结果
输出

代码示例

@Service
public class CollaborativeAgentGroup implements AiAgent {private final List<AiAgent> specialists;private final AiAgent coordinator;@Autowiredpublic CollaborativeAgentGroup(@Qualifier("researchAgent") AiAgent researchAgent,@Qualifier("writingAgent") AiAgent writingAgent,@Qualifier("editingAgent") AiAgent editingAgent,@Qualifier("coordinatorAgent") AiAgent coordinator) {this.specialists = List.of(researchAgent, writingAgent, editingAgent);this.coordinator = coordinator;}@Overridepublic AgentResponse execute(AgentRequest request) {// 并行执行专家代理List<AgentResponse> specialistResponses = specialists.parallelStream().map(agent -> agent.execute(request)).collect(Collectors.toList());// 协调结果AgentRequest consolidationRequest = new AgentRequest("Consolidate the following responses for the query: " + request.prompt() + "\nResponses: " + specialistResponses.stream().map(AgentResponse::content).collect(Collectors.joining("\n---\n")),request.context());return coordinator.execute(consolidationRequest);}
}// 使用示例
@Service
public class ReportGenerationService {@Autowiredprivate AiAgent reportTeam;public String generateComprehensiveReport(String topic) {AgentRequest request = new AgentRequest("Prepare a comprehensive report on: " + topic,Map.of("format", "APA", "length", "2000 words"));return reportTeam.execute(request).content();}
}

优点

  • 专业化分工
  • 处理复杂任务能力强
  • 结果全面

缺点

  • 资源消耗大
  • 协调成本高
  • 可能产生冲突

使用场景

  • 复杂综合任务
  • 需要多领域知识
  • 如市场分析、综合报告

使用心得

多代理协作模式产出质量令人惊喜,但成本很高。我们优化了代理数量和协调逻辑,在质量和成本间取得了平衡。

7. 自适应代理模式 (Adaptive Agent Pattern)

介绍

自适应代理根据性能指标动态选择最优子代理,实现最佳性能。

流程图

输入
评估指标
选择最优代理
执行
记录性能

代码示例

@Service
public class AdaptiveAgent implements AiAgent {private final List<AiAgent> availableAgents;private final PerformanceTracker performanceTracker;private AiAgent currentAgent;@Autowiredpublic AdaptiveAgent(@Qualifier("fastAgent") AiAgent fastAgent,@Qualifier("accurateAgent") AiAgent accurateAgent,@Qualifier("balancedAgent") AiAgent balancedAgent,PerformanceTracker performanceTracker) {this.availableAgents = List.of(fastAgent, accurateAgent, balancedAgent);this.performanceTracker = performanceTracker;this.currentAgent = balancedAgent; // 默认}@Overridepublic AgentResponse execute(AgentRequest request) {// 根据当前负载和性能选择最佳代理evaluateAndSwitchAgent();long startTime = System.currentTimeMillis();AgentResponse response = currentAgent.execute(request);long duration = System.currentTimeMillis() - startTime;// 跟踪性能performanceTracker.recordPerformance(currentAgent.getClass().getSimpleName(),request.prompt(),duration,response.metadata().get("quality"));return response;}private void evaluateAndSwitchAgent() {Map<String, Double> agentScores = new HashMap<>();// 根据性能指标计算分数for (AiAgent agent : availableAgents) {String agentName = agent.getClass().getSimpleName();PerformanceMetrics metrics = performanceTracker.getMetrics(agentName);double score = calculateScore(metrics.averageResponseTime(),metrics.successRate(),metrics.averageQualityScore());agentScores.put(agentName, score);}// 选择最高分的代理String bestAgent = Collections.max(agentScores.entrySet(), Map.Entry.comparingByValue()).getKey();this.currentAgent = availableAgents.stream().filter(a -> a.getClass().getSimpleName().equals(bestAgent)).findFirst().orElse(currentAgent);}private double calculateScore(double responseTime, double successRate, double quality) {// 简化的评分算法 - 可根据业务需求调整return (0.4 * (1 - normalize(responseTime, 0, 5000))) + (0.3 * successRate) + (0.3 * quality);}private double normalize(double value, double min, double max) {return Math.min(1, Math.max(0, (value - min) / (max - min)));}
}// 使用示例
@Service
public class AdaptiveChatService {@Autowiredprivate AiAgent adaptiveAgent;public String handleUserMessage(String message) {AgentRequest request = new AgentRequest(message, Map.of("user", "current"));return adaptiveAgent.execute(request).content();}
}

优点

  • 自动优化
  • 资源利用率高
  • 适应不同场景

缺点

  • 实现复杂
  • 需要性能监控
  • 切换可能不稳定

使用场景

  • 多变的工作负载
  • 服务质量要求高
  • 如实时系统、高流量服务

使用心得

自适应代理帮助我们应对流量高峰,响应时间降低了30%。关键是要设置合理的评估指标和切换阈值。

8. 状态感知代理模式 (Stateful Agent Pattern)

介绍

状态感知代理维护对话状态,提供上下文相关的连续交互体验。

流程图

新输入
更新状态
丰富上下文
生成响应
更新状态
输出

代码示例

@Service
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class StatefulAgent implements AiAgent {private final AiAgent delegate;private AgentState state;@Autowiredpublic StatefulAgent(@Qualifier("delegateAgent") AiAgent delegate) {this.delegate = delegate;this.state = new AgentState();}@Overridepublic AgentResponse execute(AgentRequest request) {// 更新状态updateState(request);// 丰富请求AgentRequest enrichedRequest = enrichRequest(request);// 执行AgentResponse response = delegate.execute(enrichedRequest);// 更新状态updateState(response);return response;}private void updateState(AgentRequest request) {state.setLastUserInput(request.prompt());state.incrementInteractionCount();// 分析情绪if (request.prompt().contains("!")) {state.setUserMood("excited");}}private void updateState(AgentResponse response) {state.setLastResponse(response.content());}private AgentRequest enrichRequest(AgentRequest original) {Map<String, Object> enrichedContext = new HashMap<>(original.context());enrichedContext.put("state", Map.of("interactionCount", state.getInteractionCount(),"userMood", state.getUserMood(),"lastTopics", state.getLastTopics()));return new AgentRequest(original.prompt(), enrichedContext);}
}// 状态类
public class AgentState {private int interactionCount = 0;private String lastUserInput;private String lastResponse;private String userMood = "neutral";private List<String> lastTopics = new ArrayList<>();// getters and setters
}// 使用示例
@RestController
@RequestMapping("/api/chat")
public class ChatController {@Autowiredprivate StatefulAgent chatAgent;@PostMappingpublic ResponseEntity<String> chat(@RequestBody String message) {AgentRequest request = new AgentRequest(message, Map.of());AgentResponse response = chatAgent.execute(request);return ResponseEntity.ok(response.content());}
}

优点

  • 上下文感知
  • 对话连贯
  • 个性化体验

缺点

  • 状态管理复杂
  • 内存消耗大
  • 可能状态混乱

使用场景

  • 对话系统
  • 个性化服务
  • 如聊天机器人、个人助理

使用心得

状态感知代理极大提升了用户体验评分。我们实现了状态压缩和定期清理机制,解决了内存增长问题。

综合比较表

模式复杂度响应时间适用场景资源需求
基础代理简单任务
链式代理流程化处理
路由代理多领域任务
反思代理高质量输出
规划代理复杂问题
多代理协作很高很慢综合任务很高
自适应代理动态环境中-高
状态感知代理连续交互

实施建议

  1. 从简单开始:先使用基础代理验证想法
  2. 渐进复杂化:根据需要逐步采用更复杂模式
  3. 性能监控:所有代理都应具备可观测性
  4. 混合使用:多种模式组合往往效果最佳
  5. 成本考量:复杂模式可能带来高API成本

总结

这些代码示例展示了如何在Spring框架中实现各种AI代理模式。关键点包括:

  1. 利用Spring的依赖注入管理代理组件
  2. 遵循单一职责原则设计每个代理
  3. 使用接口实现灵活的组合
  4. 为代理添加可观测性和状态管理
  5. 根据业务需求选择合适的模式组合

实际应用中,可以根据具体需求调整和扩展这些模式,例如添加缓存、重试机制或更复杂的决策逻辑。

相关文章:

Spring AI 代理模式(Agent Agentic Patterns)

一、Agentic Patterns 核心思想 根据Anthropic《构建高效代理》研究报告&#xff0c;高效LLM代理的设计应遵循两大核心原则&#xff1a; 简单性优先&#xff1a;避免过度设计&#xff0c;从最简单的解决方案开始可组合性&#xff1a;通过模块化设计实现灵活组合而非复杂框架 …...

搜索引擎2.0(based elasticsearch6.8)设计与实现细节(完整版)

1 简介 1.1 背景 《搜索引擎onesearch 1.0-设计与实现.docx》介绍了1.0特性&#xff0c;搜索schema&#xff0c;agg&#xff0c;表达式搜索映射&#xff0c;本文介绍onesearch 2.0 新特性, 参考第2节 规划特性与发布计划 1.2 关键词 文档 Document elasticsearch 一行数据称为…...

ps中前景色和背景色

在Photoshop&#xff08;简称PS&#xff09;中&#xff0c;前景色和背景色是两个非常重要的概念&#xff0c;它们直接影响着绘图、填充、渐变等操作的最终效果。以下是对前景色和背景色的全面、深入解释&#xff1a; 一、前景色与背景色的定义 前景色&#xff1a;指的是当前绘…...

网页前端开发(基础进阶2--JS)

前面学习了html与css&#xff0c;接下来学习JS&#xff08;JavaScript与Java无关&#xff09;。 web标准&#xff08;网页标准&#xff09;分为3个部分&#xff1a; 1.html主要负责网页的结构&#xff08;页面的元素和内容&#xff09; 2.css主要负责网页的表现&#xff08;…...

Go 即时通讯系统:客户端与服务端 WebSocket 通信交互

客户端和服务端的交互 客户端与服务端建立连接 客户端&#xff1a;客户端通过浏览器或者其他应用程序发起一个 HTTP 请求到服务端的 /socket.io 路径。在请求中会携带用户的 UUID 作为参数&#xff08;通过 c.Query("user") 获取&#xff09;。 // router/socket.…...

2025年5月AI科技领域周报(5.19-5.25):大模型多模态突破 具身智能开启机器人新纪元

2025年5月AI科技领域周报&#xff08;5.19-5.25&#xff09;&#xff1a;大模型多模态突破 具身智能开启机器人新纪元 目录 2025年5月AI科技领域周报&#xff08;5.19-5.25&#xff09;&#xff1a;大模型多模态突破 具身智能开启机器人新纪元一、本周热点回顾1. 百度发布全球首…...

某航后缀混淆逆向与顶像风控分析

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 风控分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…...

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…...

【C/C++】面试基础题目收集

C 软件开发面试中常见的刷题题目通常可分为以下几大类&#xff1a;数据结构与算法、系统编程、面向对象设计、C 语言特性、并发编程等。 &#x1f9e0; 一、数据结构与算法&#xff08;力扣/牛客经典题&#xff09; 掌握 STL 和底层结构实现能力&#xff1a; &#x1f4cc; 数…...

模拟实现线程池(线程数目为定值)和定时器

前言 昨天学习关于定时器的相关知识。今天花时间去模拟实现了一个定时器&#xff0c;同时也去模拟实现了一个线程池(线程数目为定值)。我感觉我收获了很多&#xff0c;对于线程的理解加深了。跟大家分享一下~ 线程池和定时器(这个是主要)的实现 代码 线程池 import java.ut…...

数据结构之队列实验

引言 在计算机科学中&#xff0c;进制转换是基础但重要的操作。例如将一个十进制数转换为二进制或八进制表示时&#xff0c;我们通常使用“短除法”——即不断用目标进制去除当前数&#xff0c;记录余数&#xff0c;直到商为0为止。 这种方法得到的是低位先产生的结果&#x…...

Java求职者面试题详解:计算机网络、操作系统、设计模式与数据结构

Java求职者面试题详解&#xff1a;计算机网络、操作系统、设计模式与数据结构 第一轮&#xff1a;基础概念问题 1. 请解释什么是HTTP协议&#xff1f; HTTP&#xff08;HyperText Transfer Protocol&#xff09;是一种用于传输超文本的协议&#xff0c;它定义了客户端和服务…...

每日八股文6.1

每日八股-6.1 Go1.Sync.map的底层实现2.结构体的tag如何获取&#xff1f;3.Go实现单例模式&#xff08;使用sync.Once&#xff09;4.Go实现单例模式&#xff08;不使用sync.Once&#xff09;5.make和new的区别6.Go项目引用包为什么用_以及包的init()函数7.如何判断一个结构体是…...

【Ubuntu】摸鱼技巧之虚拟机环境复制

前言 提示&#xff1a;所有的操作都需要关闭虚拟机 如何快速在其它电脑布置&#xff0c;linux环境&#xff0c;如果我们有一个环境直接拷贝就有时间摸鱼呀。 1.直接复制简单粗暴 不做赘述&#xff0c;如果不会复制&#xff0c;那么请右击鼠标压缩复制 2.克隆虚拟机 2.1 …...

室内VR全景助力房产营销及装修

在当今的地产行业&#xff0c;VR全景已成为不可或缺的应用工具。从地产直播到楼市VR地图&#xff0c;从效果图到水电家装施工记录&#xff0c;整个地产行业的上下游生态中&#xff0c;云VR全景的身影无处不在。本文将探讨VR全景在房产营销及装修领域的应用&#xff0c;并介绍众…...

jenkins集成gitlab实现自动构建

jenkins集成gitlab实现自动构建 前面我们已经部署了Jenkins和gitlab&#xff0c;本文介绍将二者结合使用 项目源码上传至gitee提供公网访问&#xff1a;https://gitee.com/ye-xiao-tian/my-webapp 1、创建一个群组和项目 2、添加ssh密钥 #生成密钥 [rootgitlab ~]# ssh-keyge…...

【C语言练习】070. 编写代码处理C语言中的异常情况

070. 编写代码处理C语言中的异常情况 070. 编写代码处理C语言中的异常情况C语言异常处理的基本思路返回值检查示例errno使用示例setjmp/longjmp示例最佳实践建议1. 使用返回值检查错误2. 使用全局变量记录错误状态3. 使用回调函数或信号处理程序4. 使用`setjmp`和`longjmp`示例…...

Java基本数据类型、抽象类和接口、枚举、时间类、String类全面介绍

JAVA基本数据类型知识总结 基本数据类型&#xff08;Primitive Types&#xff09; 类型占用字节默认值范围示例byte10-128 ~ 127byte a 100;short20-32,768 ~ 32,767short b 2000;int40-2 ~ 2-1int c 100000;long80L-2⁶ ~ 2⁶-1long d 10000000000L;float40.0f~7位小数f…...

Spring Boot微服务架构(八):开发之初就引入APM工具监控

使用 APM&#xff08;Application Performance Management&#xff09;工具监控 Spring Boot 应用&#xff0c;可以帮助开发者实时追踪性能瓶颈、分析调用链路、监控资源使用情况&#xff0c;并快速定位故障。以下是详细的步骤和常用工具的选择指南&#xff1a; ​​一、常用 A…...

大规模真实场景 WiFi 感知基准数据集

一段话总结 本文提出CSI-Bench,首个大规模真实场景WiFi感知基准数据集,覆盖26个室内环境、35名用户、16种商用设备,包含461小时有效数据,支持跌倒检测、呼吸监测、定位、运动源识别等单任务及用户身份、活动、 proximity联合标注的多任务学习。通过标准化评估协议和基线模…...

Python实现HPSO-TVAC优化算法优化支持向量机SVC分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在当今数据驱动的时代&#xff0c;支持向量机&#xff08;SVM&#xff09;作为一种经典的机器学习算法&#xff0c;…...

ck-editor5的研究 (3):初步使用 CKEditor5 的事件系统和API

前言 在上一篇文章中—— ck-editor5的研究&#xff08;2&#xff09;&#xff1a;对 CKEditor5 进行设计&#xff0c;并封装成一个可用的 vue 组件 &#xff0c;我已经把 CKEditor5 封装成了一个通用vue组件&#xff0c;并且成功在nuxt中运行&#xff0c;并具备一定的通用性&…...

使用ReactNative加载HarmonyOS Svga动画

这是一款使用ReactNative 加载HarmonyOS Svga动画的播放器插件 三端Svga动画统一使用点击这里 版本:v1.1.5 react-native-ohos-svgaplayer [!TIP] Github 地址 安装与使用 npm npm install react-native-ohos-svgaplayer yarn yarn add react-native-ohos-svgaplayer下面…...

WPS快速排版

论文包括&#xff08;按顺序&#xff09;&#xff1a;封面&#xff08;含题目&#xff09;、摘 要、关键词、Abstract&#xff08;英文摘要&#xff09;、Keywords、目录、正文、参考文献、在读期间发表的学术论文及研究成果&#xff0c;致 谢 题目&#xff08;黑小一加粗&…...

Java实现命令行图书管理系统(附完整源码)

一、项目概述 本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员和普通用户两种角色&#xff0c;提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则&#xff0c;代码结构清晰&#xff0c;适合Java初学者学习。 二、系统功能架构 graph T…...

使用Docker-NVIDIA-GPU开发配置:解决 Docker NVIDIA 运行时错误方法

问题描述 运行 Docker 命令时,系统提示 docker: Error response from daemon: unknown or invalid runtime name: nvidia,表明 Docker 无法识别 NVIDIA 运行时。这一错误通常出现在使用 --runtime=nvidia 和 --gpus 参数时,意味着 NVIDIA 容器运行时未正确安装或配置。NVID…...

如何更好的理解云计算和云原生?

本文介绍什么是云计算、什么是云原生、怎么理解云相关概念&#xff0c;如有问题&#xff0c;欢迎指正。 一、云计算 定义&#xff1a;云计算是通过互联网&#xff08;即“云”&#xff09;按需提供计算资源&#xff08;如服务器、存储、数据库、网络、软件等&#xff09;的服…...

【数据结构】顺序表和链表详解(上)

前言&#xff1a;上期我们介绍了算法的复杂度&#xff0c;知道的算法的重要性同时也了解到了评判一个算法的好与坏就去看他的复杂度(主要看时间复杂度)&#xff0c;这一期我们就从顺序表和链表开始讲起。 文章目录 一&#xff0c;顺序表1&#xff0c;线性表2&#xff0c;顺序表…...

唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!

在智能家居的浪潮中&#xff0c;门锁搭载显示屏已成为行业创新的焦点。据行业数据显示&#xff0c;2023年全球智能门锁出货量中&#xff0c;搭载显示屏的型号占比已突破40%&#xff0c;且年复合增长率达25%。而2024年国内智能门锁销量突破2200万套&#xff0c;预计2025年市场规…...

WPF的UI交互基石:数据绑定基础

数据绑定基础 1 Binding的Path属性2 ElementName绑定3 DataContext的作用4 绑定模式&#xff08;Binding Mode&#xff09;5 实用技巧集合1. 默认值处理2. 设计时数据3. 绑定验证4. 多级路径监控 6 常见错误排查 数据绑定是WPF的核心特性之一&#xff0c;它实现了界面&#xff…...