博客

  • 工业通讯的进化:从Modbus到ProfiNET

    在工业自动化的世界里,通讯协议就像是语言,让机器之间能够互相理解和协作。随着技术的进步,我们见证了从Modbus到ProfiNET的转变,这不仅仅是技术的升级,更是对工业自动化需求的深刻理解。

    一、Modbus:简单而经典的选择

    Modbus,这个诞生于1979年的通讯协议,以其简单易用的特性,成为了工业自动化领域的宠儿。它支持RS-232、RS-485和以太网等多种通信方式,让设备之间的数据交换和远程控制变得轻而易举。然而,随着工业自动化的发展,Modbus在数据传输速度、安全性和扩展性方面的局限性也逐渐显现。

    二、ProfiNET:现代工业的新宠

    为了应对这些挑战,ProfiNET应运而生。作为PROFIBUS用户组织推出的工业以太网标准,ProfiNET基于以太网技术,提供了高速、实时的数据传输能力。它不仅支持实时以太网、运动控制和分布式自动化等多种通信机制,而且在数据传输速率、安全性和扩展性方面都有着显著的优势。

    三、优缺点的对比与应用场景

    Modbus的优点在于其简单性、成本效益和兼容性,使其成为小型或成本敏感项目的理想选择。然而,它的速度限制、安全性不足和扩展性有限也成为制约其发展的瓶颈。

    ProfiNET的优点则在于其高速传输、安全性和扩展性,使其成为大型工业自动化项目的首选。尽管初期投资可能较高,且协议相对复杂,需要专业知识进行配置,但其带来的长期效益是显而易见的。

    四、实际场景下的转变

    让我们通过一个制造工厂的例子来具体看看这种转变。假设这个工厂最初使用的是基于Modbus的控制系统。随着生产规模的扩大和自动化需求的提高,原有的Modbus系统已无法满足需求。为了解决这些问题,工厂决定升级到ProfiNET系统。

    在升级过程中,工厂需要将现有的Modbus设备通过网关或适配器转换为ProfiNET兼容设备。例如,原本通过Modbus与传感器和执行器通信的PLC,现在通过安装ProfiNET适配器,能够以更高的速度和更强的安全性与这些设备通信。同时,工厂还部署了ProfiNET交换机来构建一个高速、可靠的网络基础设施。

    通过这种转换,工厂不仅提高了生产效率,还增强了系统的安全性和未来的可扩展性。这正是从Modbus到ProfiNET转变的生动写照,也是工业通讯进化的必然趋势。

    结语

    随着工业4.0的推进,我们有理由相信,ProfiNET将会在工业通讯领域扮演越来越重要的角色。而对于Modbus,它仍然是许多小型或成本敏感项目的理想选择。技术的演进不是一蹴而就的,它需要我们不断地探索和适应。让我们拭目以待,工业通讯的明天将会更加精彩。


    在Java领域,存在一些开源项目和库,它们旨在提供与工业通信协议如ProfiNET的兼容性或实现相关的功能。以下是一些可能与ProfiNET相关的Java开源项目:

    1. Eclipse Milo – Eclipse Milo 是一个开源的OPC UA (Open Platform Communications Unified Architecture) 客户端和服务器SDK,它提供了Java实现。虽然它不是直接针对ProfiNET的,但OPC UA是与ProfiNET可以互操作的工业通信协议。 GitHub链接: https://github.com/eclipse/milo
    2. JOPC – JOPC是一个Java库,用于实现OPC UA协议栈。与Eclipse Milo类似,它不是直接针对ProfiNET,但可以用于与使用OPC UA的ProfiNET设备进行通信。 GitHub链接: https://github.com/FreeOpcUa/JOPC
    3. Apache MINA – Apache MINA 是一个网络应用框架,可以帮助开发高性能和高可靠性的网络服务器和客户端。虽然它本身不是工业通信协议的实现,但可以用作构建与ProfiNET兼容应用程序的基础。 Apache链接: https://mina.apache.org/
    4. Modbus4j – Modbus4j 是一个用于Modbus协议的Java实现。虽然Modbus与ProfiNET不同,但了解Modbus的实现可能有助于开发与ProfiNET兼容的Java应用程序。 GitHub链接: https://github.com/jfhaugh/modbus4j
    5. ProfiBASIC – ProfiBASIC 是一个开源的Profibus通信库,虽然它不是用Java编写的,但它提供了一些可以与Java应用程序交互的接口。 GitHub链接: https://github.com/profibasic/profibasic

    由于ProfiNET是一个专有的工业通信协议,没有开源的Java实现。但是,通过使用上述项目或库,开发者可以构建与ProfiNET设备通信的Java应用程序。此外,由于工业通信协议的复杂性和专有性,建议在实际应用中与协议的官方提供者或授权供应商合作,以确保兼容性和安全性。


    OPC UA(Open Platform Communications Unified Architecture)是一个独立于平台和语言的工业通信标准,由OPC基金会(OPC Foundation)开发和维护。OPC UA旨在解决传统OPC技术中的一些限制,并提供一种统一的、跨平台的通信方式,以支持工业自动化和物联网(IoT)环境中的设备和系统之间的互操作性。

    OPC UA 的主要特点:

    1. 跨平台和语言中立性:OPC UA可以在不同的操作系统和编程语言上运行,支持多种编程语言,如C#、Java、C++等。
    2. 服务导向架构(SOA):OPC UA基于服务导向架构,提供了一套标准化的服务,使得不同的系统和设备能够通过定义良好的接口进行通信。
    3. 安全性:OPC UA内置了高级的安全机制,包括传输层和消息层的安全,支持用户认证、数据加密和完整性保护。
    4. 数据模型:OPC UA具有强大的数据模型,可以表示复杂的数据结构,支持不同类型的数据,如标量数据、数组、结构体和复杂对象。
    5. 实时性和同步机制:OPC UA支持实时数据交换和同步机制,适用于需要快速响应的工业应用。
    6. 发现和注册服务:OPC UA提供了发现服务,使得客户端可以发现网络上的服务器和服务,以及注册服务,允许设备和服务注册到全球可访问的注册服务器。
    7. 事件和报警:OPC UA支持事件和报警的发布和订阅,允许用户定义和接收事件通知。
    8. 多语言支持:OPC UA支持多语言环境,可以处理多种语言的标签和描述。
    9. Web服务:OPC UA提供了基于HTTP和WebSocket的Web服务,使得Web应用程序能够与OPC UA服务器进行通信。

    OPC UA 的应用场景:

    • 工业自动化:OPC UA广泛应用于工业自动化领域,用于实现机器、传感器、控制器和其他工业设备之间的通信。
    • 企业系统集成:OPC UA可以作为企业资源规划(ERP)系统和制造执行系统(MES)之间的桥梁,实现数据的无缝集成。
    • 智能制造:在智能制造和工业4.0的背景下,OPC UA支持机器学习和数据分析工具与工业设备的集成。
    • 物联网(IoT):OPC UA支持与各种IoT设备和平台的集成,实现设备管理和数据收集。

    OPC UA 的实现:

    OPC UA标准定义了一套协议和接口,许多公司和开源项目提供了OPC UA的实现。例如,Eclipse Milo、FreeOpcUa、open62541等都是流行的开源OPC UA服务器和客户端库。

    OPC UA是一个强大的工业通信协议,它通过提供跨平台、安全的通信机制,支持复杂的数据模型和实时性,已经成为现代工业自动化和智能制造领域的关键技术之一。

  • 从Modbus转向ProfiNET

    在当前的工业自动化和智能制造领域,通信技术的进步不仅优化了生产效率,还显著提升了操作的安全性和系统的可扩展性。今天,我们将探讨为何将传统的Modbus通信协议转换为更现代的ProfiNET协议,以及这一转变对工业实践的深远影响。

    Modbus与ProfiNET的基本概念

    Modbus 是一种应用层协议,广泛应用于工业环境中,以实现设备间的数据通信。它支持多种通信方式,如RS-232、RS-485和以太网等。Modbus的设计简单易用,使其成为小型系统中的首选协议。然而,它的数据传输速度和安全性较低,难以满足更大规模和更复杂系统的需求。

    ProfiNET 则是基于以太网的工业通信技术,由PROFIBUS用户组织推出。这一标准不仅保证了高速的数据传输能力,还支持实时通信,适应了大规模和复杂网络的需求。ProfiNET在安全性和扩展性方面都有显著优势,能够支持现代工业自动化的高要求。

    为何从Modbus转向ProfiNET

    1. 性能提升:ProfiNET提供比Modbus更快的数据传输速率,这对于需要实时或近实时反馈的生产过程尤为关键。
    2. 安全性加强:在当前网络攻击日益频繁的背景下,ProfiNET的高级安全机制,如端到端加密,提供了比Modbus更为强大的数据保护。
    3. 未来兼容性:随着工业4.0和数字化转型的推进,ProfiNET的扩展性保证了它能够适应未来更加复杂的自动化需求和新兴技术的整合。

    实际应用案例

    设想一个初始使用Modbus协议的制造工厂,随着生产规模的扩大和技术的进步,原有系统已无法满足工厂的运营需求。工厂决定升级其生产线控制器为ProfiNET。在这一过程中,通过安装适配器将原有的Modbus设备转换为支持ProfiNET的设备,工厂的PLC(可编程逻辑控制器)能够与传感器和执行器进行更高速的通信。此外,部署ProfiNET交换机也构建了一个更高效、可靠的网络基础设施。

    通过这种改造,工厂不仅显著提升了生产效率,还增强了系统的安全性和扩展性,为未来的进一步自动化和智能化升级打下了坚实的基础。

    结论

    转换从Modbus到ProfiNET的决策,是工业企业在追求更高效、更安全和更可扩展的生产系统过程中的重要步骤。随着技术的不断发展,这种转变不仅有助于企业保持竞争力,还能够更好地适应未来市场的变化和挑战。

  • 打破不可能三角:WISE如何重新定义大语言模型的知识记忆

    在科技日新月异的今天,大语言模型(LLMs)的应用越来越广泛。然而,随着世界知识的不断更新,这些模型也需要不断地进行知识更新,以纠正错误的回答和应对新兴的事实。这就引出了一个重要的问题:模型的记忆如何管理和更新?本文将介绍一项名为WISE的创新方法,旨在解决大语言模型的知识记忆问题。

    大语言模型的挑战

    大语言模型在扩展参数数量和计算能力方面展现出了惊人的智能潜力。然而,这些模型在实际应用中仍然会犯错,例如产生幻觉、不准确的回答以及偏见等问题。同时,世界的知识是不断变化的,因此模型在预训练期间所学的知识可能已经过时。

    为了应对这些挑战,研究人员提出了“终身模型编辑”的概念,即在不需要重新训练或微调的情况下,持续地更新模型的知识。这种方法不仅能够节省大量的计算成本,还能确保模型能够及时响应最新的知识和事实。

    不可能三角:可靠性、泛化性和局部性

    有效的终身模型编辑方法需要满足以下三个特性:

    1. 可靠性:模型在进行一系列编辑后,能够记住当前和之前的所有编辑。
    2. 局部性:编辑操作不会影响与编辑内容无关的预训练知识。
    3. 泛化性:模型不仅仅是记住查询和目标对,而是能够理解并泛化这些知识。

    然而,现有的方法在这三个特性上往往无法同时满足。这被称为“终身编辑的不可能三角”。

    现有方法的局限性

    现有的方法主要分为两类:编辑长期记忆和编辑工作记忆。长期记忆是指直接编辑模型的参数,这种方法容易与预训练的知识产生冲突,导致局部性差。工作记忆是指通过检索机制在推理时替换模型的表示,而不改变模型参数。这种方法虽然在可靠性和局部性上表现较好,但在泛化性上表现不佳,因为检索机制难以让模型理解和泛化编辑内容。

    WISE:桥接长期记忆与工作记忆的创新方案

    WISE(智慧编辑)通过引入双重参数记忆机制,克服了上述不可能三角。它包括主记忆(存储预训练知识)和侧记忆(存储编辑知识)。具体来说,WISE设计了以下组件:

    1. 侧记忆设计:侧记忆是从模型的某层前馈网络(FFN)中复制出来的一部分,用于存储编辑流。通过这种方式,编辑操作只影响侧记忆,不会改变主记忆,从而避免了知识冲突。
    2. 记忆路由机制:类似于检索机制,WISE通过一个路由组件来决定在推理时是使用主记忆还是侧记忆。
    3. 知识分片与合并:为了避免知识遗忘,WISE将侧记忆分成多个子空间进行编辑,然后通过模型合并技术将这些子空间合并成一个共同的侧记忆。

    实验与结果

    通过在GPT、LLaMA和Mistral等主流大语言模型上的广泛实验,WISE在问答、幻觉和分布外数据集上的表现优于现有的模型编辑方法。实验结果表明,WISE能够在终身模型编辑中更好地同时实现可靠性、泛化性和局部性,打破了不可能三角。

    结语

    WISE的出现为大语言模型的终身编辑带来了新的希望。它通过巧妙的记忆管理和编辑机制,不仅解决了长期记忆与工作记忆之间的矛盾,还为模型的持续进化提供了强有力的支持。未来,随着技术的不断发展,我们有理由相信WISE及其衍生技术将在更多应用场景中发挥重要作用。


    WISE: Rethinking the Knowledge Memory for Lifelong Model Editing of Large Language Models

    https://papers.cool/arxiv/2405.14768

    Authors: Peng Wang ; Zexi Li ; Ningyu Zhang ; Ziwen Xu ; Yunzhi Yao ; Yong Jiang ; Pengjun Xie ; Fei Huang ; Huajun Chen

    Summary: Large language models (LLMs) need knowledge updates to meet the ever-growing world facts and correct the hallucinated responses, facilitating the methods of lifelong model editing. Where the updated knowledge resides in memories is a fundamental question for model editing. In this paper, we find that editing either long-term memory (direct model parameters) or working memory (non-parametric knowledge of neural network activations/representations by retrieval) will result in an impossible triangle — reliability, generalization, and locality can not be realized together in the lifelong editing settings. For long-term memory, directly editing the parameters will cause conflicts with irrelevant pretrained knowledge or previous edits (poor reliability and locality). For working memory, retrieval-based activations can hardly make the model understand the edits and generalize (poor generalization). Therefore, we propose WISE to bridge the gap between memories. In WISE, we design a dual parametric memory scheme, which consists of the main memory for the pretrained knowledge and a side memory for the edited knowledge. We only edit the knowledge in the side memory and train a router to decide which memory to go through when given a query. For continual editing, we devise a knowledge-sharding mechanism where different sets of edits reside in distinct subspaces of parameters, and are subsequently merged into a shared memory without conflicts. Extensive experiments show that WISE can outperform previous model editing methods and overcome the impossible triangle under lifelong model editing of question answering, hallucination, and out-of-distribution settings across trending LLM architectures, e.g., GPT, LLaMA, and Mistral. Code will be released at https://github.com/zjunlp/EasyEdit.


    Q: 这篇论文试图解决什么问题?

    A: 这篇论文试图解决大型语言模型(Large Language Models, LLMs)在持续更新知识以适应不断变化的世界知识和纠正错误响应(例如幻觉、偏见和事实衰减)时面临的挑战。具体来说,论文关注的核心问题是如何在模型编辑(model editing)过程中有效地更新知识,以实现以下目标:

    1. 可靠性(Reliability):模型能够在连续编辑后记住当前和之前的编辑。
    2. 局部性(Locality):模型编辑不会影响与编辑知识无关的预训练知识。
    3. 泛化性(Generalization):模型不仅仅是记忆查询-目标对,而应该能够在给定相同知识的不同形式查询时理解和泛化。

    论文指出,在现有的模型编辑方法中,很难同时实现上述三个目标,这构成了一个“不可能三角”。作者通过提出WISE(Wise Editor)系统,旨在弥合长期记忆(模型参数)和工作记忆(通过检索得到的神经网络激活/表示)之间的差距,打破这一不可能三角,实现更有效的终生模型编辑。

    Q: 有哪些相关研究?

    A: 这篇论文提到了多个与大型语言模型(LLMs)的知识和记忆更新相关的研究工作。以下是一些主要的相关研究:

    1. 长期记忆与工作记忆:论文讨论了LLMs中的长期记忆(存储在模型参数中)和工作记忆(存储在神经元激活中)的概念,并引用了相关研究来支持这一分类。
    2. 模型编辑:论文提到了几种模型编辑方法,包括:
      • ROME:使用MLP(多层感知器)作为关键-值存储,通过最小二乘近似进行编辑。
      • MEMIT:扩展了ROME,支持多层编辑,允许同时更新成百上千的事实。
      • FT-EWC:使用弹性权重巩固(Elastic Weight Consolidation)来减轻灾难性遗忘。
      • MEND:使用超网络(hypernetworks)来转换梯度,以实现更泛化的编辑。
      • SERAC/DEFER:使用额外的小模型来存储编辑知识,并通过一个范围分类器和反事实模型进行检索和生成。
      • GRACE:使用离散的键-值码本,在推理时检索并替换隐藏层的激活。
    3. 记忆增强:论文讨论了一些旨在增强LLMs记忆能力的研究,例如:
      • MemoryLLM:提出一种具有可更新记忆的LLM架构。
      • SPALM:结合了工作记忆和长期记忆的存储模块。
      • Memoria:一种类似于人类顺序处理的Hebbian记忆架构。
    4. 知识注入:论文探讨了如何通过不同的方法向LLMs注入或更新知识,包括原位学习(in-context learning)和检索增强生成(retrieval-augmented generation)。
    5. 模型融合:论文提到了一些模型融合技术,这些技术研究如何将不同模型的知识聚合到一个模型中,例如:
      • TIES-Merging:一种解决干扰并合并模型参数的方法。
      • MergeKit:一个用于合并大型语言模型的工具包。
    6. 持续学习:论文讨论了持续学习领域中的一些方法,这些方法旨在解决深度学习模型在学习新知识时遭受的灾难性遗忘问题。
    7. 其他:论文还提到了一些其他与LLMs的编辑、记忆和知识更新相关的研究。

    这些研究为理解LLMs的记忆机制、改进模型编辑方法以及解决知识更新中的挑战提供了理论基础和实践指导。论文通过综合这些研究成果,提出了WISE系统,旨在克服现有方法的局限性,实现更有效的终生模型编辑。

    Q: 论文如何解决这个问题?

    A: 论文通过提出WISE(Wise Editor)系统来解决大型语言模型(LLMs)在持续知识更新和模型编辑中遇到的挑战。WISE系统的设计包含以下几个关键组件和策略:

    1. 双参数记忆方案:WISE引入了一个主记忆(main memory)和一个侧记忆(side memory)。主记忆用于存储预训练知识,而侧记忆用于存储编辑后的知识。
    2. 记忆路由机制:WISE训练了一个路由器(router),在给定查询时决定通过哪个记忆(主记忆或侧记忆)进行处理。这类似于基于检索的方法,允许模型在处理与编辑相关的查询时使用侧记忆,而在处理不相关的查询时使用主记忆。
    3. 知识分割与合并:为了持续编辑,WISE设计了一种知识分割机制,将不同的编辑集合存储在参数的不同子空间中。这些子空间随后通过一种称为Ties-Merge的模型合并技术合并到一个共享的侧记忆中,避免了冲突。
    4. 侧记忆设计:侧记忆被初始化为LLM的某个FFN(Feed-Forward Network)层的副本,专门用于存储编辑流。这种方法避免了直接在原始参数上进行编辑,从而减少了对预训练知识的干扰。
    5. 路由激活指示:为了在推理时确定使用主记忆还是侧记忆,WISE引入了一个基于激活的路由指示器。这个指示器基于输入查询的激活值来决定使用哪个记忆。
    6. 随机梯度掩码:在知识分割过程中,WISE使用随机梯度掩码来编辑侧记忆的不同子空间。这些掩码是二进制的,其中一部分参数被随机选择进行更新,而其余参数保持不变。
    7. Ties-Merge合并技术:为了合并不同子空间的知识,WISE采用了Ties-Merge技术,该技术通过修剪冗余参数、选择参数的符号以及计算具有相同正确符号的参数的不相交平均值来解决冲突。

    通过这些设计和策略,WISE旨在实现在LLMs的终生模型编辑中的高可靠性、局部性和泛化性,克服了现有方法难以同时实现这三个目标的“不可能三角”问题。论文通过在不同的LLM架构(如GPT、LLaMA和Mistral)上进行广泛的实验,验证了WISE在问答、幻觉和分布外设置下的有效性。

    Q: 论文做了哪些实验?

    A: 论文中进行了一系列实验来验证WISE(Wise Editor)系统在终生模型编辑中的有效性。以下是实验的主要设置和结果:

    1. 实验设置
      • 数据集:使用了ZsRE(闭卷问答任务)、SelfCheckGPT(幻觉检测)、Temporal(分布外泛化)等数据集。
      • 模型:选择了流行的自回归大型语言模型LLaMA-2-7B、Mistral-7B和GPT-J-6B进行评估。
      • 基线:与多种现有的模型编辑和持续学习方法进行了比较,包括FT-L、FT-EWC、ROME、MEMIT、MEND、SERAC/DEFER和GRACE。
    2. 评估指标
      • 可靠性(Reliability):模型在编辑后能够正确预测编辑查询的能力。
      • 泛化性(Generalization):模型对不同形式查询的理解和泛化能力。
      • 局部性(Locality):模型编辑不会影响与编辑无关的预训练知识。
    3. 主要结果
      • WISE在多个任务和长期编辑序列后的表现优于现有方法。
      • 直接编辑长期记忆的方法(如ROME、MEMIT等)与之前的预训练知识产生冲突,导致局部性差。
      • 基于检索的工作记忆修改激活的方法(如GRACE、DEFER等)在多样化查询中泛化能力不足。
    4. 分布外评估
      • 使用Temporal数据集测试了模型编辑方法在新兴实体上的分布外泛化能力。WISE在处理分布外泛化任务时表现优异。
    5. 进一步分析
      • 路由激活的可视化:展示了WISE的记忆路由模块在不同编辑次数下的激活值,证明了其在保持编辑局部性和防止预训练分布发生大的变化方面的效果。
      • 侧记忆的定位分析:分析了在不同阶段的解码器层中编辑的效果,发现中后层是理想的侧记忆层。
      • ρ和k的分析:研究了WISE中重要的超参数——掩码比例ρ和子空间数量k,发现存在一个固有的合并锚点和合并冲突之间的权衡。
      • 扩展到3K次编辑:将连续编辑次数扩展到3K,发现WISE系列在高可扩展性方面保持了高性能。
    6. 推理时间分析
      • 分析了WISE在不同编辑次数下的推理时间,发现WISE-Merge引入了恒定的推理延迟,而WISE-Retrieve由于引入了检索路由,随着编辑次数的增加,推理时间有所增加。

    通过这些实验,论文证明了WISE在大型语言模型的终生编辑中实现了高可靠性、局部性和泛化性,克服了现有技术的局限。

    Q: 有什么可以进一步探索的点?

    A: 尽管WISE在终生模型编辑方面取得了显著的成果,但仍有一些潜在的探索方向可以进一步改进和扩展其能力:

    1. 侧记忆检索的改进:如文中所述,侧记忆检索的准确性有待提高。可以通过更精细的激活管理或增强侧记忆之间的特异性来改进检索过程。
    2. 编辑指令的优化:在某些情况下,WISE在处理特定编辑指令时可能会出现错误。研究如何优化编辑指令以提高模型的准确性和一致性可能是一个有价值的方向。
    3. 跨领域编辑能力:WISE在单一数据集上的性能较好,但在跨领域编辑时可能会遇到挑战。探索如何使WISE能够更好地处理不同领域的知识编辑是一个重要的研究方向。
    4. 知识锚点的作用:文中提到知识锚点在模型合并中的重要性。进一步研究如何利用知识锚点来提高模型的泛化能力和稳定性值得深入探讨。
    5. 计算成本的优化:虽然WISE在计算成本方面表现出了较好的效率,但随着编辑次数的增加,如何更有效地管理计算资源仍然是一个值得关注的点。
    6. 模型泛化性的进一步提升:尽管WISE在某些任务上表现出了良好的泛化能力,但在某些情况下,如文中所述的一般化失败案例,模型的泛化性仍有提升空间。
    7. 模型解释性:提高模型编辑过程的可解释性,帮助研究人员和用户理解模型是如何进行知识更新和决策的,这对于建立信任和透明度至关重要。
    8. 安全性和伦理考量:随着技术的发展,确保模型编辑过程符合伦理标准并防止滥用是非常重要的。研究如何设计安全防护措施和伦理指导原则是一个关键议题。
    9. 多模态编辑能力:当前的研究主要集中在文本编辑上,未来可以探索如何将WISE扩展到多模态场景,例如结合图像、视频和文本进行知识编辑。
    10. 实时编辑和增量学习:研究如何使WISE能够支持实时编辑和增量学习,这对于动态环境中的知识更新尤为重要。
    11. 与其他记忆增强技术的集成:考虑将WISE与其他记忆增强技术(如增强工作记忆或长期记忆的方法)结合,以进一步提升LLMs的记忆和编辑能力。
    12. 社区和开源协作:鼓励社区参与和开源协作,以便集思广益,共同推动终生模型编辑技术的发展和应用。

    这些探索点不仅可以推动WISE技术的进步,还可能对整个大型语言模型编辑和持续学习领域产生深远影响。

    Q: 总结一下论文的主要内容

    A: 这篇论文的主要内容可以概括为以下几点:

    1. 问题识别:论文指出大型语言模型(LLMs)在持续更新知识和纠正错误响应时面临挑战。现有的模型编辑方法难以同时实现可靠性、局部性和泛化性,构成了一个“不可能三角”。
    2. WISE系统:为了解决这个问题,论文提出了WISE(Wise Editor)系统。WISE采用双参数记忆方案,包括主记忆和侧记忆,并通过路由器决定在给定查询时使用哪个记忆。
    3. 知识分割与合并:WISE引入了知识分割机制,将编辑知识存储在不同的参数子空间中,并通过Ties-Merge技术合并这些子空间,避免了知识冲突。
    4. 侧记忆设计:侧记忆被初始化为LLM的某个FFN层的副本,专门用于存储编辑流,避免了直接在原始参数上进行编辑。
    5. 路由激活指示:WISE使用基于激活的路由指示器来决定在推理时使用主记忆还是侧记忆。
    6. 实验验证:论文通过在问答、幻觉检测和分布外泛化等任务上的实验,验证了WISE在不同LLM架构(如GPT、LLaMA和Mistral)上的有效性。
    7. 分析与讨论:论文对WISE的路由激活、侧记忆定位、超参数选择等进行了深入分析,并讨论了如何改进检索准确性和模型泛化能力。
    8. 结论:WISE成功克服了现有终生模型编辑方法的局限,实现了高可靠性、局部性和泛化性的统一,为大型语言模型的知识更新提供了一种有效的解决方案。
    9. 未来工作:论文提出了一些未来可能的研究方向,包括改进侧记忆检索、优化编辑指令、提高跨领域编辑能力和模型泛化性等。

    整体而言,这篇论文在终生模型编辑领域做出了重要贡献,提出了一种创新的解决方案,并对其进行了全面的评估和分析。

  • 大型语言模型如何应对长篇数学文本问题

    近年来,随着人工智能技术的迅猛发展,大型语言模型(LLMs)在解决数学问题方面展现出了巨大的潜力。然而,当前的研究大多集中在那些背景简短的问题上。现实生活中的数学问题往往涉及复杂的叙述和背景,这对大型语言模型提出了更高的要求。本文将探讨LLMs在解决长篇数学文本问题(MWPs)方面的能力,并介绍一种名为E-GSM的新数据集及相关研究成果。

    背景介绍

    数学文本问题(MWPs)是以自然语言形式呈现的数学问题,需要精细的推理能力来解决。传统的数学问题数据集,如GSM8K,通常包含简短的叙述,只有几句话。然而,这种设置与现实世界中的情况存在差异。现实中的数学问题往往有更长的背景,这可能会对数学推理过程产生影响。研究表明,长篇背景可能会阻碍而不是促进数学推理过程。

    研究目的

    本研究的主要目的是探讨LLMs在解决长篇数学文本问题(CoLeG,即Context Length Generalizability)的能力。为此,我们构建了一个名为Extended Grade-School Math(E-GSM)的数据集,这个数据集包含了从GSM8K扩展而来的长篇数学问题。我们还提出了两种新的指标来评估LLMs在解决这些问题时的效率和韧性。

    研究方法

    数据集构建

    E-GSM数据集的构建过程主要包括以下几个步骤:

    1. 初始数据选择:从GSM8K测试集中选择问题。
    2. 文本扩展:使用GPT-4-turbo模型通过2-shot示例法对原始问题进行扩展。
    3. 质量控制:通过人工评估和启发式方法确保扩展问题的质量。

    我们通过多轮扩展逐步增加问题的长度,最终获得了一个包含多个扩展轮次问题的综合数据集。

    评估方法

    我们使用七个专有LLMs和20个开源LLMs,以及三种最先进的零样本提示技术对E-GSM进行了评估。结果表明,LLMs在长篇数学文本问题上的表现较弱,尤其是在处理更长的背景时。

    解决方案

    为了解决这个问题,我们针对专有LLMs和开源LLMs分别提出了不同的策略:

    1. 专有LLMs:我们开发了一种名为条件检索指令(CoRe)的新提示技术。这种技术鼓励LLMs首先检索问题条件,然后应用不同的推理模块。
    2. 开源LLMs:我们建议在微调过程中将扩展作为辅助任务,并发布了包含65K条链式推理数据的微调数据集。

    研究结果

    我们的实验结果表明,这些策略在E-GSM及其他多个MWP基准测试上都表现出了显著的效果和较强的泛化能力。具体来说,CoRe和扩展微调任务不仅提高了LLMs在E-GSM上的准确性,还展示了其在其他数学问题基准测试中的广泛适用性。

    结论

    LLMs在解决长篇数学文本问题上的能力对于其在现实世界应用中的重要性不言而喻。我们的研究表明,长篇数学问题会显著降低LLMs的数学推理能力。通过提出有针对性的解决方案,我们不仅改善了LLMs在长篇数学问题上的表现,也为未来研究提供了宝贵的方向和方法。

    本研究为LLMs在复杂、真实世界应用中的使用铺平了道路,提供了实用的解决方案,并为模型泛化能力和训练方法的进一步探索开辟了新的途径。


    本文参考了《Can LLMs Solve Longer Math Word Problems Better?》一文中的研究成果,旨在为读者提供关于大型语言模型在解决长篇数学文本问题方面最新进展的深入洞见。希望通过这篇文章,您能对这一前沿领域有更清晰的认识。

    Can LLMs Solve longer Math Word Problems Better?

    https://papers.cool/arxiv/2405.14804

    Authors: Xin Xu ; Tong Xiao ; Zitong Chao ; Zhenya Huang ; Can Yang ; Yang Wang

    Summary: Math Word Problems (MWPs) are crucial for evaluating the capability of Large Language Models (LLMs), with current research primarily focusing on questions with concise contexts. However, as real-world math problems often involve complex circumstances, LLMs’ ability to solve long MWPs is vital for their applications in these scenarios, yet remains under-explored. This study pioneers the exploration of Context Length Generalizability (CoLeG), the ability of LLMs to solve long MWPs. We introduce Extended Grade-School Math (E-GSM), a collection of MWPs with lengthy narratives. Two novel metrics are proposed to assess the efficacy and resilience of LLMs in solving these problems. Our examination of existing zero-shot prompting techniques and both proprietary and open-source LLMs reveals a general deficiency in CoLeG. To alleviate these challenges, we propose distinct approaches for different categories of LLMs. For proprietary LLMs, a new instructional prompt is proposed to mitigate the influence of long context. For open-source LLMs, a new data augmentation task is developed to improve CoLeG. Our comprehensive results demonstrate the effectiveness of our proposed methods, showing not only improved performance on E-GSM but also generalizability across several other MWP benchmarks. Our findings pave the way for future research in employing LLMs for complex, real-world applications, offering practical solutions to current limitations and opening avenues for further exploration of model generalizability and training methodologies.

  • 人工智能与教育:Ken Koedinger教授论智能辅导系统

    前国防部长唐纳德·拉姆斯菲尔德曾说过:“我们不清楚我们不知道的是什么。”这句话揭示了一个深刻的困境,即“未知的未知”,这是军方和数据科学家都熟悉的概念。

    同样的原则也适用于教育领域。卡内基·梅隆大学的人机交互和心理学教授肯·科丁格(Ken Koedinger)认为,这种不确定性动摇了传统的教学方式。他指出,学生在学习过程中可能表现不佳,因为他们往往无法判断自己是否真正掌握了知识,或者是否还需要更多的训练。

    为了解决这一问题,科丁格教授提倡使用人工智能(AI)作为辅助教学的工具,而不是替代教师。他认为,智能辅导系统可以为学生提供个性化的课程设计,避免重复学习已掌握的内容,同时收集数据来完善学习系统。

    1. 你知道什么时候该学习吗?

    在哈佛大学的演讲中,科丁格教授向应用计算科学研究所的50位与会者提出了一个问题:“你知道你什么时候该学习吗?”

    这个问题的回答往往是两极分化的,而科丁格教授认为,正确答案是“不知道”。研究表明,学生通常无法准确判断自己是否需要学习,他们自认为的学习状态实际上可能是一种错觉。

    喜欢 vs. 学会

    一个典型的例子是,学生们常常认为喜欢某一课程就意味着能够学得更好。然而,科丁格教授的研究表明,喜欢与学会之间的相关性很低。使用AI软件检测学生参与情况的结果显示,那些自称喜欢课程的学生可能会关注错误的内容,而那些看起来困惑的学生可能正处于有效的学习过程中。

    科丁格教授指出,学生缺乏必要的专业知识,无法将他们所知与实际掌握的知识区分开来。而教师们则往往高估了学生的理解能力。例如,在学习高中代数问题时,教师们认为方程式是学生最容易解决的形式,但学生实际上在基本的数学词汇上就遇到了困难。

    2. “以数据开始和结束”

    智能辅导系统,特别是其生成的数据,可能有助于弥补认知上的差距。科丁格教授讲述了卡内基·梅隆大学开发的智能辅导系统Cognitive Tutor及其背后的项目。

    Cognitive Tutor基于机器生成的认知模型和表现模型,已经存在了几十年。认知模型基于解决问题所需的技能、如何获得这些技能、问题管理规则以及学生可能犯的错误等。

    认知模型的算法

    认知模型使用两种算法来测量性能:

    1. 模型跟踪算法:通过跟踪学生的个人表现提供动态帮助,找出学生困惑的知识点以及困惑的原因。
    2. 贝叶斯知识跟踪算法:通过追踪学生所学知识点,评估学生的掌握情况。

    所有智能辅导系统的模型都产生数据,这对教育研究和改善学习系统至关重要。科丁格教授指出,这些改进是在一个以数据开始和结束的连续循环中进行的。研究人员使用A/B测试法(称为“体内测试”)进行随机、可控的实验,评估改进效果。

    数据还可以揭示学生的学习方式,通过生成学习曲线,映射学生的错误率,为改进提供依据。智能辅导系统产生的数据可以帮助教育者将广泛的话题拆分为具体的、细微的小问题来解决。

    科丁格教授举例说,类似于网球运动员在发球有问题时,找出具体原因并有针对性地练习,教育工作者也可以通过数据发现学生具体的学习问题,并在这些点上进行反复练习。


    科丁格教授主张通过数据驱动的智能辅导系统,不仅能够实现个性化教学,还能通过持续的数据反馈和改进,显著提升学生的学习效果。


    卡内基·梅隆大学的人机交互和心理学教授肯·科丁格(Ken Koedinger)提出了一个引人深思的观点:学生常常不知道他们真正掌握了什么。他引用前国防部长唐纳德·拉姆斯菲尔德的名言“未知的未知”来说明这一点,这种困境在教育中尤为显著。

    主要观点概括:

    1. 学生的学习自我评估往往不准确
      • 学生通常无法判断自己是否真正掌握了知识,容易陷入自我误导的学习状态。
      • 喜欢某一课程并不等同于学会该课程,学生可能会把注意力集中在错误的内容上。
    2. 教师的认知偏差
      • 教师们往往高估了学生的理解能力,低估了学生在基础知识上的困难。
      • 专家们对自己的知识缺乏意识,无法准确评估学生的困惑点。
    3. 智能辅导系统的作用
      • 通过AI和数据驱动的智能辅导系统,可以为学生提供个性化的课程设计,避免重复学习已掌握的内容。
      • 这些系统生成的数据可以帮助教育者识别学生的具体问题,并提供针对性的练习。

    补充说明和重点:

    科丁格教授提倡的智能辅导系统,如Cognitive Tutor,利用认知模型和表现模型,通过模型跟踪算法和贝叶斯知识跟踪算法,动态地评估学生的表现。这种方法不仅能识别学生困惑的知识点,还能了解学生困惑的原因,从而提供更有针对性的帮助。

    数据在这其中起到了至关重要的作用。通过持续的数据反馈,教育者可以进行“体内测试”(A/B测试),评估和改进教学方法。数据还可以揭示学生的学习方式,生成学习曲线,帮助教育者将复杂的学习任务拆分为具体的小问题进行解决。

    例如,在网球训练中,如果发现运动员发球有问题,通过数据分析可以找出特定的原因,如扔球的方式,然后进行针对性的练习。同样,智能辅导系统可以通过数据发现学生的具体学习问题,进行精细化的教学调整。

    Ken Koedinger教授的观点强调,通过数据驱动的智能辅导系统,不仅可以实现个性化教学,还能通过持续的数据反馈和改进,显著提升学生的学习效果。这种方法打破了传统的教学方式,为教育领域带来了新的可能性。

  • MySQL 事务一致性要求的级别

    在 MySQL 中,事务一致性级别是通过隔离级别(Isolation Level)来控制的。不同的隔离级别提供不同程度的事务隔离,以平衡一致性和性能。MySQL 支持以下几种隔离级别:

    1. READ UNCOMMITTED(未提交读):最低的隔离级别。事务可以读取其他事务尚未提交的更改,会导致“脏读”问题。
    2. READ COMMITTED(提交读):事务只能读取其他事务已经提交的更改,避免了“脏读”,但可能会出现“不可重复读”。
    3. REPEATABLE READ(可重复读):默认隔离级别。事务在开始时看到的数据一致,即使其他事务修改了数据,当前事务也不会看到这些更改,避免了“不可重复读”,但可能会出现“幻读”。
    4. SERIALIZABLE(可串行化):最高的隔离级别。事务完全隔离,强制事务串行执行,避免了“脏读”、“不可重复读”和“幻读”,但性能最差。

    要调低事务一致性要求,可以选择较低的隔离级别,如 READ COMMITTEDREAD UNCOMMITTED。以下是调整 MySQL 隔离级别的方法:

    调整全局隔离级别

    要调整 MySQL 实例的全局隔离级别,可以使用以下 SQL 语句:

    SET GLOBAL transaction_isolation = 'READ COMMITTED';

    或者:

    SET GLOBAL transaction_isolation = 'READ UNCOMMITTED';

    调整全局隔离级别需要重启 MySQL 服务才能生效,或者你可以启动一个新的会话来观察变化。

    调整会话隔离级别

    要调整当前会话的隔离级别,可以使用以下 SQL 语句:

    SET SESSION transaction_isolation = 'READ COMMITTED';

    或者:

    SET SESSION transaction_isolation = 'READ UNCOMMITTED';

    查看当前隔离级别

    要查看当前会话或全局的隔离级别,可以使用以下 SQL 语句:

    -- 查看当前会话的隔离级别
    SELECT @@session.transaction_isolation;
    
    -- 查看全局隔离级别
    SELECT @@global.transaction_isolation;

    示例

    以下是一个完整的示例,展示如何在 MySQL 中设置和查看隔离级别:

    -- 设置当前会话的隔离级别为 READ COMMITTED
    SET SESSION transaction_isolation = 'READ COMMITTED';
    
    -- 验证当前会话的隔离级别
    SELECT @@session.transaction_isolation;
    
    -- 设置全局隔离级别为 READ UNCOMMITTED
    SET GLOBAL transaction_isolation = 'READ UNCOMMITTED';
    
    -- 重启 MySQL 服务以应用全局隔离级别的更改
    -- 对于大多数管理工具,可以用以下命令重启服务
    -- sudo service mysql restart
    
    -- 验证全局隔离级别
    SELECT @@global.transaction_isolation;

    注意事项

    • 调低隔离级别可以提高性能,但可能会牺牲数据一致性。
    • 在选择隔离级别时,需要权衡性能和一致性,根据具体的应用场景和需求做出选择。
    • 在高并发环境中,较低的隔离级别可能会导致“脏读”、“不可重复读”和“幻读”等问题,因此需要特别注意。

    通过调整 MySQL 的隔离级别,可以根据具体需求在性能和一致性之间找到适当的平衡。

  • Koa2 框架介绍

    Koa 是由 Express 的原始团队开发的,旨在成为一个更小、更富表现力且更健壮的 Web 框架。Koa2 是 Koa 的第二个主要版本,具有一些显著的改进和特性。以下是对 Koa2 框架的详细介绍和分析:

    Koa2 的特点

    1. 轻量和模块化
      • Koa 本身非常轻量,没有内置的中间件。
      • 它鼓励用户通过模块化的方式来构建应用,只需安装需要的中间件即可。
    2. 现代 JavaScript 支持
      • Koa2 采用了 async/await 语法,取代了 Koa1 中的 generator 函数。这使得异步代码更加简洁和易读。
      • 完全支持 ES6/ES7+ 特性,利用了现代 JavaScript 的优势。
    3. 中间件机制
      • Koa 的中间件机制类似于洋葱模型,支持中间件的顺序执行和嵌套。
      • 中间件可以在请求处理前后执行代码,提供了极大的灵活性。
    4. 无内置路由
      • 与 Express 不同,Koa2 不包括内置的路由功能。用户需要选择第三方路由库,如 koa-router
    5. 更好的错误处理
      • Koa2 通过 try/catch 块来处理异步错误,避免了传统的回调地狱和难以调试的问题。

    Koa2 的使用场景

    1. API 服务
      • 由于其轻量和高性能,Koa2 非常适合用于构建 RESTful API 服务。
      • 中间件机制可以轻松处理身份验证、日志记录、错误处理等任务。
    2. 单页应用(SPA)后端
      • Koa2 可以用作前端单页应用的后端,提供数据接口和简单的路由功能。
    3. 微服务架构
      • 由于其模块化设计,Koa2 非常适合于微服务架构中的单个服务。
      • 每个微服务都可以独立部署和扩展。

    Koa2 示例代码

    以下是一个简单的 Koa2 应用示例:

    const Koa = require('koa');
    const Router = require('koa-router');
    
    const app = new Koa();
    const router = new Router();
    
    // 中间件示例
    app.use(async (ctx, next) => {
      console.log(`${ctx.method} ${ctx.url}`);
      await next();
    });
    
    // 路由示例
    router.get('/', async (ctx, next) => {
      ctx.body = 'Hello, Koa2!';
    });
    
    router.get('/hello/:name', async (ctx, next) => {
      const name = ctx.params.name;
      ctx.body = `Hello, ${name}!`;
    });
    
    app
      .use(router.routes())
      .use(router.allowedMethods());
    
    app.listen(3000, () => {
      console.log('Server is running on http://localhost:3000');
    });

    Koa2 的优势

    • 高性能:由于 Koa2 的轻量和无内置中间件设计,其性能表现优异。
    • 灵活性:开发者可以自由选择和组合中间件,构建出适合自己需求的应用。
    • 现代化:全面支持 async/await,代码更加简洁和易读。

    Koa2 的局限性

    • 学习曲线:对于新手来说,Koa2 的学习曲线可能比 Express 稍陡。
    • 依赖第三方库:没有内置的路由、模板引擎等功能,需要依赖第三方库。

    总结

    Koa2 是一个现代、轻量且高效的 Node.js Web 框架,非常适合构建 API 服务和微服务。其模块化和中间件机制提供了极大的灵活性,使开发者可以根据需求自由组合功能。如果你喜欢现代 JavaScript 并且需要一个高性能的框架,Koa2 是一个非常不错的选择。


    Koa 是一个由 Express 的原始团队开发的 Node.js Web 框架,旨在提供一个更小、更富表现力且更健壮的基础来编写 Web 应用和 API。以下是 Koa 的历史和发展过程:

    Koa 框架的发展历史

    1. 初创背景

    Koa 的诞生背景与 Express 密切相关。Express 是最早的一批 Node.js Web 框架之一,由 TJ Holowaychuk 创建,并迅速成为最流行的 Node.js Web 框架之一。然而,随着 Node.js 和 JavaScript 生态系统的发展,Express 面临一些技术债务和设计局限性。

    • Express 的局限性
    • 使用了回调函数来处理异步操作,容易导致“回调地狱”。
    • 中间件的执行顺序较难管理。
    • 错误处理机制不够完善。

    2. Koa 的诞生

    为了克服这些局限性,TJ Holowaychuk 和其他核心开发者开始设计一个新的框架,这个框架就是 Koa。Koa 的目标是提供一个更现代、更灵活的开发体验。

    • 发布时间:Koa 的第一个版本于 2013 年发布。
    • 主要设计理念
    • 轻量和模块化:Koa 本身非常轻量,没有内置的中间件,鼓励用户通过模块化的方式来构建应用。
    • 现代 JavaScript:Koa 充分利用现代 JavaScript 特性,如 Generator 函数(在 Koa v1 中)和 async/await(在 Koa v2 中)。
    • 中间件机制:采用洋葱模型的中间件机制,提供了灵活的请求响应流程控制。

    3. Koa v1

    Koa v1 使用了 ES6 的 Generator 函数来处理异步操作,这在当时是一个非常前沿的设计。Generator 函数提供了优雅的异步控制流,但它们的使用方式相对复杂,特别是对于新手开发者。

    • Generator 中间件:Koa v1 的中间件是 Generator 函数,需要使用 yield next 来处理下一个中间件。
    • 代码示例
      const koa = require('koa');
      const app = new koa();
    
      app.use(function* (next) {
        this.body = 'Hello, Koa v1!';
        yield next;
      });
    
      app.listen(3000);

    4. Koa v2

    随着 ES7 async/await 的引入,JavaScript 的异步编程变得更加简单和直观。Koa 团队决定在 Koa v2 中采用 async/await 来取代 Generator 函数。

    • 发布时间:Koa v2 于 2017 年正式发布。
    • 主要改进
    • 使用 async/await 来处理异步操作,使代码更加简洁和易读。
    • 保持轻量和模块化的设计理念。
    • 代码示例
      const Koa = require('koa');
      const app = new Koa();
    
      app.use(async (ctx, next) => {
        ctx.body = 'Hello, Koa v2!';
        await next();
      });
    
      app.listen(3000);

    5. 发展和现状

    Koa 在发布之后,迅速获得了社区的认可,特别是在需要高性能和灵活性的场景中,如 API 服务和微服务架构。由于其轻量和模块化的设计,Koa 被广泛用于构建各种类型的 Web 应用和服务。

    • 社区和生态:Koa 有一个活跃的社区和丰富的中间件生态系统,开发者可以找到各种所需的中间件来扩展 Koa 的功能。
    • 持续维护和更新:Koa 核心团队持续维护和更新框架,确保其与最新的 Node.js 和 JavaScript 规范保持兼容。

    总结

    Koa 是由 Express 的原始团队开发的,旨在提供一个更现代、更灵活的 Node.js Web 框架。通过采用 async/await 等现代 JavaScript 特性,Koa 提供了一个更优雅的异步编程模型。其轻量和模块化的设计使其成为构建高性能 Web 应用和 API 的理想选择。随着社区和生态系统的不断发展,Koa 仍然是一个受欢迎的 Node.js Web 框架。

  • 职业发展中的市场切入与个人成长

    引言

    在职业发展的道路上,选择行业与市场切入点是至关重要的。尤其是在计算机行业,如何应对市场需求、选择合适的工作路径,直接影响到个人的职业成长和发展方向。

    选择行业与市场切入

    当你选择了一个行业,首先要考虑的是如何切入市场。对于计算机行业而言,市场被大公司所占据,对于个人而言,切入市场的方式就是迎合这些公司的招聘要求,这相当于从被动的角度去解决问题。

    为什么现在有这么多培训班,特别是Web前端,招生宣传往往是“一毕业就18K”?追根溯源,这是因为外包公司能给到这个价格。

    外包与自研公司的薪资差异

    为什么外包能给18K,而自研公司却不能?因为外包对接的是甲方客户,甲方一个岗位,初、中、高、专级别划分,能给到18K的,基本是中高级别的外包。但是你知道甲方给外包多少钱吗?据我了解,可以开到25~30K,中间的差价,相当于是外包公司的毛利了。

    你以为这就完了?大公司的部门之间是有HC(Headcount,俗称人头)差异的。如果A部门的项目缺人,又没有HC,怎么办?找有富余HC的B部门,借调。可以是直接调人,也可以是借HC自己招人,只不过招来的是挂在B部门的编制下。而A部门的预算,要支付给B部门「服务费」,我们部门的收费标准是50K。

    你没听错,一个50K的技术服务费,落到真正干活的外包手上,往往只有15~18K。

    那我们部门傻吗,花50K去招一个外包?项目的压力就摆在那里,干不完就影响年终绩效,反正花的是公司的预算,50K也收不到自己的腰包,而且对部门领导而言,这点钱都不够年终奖塞牙缝的。

    那公司傻吗,允许手底下这么做?因为要抢市场,或者是优化流程,这些带来的收益,往往能增加几千万利润或者节省几百万的成本。财报好看了,股票涨了,股东开心了,领导年终奖有着落了,皆大欢喜。区区50K一个的外包岗算什么,连服务器租赁费的零头都算不上,何况做完项目了还能优化掉。

    培训班与自研岗位的挑战

    那回到18K,为什么培训班出来的Web前端,大部分没法直接去自研?

    1. 薪资与技术要求:18K在深圳的自研公司算是比较高的薪水,对技术要求也比较高,而且岗位歧视严重,大部分公司宁可给JAVA岗20K,也不愿给前端18K。
    2. 简历包装:简历是包装过的,真正接手了18K的工作,往往会非常痛苦,待不久。
    3. 自研公司的市场地位:大部分自研公司都在吃市场的边角料,盘子/利润做不大,怎能提高员工待遇?老板又不是来做慈善的。

    内编与外包的选择

    为什么大公司都喜欢用外包?因为内编麻烦啊!一个月薪20K的内编,企业往往要付出远超20K的成本,招聘流程又臭又长,每年还要搞考核,还不能随意裁员。

    但还是因为利益问题,部门必须要有内编镇场,而且有些东西,外包就是做不了,比如核心算法、服务器部署权限等等,这些都要用合同和股票来捆绑。

    公司越大,岗位越重要,越是会弄A/B角备份机制,防止某些人权重过高,「功高震主」这句话不是开玩笑的,这点尤其体现在技术岗上。

    技术学习与个人恐惧感

    如果你只知道学技术,刷题,即便你的技术再好,内心深处仍然会有被别人支配的恐惧感。而且,你时常会疑问,技术到底学多少,才能没有恐惧感?答案是,越学技术,很可能你会越质疑自己。

    我先后待过N家世界五百强公司,可以明确地说,公司越大,用到的技术可能性越多,涉及的会议也越多,留给真正写代码的时间反而变少了。技术越好,责任越大,这种压力并不会因为技术水平的提升而减少,反而可能会加剧。

    从供需关系切入市场

    在思考职业发展时,不能仅仅依靠技术,必须从社会的供需关系切入市场。通过复利的原理来塑造和扩大一个模式,这个模式可能并不是高科技,但它能够解决实际问题,为别人创造价值。这种方法不仅适用于计算机行业,也适用于其他行业。

    复利思维的重要性

    复利思维指的是通过一次性投入,获取多次收益。比如,开发一个软件工具,虽然前期投入很大,但一旦开发完成,只要市场有需求,就能持续产生收益。这个工具可能只是一个简单的应用,但它解决了用户的痛点,满足了市场需求。

    实际案例

    例如,一位程序员开发了一款高效的任务管理工具,前期投入了大量时间和精力,但上线后,不断有用户购买和订阅。这款工具解决了很多人工作效率低的问题,因此获得了广泛的市场认可。通过复利效应,这位程序员不仅收回了前期的投入,还持续获得了丰厚的回报。

    建立自己的圈子

    在复杂的工作环境中,建立自己的圈子至关重要。通过建立自己的影响力和网络,可以掌握主动权,而不是被动地适应外部环境。

    圈子的力量

    一个强大的圈子不仅能够提供技术支持,还能在职业发展中提供宝贵的机会和资源。通过与业内人士交流,获取第一手的行业信息,了解最新的发展趋势,这些都能帮助你在职业道路上走得更远。

    如何建立圈子

    1. 参加行业活动:多参加行业会议、技术沙龙等活动,结识更多业内人士。
    2. 在线交流:利用社交媒体和专业论坛,积极参与讨论,分享自己的见解和经验。
    3. 持续学习:保持对新技术和行业动态的关注,不断提升自己的技能和知识储备。

    总结

    在职业发展的道路上,技术不能脱离市场单独存在。任何技术都需要与市场需求结合,才能真正创造价值。通过复利思维,实现持续增长,并通过建立自己的圈子,掌握职业发展的主动权。这些策略不仅适用于计算机行业,也适用于其他行业的发展。

    希望这些分析和建议能帮助更多人在职业选择和个人发展中做出明智的决策。无论你处于职业生涯的哪个阶段,这些原则都能为你提供有价值的指导和帮助。

  • 《德国电梯社会:一个欧洲心脏地区的危机》

    Reblog via Libgen中文新书速递

    《德国电梯社会:一个欧洲心脏地区的危机》
    作者:[德] 奥利弗·纳赫特威 (Oliver Nachtwey)等
    华东师范大学出版社 2023
    下載:libgen.is/book/index.php?md5=3

  • 在Android系统中,有时候应用程序或系统会发出“beep”声。要在代码中关闭这个声音,可以采取以下几种方法

    1. 禁用系统声音

    你可以通过编写代码来关闭特定的系统声音。以下是一个示例,展示了如何关闭按键声音:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);

    请注意,这种方法会关闭所有系统声音,不仅仅是“beep”声。

    2. 调整音量

    你也可以通过调整音量来降低或关闭声音。以下是一个示例:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, 0, 0);

    3. 捕获并处理系统音效

    如果你只想在特定情况下关闭声音,例如按下某些按钮时,可以捕获这些事件并处理它们:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_YOUR_KEY) {
            // 阻止系统发出声音
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    4. 禁用按键声音

    如果你的应用中有特定的UI组件(如按钮),你可以禁用它们的按键声音:

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click me"
        android:soundEffectsEnabled="false"/>

    或者通过代码:

    Button button = findViewById(R.id.your_button);
    button.setSoundEffectsEnabled(false);

    5. 修改音频焦点

    在某些情况下,你可以通过管理音频焦点来暂时关闭声音:

    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    audioManager.requestAudioFocus(null, AudioManager.STREAM_SYSTEM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

    注意事项

    • 需要适当的权限来控制音频设置。
    • 请确保这种操作不会影响用户体验,特别是如果用户依赖某些声音提示。

    通过以上方法,你可以在代码中控制和关闭Android系统中的“beep”声音。