首页
人工智能
网络安全
手机
搜索
登录
搜索
golden81
累计撰写
154
篇文章
累计收到
0
条评论
首页
栏目
首页
人工智能
网络安全
手机
自定义幻灯片
最新文章
2025-4-23
微软AI CEO:通用人工智能或在5年内出现
4月5日,微软AICEO及DeepMind的联合创始人Mustafa Suleyman接受海外播客BigTechnology访谈,本次对话深入探讨了微软在AI领域的最新动向、战略思考以及对未来的展望以及与OpenAI的合作关系等话题。 Mustafa Suleyman坚称AI大模型的能力绝不可能已经见顶,“我们还有非常长的路要走”,尤其是在解决幻觉、提升准确性等“最后一英里”的难题上。预测AI将彻底改变搜索模式,使其变为对话式,白领工作将转向管理AI Agent。 此外,他还驳斥了关于缩减数据中心投入的报道,称微软仍在以惊人速度消耗资源。并形容与OpenAI的合作是长期的、极其成功的。 主持人:微软为何要打造一款升级版的、更具人情味的AI机器人,它将如何吸引用户?构建更个性化Copilot(具备更强记忆力、行动执行能力、购物助手乃至虚拟化身)的构想是如何一步步变为现实的?这种记忆能力能回溯多久,用户是否仍需反复提醒AI自己的信息?记忆功能与授权AI执行订票等实际操作之间是否存在关联,即信任是否是授权的前提?未来可能推出的虚拟化身功能,是否意味着我们将与某种形式的“数字人”进行交互? Mustafa Suleyman:我们正处于一个时代的关键转折点,从智能新纪元的第一阶段迈向全新的开端。过去,大家对聊天机器人的基础问答能力,也就是“智商”(IQ)印象深刻。早期用户更关注实用性,像数学或编码能力。但对于大多数消费者而言,机器人的交互语气,也就是“情商”(EQ)才是关键。比如是否礼貌、尊重、适时幽默,能否记住并正确使用用户名字,能否学习用户的纠正。 目前的记忆功能虽不完美,但意义重大。它能记住用户的关键信息,像家庭状况、背景经历,还能逐渐理解用户偏好,如交流风格、回答形式等。记忆是解锁全新AI使用方式的关键特性,让用户投入的时间和信息得以积累,深化与AI的独特连接。 当用户觉得AI足够了解自己时,才会更愿意授权它执行实际操作,比如用信用卡预订机票。我们期望AI能帮用户处理事务,减轻生活负担,这也是我从2010年创立DeepMind时就追求的目标。像Copilot现在能在Windows中控制鼠标、导航界面等,让数字生活更便捷。 虚拟化身功能就像“马麦酱”,有人喜欢,有人不喜欢。对部分用户来说,有独特名字、形象、表情和个性的虚拟化身会让交互更像人与人对话,我们在测试中也发现它能改变交互体验。不过,也有人偏爱纯文本或图像/视频交互。目前这还在实验阶段,但预示了未来方向,我们可能会与个人AI伴侣建立深厚、持久的关系。 主持人:面对Amazon、OpenAI、Google(DeepMind)等巨头都在布局相似的AI伴侣领域,微软将如何实现差异化?仅仅依靠AI更具个性化、更富人情味的特质吗?这是否意味着未来用户会像挑选商品一样,根据个人偏好选择不同的AI伴侣?考虑到用户可能与AI建立深厚情感连接(如Replica用户与其AI结婚的案例),微软是否为此做好了准备,将如何设定和坚守伦理界限?在平衡AI能力(如减少拒绝执行指令)与安全、防止滥用(如生成名人图像或被诱导产生不当言论)方面,微软将如何在坚守自身价值观的同时保持竞争力? Mustafa Suleyman:我们的差异化策略在于侧重塑造AI的个性和语气,让用户感觉像在和熟悉、友善、乐于助人且支持自己的人交流,还能反映用户的个人价值观,随时间学习并体现用户偏好。同时,我们非常重视安全可控,让AI正直、简单,避免卷入争议,保持礼貌、尊重和不偏不倚,能呈现争议双方观点。 未来用户确实会根据个人偏好选择AI伴侣,AI会像贴心伙伴一样适应用户。从用户反馈能看出,他们已经和AI伴侣建立了真实的情感连接。比如有67岁用户在Copilot帮助下修理家门、学习刷漆技巧等。 对于AI的边界,我们不会开发诱导深度情感的产品。我们有实时分类器检测不当互动,一旦发现会及时制止。例如和Copilot说“我爱你”,它会礼貌岔开话题。 在平衡AI能力与安全方面,初期设定拒绝机制是有必要的。我们会审视限制是否恰当,不会盲目放宽限制。接下来要考虑赋予Copilot在浏览器中执行操作的自主权大小,要谨慎、稳健推进。 主持人:除了个性化,微软还发布了AI播客、深度研究、笔记页面、Copilot搜索等一系列功能,这些更新背后是否存在一个清晰、全面的战略?或者说这一切仍然是围绕塑造AI个性展开?构建如此主动、全能的AI助手为何如此困难,尽管许多公司都有此愿景?当前AI领域存在关于模型本身与基于模型的产品哪个更重要的辩论,您认为模型的发展是否已接近瓶颈,导致重心必须转向产品开发?尤其是在预训练方面,通过不断扩大模型规模的方式是否已显示出收益递减?路透社报道称微软缩减数据中心租约计划,这是否与您声称仍在通过扩大规模看到成果相矛盾,又是否与OpenAI开始同Oracle等其他公司合作有关?既然扩大规模能带来价值,为何微软自身反而专注于构建规模较小的模型,而不是像合作伙伴OpenAI那样利用微软的计算资源追求最大模型?对于个性化的新AI产品而言,推理能力本身相较于模型规模的重要性如何?推理所需的计算量真的远超训练吗?运行AI服务(如生成娱乐图片、辅助订票)的高昂成本与其产生的价值是否匹配?这股AI热潮是否会因成本过高而难以为继? Mustafa Suleyman:这些功能的核心都是帮助用户完成任务。IQ和EQ关乎智能与友善,但用户更关心AI能否编辑文档、生成播客、进行对话式互动等。未来电脑将从被动变为主动,提供建议、推送内容等,这是伙伴模式的重大变革。 构建主动、全能的AI助手非常困难,因为世界存在很多无法预见的边缘案例,我们还处于初级阶段。就像早期的GPT - 3或LaMDA,虽有缺陷,但也有惊艳时刻。经过迭代,记忆、个性化和行动功能已接近成功。 模型发展远未到瓶颈。以幻觉和引用问题为例,虽有改进但还需解决。每次模型迭代都有新技巧提升准确性,大规模采用往往在准确率大幅提升时发生。语音技术就是如此,现在已经很出色。 预训练阶段进展速度变慢,但计算投入只是调整到后训练阶段和推理时间,总投入未减少,模型能力仍在进步。 路透社关于微软缩减数据中心租约的报道不准确。很多只是早期探索性对话,未最终签署协议。我们持有部分合同选项以保留灵活性,同时在其他地区有实际投资,自2020年以来一直在大量消耗资源。 OpenAI与Oracle合作的说法不属实,OpenAI所有推理需求都通过我们满足,合作关系没有放缓。 我们与OpenAI有良好合作,他们进行前沿探索,我们则专注构建自己的MAI模型。因为前沿探索成本高,后续优化者能找到更高效、低成本的方法构建相似甚至更好的系统。 推理能力很重要,具备推理能力的模型学会了“如何学习”,能在执行前思考推演。推理确实消耗更多计算资源,但不是所有任务都需要这类模型,日常问题更偏爱快速结果。 从技术史来看,有用的技术会变得更便宜、易用和普及。AI领域也会如此,价格下降会带来高采用率,进而降低生产成本。目前AI服务虽有成本,但前景积极,许多应用会在生活中发挥重要作用。 主持人:鉴于微软和OpenAI都在努力构建相似的AIAgent产品,双方的合作关系未来将如何演变?是什么维系着OpenAI继续遵守约定?如果OpenAI真的宣布已达到AGI,根据合同条款,这会对双方的合作关系产生什么影响?微软最近参与了OpenAI高达400亿美元的新一轮融资,投资这笔资金的目的是什么,微软从中获得了什么?关于AGI的到来,您的预测是什么?您似乎比一些同行(如DemisHassabis)更为谨慎。 Mustafa Suleyman:我们和OpenAI的合作始于2019年,微软当时向其投资10亿美元,这将是科技史上非常成功的合作案例。双方关系很好,他们发展迅速,产品受欢迎。但他们是初创公司,有自己的优先事项,我们也有我们的,合作关系会随时间演变。不过我相信,这种合作对双方将继续互利共赢。 AGI的定义很模糊,如果真的创造出价值超越人类全部经济活动总和的东西,那将从根本上改变人类社会。我认为距离AGI还有相当距离,直觉上至少还需要十年左右,但也有可能在五年内发生。在此期间,我们会专注于构建出色的产品。 微软参与OpenAI新一轮融资是因为OpenAI越成功,我们就越成功。我们会成为该公司最大股东之一,还获得了重要的技术许可,他们也使用我们的基础设施和技术。 主持人:随着像Copilot这样的对话式AI产品日益普及,传统的搜索引擎将会变成什么样子?您过去似乎认为现有搜索模式存在弊端,未来的商业模式(尤其是广告)将如何适应这种转变?您对于人工智能可能颠覆白领工作的观点一直比较鲜明,甚至认为这种情况可能已经开始,您认为未来的工作模式将如何演变?考虑到AI对各行各业(如客户服务、软件工程、新闻、播客制作)的潜在冲击,您对当今年轻人在规划职业生涯时有何建议?在一个由个性化AI助手(可能内嵌广告)作为用户与企业互动中介的新时代,品牌将扮演何种角色,其自身会经历怎样的演变? Mustafa Suleyman:我觉得现在还普遍使用传统搜索挺奇怪的,未来搜索将发生根本性变革。用户不再浏览蓝色链接,而是直接向AI提问,AI提供凝练答案,还能呈现图片、地图和视频,用户可即时反馈,AI实时重新生成结果。 广告在未来商业模式中仍会很重要,我们要让广告更有质量、更个性化、更有价值,将其巧妙地整合到辅助体验中,找到对用户有益的平衡点。 AI对工作模式的影响是未来15年的重大转变。推理模型将成为廉价且充足的资源,未来工作流将围绕管理个人专属AIAgent展开,提升效率和创造力。我更倾向用“人工能力智能”(ACI)来评估技术对工作的影响。 给年轻人的职业建议是积极体验新兴AI工具,大胆尝试,保持开放心态,了解技术的局限性和可能犯的错误,形成对技术发展的客观认识。 在AI时代,品牌的重要性会更加凸显。信任包括实用性和情感两个维度,品牌在情感维度上能传递可靠感和熟悉感,值得信赖的品牌会更受用户青睐。
2025年-4月-23日
16 阅读
0 评论
网络安全
2025-4-23
DeepSeek模型MOE结构代码详解
其实在DeepSeek-R1爆火之前,DeepSeek V2在我们行业就已经妇孺皆知了,它独特的MOE结构值得研究一下。这篇文章是基于 ZOMI酱 的2个视频写的,这2个视频讲的很好,建议大家都学习一下:《MOE终于迎来可视化解读!傻瓜都能看懂MoE核心原理!》和《使用昇腾NPU手撕MoE单机版代码!没想到如此简单!》。 这篇文章是把我自己的理解梳理一下,加强自己的理解和记忆。 MOE结构概述 我们可以从zomi酱视频里面的这张图开始: MOE是mixture of experts 的缩写,简单来说,就是把传统transformer结构中decoder层里面的单个线性层替换层多个并列的线性层。在这些线性层前面还有一个Router,Router会选择并列线性层里面的一部分进行计算。这样的话,既能让模型学习更多的知识(多个“专家”),又能减少推理计算量(选择部分“专家”进行计算)。 MOE计算代码 接下来我们参考zomi酱提供的代码来详细看一下MOE的计算过程是怎样的: import torch import torch.nn as nn import torch.nn.functional as F import torch_npu from torch_npu.contrib import transfer_to_npu class Expert(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super().__init__() self.net = nn.Sequential( nn.Linear(input_dim, hidden_dim), nn.GELU(), nn.Linear(hidden_dim, output_dim)) def forward(self, x): return self.net(x) class MoE(nn.Module): def __init__(self, input_dim, num_experts, top_k, expert_capacity, hidden_dim, output_dim): super().__init__() self.num_experts = num_experts self.top_k = top_k self.expert_capacity = expert_capacity # 路由网络 self.gate = nn.Linear(input_dim, num_experts) # 专家集合 self.experts = nn.ModuleList( [Expert(input_dim, hidden_dim, output_dim) for _ in range(num_experts)]) def forward(self, x): batch_size, input_dim = x.shape device = x.device # 路由计算 logits = self.gate(x) probs = torch.softmax(logits, dim=-1) print("probs: ", probs) topk_probs, topk_indices = torch.topk(probs, self.top_k, dim=-1) print("topk_probs: ", topk_probs) print("topk_indices: ", topk_indices) # 辅助损失计算 if self.training: # 重要性损失(专家利用率均衡) importance = probs.sum(0) importance_loss = torch.var(importance) / (self.num_experts ** 2) # 负载均衡损失(样本分配均衡) mask = torch.zeros_like(probs, dtype=torch.bool) mask.scatter_(1, topk_indices, True) routing_probs = probs * mask expert_usage = mask.float().mean(0) routing_weights = routing_probs.mean(0) load_balance_loss = self.num_experts * (expert_usage * routing_weights).sum() aux_loss = importance_loss + load_balance_loss else: aux_loss = 0.0 # 专家分配逻辑 flat_indices = topk_indices.view(-1) flat_probs = topk_probs.view(-1) sample_indices = torch.arange(batch_size, device=device)[:, None]\ .expand(-1, self.top_k).flatten() print("sample_indices: ", sample_indices) # 初始化输出 outputs = torch.zeros(batch_size, self.experts[0].net[-1].out_features, device=device) # 处理每个专家 for expert_idx in range(self.num_experts): print("expert_idx: ", expert_idx) # 获取分配给当前专家的样本 expert_mask = flat_indices == expert_idx print("expert_mask: ", expert_mask) expert_samples = sample_indices[expert_mask] print("expert_samples: ", expert_samples) expert_weights = flat_probs[expert_mask] print("expert_weights: ", expert_weights) # 容量控制 if len(expert_samples) > self.expert_capacity: expert_samples = expert_samples[:self.expert_capacity] expert_weights = expert_weights[:self.expert_capacity] if len(expert_samples) == 0: continue # 处理专家计算 expert_input = x[expert_samples] print("expert_input: ", expert_input) expert_output = self.experts[expert_idx](expert_input) weighted_output = expert_output * expert_weights.unsqueeze(-1) # 累加输出 outputs.index_add_(0, expert_samples, weighted_output) return outputs, aux_loss # 测试示例 if __name__ == "__main__": input_dim = 5 output_dim = 10 num_experts = 8 top_k = 3 expert_capacity = 32 hidden_dim = 512 batch_size = 10 # add device = torch.device("npu:4" if torch.npu.is_available() else "cpu") moe = MoE(input_dim, num_experts, top_k, expert_capacity, hidden_dim, output_dim).to(device) x = torch.randn(batch_size, input_dim).to(device) moe.eval() output, _ = moe(x) print(f"Eval output shape: {output.shape}") # torch.Size([64, 256]) 初始化函数定义 首先,定义了Expert类,也就是“专家”,可以看到,专家是由线性层和激活函数构成的简单模型。 然后开始定义MOE类。在初始化函数中,定义了这样几个变量: self.num_experts:专家的数量,也就是上面提到的“并列线性层”的个数,训练后的每个专家的权重都是不同的,代表它们所掌握的“知识”是不同的。 self.top_k:每个输入token激活的专家数量。 self.expert_capacity:代表计算每组token时,每个专家能被选择的最多次数。 self.gate:路由网络,一般是一个线性层,用来计算每个专家被选择的概率。 self.experts:实例化Expert类,生成多个专家。 前向计算逻辑 接下来看一下forward函数。为了方便大家理解,我们把上面代码的执行打印结果也一起附上。 首先是输入x,shape是(batch_size, input_dim),batch_size我们可以看作是token的数量,也就是序列长度。然后通过self.gate和softmax计算每个token在每个专家上的激活概率: logits = self.gate(x) probs = torch.softmax(logits, dim=-1) probs的打印结果如下:我们设置的batch_size是10,num_experts是8,所以probs是个10行8列的矩阵。 probs: tensor([[0.1710, 0.1348, 0.0746, 0.1714, 0.0594, 0.2695, 0.0251, 0.0940], [0.1556, 0.0776, 0.1658, 0.1489, 0.1152, 0.1679, 0.0565, 0.1124], [0.1077, 0.1154, 0.1564, 0.1317, 0.0630, 0.2026, 0.0518, 0.1715], [0.0681, 0.0680, 0.1236, 0.1030, 0.1707, 0.2827, 0.0627, 0.1211], [0.0453, 0.0648, 0.2313, 0.0781, 0.1026, 0.1304, 0.1326, 0.2149], [0.1394, 0.2278, 0.0625, 0.1832, 0.0395, 0.1512, 0.0691, 0.1274], [0.1096, 0.1462, 0.1302, 0.1397, 0.0607, 0.1898, 0.0639, 0.1598], [0.1200, 0.1952, 0.0970, 0.1648, 0.0360, 0.1072, 0.1018, 0.1779], [0.0650, 0.0501, 0.1463, 0.1025, 0.2219, 0.1446, 0.1439, 0.1257], [0.0641, 0.0813, 0.0579, 0.1348, 0.1170, 0.0631, 0.3554, 0.1264]], device='npu:4', grad_fn=<SoftmaxBackward0>) 接着,再用topk算子把每个token的激活专家选出来: topk_probs, topk_indices = torch.topk(probs, self.top_k, dim=-1) topk_probs和topk_indices 的打印结果如下,因为我们设置的top_k=3,所以每个token都把排名前三的概率选出来了,同时topk_indices把这些概率对应的专家编号也选出来了,比如第0个token,激活了5号专家、3号专家、0号专家。 topk_probs: tensor([[0.2695, 0.1714, 0.1710], [0.1679, 0.1658, 0.1556], [0.2026, 0.1715, 0.1564], [0.2827, 0.1707, 0.1236], [0.2313, 0.2149, 0.1326], [0.2278, 0.1832, 0.1512], [0.1898, 0.1598, 0.1462], [0.1952, 0.1779, 0.1648], [0.2219, 0.1463, 0.1446], [0.3554, 0.1348, 0.1264]], device='npu:4', grad_fn=<TopkBackward0>) topk_indices: tensor([[5, 3, 0], [5, 2, 0], [5, 7, 2], [5, 4, 2], [2, 7, 6], [1, 3, 5], [5, 7, 1], [1, 7, 3], [4, 2, 5], [6, 3, 7]], device='npu:4') self.training分支对应的是训练过程中计算损失函数的部分,我们后面再讲。 选择好专家后,就要开始计算了。计算规则是,对于每个token,假如它选择的专家是e1、e2、e3,概率分别是p1、p2、p3,那么这个token的计算结果就是p1e1_out+p2e2_out+p3*e3_out。 由于计算个体是每个专家,所以代码中用for循环遍历每个专家。我们以第0个专家为例,看看它的计算过程是怎样的。 首先需要确定0号专家的输入。由于不是每个token都选择了0号专家,所以不能把x直接作为输入,而是要确定一个下标向量idxes,把x[idxes]作为0号专家的输入,idxes的值就是激活了0号专家的所有token编号,那么怎么得到idxes呢?代码里面是这样做的: 首先计算一个mask: expert_mask = flat_indices == expert_idx 打印结果如下: expert_mask: tensor([False, False, True, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], device='npu:4') flat_indices是topk_indices平铺之后的向量。通过对比,可以看到expert_mask中True的位置和topk_indices中0的位置铺平之后是一致的,代表第0个专家被第0个token和第1个token激活了。 而且expert_mask代表的含义是:只要它的第0-2的位置是True的话,就代表被第0个token激活了,只要它的第3-5的位置是True的话,就代表被第1个token激活了,以此类推,我们可以声明一个sample_indices向量: sample_indices: tensor([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9], device='npu:4 再通过下面的代码就可以把idxes取出来了: expert_samples = sample_indices[expert_mask] 也顺便把概率权重取出来: expert_weights = flat_probs[expert_mask] 接着把输入取出来: expert_input = x[expert_samples] 打印结果如下: expert_samples: tensor([0, 1], device='npu:4') expert_weights: tensor([0.1710, 0.1556], device='npu:4', grad_fn=<IndexBackward0>) expert_input: tensor([[-1.4382, -1.5939, 0.0802, -0.5614, 0.2586], [-1.2631, 1.0266, 0.1806, -0.7280, -0.6913]], device='npu:4') 再进行专家计算: expert_output = self.experts[expert_idx](expert_input) weighted_output = expert_output * expert_weights.unsqueeze(-1) 最后还需要把计算结果叠加到对应的token上面去: outputs.index_add_(0, expert_samples, weighted_output) 完成上面的for循环之后,就把所有专家的计算任务完成了,通过index_add_的操作,把每个token的计算结果也汇总了。 损失函数 损失函数包含2部分:专家利用率均衡和样本分配均衡。 首先是专家利用率均衡,如果每个专家被选择的概率相近,那么说明分配越均衡,损失函数越小: importance = probs.sum(0) importance_loss = torch.var(importance) / (self.num_experts ** 2) 然后是样本分配均衡,首先得到每个token、每个专家的分配概率矩阵: mask = torch.zeros_like(probs, dtype=torch.bool) mask.scatter_(1, topk_indices, True) routing_probs = probs * mask 然后按照token维度(样本维度)求平均,得到每个专家被分配的token平均数量和平均概率: expert_usage = mask.float().mean(0) routing_weights = routing_probs.mean 两者相乘求和得到负载均衡损失: load_balance_loss = self.num_experts * (expert_usage * routing_weights).sum() 样本分配越均衡,这个损失函数越小。举个例子,10个专家,10个样本,如果所有样本都分到1个专家,那么损失函数值为10x1+0+0...+0=10,如果平均分给10个专家,那么损失函数值为1x0.1+1x0.1+...+1x0.1=1。 本文由博客一文多发平台 OpenWrite 发布!
2025年-4月-23日
14 阅读
0 评论
人工智能
2025-4-23
99%下单智界R7准车主都因为三个理由
文 | AUTO芯球 作者 | 雷慢 各位,我已经冲了, 我们团队刚刚下单了智界R7 360km Max增程版, 而且已经急不可耐地催了鸿蒙智行的人了, 希望能早点提车, 我下单这个车的原因很简单, 一是这车53.4度的电池真的很够用, 要知道,这比ModelY低配62度电都差不了太多了, 它有360公里的纯电续航, 媒体实测在25℃环境跑出278.8公里高速续航, 达成率高达87%, 我日常市区通勤, 基本只需一个星期充一次电, 这对我们距离适中的人来说, 把增程当纯电开,是再美不过的事情了, 而且我一到节假日喜欢往外省、甚至西部云南、西藏跑, 它综合续航干到1673公里, 也不怕有续航焦虑, 一口气可以从长沙跑到昆明了。 第二个原因是我特别喜欢这车的“雪鸮增程系统”, 它最大的亮点就是“算法”, 这车的智能算法可以让增程器介入时振动幅度降低90%, 据说增程器启动时车内声音只有38分贝, 这什么概念,按国际标准, 45分贝以上才算噪音,38分贝连噪音都不算。 最大的亮点是这套算法智能分配油电资源, 现在已经有车主实测过了, 它亏电状态下的百公里油耗仅5L多; 说白了,算法知道怎么给你省油、省心、保持安静, 第三点,就是这车的智能驾驶水平确实能给我省心省事, 高速智驾省心,城区自动泊车省事, 这车和智界S7是同一套华为智驾ADS3.3,, 说一个例子吧,前几天我还开智界S7, 在路上和右边一辆车并行, 但当右前方要到断头路的时候, 智界S7主动减速,让对方向左并道过来, 这聪明程度我都惊呆了, 就这么一个小事,让我对这套智驾增加了非常大的好感。 别看这件小事, 背后可能是技术团队日夜不停的努力实现的, 才让我们下定决心下单, 毕竟,咱们买车,谁的钱都不是大风刮来的, 每一毛钱都要花得值。 各位,等我提车, 到时候给大家做个全面的测试。 *本文图片均来源于网络 聚焦智能汽车,助力关键决策。
2025年-4月-23日
11 阅读
0 评论
人工智能
2025-4-23
Virbox Protector :Unity程序加密的可靠选择
在Unity3D应用的广阔领域中,涵盖了游戏、城市规划、娱乐、艺术与教育、军事与航天工业、室内设计、房产开发、工业仿真以及文物古迹展示、Web3D/产品/静物展示、地理等诸多行业。然而,Unity3D程序的核心程序集文件Assembly - CSharp.dll作为标准的.NET文件格式,包含方法名、类名、类型定义等丰富的元数据信息,这使得它极易受到攻击。例如,使用DnSpy等工具能够轻易地对其反编译和篡改,导致代码逻辑、类名和方法名等核心信息完全暴露。 针对这一现状,Virbox Protector Unity3D版加密工具应运而生。它能够对Unity3D游戏引擎开发的程序提供全面的保护。 一、防止C#代码反编译 它专注于保护C#程序集(Assembly - CSharp.dll)。在当今的技术环境下,防止C#代码被反编译至关重要。借助Virbox Protector,可有效抵御诸如de4dot等工具的攻击,避免代码被还原,从而确保C#代码的安全性,守护代码中的逻辑、类名和方法名等关键要素。 二、加密global - meta - data.dat 在保护global - meta - data.dat文件方面,Virbox Protector也有着卓越的表现。通过运用多种保护技术,该加密工具能够有效防止il2cppDumper等工具对.NET元数据信息进行Dump操作。这一加密措施进一步巩固了Unity3D程序的安全防线,防止关键元数据信息被窃取或篡改。 三、加密AssetBundle资源 AssetBundle资源在Unity3D程序中也占据着重要地位。Virbox Protector提供了针对AssetBundle资源的加密功能,成功避免了Asset Studio等工具对其的反编译。这有助于保护游戏或应用程序中的各类资源,维持其完整性和保密性。 四、反调试功能 同时,Virbox Protector具备强大的反调试能力。通过运用平台相关技术,该工具能够有效防止程序被动态调试。这一功能为Unity3D程序的运行环境增添了一道坚实的安全屏障,抵御可能来自调试方面的恶意攻击。 五、Virbox Protector的优势 (一)广泛的加密兼容性 无论是采用MONO还是IL2CPP的Unity3D项目,Virbox Protector都能对其进行加密。这一特性使得不同项目配置下的Unity3D程序都能享受到该加密工具的保护,不受技术架构的限制。 (二)高安全性 Virbox Protector采用高强度的加密方案,并且结合二进制指令块混淆虚拟化技术。这种技术的加持使得加密后的安全性得到大幅提升,为Unity3D程序抵御各类攻击提供了更为强大的保障。 (三)性能无影响 加密操作往往可能会对程序或游戏的性能产生影响,但Virbox Protector不存在这一问题。在加密之后,程序或者游戏的性能不受影响,有效解决了加密安全与游戏性能之间的冲突,让开发者在保障安全的同时无需担忧性能损耗。 (四)快速便捷的加密操作 在操作流程上,Virbox Protector体现出极大的便利性。无需编写代码,只需将项目拖入加密工具,即可快速进行解析。而且,整个过程无需对编译环境做任何修改,能够在三分钟内完成对Unity3D程序的保护,为用户提供了流畅、高效的使用体验。 (五)多平台及架构支持 Virbox Protector在支持平台方面表现出色,涵盖了Windows、Linux、macOS、Android系统,并且支持PC x86平台、安卓arm平台以及模拟器。这种广泛的平台及架构支持,使得Unity3D程序在不同环境下都能得到有效的加密保护,无论是在桌面端还是移动端,亦或是在模拟器环境下运行的程序,都能受益于Virbox Protector的安全防护。
2025年-4月-23日
11 阅读
0 评论
网络安全
2025-4-23
Java + Tesseract 实现图片验证码识别
在实际开发中,很多网页都采用验证码防止机器人自动提交表单。如果我们希望通过自动化脚本处理这些网页,就需要一种方法来“读懂”验证码。Tesseract 是目前最主流的开源 OCR(Optical Character Recognition,光学字符识别)引擎之一。今天我们将通过 Java 调用 Tesseract,实现从验证码图片中提取文字的全过程。 准备工作\ 安装 Tesseract 你可以从 Tesseract 官方 GitHub 下载对应平台的版本。安装完成后,确保将 tesseract 命令添加到环境变量中。 获取 tess4j tess4j 是 Java 调用 Tesseract 的桥梁。通过 Maven 添加依赖: net.sourceforge.tess4j tess4j 5.4.0 代码实现步骤 OCR 识别核心类 import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; public class CaptchaReader { public static String extractTextFromImage(String imagePath) { File imageFile = new File(imagePath); ITesseract tesseract = new Tesseract(); // 设置语言包目录 tesseract.setDatapath("tessdata"); // 设置识别语言 tesseract.setLanguage("eng"); // 可选:设置页面分割模式为“单行文本” tesseract.setPageSegMode(7); try { BufferedImage image = ImageIO.read(imageFile); String result = tesseract.doOCR(image); return result.replaceAll("\\s+", ""); // 去除空白字符 } catch (Exception e) { e.printStackTrace(); return "识别失败"; } } } 2. 简单测试类 public class Main { public static void main(String[] args) { String result = CaptchaReader.extractTextFromImage("src/main/resources/captcha.png"); System.out.println("识别结果: " + result); } } 🧪 测试效果 图片内容:W8K5X 识别结果输出:W8K5X 识别准确率高时,说明验证码样式简单,无需复杂处理。如果识别出现偏差,可以尝试下面的增强处理。 图像预处理建议 验证码图片如果有干扰线或背景杂色,建议使用如下图像预处理方式提升识别效果: 灰度化处理:将彩色图像转为灰度图。 二值化处理:将图像中每个像素转为黑或白。 图像锐化:增强字符边缘。 缩放图像:适当放大图像,提升字符清晰度。 这些可通过 Java 的 BufferedImage 搭配像素级处理或 OpenCV Java 版实现。
2025年-4月-23日
14 阅读
0 评论
人工智能
2025-4-23
系统安全及应用
一、Linux 系统安全基础 1. 用户与权限管理 核心原则: 最小权限原则:普通用户不使用 root 权限,通过sudo分配特定操作权限。 用户组隔离:按业务功能划分用户组(如www-data、docker),限制跨组访问。 关键操作: 禁用闲置账户:usermod -L <username>(锁定账户)或删除无用账户:userdel -r <username>。 强密码策略:通过/etc/pam.d/passwd配置密码复杂度(如pam_cracklib模块),强制定期修改密码(chage -M 90 <username>)。 sudo配置:编辑/etc/sudoers,限制用户仅能执行指定命令(如user ALL=(ALL) NOPASSWD: /usr/sbin/service httpd restart)。 2. 文件系统安全 权限控制: 重要文件权限示例: /etc/shadow(用户密码哈希):权限-rw-------,仅 root 可读。 /etc/sudoers:权限-rw-r--r--,需通过visudo编辑防止语法错误。 禁止用户修改关键目录:chattr +i /etc/passwd(添加不可变属性,需chattr -i取消)。 文件系统挂载选项: 挂载时禁用执行权限:mount -o noexec /dev/sdb1 /mnt/data(防止 U 盘恶意文件执行)。 启用nosuid和nodev:禁止 SUID 程序和设备文件创建(如/etc/fstab中设置/home nosuid,nodev)。 3. 内核安全加固 修改/etc/sysctl.conf配置: 禁止 IP 转发:net.ipv4.ip_forward = 0。 防范 SYN Flood 破坏:bash net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 限制核心转储(Core Dump):fs.suid_dumpable = 0(防止敏感数据泄露)。 加载安全模块: 启用grsecurity或PaX内核补丁(增强内存保护,防范缓冲区溢出)。 二、网络安全防护 1. 防火墙配置 iptables 基础规则:bash # 清空默认规则 iptables -F iptables -X # 允许本地回环接口 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接回流 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 仅允许SSH(22端口)、HTTP(80)、HTTPS(443)入站 iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 拒绝所有其他入站流量 iptables -P INPUT DROP # 保存规则(不同发行版命令可能不同,如Debian用iptables-persistent) service iptables save firewalld(CentOS 7 + 推荐):bash # 添加永久HTTP服务规则 firewall-cmd --permanent --add-service=http firewall-cmd --reload 2. SELinux 与 AppArmor SELinux(Security-Enhanced Linux): 模式:enforcing(强制模式,拦截违规操作)、permissive(仅日志记录,不拦截)。 查看状态:sestatus 修改文件上下文:chcon -t httpd_sys_content_t /var/www/html/newfile.txt(允许 HTTP 服务访问文件)。 AppArmor(Ubuntu 默认): 限制程序行为:aa-complain /usr/sbin/sshd(进入警告模式,测试规则)。 3. SSH 安全加固 禁止 root 直接登录:编辑/etc/ssh/sshd_config,设置PermitRootLogin no。 使用密钥认证: 生成密钥对:ssh-keygen -t rsa -b 4096 上传公钥至服务器:ssh-copy-id user@server 禁用密码登录:PasswordAuthentication no 限制登录来源:AllowUsers user1@192.168.1.*(仅允许指定 IP 段用户登录)。 三、服务与应用安全 1. Web 服务(如 Apache/Nginx) Apache 加固: 隐藏版本号:在httpd.conf中设置ServerTokens Prod、ServerSignature Off。 禁用危险模块:a2dismod autoindex(关闭目录索引)。 Nginx 配置示例:nginx server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; # 强制HTTPS location / { deny all; # 默认拒绝所有访问,通过子规则开放特定路径 } } 2. 数据库服务(如 MySQL/PostgreSQL) MySQL 安全措施: 禁用远程 root 登录:UPDATE mysql.user SET Host='localhost' WHERE User='root'; 启用 SSL 连接:在my.cnf中配置require_secure_transport = ON。 PostgreSQL 访问控制:编辑pg_hba.conf,使用md5或sCRAM-SHA-256认证:bash host all all 127.0.0.1/32 scram-sha-256 3. 软件包管理与bug修复 定期更新系统: Debian/Ubuntu:apt update && apt upgrade -y RHEL/CentOS:yum update -y或dnf update -y(Fedora) bug扫描工具: yum install yum-plugin-security(查看可用安全补丁) OpenVAS或Nessus扫描系统bug。 四、日志监控与入侵检测 1. 系统日志管理 关键日志文件: 身份验证日志:/var/log/auth.log(记录 SSH 登录、sudo 操作) 系统服务日志:/var/log/syslog(通用系统消息) Apache/Nginx 日志:/var/log/apache2/access.log、/var/log/nginx/error.log 集中日志管理: 通过rsyslog将日志发送至远程服务器:bash # 在/etc/rsyslog.conf添加 *.* @remote-log-server:514 使用 ELK Stack 或logrotate进行日志分析和轮转。 2. 入侵检测工具 OSSEC(开源主机入侵检测系统): 监控文件完整性:检测/etc/passwd等关键文件修改。 实时告警:通过邮件或 API 发送异常行为通知。 Tripwire:基于文件哈希的完整性检查工具,定期对比文件变化。 实时进程监控:bash ps aux | grep -v grep | awk '{print $11}' | sort -u # 查看异常进程 lsof -i :80 # 查看占用80端口的进程 五、数据安全与加密 1. 磁盘加密 LUKS(Linux Unified Key Setup):bash # 加密新分区 cryptsetup luksFormat /dev/sdb1 cryptsetup luksOpen /dev/sdb1 encrypted_data mkfs.ext4 /dev/mapper/encrypted_data 文件级加密: gpg加密文件:gpg -c sensitive.txt(生成加密文件sensitive.txt.gpg)。 ecryptfs加密用户目录:ecryptfs-setup-private(自动加密 /home/user 目录)。 2. 传输安全 使用scp/sftp替代ftp/scp传输文件。 配置 VPN(如 OpenVPN)实现安全远程访问:bash # OpenVPN服务器配置示例 port 1194 proto udp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key 六、安全最佳实践 最小化安装:仅安装必要服务,卸载无用软件(如yum remove httpd)。 禁用不需要的服务:bash systemctl disable --now telnet.socket # 禁用Telnet服务 systemctl status | grep "enabled" # 检查开机自启服务 定期备份: 全量备份:tar -czvf /backup/full_$(date +%F).tar.gz /etc /var/www 增量备份:使用rsync --inplace --backup-dir。 应急响应流程: 发现异常进程:使用kill -9 <PID>终止,结合netstat -antp查看连接来源。 检查可疑文件:ls -ltr /tmp(查看临时目录近期修改文件)、使用rkhunter扫描 Rootkit。 七、常用 Linux 安全工具列表 类别 工具 功能描述 防火墙 iptables/firewalld 配置网络流量过滤规则 入侵检测 OSSEC、Tripwire 监控系统异常和文件篡改 bug扫描 Lynis、OpenVAS 检测系统配置缺陷和软件bug 日志分析 Logwatch、GoAccess 生成日志报告、可视化 Web 访问日志 安全审计 sudo-audit、auditd 记录 sudo 操作、系统调用审计 加密工具 GPG、LUKS 文件加密、磁盘加密 网络监控 nmap、tcpdump、iftop 端口扫描、抓包分析、流量监控 八、云环境下的 Linux 安全补充 容器安全: 使用Docker Security Scanning扫描镜像bug。 限制容器权限:docker run --security-opt=no-new-privileges。 云服务商工具: AWS:EC2 Instance Metadata Service (IMDSv2) 防窃取元数据。 阿里云:开启安全组隔离、使用云盾主机安全。
2025年-4月-23日
10 阅读
0 评论
网络安全
2025-4-23
MCP与A2A协议关系及区别解析
MCP和A2A是两种不同的AI通信协议,它们的用途和定位不同。 核心区别 MCP 作用:负责AI之间的连接和调度,比如让AI A能找到AI B并建立通信。 类比:像“电话拨号系统”——只管打通电话,不关心通话内容。 适用场景:需要快速匹配不同AI的场景,比如一个AI需要临时调用另一个AI的服务。 A2A 作用:规范AI之间的数据交换格式和语义,确保它们能正确理解对方的信息。 类比:像“商务沟通模板”——规定双方要用什么格式、术语来交流。 适用场景:需要精确数据交互的场景,比如医疗AI向数据分析AI请求特定格式的患者统计。 关系 它们可以配合使用: MCP先建立连接(让两个AI能互相找到对方)。 A2A再规范对话(确保它们用同一种“语言”交流)。 哪个更好? 如果你需要快速调用不同AI(比如让智能家居AI临时询问天气AI),MCP更合适。 如果你需要精准的数据交换(比如金融AI向风控AI发送结构化数据),A2A更合适。 最佳方案:两者结合,MCP负责“找人”,A2A负责“聊天”。 推荐阅读 App压力测试 JMeter_实现分组并发 Seleium的BUG:页面元素文案重复空格处理 自动化关键数据记录 WebView自动化测试 我们是如何测试人工智能的(一)基础效果篇(内含大模型的测试内容)
2025年-4月-23日
13 阅读
0 评论
人工智能
2025-4-23
用文心快码(Comate)打造“有温度的营养师”,智能代码让女朋友爱上吃早餐
我是一个连"循环"和"轮回"都分不清的编程小白。最近发现女朋友因为工作太忙,经常不吃早餐,说了八百遍"记得吃早饭"也没用。作为一个不懂编程的暖男,我决定用文心快码(Baidu Comate)给她做个专属早餐提醒APP! 虽然我连"Hello World"都写不利索,但用了文心快码(Baidu Comate)后,居然真的做出了一个会卖萌、会提醒、还能记录饮食健康的智能APP! 我需要先想想,女朋友需要什么样的早餐管家?普通闹钟提醒太冰冷,我们要的是个"有温度的营养师",要有智能提醒,不是简单弹窗,而是根据她的作息动态调整提醒时间;要有早餐推荐,每天自动推荐不同的营养搭配(周一牛奶+全麦面包,周二燕麦+水果...);还要有成就系统,连续7天吃早餐解锁"健康小仙女"称号。如果三次提醒都没响应,自动给我发SOS警报。 怎样让AI听懂你的浪漫?打开文心快码(Baidu Comate),用"直男都能懂"的语言描述需求:"帮我写一个基于Python 3.11的早餐提醒APP,要求:每天早上根据女友作息(8:00-9:00间)弹出温馨提醒;界面要可爱,有卡通早餐图案和卖萌文案;每日推荐不同的营养早餐组合;记录用餐情况,生成每周健康报告...... 说到百度的文心快码(Baidu Comate),就不得不提它的明星产品——Zulu。想象一下,有一个超级智能的小助手,它不仅能瞬间读懂你对代码的想法,还能迅速帮你写出和补全代码,这简直就是给你的键盘装上了一个加速器嘛!这一切,都多亏了百度文心大模型的超强支持。有了Zulu的帮助,编程这件事变得前所未有的简单高效,就算是刚入门的新手,也能像经验丰富的老手一样,在编程的世界里自由驰骋,轻松把自己脑海中的奇思妙想变为现实。 想让女朋友离不开这个APP?还可以加这些"小心机":早安天气预报(提醒时附带今日气温和穿衣建议),早餐自拍挑战(完成打卡后弹出"来张元气自拍?"),情侣任务(周末弹出"今天一起吃brunch吧!")。 虽然代码是文心快码(Baidu Comate)写的,但这份心意绝对100%纯手工打造! 在最近的百度Create开发者大赛上,有一个特别有趣的擂台赛环节。这里简直就是编程小白的天堂!参赛者们通过使用百度的文心快码(Baidu Comate)这个超棒的开发助手,轻松搞定了从游戏开发到网页设计等多个项目。想象一下,即便是对编程一知半解的新手,也能像给女朋友制作一个充满爱意的早餐提示APP那样简单又有趣地完成这些任务。真的是让人感觉,只要有好的工具在手,编程这件事儿也可以变得如此轻松愉快!
2025年-4月-23日
13 阅读
0 评论
人工智能
2025-4-22
深盾安全加固:Android 应用的安全守护者
在移动应用生态蓬勃发展的当下,Android 应用面临着复杂且严峻的安全挑战。破解、篡改、盗版、数据窃取、钓鱼欺诈等威胁,时刻威胁着应用的安全性与开发者的权益。深盾安全加固作为专业的移动加固工具,为 Android 应用构建起一道坚固的安全防线。 全方位功能,抵御安全威胁 深盾安全加固采用指令级代码混淆、代码虚拟化、代码加密等多种技术手段,对代码逻辑进行深度保护,有效防止应用代码被反编译和逆向分析;通过严格校验 APK 开发者签名,杜绝应用被二次打包、植入广告或恶意代码的风险;具备强大的防调试能力,可抵御 IDA、JEB 等专业工具的调试与动态代码逻辑分析,确保应用运行安全无虞。 核心技术,筑牢安全壁垒 DEX 文件加密隐藏技术,为 DEX 文件加壳,避免代码被窃取与反编译;SO 区段压缩加密、SO 代码混淆及虚拟化技术,对 SO 库进行多维度保护,防止被反编译、打补丁与动态调试;单步断点检测、防动态调试等功能,进一步增强应用抵御调试攻击的能力;开发者签名校验与 SO 内存完整性校验,从多个环节保障应用的原始性与完整性;DEX 虚拟机保护技术,对 dalvik 字节码虚拟化处理,提升逆向分析难度。 显著优势,保障应用安全 深盾安全加固拥有行业领先的不依赖 LLVM 的 Native 层代码混淆虚拟化技术,在确保安全性的同时,兼顾性能表现;加固过程不插入无关代码、不收集用户信息,尊重用户隐私;无需更改开发环境,操作简便,易于上手;保护过程本地完成,不上传开发者与程序信息,严守数据安全;加固前后 APK 大小几乎无变化,保障应用流畅运行。 多元应用场景,守护应用价值 无论是面临盗版篡改、恶意代码注入的风险,还是担忧核心代码被窃取、源代码被反编译,亦或是担心收费程序被破解造成商业损失,深盾安全加固都能提供可靠的安全解决方案,全方位守护 Android 应用的核心竞争力与商业价值。
2025年-4月-22日
16 阅读
0 评论
网络安全
2025-4-22
宁德时代骁遥双核电池发布:双核架构 + 自生成负极技术,适配各种材料体系
宁德时代骁遥双核电池今日正式发布,其采用双核架构 + 自生成负极技术,具备跨体系、跨电量、跨电压特性。IT之家从宁德时代超级科技日现场获悉,宁德时代骁遥双核电池首创“电电增程”技术,覆盖全价位、全车型、全场景,其分为主能量区(可选不同化学体系电池,满足日常用车需求)和增程能量区(自生成负极电池,满足长途出行需求)。
2025年-4月-22日
21 阅读
0 评论
手机数码
10
11
12
13
14