微服务架构下AI服务异步集成方案:解耦与性能优化实战
在微服务架构和AI能力集成日益普及的今天很多团队在尝试将独立的AI服务AiService以工具化Tool的方式嵌入现有业务系统时会遇到架构不匹配、依赖复杂、性能不稳定等实际问题。直接硬集成往往导致系统臃肿、调试困难。本文将分享一套经过实战检验的迂回集成方案通过建立适配层、消息队列解耦和异步调度机制在不改造核心业务的前提下实现AiService的平滑工具化集成。无论你是正在做技术预研还是已经踩过集成坑的开发者都能从本文获得可直接落地的架构思路和代码示例。1. AiService与Tool集成的核心挑战与迂回方案概述1.1 什么是AiService的工具化集成AiService通常指独立的AI能力服务如语音识别、图像分析、NLP处理等多以API形式提供。Tool化集成则是将这些AI能力作为业务系统中的一个个工具组件来使用比如在内容审核流程中调用敏感词检测Tool在客服系统中调用情感分析Tool。理想很美好但现实常遇到这些问题AiService的响应时间不稳定几百毫秒到几秒不等业务系统需要同步等待AI服务版本迭代快但业务系统不能频繁跟着升级AI服务可能涉及敏感数据需要特殊的网络隔离和安全管控。直接调用虽然简单却会给主干业务带来延迟波动、单点故障等风险。1.2 迂回方案的设计理念迂回方案的核心思想是间接优于直接异步优于同步。我们不将AiService直接作为业务代码中的工具类调用而是通过一系列架构手段实现解耦适配层转换将AiService的API接口转换为内部标准工具协议消息队列缓冲业务系统发出工具使用请求后立即返回不等待AI结果异步结果回调AI处理完成后通过回调通知业务系统降级容错机制AI服务不可用时提供基础替代方案这样既享受了AI能力带来的智能化提升又避免了强依赖导致的核心业务不稳定。下面我们通过完整实战案例来具体实现这一方案。2. 环境准备与项目结构设计2.1 技术选型与版本说明本方案采用Spring Boot作为基础框架配合RabbitMQ实现消息解耦。以下为关键组件版本请根据实际环境调整JDK 8Spring Boot 2.7.xRabbitMQ 3.9Redis 6.x用于结果缓存Maven 3.62.2 项目模块划分采用多模块Maven项目结构确保职责分离ai-tool-integration/ ├── ai-adapter-service/ # AI服务适配层 ├── tool-core/ # 工具化核心定义 ├── message-queue/ # 消息队列配置 ├── business-app/ # 业务应用使用方 └── callback-service/ # 回调处理服务这种结构允许每个模块独立开发部署特别是ai-adapter-service可以单独升级AI能力而不影响业务系统。3. 核心架构实现从直接调用到迂回集成3.1 定义标准工具接口首先在tool-core模块中定义统一的工具接口这是迂回方案的契约基础// 文件路径tool-core/src/main/java/com/example/tool/core/Tool.java public interface ToolT, R { String getToolName(); ToolType getToolType(); ToolResultR execute(T input); boolean isAvailable(); } // 工具结果统一封装 public class ToolResultR { private boolean success; private R data; private String errorMessage; private long executionTime; // 省略getter/setter } // 工具类型枚举 public enum ToolType { AI_TEXT_ANALYSIS, // 文本分析 AI_IMAGE_PROCESS, // 图像处理 AI_VOICE_RECOGNITION // 语音识别 }3.2 实现AI服务适配层ai-adapter-service模块负责将具体的AiService适配成标准Tool接口。以文本情感分析为例// 文件路径ai-adapter-service/src/main/java/com/example/ai/adapter/TextSentimentTool.java Service public class TextSentimentTool implements ToolString, SentimentResult { Autowired private ExternalAIServiceClient aiClient; Override public String getToolName() { return text-sentiment-analysis; } Override public ToolType getToolType() { return ToolType.AI_TEXT_ANALYSIS; } Override public ToolResultSentimentResult execute(String text) { try { long startTime System.currentTimeMillis(); // 调用外部AI服务 AIServiceResponse response aiClient.analyzeSentiment(text); SentimentResult result convertToStandardResult(response); long costTime System.currentTimeMillis() - startTime; return ToolResult.SentimentResultbuilder() .success(true) .data(result) .executionTime(costTime) .build(); } catch (AIServiceException e) { return ToolResult.SentimentResultbuilder() .success(false) .errorMessage(AI服务调用失败: e.getMessage()) .executionTime(0) .build(); } } private SentimentResult convertToStandardResult(AIServiceResponse response) { // 将AI服务返回格式转换为标准格式 return new SentimentResult( response.getSentimentType(), response.getConfidence(), response.getKeywords() ); } Override public boolean isAvailable() { // 检查AI服务健康状态 return aiClient.healthCheck(); } }3.3 消息队列异步化改造关键的迂回步骤通过消息队列将同步调用改为异步处理。在message-queue模块中配置# 文件路径message-queue/src/main/resources/application.yml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest template: retry: enabled: true initial-interval: 1000ms max-attempts: 3 # 工具请求队列配置 tool: queue: request: tool.request.queue response: tool.response.queue exchange: tool.exchange定义工具请求消息格式// 文件路径message-queue/src/main/java/com/example/message/ToolRequestMessage.java public class ToolRequestMessage { private String messageId; private String toolName; private Object inputData; private String callbackUrl; // 结果回调地址 private long timestamp; private int timeoutSeconds 30; // 省略getter/setter }4. 完整实战案例文本内容审核系统集成情感分析Tool4.1 业务场景说明假设我们有一个内容审核系统需要对用户发布的文本进行自动审核。传统方式是直接调用情感分析API但遇到AI服务抖动时整个审核流程会卡住。现在我们通过迂回方案集成情感分析Tool。4.2 业务系统集成Tool在business-app模块中我们通过消息队列发送工具使用请求// 文件路径business-app/src/main/java/com/example/business/service/ContentReviewService.java Service public class ContentReviewService { Autowired private RabbitTemplate rabbitTemplate; Value(${tool.queue.request}) private String toolRequestQueue; public ReviewResult submitContentReview(Content content) { // 1. 基础审核不同步等待AI BasicReviewResult basicResult basicReview(content); // 2. 异步调用情感分析Tool String callbackUrl buildCallbackUrl(content.getId()); ToolRequestMessage request createSentimentRequest(content.getText(), callbackUrl); rabbitTemplate.convertAndSend(toolRequestQueue, request); // 3. 立即返回中间结果不等待AI处理 return ReviewResult.builder() .contentId(content.getId()) .basicResult(basicResult) .aiProcessingStatus(PENDING) .submitTime(new Date()) .build(); } private ToolRequestMessage createSentimentRequest(String text, String callbackUrl) { ToolRequestMessage request new ToolRequestMessage(); request.setMessageId(UUID.randomUUID().toString()); request.setToolName(text-sentiment-analysis); request.setInputData(text); request.setCallbackUrl(callbackUrl); request.setTimestamp(System.currentTimeMillis()); return request; } }4.3 AI适配层处理请求ai-adapter-service监听工具请求队列实际调用AI服务// 文件路径ai-adapter-service/src/main/java/com/example/ai/listener/ToolRequestListener.java Component public class ToolRequestListener { Autowired private ToolManager toolManager; Autowired private RabbitTemplate rabbitTemplate; Value(${tool.queue.response}) private String toolResponseQueue; RabbitListener(queues ${tool.queue.request}) public void handleToolRequest(ToolRequestMessage request) { try { ToolObject, Object tool toolManager.getTool(request.getToolName()); if (tool null) { sendErrorResponse(request, 工具不存在: request.getToolName()); return; } ToolResultObject result tool.execute(request.getInputData()); // 发送处理结果到响应队列 ToolResponseMessage response buildResponse(request, result); rabbitTemplate.convertAndSend(toolResponseQueue, response); } catch (Exception e) { sendErrorResponse(request, 工具执行异常: e.getMessage()); } } private ToolResponseMessage buildResponse(ToolRequestMessage request, ToolResultObject result) { ToolResponseMessage response new ToolResponseMessage(); response.setOriginalMessageId(request.getMessageId()); response.setToolName(request.getToolName()); response.setSuccess(result.isSuccess()); response.setResultData(result.getData()); response.setErrorMessage(result.getErrorMessage()); response.setProcessTime(new Date()); return response; } }4.4 回调服务处理AI结果callback-service模块专门处理AI处理完成后的回调// 文件路径callback-service/src/main/java/com/example/callback/CallbackService.java Service public class CallbackService { Autowired private ContentReviewResultRepository resultRepository; RabbitListener(queues ${tool.queue.response}) public void handleToolResponse(ToolResponseMessage response) { // 根据业务ID找到对应的审核记录 String contentId extractContentIdFromMessage(response); ContentReviewRecord record resultRepository.findByContentId(contentId); if (record ! null) { // 更新AI处理结果 record.setAiResult(convertToReviewResult(response)); record.setAiProcessTime(new Date()); record.setStatus(ReviewStatus.COMPLETED); resultRepository.save(record); // 可选发送通知或触发后续流程 notifyReviewCompleted(record); } } private void notifyReviewCompleted(ContentReviewRecord record) { // 实现业务特定的通知逻辑 // 如WebSocket推送、邮件通知、触发下一步工作流等 } }4.5 运行验证与结果查看启动所有服务后我们可以通过REST API测试整个流程// 文件路径business-app/src/main/java/com/example/business/controller/ReviewController.java RestController RequestMapping(/api/review) public class ReviewController { Autowired private ContentReviewService reviewService; PostMapping(/submit) public ResponseEntityReviewResult submitReview(RequestBody Content content) { ReviewResult result reviewService.submitContentReview(content); return ResponseEntity.accepted().body(result); // 202 Accepted表示已接受处理 } GetMapping(/result/{contentId}) public ResponseEntityReviewResult getResult(PathVariable String contentId) { ReviewResult result reviewService.getReviewResult(contentId); return ResponseEntity.ok(result); } }测试流程调用POST /api/review/submit提交内容审核立即返回202状态包含基础审核结果AI处理状态为PENDING系统后台异步处理情感分析定期调用GET /api/review/result/{contentId}查询最终结果5. 性能优化与高级特性5.1 结果缓存与去重对于相同内容的重复处理添加缓存机制提升性能// 文件路径ai-adapter-service/src/main/java/com/example/ai/cache/ResultCacheService.java Service public class ResultCacheService { Autowired private RedisTemplateString, Object redisTemplate; private static final String CACHE_PREFIX tool_result:; private static final long CACHE_EXPIRE_HOURS 24; public ToolResultObject getCachedResult(String toolName, Object input) { String cacheKey buildCacheKey(toolName, input); ToolResultObject cached (ToolResultObject) redisTemplate.opsForValue().get(cacheKey); if (cached ! null !isCacheExpired(cached)) { cached.setCached(true); // 标记为缓存结果 return cached; } return null; } public void cacheResult(String toolName, Object input, ToolResultObject result) { if (result.isSuccess()) { String cacheKey buildCacheKey(toolName, input); redisTemplate.opsForValue().set(cacheKey, result, CACHE_EXPIRE_HOURS, TimeUnit.HOURS); } } private String buildCacheKey(String toolName, Object input) { String inputHash DigestUtils.md5DigestAsHex(input.toString().getBytes()); return CACHE_PREFIX toolName : inputHash; } }5.2 批量处理优化支持批量文本处理减少网络开销// 文件路径ai-adapter-service/src/main/java/com/example/ai/adapter/BatchTextSentimentTool.java Service public class BatchTextSentimentTool implements ToolListString, ListSentimentResult { Override public ToolResultListSentimentResult execute(ListString texts) { if (texts.size() 50) { // 分批处理避免单次请求过大 return processInBatches(texts, 50); } // 单次批量处理 AIBatchResponse batchResponse aiClient.batchAnalyzeSentiment(texts); ListSentimentResult results convertBatchResults(batchResponse); return ToolResult.ListSentimentResultbuilder() .success(true) .data(results) .build(); } private ToolResultListSentimentResult processInBatches(ListString texts, int batchSize) { ListSentimentResult allResults new ArrayList(); for (int i 0; i texts.size(); i batchSize) { ListString batch texts.subList(i, Math.min(i batchSize, texts.size())); ToolResultListSentimentResult batchResult execute(batch); if (!batchResult.isSuccess()) { return ToolResult.ListSentimentResultbuilder() .success(false) .errorMessage(第 (i/batchSize 1) 批处理失败) .build(); } allResults.addAll(batchResult.getData()); } return ToolResult.ListSentimentResultbuilder() .success(true) .data(allResults) .build(); } }5.3 熔断与降级机制集成Resilience4j实现熔断保护# 文件路径ai-adapter-service/src/main/resources/application.yml resilience4j: circuitbreaker: instances: aiServiceCircuitBreaker: failure-rate-threshold: 50 sliding-window-size: 10 minimum-number-of-calls: 5 wait-duration-in-open-state: 10s timelimiter: instances: aiServiceTimeLimiter: timeout-duration: 30s// 文件路径ai-adapter-service/src/main/java/com/example/ai/circuitbreaker/AIServiceWithCircuitBreaker.java Service public class AIServiceWithCircuitBreaker { Autowired private ExternalAIServiceClient aiClient; private final CircuitBreaker circuitBreaker; private final TimeLimiter timeLimiter; public AIServiceWithCircuitBreaker() { this.circuitBreaker CircuitBreaker.ofDefaults(aiService); this.timeLimiter TimeLimiter.of(Duration.ofSeconds(30)); } public AIServiceResponse callWithProtection(String text) { CallableAIServiceResponse callable () - aiClient.analyzeSentiment(text); CallableAIServiceResponse decoratedCallable CircuitBreakerDecorator .ofCircuitBreaker(callable, circuitBreaker); decoratedCallable TimeLimiterDecorator.of(decoratedCallable, timeLimiter); try { return decoratedCallable.call(); } catch (Exception e) { throw new AIServiceException(AI服务调用保护机制触发, e); } } }6. 常见问题与排查指南6.1 消息队列相关问题问题现象可能原因解决方案工具请求消息积压AI服务响应慢或宕机1. 检查AI服务健康状态2. 增加消费者数量3. 设置消息TTL回调消息丢失网络抖动或回调服务宕机1. 实现消息持久化2. 添加重试机制3. 设置死信队列消息序列化错误数据类型不匹配1. 统一序列化协议2. 添加消息版本号3. 兼容性测试6.2 AI服务集成问题// 文件路径ai-adapter-service/src/main/java/com/example/ai/troubleshooting/AIServiceTroubleshooter.java Component public class AIServiceTroubleshooter { private static final Logger logger LoggerFactory.getLogger(AIServiceTroubleshooter.class); public void diagnoseAIServiceIssue(String toolName, Exception error) { if (error instanceof ConnectException) { logger.error(AI服务连接失败: {}检查网络连通性和服务地址, toolName); // 执行网络诊断 diagnoseNetworkConnectivity(); } else if (error instanceof TimeoutException) { logger.warn(AI服务响应超时: {}考虑调整超时时间或优化算法, toolName); // 建议优化策略 suggestTimeoutOptimization(); } else if (error instanceof AIServiceException) { AIServiceException aiError (AIServiceException) error; handleAIServiceSpecificError(aiError.getErrorCode(), toolName); } } private void diagnoseNetworkConnectivity() { // 实现网络诊断逻辑 logger.info(执行网络诊断ping服务端点、检查防火墙规则等); } }6.3 性能调优建议监控关键指标消息队列堆积情况AI服务响应时间分布工具调用成功率缓存命中率容量规划建议根据业务峰值估算消息队列容量设置合理的线程池大小预留足够的网络带宽调试技巧为每个工具请求生成唯一Trace ID记录详细的处理日志使用APM工具监控全链路性能7. 生产环境最佳实践7.1 安全考虑AI服务可能处理敏感数据需要特别注意安全防护// 文件路径ai-adapter-service/src/main/java/com/example/ai/security/DataSecurityHandler.java Component public class DataSecurityHandler { public String sanitizeInput(String input) { // 移除敏感信息 return removeSensitiveData(input); } public boolean containsSensitiveInfo(String text) { // 检测是否包含敏感信息 Pattern sensitivePattern Pattern.compile((身份证|手机号|银行卡)); return sensitivePattern.matcher(text).find(); } public String encryptForAI(String data) { // 如果需要加密传输 return aesEncrypt(data, getAIServiceKey()); } }7.2 监控与告警建立完整的监控体系# 文件路径ai-adapter-service/src/main/resources/micrometer-config.yml management: endpoints: web: exposure: include: health,metrics,prometheus metrics: export: prometheus: enabled: true endpoint: health: show-details: always # 自定义健康检查 tool: metrics: - name: tool_invocation_count description: 工具调用次数 - name: tool_response_time description: 工具响应时间 - name: tool_error_rate description: 工具错误率7.3 版本管理与兼容性AI服务迭代频繁需要做好版本管理接口版本化为每个AI工具接口定义版本号向后兼容新版本接口保持对老版本数据的兼容灰度发布新工具版本先小范围试用回滚机制发现问题时能快速回退到稳定版本// 文件路径tool-core/src/main/java/com/example/tool/version/ToolVersionManager.java Component public class ToolVersionManager { public boolean isCompatible(String currentVersion, String requiredVersion) { // 实现版本兼容性检查逻辑 return checkVersionCompatibility(currentVersion, requiredVersion); } public void migrateData(Object oldData, String fromVersion, String toVersion) { // 数据格式迁移逻辑 if (needDataMigration(fromVersion, toVersion)) { performDataMigration(oldData, fromVersion, toVersion); } } }通过本文介绍的迂回方案我们成功将AiService以Tool的形式集成到业务系统中既享受了AI能力带来的智能化提升又避免了直接集成带来的稳定性风险。这种架构特别适合对响应时间要求不高但需要AI能力的业务场景。在实际项目中建议先从小规模试点开始逐步验证方案的可行性和性能表现。重点关注消息队列的稳定性、AI服务的可靠性以及整个链路的可观测性。随着经验的积累可以进一步优化缓存策略、批量处理机制和故障恢复能力。

相关新闻

51单片机电子钟项目实战:LCD1602显示、整点报时与闹钟功能

51单片机电子钟项目实战:LCD1602显示、整点报时与闹钟功能

这次我们来做一个完整的51单片机电子钟项目,基于STC89C52单片机,使用LCD1602显示屏,实现时间显示、整点报时和闹钟功能。这个项目非常适合单片机初学者作为课程设计或毕业设计,硬件成本低,代码逻辑清晰,能够…

2026/10/18 8:08:29 阅读更多 →
Visual C++ Redistributable AIO:3分钟解决Windows应用程序启动失败的终极方案

Visual C++ Redistributable AIO:3分钟解决Windows应用程序启动失败的终极方案

Visual C Redistributable AIO:3分钟解决Windows应用程序启动失败的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的…

2026/10/18 8:08:40 阅读更多 →
影刀RPA文本数据提取方法四:Python字符串处理

影刀RPA文本数据提取方法四:Python字符串处理

影刀RPA文本数据提取方法四:Python字符串处理 作者:林焱 | 适合人群:指令和正则都搞不定,需要更强大文本处理能力的新手 什么情况用什么 有些文本处理任务,用影刀指令写很麻烦,用正则也很难写对。 比如&a…

2026/10/18 8:09:24 阅读更多 →

最新新闻

多模态图像分类案例

多模态图像分类案例

当然可以!以下是使用CIFAR-10数据集进行多模态图像识别分类的完整代码。由于CIFAR-10只有图像没有文本描述,我会模拟生成对应的文本描述来实现多模态实验:import torch import torch.nn as nn import torch.optim as optim from torch.utils.…

2026/10/18 23:10:18 阅读更多 →
Ashampoo Photo Commander:海量本地照片的管理与批处理利器

Ashampoo Photo Commander:海量本地照片的管理与批处理利器

管理照片这件事,我从还在用光盘版图片库软件的时代就开始折腾,十几年换过不少工具。Ashampoo Photo Commander 在国内算不上一线网红软件,但每次有人问我"本地图片管理到底该用什么",它基本都排在我推荐清单的前三名。说…

2026/10/18 23:10:18 阅读更多 →
根治你的健忘虾!全网最全!23款Agent记忆架构大横评:从向量数据库到TaoToken统一通道

根治你的健忘虾!全网最全!23款Agent记忆架构大横评:从向量数据库到TaoToken统一通道

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

2026/10/18 23:10:18 阅读更多 →
C#显示设置实战:设置缩放比例后,鼠标光标位置与屏幕大小如何精准换算(TaoToken统一Key/API通道)

C#显示设置实战:设置缩放比例后,鼠标光标位置与屏幕大小如何精准换算(TaoToken统一Key/API通道)

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

2026/10/18 23:10:18 阅读更多 →
2026年AI Agent面试通关秘籍:用TaoToken统一Key打通MCP与Function Call实战

2026年AI Agent面试通关秘籍:用TaoToken统一Key打通MCP与Function Call实战

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

2026/10/18 23:10:18 阅读更多 →
水文站点实时数据爬虫:Selenium+Requests混合方案实战

水文站点实时数据爬虫:Selenium+Requests混合方案实战

简介:本资源是一套面向Python初学者与数据爱好者设计的水文实时数据采集与可视化实践项目,聚焦网络爬虫与基础数据分析能力训练,适用于环境监测、水利信息化等场景的入门级技术验证。压缩包共9个文件,含3个核心Python脚本&#xf…

2026/10/18 23:09:18 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →