https://my.oschina.net/u/4107293/blog/3100208

从1956年的达特茅斯会议到当代的“人类脑计划”,模拟大脑一直是AI研究的重要方向。然而,无论是符号主义、联结主义还是行为主义,都面临着理论与实践的挑战。深度学习的崛起,似乎为AI提供了一条更为可行的道路。

  人工智能这个词,从诞生到一路坎坷地迎来辉煌,就注定与“模拟”紧密相连。

  1956年,在新罕布什尔州达特茅斯学院的一次小型会议上,赫伯特西蒙、约翰麦卡锡、克劳德香农等AI界的开山鼻祖们,就提出了“智能的任何特征,原则上都可以精确描述,因此我们可以制造机器来对它进行模拟”。

  当代也有不少科学家坚信,观察研究人类大脑,可以轻松解决新一代人工智能的设计问题。2013年,欧盟牵头、26个国家135个合作机构参与的“人类脑计划”(Human Brain Project,简称HBP)也将重点放在了,如何通过超级计算机技术来模拟人脑功能,以期实现人工智能。

  听起来,模拟人脑的思维路径,在此基础上进行推理运算,得到新的知识、判断,似乎是AI从诞生到进化的必由之路。

  然而,远有日本雄心勃勃打造的能像人一样推理的“第五代计算机”宣告破产,近有耗时10年、烧光10亿欧元试图模拟大脑的“蓝脑计划”(Blue Brain Project)彻底凉凉,连一个蠕虫的大脑都没模拟成功。

  这不禁让我们有些疑惑,AI与模拟大脑之间,到底存在着怎样复杂纠结的联系?

  从热恋到冷落:模拟大脑如何成为AI的备胎

  先解释一下,虽然都是对大脑智能的“模拟”,但不同人工智能学派的理念却各不一样。

  符号主义学派主张模拟人脑的逻辑思维。先把问题或知识表示为某种逻辑结构,运用符号演算,从而实现表示、推理和学习等功能,典型代表就是专家系统。

  联结主义学派则主张模拟人脑的生理结构和工作机理。通过人脑神经网络、神经元之间的连接以及在神经元间的并行处理,实现对人脑智能的模拟。现在街知巷闻的神经网络算法,就是这一理念的成功应用。

  而行为主义学派则主张直接模拟智能行为的感知和动作模式。不要考虑复杂的知识、表征、推理等等,让AI在现实世界中通过自动控制过程与环境交互作用表现出来就好。

  当然也有像瑞士神经科学家Henry Markram主导的“蓝脑计划”一样,试图用计算机创建复杂的数学模型,用来模拟人脑的86亿个神经元和100万亿的突触,以帮助研发出更智能的机器人。

  在当时来看,所有模拟理论或多或少都有一些问题。比如符号主义很难说清楚,数字模型与人类心理相似性上的关联;联结主义智能粗略地模拟神经系统,如果训练多层网络使用的路径,就很难找到与之对应的生物学知识和匹配的硬件。行为主义只能实现低层智能,比如让机器虫爬来爬去,而复刻一个数字化大脑就更不现实了,因为想要从细胞层面构建人脑模型、模拟860亿个神经元的运作与相互关联,以今天的脑科学水平注定只是白花钱。

  所以,现实中的人工智能,正如图灵说所,唯一需要做的事就是找到脑内运行的程序,获得正确的智能算法,然后在合适的硬件上运行它。

  而时代的幸运儿就是深度学习。模拟人脑神经网络工作机制的深度学习方法,乘着互联网的东风直上青云,成为最适合将智能程序与算法下沉到社会机器上的核心技术。

  大连看妇科哪里好 mobile.0411fuke.com

  大连好的妇科医院 mobile.bohaink.com

  在感知层面,利用现代计算机算力的提升,以及网络数据量的暴涨,让深度学习通过大规模数据集与训练来获得数据模型成为了可能。

  而在让机器“看起来智能”的核心推理能力上,深度学习也展现了足够强大的进步。主要体现在两个方面:一种是判别事物。在已知属性的条件下,让机器对某个事物进行判断与分类,比如找出垃圾邮件或攻击性语言,亦或是从图像、视频中识别出某种特殊物体等等。

转载于:https://my.oschina.net/u/4107293/blog/3100209

您希望在不改动现有业务层(包括Controller)代码的前提下,移除用于触发业务的HTTP请求,完全通过WebSocket(基于STOMP)来实现业务的触发和结果的返回。这个思路是可行的,核心在于**在服务器端添加一个“消息适配层”**,它负责接收WebSocket消息,并**代为调用现有的HTTP接口**。 为了让您快速了解改造前后的区别,我用一个表格来展示核心流程的变化: | 步骤 | 原有模式 (WebSocket + HTTP) | 新模式 (纯WebSocket) | | :--- | :--- | :--- | | 1 | 前端建立WebSocket连接并订阅响应主题 (e.g., `/user/queue/result`) | **同左侧**,前端建立WebSocket连接并订阅响应主题 (e.g., `/user/queue/result`) | | 2 | 前端发送**HTTP请求**到业务接口 (e.g., `POST /api/start-business`) | 前端通过WebSocket**发送消息**到适配端点 (e.g., `SEND /app/trigger-business`) | | 3 | **HTTP Controller** (`@PostMapping`) 接收请求,调用业务逻辑 | **STOMP消息控制器** (`@MessageMapping`) 接收消息,**内部转发HTTP请求**至原Controller | | 4 | 业务逻辑执行,结果通过`SimpMessagingTemplate`**经WebSocket推送** | **同左侧**,原业务逻辑执行,结果通过`SimpMessagingTemplate`**经WebSocket推送** | ### 🛠️ 实现方案:STOMP消息代理(适配器模式) 这个方案的核心是创建一个新的STOMP消息控制器(`@MessageMapping`),它作为适配器,接收客户端的WebSocket消息,然后在服务器内部自动调用原有的HTTP接口。 #### 前端修改 前端需要将原来发送HTTP请求的代码,改为发送STOMP消息。 ```javascript // 假设已建立STOMP连接 'stompClient' // 原来发送HTTP请求的地方(例如axios或fetch) // axios.post('/api/start-business', { data: 'yourData' }); // 改为发送STOMP消息 function triggerBusinessOverWebSocket(requestData) { const message = { id: 'unique-request-id-' + Date.now(), // 用于关联请求和响应 originalUrl: '/api/start-business', // 想要调用的原始HTTP接口路径 originalMethod: 'POST', // 原始HTTP方法 payload: requestData // 原始HTTP请求体数据 }; // 发送到服务器端STOMP消息适配器的端点 stompClient.send('/app/trigger-business', {}, JSON.stringify(message)); } ``` #### 后端实现(消息适配器) 在后端,创建一个新的STOMP消息控制器,充当内部代理。 ```java @Controller public class WebSocketTriggerAdapterController { @Autowired private RestTemplate restTemplate; // 或使用WebClient进行内部HTTP调用 @Autowired private SimpMessagingTemplate messagingTemplate; @MessageMapping("/trigger-business") // 监听前端发送的STOMP消息目的地 public void handleWebSocketTrigger(@Payload WebSocketTriggerMessage triggerMessage, SimpMessageHeaderAccessor headerAccessor) { // 1. 可选:从STOMP帧头或会话中获取用户身份等信息进行验证 // String username = (String) headerAccessor.getSessionAttributes().get("username"); // 2. 准备调用原有HTTP接口 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 可以设置其他必要的HTTP头,如认证信息 // headers.set("Authorization", "Bearer ..."); HttpEntity<Object> requestEntity = new HttpEntity<>(triggerMessage.getPayload(), headers); // 3. 动态构造内部请求URL(确保指向自身) String internalApiUrl = "http://localhost:8080" + triggerMessage.getOriginalUrl(); // 注意生产环境需妥善处理服务发现和URL构造 ResponseEntity<String> responseEntity; try { // 4. 内部调用原有的HTTP接口 responseEntity = restTemplate.exchange( internalApiUrl, HttpMethod.resolve(triggerMessage.getOriginalMethod()), // 解析HTTP方法 requestEntity, String.class ); // 5. 假设原HTTP接口成功,并返回JSON String responseBody = responseEntity.getBody(); // 6. 通过WebSocket将原HTTP接口的响应结果发送回前端 // 前端需要订阅/user/queue/triggers-result等目的地 messagingTemplate.convertAndSendToUser(/*username*/ "default-user", "/queue/triggers-result", responseBody); } catch (Exception e) { // 7. 处理错误 String errorResponse = "{\"status\": \"ERROR\", \"message\": \"Failed to call internal API: " + e.getMessage() + "\"}"; messagingTemplate.convertAndSendToUser(/*username*/ "default-user", "/queue/errors", errorResponse); } } // 内部类,用于映射前端发送的STOMP消息体 public static class WebSocketTriggerMessage { private String id; private String originalUrl; private String originalMethod; private Object payload; // 映射原HTTP请求体 // getters and setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getOriginalUrl() { return originalUrl; } public void setOriginalUrl(String originalUrl) { this.originalUrl = originalUrl; } public String getOriginalMethod() { return originalMethod; } public void setOriginalMethod(String originalMethod) { this.originalMethod = originalMethod; } public Object getPayload() { return payload; } public void setPayload(Object payload) { this.payload = payload; } } } ``` #### 配置内部HTTP调用工具 确保您的Spring Boot应用能使用`RestTemplate`或`WebClient`进行内部调用。 ```java @Configuration public class AppConfig { @Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } } ``` ### ✅ 方案优势与注意事项 * **业务零侵入**:您现有的`@PostMapping("/api/start-business")`等Controller代码无需任何改动。 * **单一连接**:所有通信(触发业务和接收结果)都通过唯一的WebSocket连接完成。 * **灵活性**:可以为一个STOMP端点配置代理多个不同的HTTP接口。 * **错误处理**:通过WebSocket返回错误信息。 ⚠️ **注意事项**: * **会话关联**:需要确保将响应消息发送给正确的用户。示例中使用了`convertAndSendToUser`,这通常需要配置用户目的地(`setUserDestinationPrefix`)并与认证结合。您需要从STOMP会话中正确获取用户标识(如用户名),而不是使用硬编码的"default-user"。 * **性能开销**:内部HTTP调用会产生少量额外开销,但对于大多数应用而言可接受。 * **URL构造**:生产环境中,内部API URL的构造可能需要更智能的方式(例如使用服务发现`DiscoveryClient`),而不仅仅是`"http://localhost:8080"`。 * **安全性**:确保只有经过认证和授权的客户端才能通过WebSocket消息触发内部HTTP调用,防止内部API被未经授权地调用。 ### 🌐 网络参考方案 搜索结果显示了一些相关的实现思路和资料,虽然不完全一致,但可以借鉴: * **GitHub项目参考**:文中提到了 [EasySocket 项目](https://github.com/Raindtop/EasySocket),它展示了如何使用WebSocket替代HTTP进行通信,虽然具体实现可能不同,但其思路和解决的问题(如请求等待、断线重连)有参考价值。 * **博客文章**:《[WebSocket替换Http协议的逻辑实现](https://my.oschina.net/u/4109273/blog/11201131)》 和 《[Spring Cloud Gateway整合基于STOMP协议的WebSocket实战](https://www.ewbang.com/community/article/details/1000073069.html)》 都涉及WebSocket和STOMP的深入使用,后者虽然重点在网关集成,但也包含了STOMP服务端的配置和概念说明。 * **官方文档**:始终是最可靠的资源。Spring Framework 官方文档中的 [WebSocket](https://docs.spring.io/spring-framework/reference/web/websocket.html) 和 [STOMP](https://docs.spring.io/spring-framework/reference/web/websocket/stomp.html) 部分提供了最权威的配置和API说明。 希望这些方案和思路能帮助您顺利完成架构改造。 输出以上这个新模式的时序图,plantUML
最新发布
09-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值