大模型日报3月11日

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

#   资讯

##   研究

###   前端不存在了?盲测64%的人更喜欢GPT-4V的设计,杨笛一等团队新作

  https://mp.weixin.qq.com/s/uQ8T4VS9hyD-R-CNytFZcA

将视觉设计实现成执行功能的代码是一项颇具挑战性的任务,因为这需要理解视觉元素和它们的布局,然后将它们翻译成结构化的代码。这个过程需要复杂的技能,也因此让很多普通人无法构建自己的网络应用,即便他们已经有了非常具体的构建或设计思路。不仅如此,由于这个过程需要不同领域的专业知识,因此往往需要具备不同技能的人互相合作,这就会让整个网页构建过程更加复杂,甚至可能导致目标设计与实际实现之间出现偏差。近日,斯坦福大学、佐治亚理工学院等机构的一个联合团队评估了当前的多模态模型在这一任务上的表现。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fe15ba03cbba4aac853dcd3b86284b52~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1646&h=912&s=203914&e=png&b=ffffff)

  


###   DenseMamba:大模型的DenseNet时刻,Mamba和RetNet精度显著提升

  https://mp.weixin.qq.com/s/smTpbX_c_e2sxi4aas8Ibg

近期,来自华为诺亚方舟实验室的研究者提出了 DenseSSM,用于增强 SSM 中各层间隐藏信息的流动。通过将浅层隐藏状态有选择地整合到深层中,DenseSSM 保留了对最终输出至关重要的精细信息。DenseSSM 在保持训练并行性和推理效率的同时,通过密集连接实现了性能提升。该方法可广泛应用于各种 SSM 类型,如 Mamba 和 RetNet。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/850f53bfe0dc42259d45c13265db9eb0~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=891&h=763&s=459846&e=png&b=fcfcfc)

  


###   当prompt策略遇上分治算法,南加大、微软让大模型炼成「火眼金睛」

  https://mp.weixin.qq.com/s/xxMg97rmHQ1w4ILsai3NdA

近年来,大语言模型(LLMs)由于其通用的问题处理能力而引起了大量的关注。现有研究表明,适当的提示设计(prompt enginerring),例如思维链(Chain-of-Thoughts),可以解锁 LLM 在不同领域的强大能力。然而,在处理涉及重复子任务和 / 或含有欺骗性内容的任务(例如算术计算和段落级别长度的虚假新闻检测)时,现有的提示策略要么受限于表达能力不足,要么会受到幻觉引发的中间错误的影响。为了使 LLM 更好地分辨并尽可能避免这种中间错误,来自南加州大学、微软的研究者提出了一种基于分治算法的提示策略。这种策略利用分治程序来引导 LLM。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fcd7e113dd224c2c8256d0662356a608~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1671&h=562&s=692750&e=png&b=fafafa)

  


  


###   不依赖token,字节级模型来了!直接处理二进制数据

  https://mp.weixin.qq.com/s/BLUTwhAlbXMPKYAgIoB_0Q

最新GPT,不预测token了。微软亚研院等发布bGPT,仍旧基于Transformer,但是模型预测的是**下一个字节(byte)** 。通过直接处理原生二进制数据,bGPT将所有输入内容都视为字节序列,从而可以不受限于任何特定的格式或任务。能预测CPU行为,准确率**超过99.99%** ;还能直接模拟MIDI——一种音乐传输和存储的标准格式。研究团队认为,传统的深度学习往往忽视了**字节**——数字世界的构建基石。不论是信息的形式还是操作,都是通过二进制格式编码和处理的。字节构成了所有数据、设备和软件的基础,从计算机处理器到我们日常使用的电子产品中的操作系统。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f4ee56ba86ec4f699ab5b84dcffd55d9~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1080&h=287&s=108568&e=png&b=fefefe)

  


  


##   产业

###   黄仁勋透露英伟达下一代 DGX AI 系统将采用液冷技术

  https://www.ithome.com/0/754/850.htm

英伟达 CEO 黄仁勋已确认,其下一个 DGX AI 系统将采用液冷散热。这为数据中心领域带来了新的机遇。英伟达在一次会议上透露了该消息。数据中心和 AI 服务器领域一直在加快推进液冷步伐,各公司为液冷设备的制造工厂投入巨额资金。此外,液冷数据中心将需要大量的研发工作和足够的基础设施来维护。在数据中心使用液冷有利有弊,主要好处包括更高效的降温和更高的服务器机架密度,因为液冷可以使服务器在机架内更紧密地排列。然而,其高昂的建造成本和维护复杂性一直阻碍推广。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/052b906a18b245789d1fc846dfefd305~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1010&h=666&s=345199&e=png&b=141414)

  


###   零一万物自研全导航图向量数据库,横扫权威榜单6项第一

  https://mp.weixin.qq.com/s/FAH1nPYLKtkiniW3WcYRxg

3 月 11 日,零一万物宣布推出基于全导航图的新型向量数据库 「笛卡尔(Descartes)」,已包揽权威榜单 ANN-Benchmarks 6 项数据集评测第一名。向量数据库,又被称为 AI 时代的信息检索技术,是检索增强生成(Retrieval-Augmented Generation, RAG)内核技术之一。对大模型应用开发者来说,向量数据库是非常重要的基础设施,在一定程度上影响着大模型的性能表现。在国际权威评测平台 ANN-Benchmarks 离线测试中,**零一万物笛卡尔(Descartes)向量数据库登顶6 份数据集评测第一名,比之前榜单上同业第一名有显著性能提升,部分数据集上的性能提升甚至超过 2 倍以上。** 零一万物表示,笛卡尔向量数据库将用在近期即将正式亮相的 AI 产品中,未来也将结合工具提供给开发者。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/49672f514b0846818f357546d4a0bba3~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=700&h=393&s=234105&e=png&b=003424)

  


###   AWS AI 高管表示,英伟达不是思科,其芯片需求将维持高位

  https://mp.weixin.qq.com/s/iWMsRhX1Gprk0jiiRb8SlQ

Nvidia 迅速崛起,成为市值第三大公司,这让很多人将其与思科进行比较。思科在互联网泡沫时期销售路由器取得了成功,短暂地成为了世界上最有价值的上市公司,但 AWS 人工智能产品副总裁 Matt Wood *()* 对这种比较提出了质疑。Wood 表示,Nvidia 的创新能力和为客户带来的“巨大收益”是思科无法比拟的。思科的崛起是短暂的,近年来该公司的业务已经停滞不前。虽然包括 Databricks CEO Ali Ghodsi 在内的一些行业人士表示,他们预计 Nvidia AI 芯片的供应限制将在明年得到缓解,从而导致价格下降,但伍德表示他也不确定这一点。Wood 在与外媒 Information 对谈时表示:“我预计需求将保持相当高的水平。”AWS 和其他云服务提供商将 Nvidia 驱动的服务器出租给他们的客户,并使用它们来开发自己的AI 服务。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bb988e1ecfb448f3b4646db4fed4fed8~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=900&h=900&s=201639&e=png&b=598c01)

  


  


  


#   推特

###   马斯克宣布本周开源Grok,并评论区怒怼OpenAI

  https://x.com/elonmusk/status/1767108624038449405?s=20

本周,@xAI 将开源 Grok

* * *

评论区:

如果OpenAI真的是"开放"的,他们也应该这样做。

马斯克回复:

OpenAI只是个谎言

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/71eba479725c42cda10829e9d39169ed~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1206&h=452&s=67572&e=png&b=000000)

  


###   用RAG搜索复杂PDF文档

  https://x.com/llama_index/status/1766862130761125958?s=20

复杂PDF文档上的RAG V2 📑

如果你在寻找一个权威的教程,教你如何在凌乱、复杂的PDF文档(包含混乱的格式、字体、表格、图表)上解决RAG问题,这就是适合你的教程。

在这些情况下,简单的RAG是行不通的⛔️。这个由@AIMakerspace 制作的视频是一个全面的教程,向你展示如何使用LlamaParse和LlamaIndex,通过高级解析、分层索引和递归检索,精心设计一个RAG管道。

完整视频在这里🎞️:https://youtube.com/watch?v=7qsxz2rURG4

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b6ed3085639f4448886571ba091f8444~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1199&h=637&s=745849&e=png&b=383838)

  


###   LlamaGym:只需几行代码,就可以使用在线强化学习来微调LLM Agent

  https://x.com/khoomeik/status/1766805213644800011?s=20

基于大语言模型(LLM)的智能体在完成环境中的任务时,不应该得到改进吗?现在宣布推出LlamaGym!只需几行代码,就可以使用在线强化学习来微调LLM智能体。技术细节、GitHub仓库、实验结果等更多内容现已推出。

  


暂时无法在飞书文档外展示此内容

  


###   Sanseviero分享:“选择LLM时需要考虑的不同工具、因素和注意事项”

  https://x.com/osanseviero/status/1766921390970581142?s=20

Omar Sanseviero:比较基础的大语言模型(LLM)和它们的对话版本并非易事😫

我写了这篇博文,解释了在选择LLM时需要考虑的不同工具、因素和注意事项。

请欣赏!<https://osanseviero.github.io/hackerllama/blog/posts/llm_evals/>

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7d59c674171645bdb4f58dba2f0d1987~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=666&h=500&s=458995&e=png&b=857e8c)

  


###   Leonie分享如何微调开源模型:使用LoRA技术微调Gemma-2B模型

  https://x.com/helloiamleonie/status/1766856548309975226?s=20

你如何微调开源模型,例如谷歌的Gemma?

Merve Noyan (@mervenoyann)向你展示了如何使用LoRA技术微调Gemma-2B模型:

<https://colab.research.google.com/drive/12OkGVWuh2lcrokExYhskSJeKrLzdmq4T?usp=sharing>

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/eac06efd3dff439b9a4fc5ec9848cb1d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1200&h=1111&s=494232&e=png&b=242424)

  


###   泰米尔语大型语言模型7B v1.0版本上线,在泰米尔语Alpaca数据集上微调

  https://x.com/MervinPraison/status/1766796706438426961?s=20

推出泰米尔语大型语言模型7B v1.0版本

专门为泰米尔语微调的大型语言模型。

Hugging Face模型地址:<https://huggingface.co/mervinpraison/tamil-large-language-model-7b-v1.0>

@reach_vb

<https://mer.vin/tamil-large-language-model/>

基础模型:Gemma 7B

在泰米尔语Alpaca数据集上微调

使用了@unslothai, 由@danielhanchen 提供

感谢@ramsri_goutham

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c51fbe5fd0234cdc93e801c6c1acc840~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=879&h=819&s=48438&e=png&b=f1f1f1)

  


###   MajorTOM:最大的可用于机器学习的Sentinel-2卫星影像数据集

  https://x.com/huggingface/status/1766839995162083593?s=20

我们很高兴与欧洲航天局合作发布MajorTOM,这是最大的可用于机器学习的Sentinel-2卫星影像数据集!🚀

它覆盖了地球表面的50%。2.5万亿像素的开源数据!

🤗👐🌌🚀🌏

<https://huggingface.co/Major-TOM>

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bc73ef3aa4e04bb184038921f56b344d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1200&h=900&s=2409659&e=png&b=e19970)

  


  


#   论文

###   **Deepseek-VL: 迈向现实世界的视觉语言理解**

  链接:http://arxiv.org/abs/2403.05525v1

我们介绍了DeepSeek-VL,一个面向真实世界视觉和语言理解应用的开源视觉-语言模型。我们的方法围绕三个关键维度展开:我们努力确保我们的数据具有多样性、可扩展性,并且广泛覆盖包括Web截图、PDF、OCR、图表和基于知识的内容在内的真实场景,旨在全面表达实际环境。此外,我们从真实用户场景创建了用例分类法,并相应地构建了一份指导微调数据集。使用这个数据集进行微调显著改进了模型在实际应用中的用户体验。考虑到效率和大多数真实场景的需求,DeepSeek-VL集成了一个混合视觉编码器,能够高效处理高分辨率图像(1024 x 1024),同时保持相对较低的计算开销。这一设计选择确保了模型在各种视觉任务中捕获关键语义和详细信息的能力。我们认为一个熟练的视觉-语言模型首先应具有强大的语言能力。为了确保在预训练期间保持LLM的能力,我们研究了一种有效的视觉-语言预训练策略,通过从一开始就整合LLM训练并仔细管理视觉和语言模式之间观察到的竞争动力学。DeepSeek-VL系列(包括1.3B和7B模型)展示了在真实应用中作为视觉-语言聊天机器人的卓越用户体验,在保持鲁棒的语言中心基准性能的同时,在相同模型大小下实现了一流或具有竞争性的性能,跨越广泛的视觉-语言基准。我们已经公开发布了1.3B和7B模型,以促进基于这一基础模型的创新。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0413f9914f59490b9f7dcfba9633229e~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=662&h=1065&s=279602&e=png&b=fffefe)

  


###   **Gemini 1.5: 在数百万个token的上下文中解锁多模态理解**

  链接:http://arxiv.org/abs/2403.05530v1

在这份报告中,我们介绍了Gemini家族的最新模型,Gemini 1.5 Pro,这是一个高度高效的多模态专家混合模型,能够回忆和推理来自上百万token上下文的细粒度信息,包括多个长文档和几小时的视频和音频。Gemini 1.5 Pro在跨模态的长上下文检索任务上实现了近乎完美的召回,改进了长文档QA、长视频QA和长上下文ASR的现有技术水平,并在一系列基准测试中与或超过了Gemini 1.0 Ultra的技术水平。通过研究Gemini 1.5 Pro长上下文能力的极限,我们发现在至少10M token范围内,下一个token的预测和几乎完美的检索率(>99%),这远远超过了现有模型如Claude 2.1(200k)和GPT-4 Turbo(128k)。最后,我们强调了大型语言模型在边界上的令人惊讶的新能力;当给定一个Kalaman语的语法手册,这是一种全球少于200名使用者的语言,模型学会以与从相同内容学习的人类相似的水平将英语翻译为Kalaman。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b490754eb6174b3a9a83f2c423d250b5~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=729&h=1049&s=329160&e=png&b=fefdfd)

  


###   **关于大型** **预训练模型** **人机协作的调查**

  链接:http://arxiv.org/abs/2403.04931v1

摘要:在人工智能领域快速发展的背景下,人类智能与人工智能系统之间的合作,即人工智能(HAI)团队合作,已经成为推动问题解决和决策过程的基石。大型预训练模型(LPtM)的出现显著改变了这一格局,通过利用大量数据来理解和预测复杂模式,为人类智能提供了前所未有的能力。本文调查了LPtM与HAI的关键整合,强调了这些模型如何超越传统方法增强协作智能。它探讨了LPtM在增强人类能力方面的协同潜力,并讨论了这种协作对人工智能模型改进、团队协作、伦理考虑以及在各个领域的广泛应用的意义。通过这一探索,本研究揭示了LPtM增强的HAI团队合作的转变性影响,为未来的研究、政策制定和旨在充分发挥这种合作潜力为研究和社会利益做出贡献的战略实施提供了见解。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a7b9ad547db243ba8b99bfec352c7833~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=689&h=969&s=260378&e=png&b=fffefe)

###   **GEAR: 一种高效的** **KV** **缓存** **压缩算法** **,用于** **LLM** **的接近无损的生成推断**

  链接:http://arxiv.org/abs/2403.05527v1

关键-值(KV)缓存已成为加快大型语言模型(LLMs)推理生成速度的事实标准。然而,随着序列长度的增加,缓存需求也在不断增长,将LLM推理转变为一个受内存限制的问题,显著地限制了系统吞吐量。现有方法依赖于丢弃不重要的token或对所有条目进行均匀量化。然而,这些方法往往会产生高的逼近误差,以表示压缩矩阵。自回归解码过程进一步增加了每一步的错误,导致模型生成的关键偏差和性能恶化。为了解决这一挑战,我们提出了GEAR,一种能够实现几乎无损高比例压缩的高效KV缓存压缩框架。GEAR首先将大多数大小相似的条目量化为超低精度。然后使用低秩矩阵来近似量化误差,使用稀疏矩阵来修正异常条目引起的个别错误。通过巧妙地整合三种技术,GEAR能够充分发挥它们的协同潜力。我们的实验表明,与其他选择相比,GEAR实现了接近无损的4位KV缓存压缩,吞吐量提高最多2.38倍,同时将峰值内存大小减小最多2.29倍。我们的代码公开可用于 https://github.com/HaoKang-Timmy/GEAR.

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d56ec124d8341368fe3219f00aa6e17~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=676&h=881&s=248139&e=png&b=fffefe)

  


###   **Alpaca对抗Vicuna:利用** **LLM** **揭示LLM的记忆现象**

  链接:http://arxiv.org/abs/2403.04801v1

本文介绍了一种黑盒提示优化方法,使用攻击者LLM智能体揭示受害智能体中更高级别的记忆,与直接提示目标模型使用训练数据的方法相比,这是量化LLM中记忆的主要方法。我们使用迭代拒绝抽样优化过程来找到具有两个主要特征的基于指令的提示:(1)与训练数据最小的重叠,以避免直接向模型展示解决方案,和(2)受害模型的输出与训练数据的最大重叠,旨在诱导受害者吐出训练数据。我们观察到,我们基于指令的提示生成的输出与训练数据的重叠比基线前缀后缀测量高23.7%。我们的研究结果表明,(1)经过指令调整的模型可以暴露出与基础模型一样多的预训练数据,甚至更多;(2)除了原始训练数据之外的环境可能导致泄漏;(3)使用其他LLM提出的指令可以打开一条新的自动攻击途径,我们应进一步研究和探索。代码可在 https://github.com/Alymostafa/Instruction_based_attack 找到。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cd8adee3203b49b08c54420cbeb2f596~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=735&h=1158&s=416136&e=png&b=fffefe)

  


  


###   **高效Transformer真的节省计算量吗?**

  链接:http://arxiv.org/abs/2402.13934v1

摘要:随着基于Transformer的语言模型在越来越大的数据集和庞大数量的参数上进行训练,寻找替代标准Transformer的更高效方法变得非常有价值。尽管提出了许多高效的Transformer和Transformer替代方案,但没有提供它们能够作为标准Transformer替代品的理论保证。这使得难以确定何时使用特定模型以及优先考虑何种方向进行进一步研究。本文旨在了解高效Transformer的能力和局限性,特别是稀疏Transformer和线性Transformer。我们关注它们在思维能力方面的表现,通过“CoT prompts”展现,并遵循以前的研究将其建模为动态规划(DP)问题。我们的结果表明,虽然这些模型具有足够的表达能力来解决一般DP任务,但与预期相反,它们需要随着问题规模而扩大的模型大小。尽管如此,我们确定了一类DP问题,对于这些模型来说可以比标准Transformer更高效。通过在代表性DP任务上进行实验验证了我们的理论结果,增加了对高效Transformer实际优势和劣势的了解。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/20f57d568be84408bef255fd0ac45ab3~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=795&h=1053&s=472737&e=png&b=fffdfd)

  


  


###   **LLM4Decompile: 使用大语言模型反编译** **二进制代码**

  链接:http://arxiv.org/abs/2403.05286v1

反编译旨在将编译代码恢复为易读的源代码,但在名称和结构等细节上存在困难。大型语言模型(LLMs)在编程任务上显示出潜力,鼓励将它们应用于反编译。然而,目前并不存在任何用于反编译的开源LLM。此外,现有的反编译评估系统主要考虑标记级准确性,而很大程度上忽略了代码的可执行性,这是任何程序最重要的特征。因此,我们发布了第一个开放获取的反编译LLMs,其范围从1B到33B,预训练了40亿个C源代码和相应的汇编代码的token。这些开源LLMs可以作为该领域进一步发展的基准。为了确保实际程序评估,我们引入了Decompile-Eval,这是第一个考虑了反编译的重新编译和重新执行性的数据集。该基准重点强调了从程序语义的角度评估反编译模型的重要性。实验表明,我们的LLM4Decompile已经展示了准确反编译21%的汇编代码的能力,比GPT-4提高了50%。我们的代码、数据集和模型已发布在https://github.com/albertan017/LLM4Decompile。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d8a3154c7d38438683eadf1e91d7b46c~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=668&h=984&s=360568&e=png&b=fefbfb)

#   产品

###   **EverLearns Studio**

  https://generator.everlearns.com

EverLearns 是一个帮助用户在短短 5 分钟内生成任何课程的产品。它使用 AI 驱动的编辑器来构建交互式课程内容,并提供一键分享课程给学生的功能。这个平台旨在帮助内容创作者、教育工作者和家长快速创建高质量的课程,节省时间并专注于更重要的事情。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ddf43f0f304b4a9c9315f9c85f00282d~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2260&h=1080&s=571498&e=png&b=fcfbfb)

  


###   Wondercraft

  https://www.wondercraft.ai/

Wondercraft 是一个旨在简化音频内容创建过程的平台,它允许用户通过打字、使用逼真的 AI 声音甚至他们自己的克隆声音来制作播客、有声读物、广告等。该平台的目标是打破制作高质量音频的困难,以及解决语言障碍的问题。Wondercraft 还提供对现有内容进行翻译和配音的服务,结合了 AI 翻译的效率与人工编辑和质量保证。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16be1c683ef04762b14ced473d6f5e37~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2260&h=1094&s=355621&e=png&b=010421)

  


#   HuggingFace&Github

###   MovieLLM

  https://deaddawn.github.io/MovieLLM/

MovieLLM 是一种为长视频创建合成的高质量数据的框架。该框架利用 GPT-4 和文本到图像模型的强大功能来生成详细的脚本和相应的视觉效果。通过 MovieLLM,研究人员可以克服现有视频数据集在稀缺性和偏见方面的局限性,从而提高多模态模型在理解复杂视频叙事方面的性能。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cca250a164f04857a15f50cab0898d0b~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1200&h=200&s=502087&e=png&b=76583e)

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9cf4e7a055834201ae3966b9fbc6709b~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=3003&h=1625&s=1598319&e=png&b=fefdfd)

  


###   **Anthropic Cookbook**

  https://github.com/anthropics/anthropic-cookbook

  Anthropic Cookbook 帮助开发人员使用 Clade 进行构建的代码和指南,提供可复制的代码片段,用户可以轻松地将其集成到自己的项目中。

  


###   AtomoVideo

  https://atomo-video.github.io/

AtomoVideo 是一种新颖的高保真图像到视频 (I2V) 的生成框架,可从输入图像生成高保真视频,实现比现有工作更好的动作强度和一致性,并且无需特定调整即可兼容各种个性化 T2I 模型。

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4fa3ba8a664f47179696bca8381fed0b~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2028&h=1446&s=3953994&e=png&b=f7f4f3)

###   FSDP_QLora

  https://github.com/AnswerDotAI/fsdp_qlora

  这个库是有关使用量化 LoRA + FSDP 进行训练的LLMs。

  


#   投融资

  


###   AI创企Astera寻求募资5.34亿美元IPO ,估值或达50亿美元

  https://news.crunchbase.com/ai/chip-startup-astera-labs-ipo/

  Astera Labs,一家芯片初创公司,正计划通过首次公开募股(IPO)获得高达45亿美元的估值,利用投资者对所有与AI相关的事物的浓厚兴趣。这家位于加利福尼亚州圣克拉拉的公司将提供近1480万股,而现有股东将提供约300万股,根据其监管文件。总体而言,公司计划通过以每股27至30美元的价格出售股份,募集高达5.34亿美元资金。这一目标估值较公司2022年晚些时候在由富达管理研究公司领投的1.5亿美元D轮融资中的近32亿美元估值有所增加。Astera的其他投资者包括Atreides Management、英特尔资本和Sutter Hill Ventures。Astera的IPO申请正值芯片巨头Nvidia看似即将超越苹果成为世界第二大市值公司之际,高端芯片的需求因当前的生成式AI浪潮而达到前所未有的高度,这无疑与Astera的申请时机有关。

###   寻找最新人工智能初创公司的演示文稿。

  https://decks.chiefaioffice.xyz/

  Chief AI Decks 是一个展示超过50家人工智能创业公司商业计划书的平台。这个网站提供了一个独特的机会,让用户能够发现最新的AI创业公司,并将这些公司的信息直接发送到用户的邮箱中。网站分类详细,包括从前种子期(Pre-Seed)到C轮(Series C)不等的融资阶段,涵盖了各个领域的AI创业公司,如图形设计基础模型工具、人工智能和机器人技术、大数据处理等。这为对人工智能领域感兴趣的投资者、创业者和科技爱好者提供了丰富的资源和灵感。

#   学习

###   可能是讲的最清楚的WeightonlyGEMM博客

  https://zhuanlan.zhihu.com/p/675427125?utm_medium=social&utm_oi=56635854684160&utm_psn=1750099158134951936&utm_source=wechat_session&s_r=0

  文章详细介绍了WeightOnly GEMM技术,这是一种由NVIDIA和Microsoft合作提出的加速MoE推理的方法。该技术针对MoE模型大、内存受限的问题,通过将权重从int8或int4快速转换为FP16进行计算,同时保持高精度。文章还探讨了WeightOnly GEMM与Naive FP16 GEMM的性能对比,以及在不同batch size下的表现。此外,文章还深入讨论了快速整数到浮点数转换的技术细节,以及如何通过权重交错和布局转换来优化TensorCore的使用。最后,文章还提到了针对小batch size的WeightOnly GEMV优化,以及在不同GPU架构上实现WeightOnly GEMM的策略。

###   LogSumExp求导

  https://zhuanlan.zhihu.com/p/667056682?utm_medium=social&utm_oi=56635854684160&utm_psn=1750068190280077312&utm_source=wechat_session&s_r=0

  文章详细阐述了LogSumExp(LSE)算子的求导过程。LSE在机器学习中广泛应用,如多分类问题的Softmax函数,用于解决数值上溢问题。文章首先定义了LSE的数学表达式,并区分了两种情况:当索引i不等于最大值索引j时,以及当i等于j时。通过一系列数学推导,作者得出了LSE对输入向量中每个元素的偏导数。最终结果表明,在两种情况下,LSE的导数都等于指数函数值除以所有指数函数值的总和。这一结果对于理解和优化涉及LSE的机器学习模型具有重要意义。

###   FlashAttention v2核心代码解析

  https://zhuanlan.zhihu.com/p/686225377?utm_psn=1750464860968919040

  本文深入解析了FlashAttention v2的核心代码实现,涉及并行化设计、cute库的应用、early exit处理、流水线并行等技术。FlashAttention v2在处理序列长度维度上实现了并行化,提高了算法效率。代码中使用了cute库来加速数据拷贝和GEMM运算,同时通过early exit技术减少了不必要的计算,并通过流水线并行提高了计算效率。文章还详细介绍了softmax和mask函数的实现细节,以及如何将计算结果输出到全局内存。整体上,FlashAttention v2的实现展示了在推理和部署加速方面的先进技术和优化策略。

###   Diffusion Policy系列文章笔记

  


  https://zhuanlan.zhihu.com/p/686378554?utm_psn=1750564564008357888

  文章主要总结了Diffusion Policy系列文章的关键技术点,专注于强化学习中的策略学习和优化。首先介绍了Diffusion Q-learning(DQL),将Diffusion模型与Q-learning结合,利用复杂概率分布作为策略,旨在直接最大化Q函数以提升策略性能。接着探讨了Selecting from Behavior Candidates (SfBC)和Implicit Diffusion Q-learning (IDQL),这两种方法通过创新的伪采样技术,从行为候选中选择最优策略,以解决Offline RL问题。文章通过深入分析这些方法的理论基础和实现机制,展示了如何有效地结合Diffusion模型和强化学习策略,以达到优化决策过程的目的。

#   声明

  本文档仅供学习交流使用,版权归原作者所有,若涉侵权,请联系Jack Jin 15101136166

  


  


  


![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6cc8bceab691418b9e559372adc286e0~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=842&h=415&s=203023&e=png&b=0982fc)

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

import os import time import threading import csv from datetime import datetime, timedelta import tkinter as tk from tkinter import messagebox from pynput import mouse, keyboard import pandas as pd import openpyxl from openpyxl import Workbook from openpyxl.styles import Font, PatternFill from openpyxl.utils import get_column_letter import sys import winshell from win32com.client import Dispatch import ctypes import psutil import win32event import win32api import winerror import json import hashlib # 定义基础无操作时间常量 FIRST_LOCK_LIMIT = 5 # 首次锁定的无操作时间(秒) LOCK_LIMIT = 30 # 后续锁定的无操作时间(秒) # 添加报表文件保护密码 REPORT_PASSWORD = "123" # 用于保护生成的Excel文件 REPORT_DIR = "D:/Users/x00707/LCZ_Machine_Time/LCZ_Machine_Time/UseTime_Summary/" REPORT_FILE_PREFIX = "UseTime_Summary_" # 修改为前缀格式 CONFIG_VERSION = "1.6" # 更新版本号 USER_DATA_FILE = "user_data.json" # 添加默认用户列表(包括两个普通账号) DEFAULT_USERS = { "admin": {"password": "123", "role": "admin"}, "001": {"password": "123", "role": "user"}, "002": {"password": "123", "role": "user"}, "102": {"password": "123", "role": "user"} } last_activity_time = time.time() is_locked = False session_start_time = None current_date = datetime.now().date() lock_window = None app_running = True daily_usage = {} first_run = False current_user = None lock_count = 0 # 记录本次启动后的锁定次数 mutex_name = "Global\\MachineTimeMonitor" mutex = win32event.CreateMutex(None, False, mutex_name) last_error = win32api.GetLastError() if last_error == winerror.ERROR_ALREADY_EXISTS: sys.exit(0) def get_inactivity_limit(): global lock_count return FIRST_LOCK_LIMIT if lock_count == 0 else LOCK_LIMIT def hash_password(password): return hashlib.sha256(password.encode()).hexdigest() def load_user_data(): """加载用户数据,自动添加缺失的默认用户""" if os.path.exists(USER_DATA_FILE): try: with open(USER_DATA_FILE, 'r') as f: user_data = json.load(f) except: # 文件损坏时创建默认用户数据 user_data = create_default_user() else: # 文件不存在时创建默认用户数据 user_data = create_default_user() # 检查并添加缺失的默认用户 updated = False for username, user_info in DEFAULT_USERS.items(): if username not in user_data["users"]: # 添加缺失的用户 user_data["users"][username] = { "password": hash_password(user_info["password"]), "role": user_info["role"], "first_login": True } updated = True if updated: save_user_data(user_data) # 保存更新后的用户数据 return user_data def create_default_user(): """创建默认用户,使用全局 DEFAULT_USERS""" default_user = {"users": {}} for username, user_info in DEFAULT_USERS.items(): default_user["users"][username] = { "password": hash_password(user_info["password"]), "role": user_info["role"], "first_login": True } save_user_data(default_user) return default_user def save_user_data(user_data): with open(USER_DATA_FILE, 'w') as f: json.dump(user_data, f, indent=2) def add_user(username, password, role="user"): user_data = load_user_data() if username in user_data["users"]: return False, "用户已存在" user_data["users"][username] = {"password": hash_password(password), "role": role, "first_login": True} save_user_data(user_data) return True, "用户添加成功" def change_password(username, old_password, new_password): user_data = load_user_data() if username not in user_data["users"]: return False, "用户不存在" user = user_data["users"][username] if user["password"] != hash_password(old_password): return False, "原密码不正确" user["password"] = hash_password(new_password) user["first_login"] = False save_user_data(user_data) return True, "密码修改成功" def authenticate(username, password): user_data = load_user_data() if username not in user_data["users"]: return False, "用户不存在", None user = user_data["users"][username] if user["password"] != hash_password(password): return False, "密码不正确", None return True, "登录成功", user["role"] def create_shortcut(): startup_folder = winshell.startup() shortcut_path = os.path.join(startup_folder, "MachineTimeMonitor.lnk") current_script = os.path.abspath(__file__) if not os.path.exists(shortcut_path) or not is_shortcut_current(shortcut_path, current_script): target = sys.executable wDir = os.path.dirname(current_script) shell = Dispatch('WScript.Shell') shortcut = shell.CreateShortCut(shortcut_path) shortcut.Targetpath = target shortcut.Arguments = f'"{current_script}"' shortcut.WorkingDirectory = wDir shortcut.IconLocation = sys.executable shortcut.Description = f"机台监控 v{CONFIG_VERSION}" shortcut.save() def is_shortcut_current(shortcut_path, current_script): try: shell = Dispatch('WScript.Shell') shortcut = shell.CreateShortCut(shortcut_path) return shortcut.Arguments == f'"{current_script}"' except: return False def terminate_existing_instances(): current_pid = os.getpid() current_script = os.path.basename(__file__) for proc in psutil.process_iter(['pid', 'name', 'cmdline']): try: if proc.info['name'].lower() in ['python.exe', 'pythonw.exe']: cmdline = proc.info['cmdline'] if (cmdline and len(cmdline) > 1 and current_script in cmdline[1] and proc.info['pid'] != current_pid): proc.terminate() time.sleep(0.5) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass def load_historical_data(): """从 Excel 报表文件加载历史数据""" global daily_usage daily_usage.clear() if not os.path.exists(REPORT_DIR): return # 遍历报表目录下的所有 Excel 文件 for filename in os.listdir(REPORT_DIR): if filename.startswith(REPORT_FILE_PREFIX) and filename.endswith(".xlsx"): try: wb = openpyxl.load_workbook(os.path.join(REPORT_DIR, filename)) if "Session Details" in wb.sheetnames: ws = wb["Session Details"] # 从第二行开始读取数据(跳过标题行) for row in range(2, ws.max_row + 1): date_str = ws.cell(row, 1).value # A列:Date user = ws.cell(row, 2).value # B列:Account duration = ws.cell(row, 5).value # E列:Duration(min) if date_str and user and duration: user_key = f"{date_str}_{user}" daily_usage[user_key] = daily_usage.get(user_key, 0) + float(duration) except Exception as e: print(f"加载历史数据时出错({filename}): {e}") def log_session(start_time, end_time, user): """记录会话并生成使用时间报表""" # 处理跨天使用的情况 current_day = start_time.date() end_day = end_time.date() if current_day == end_day: # 记录单使用情况 duration = (end_time - start_time).total_seconds() / 60 date_str = start_time.strftime("%Y-%m-%d") start_str = start_time.strftime("%H:%M:%S") end_str = end_time.strftime("%H:%M:%S") # 更新每使用时间 user_key = f"{date_str}_{user}" daily_usage[user_key] = daily_usage.get(user_key, 0) + duration # 生成/更新当天的使用时间报表 generate_daily_report(current_day, [ [date_str, user, start_str, end_str, f"{duration:.1f}"] ]) else: # 处理跨天使用的情况(第一天部分) day1_end = datetime.combine(start_time.date(), datetime.max.time()).replace(microsecond=0) duration1 = (day1_end - start_time).total_seconds() / 60 date_str1 = start_time.strftime("%Y-%m-%d") start_str1 = start_time.strftime("%H:%M:%S") end_str1 = day1_end.strftime("%H:%M:%S") # 第二天部分 day2_start = datetime.combine(end_time.date(), datetime.min.time()) duration2 = (end_time - day2_start).total_seconds() / 60 date_str2 = end_time.strftime("%Y-%m-%d") start_str2 = day2_start.strftime("%H:%M:%S") end_str2 = end_time.strftime("%H:%M:%S") # 更新每使用时间 user_key1 = f"{date_str1}_{user}" user_key2 = f"{date_str2}_{user}" daily_usage[user_key1] = daily_usage.get(user_key1, 0) + duration1 daily_usage[user_key2] = daily_usage.get(user_key2, 0) + duration2 # 生成/更新两天的使用时间报表 generate_daily_report(start_time.date(),[[date_str1, user, start_str1, end_str1, f"{duration1:.1f}"]]) generate_daily_report(end_time.date(), [[date_str2, user, start_str2, end_str2, f"{duration2:.1f}"]]) def generate_daily_report(report_date, new_records=None): """生成每使用时间报表,添加 Date 列""" # 提取年份和月份(格式化为两位数) year_str = report_date.strftime("%Y") month_str = report_date.strftime("%m") # 创建年/月子目录路径 report_path = os.path.join(REPORT_DIR, year_str, month_str) # 确保年/月目录存在 os.makedirs(report_path, exist_ok=True) # 创建完整的文件路径 date_str = report_date.strftime("%Y%m%d") report_filename = os.path.join(report_path, f"{REPORT_FILE_PREFIX}{date_str}.xlsx") try: # 如果文件已存在,加载现有工作簿 if os.path.exists(report_filename): wb = openpyxl.load_workbook(report_filename) ws1 = wb["Session Details"] if "Session Details" in wb.sheetnames else wb.create_sheet("Session Details") ws2 = wb["Daily Summary"] if "Daily Summary" in wb.sheetnames else wb.create_sheet("Daily Summary") else: # 创建新工作簿 wb = Workbook() ws1 = wb.active ws1.title = "Session Details" # 添加包含 Date 列的表头 ws1.append(['Date', 'Account', 'StartTime', 'EndTime', 'Duration(min)']) ws2 = wb.create_sheet("Daily Summary") ws2.append(['Account', 'UseTime(minutes)', 'UseTime(hours)']) # 添加新记录(如果有) if new_records: for record in new_records: ws1.append(record) # 处理详细使用记录 user_totals = {} # 从第二行开始读取现有数据(跳过标题行) for row in range(2, ws1.max_row + 1): user = ws1.cell(row, 2).value # B列:Account duration = ws1.cell(row, 5).value # E列:Duration(min) if user and duration: try: # 确保持续时间是数字 duration_val = float(duration) user_totals[user] = user_totals.get(user, 0) + duration_val except (ValueError, TypeError): pass # 清除旧汇总数据(保留标题行) if ws2.max_row > 1: ws2.delete_rows(2, ws2.max_row - 1) # 生成每汇总 for user, total_minutes in user_totals.items(): ws2.append([user, total_minutes, f"{total_minutes / 60:.2f}"]) # 应用样式 for ws in [ws1, ws2]: for col in ws.columns: max_length = 0 column_letter = get_column_letter(col[0].column) for cell in col: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = (max_length + 2) * 1.2 ws.column_dimensions[column_letter].width = adjusted_width # 设置标题样式 header_fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type="solid") header_font = Font(color="FFFFFF", bold=True) for row in ws.iter_rows(min_row=1, max_row=1): for cell in row: cell.fill = header_fill cell.font = header_font # 保存报表 # 设置工作簿保护密码 wb.security = openpyxl.workbook.protection.WorkbookProtection( workbookPassword=REPORT_PASSWORD, lockStructure=False, # 允许修改工作表结构 lockWindows=False # 允许调整窗口大小 ) wb.security.set_workbook_password(REPORT_PASSWORD) # 设置每个工作表的保护 for ws in wb.worksheets: ws.protection.set_password(REPORT_PASSWORD) ws.protection.sheet = True ws.protection.enable() # 保存报表(原有代码) wb.save(report_filename) print(f"已更新日报表: {report_filename}") except Exception as e: print(f"生成每日报表时出错: {e}") def show_change_password_window(parent, username): change_pw_window = tk.Toplevel(parent) change_pw_window.title("修改密码") change_pw_window.geometry("400x300") change_pw_window.resizable(False, False) change_pw_window.grab_set() change_pw_window.transient(parent) change_pw_window.configure(bg="#2c3e50") window_width = 400 window_height = 300 screen_width = change_pw_window.winfo_screenwidth() screen_height = change_pw_window.winfo_screenheight() x = (screen_width - window_width) // 2 y = (screen_height - window_height) // 2 change_pw_window.geometry(f"{window_width}x{window_height}+{x}+{y}") frame = tk.Frame(change_pw_window, bg="#34495e", padx=20, pady=20) frame.pack(fill="both", expand=True, padx=20, pady=20) tk.Label(frame, text=f"修改密码 - {username}", bg="#34495e", fg="#ecf0f1", font=("Arial", 14, "bold")).grid(row=0, column=0, columnspan=2, pady=(0, 15)) tk.Label(frame, text="原密码:", bg="#34495e", fg="#ecf0f1", font=("Arial", 12)).grid(row=1, column=0, sticky="e", pady=5) old_pw_var = tk.StringVar() old_pw_entry = tk.Entry(frame, textvariable=old_pw_var, show="*", font=("Arial", 12), width=20) old_pw_entry.grid(row=1, column=1, padx=10, pady=5) tk.Label(frame, text="新密码:", bg="#34495e", fg="#ecf0f1", font=("Arial", 12)).grid(row=2, column=0, sticky="e", pady=5) new_pw_var = tk.StringVar() new_pw_entry = tk.Entry(frame, textvariable=new_pw_var, show="*", font=("Arial", 12), width=20) new_pw_entry.grid(row=2, column=1, padx=10, pady=5) tk.Label(frame, text="确认新密码:", bg="#34495e", fg="#ecf0f1", font=("Arial", 12)).grid(row=3, column=0, sticky="e", pady=5) confirm_pw_var = tk.StringVar() confirm_pw_entry = tk.Entry(frame, textvariable=confirm_pw_var, show="*", font=("Arial", 12), width=20) confirm_pw_entry.grid(row=3, column=1, padx=10, pady=5) status_var = tk.StringVar() status_label = tk.Label(frame, textvariable=status_var, bg="#34495e", fg="#e74c3c", font=("Arial", 10)) status_label.grid(row=4, column=0, columnspan=2, pady=5) def change_password_action(): old_pw = old_pw_var.get() new_pw = new_pw_var.get() confirm_pw = confirm_pw_var.get() if not old_pw or not new_pw or not confirm_pw: status_var.set("所有字段都必须填写") return if new_pw != confirm_pw: status_var.set("新密码和确认密码不匹配") return success, message = change_password(username, old_pw, new_pw) if success: messagebox.showinfo("成功", message, parent=change_pw_window) change_pw_window.destroy() else: status_var.set(message) button_frame = tk.Frame(frame, bg="#34495e") button_frame.grid(row=5, column=0, columnspan=2, pady=(10, 0)) change_btn = tk.Button(button_frame, text="修改密码", command=change_password_action, bg="#3498db", fg="white", font=("Arial", 12), padx=15, pady=5, bd=0) change_btn.pack(side="left", padx=10) cancel_btn = tk.Button(button_frame, text="取消", command=change_pw_window.destroy, bg="#95a5a6", fg="white", font=("Arial", 12), padx=15, pady=5, bd=0) cancel_btn.pack(side="left", padx=10) change_pw_window.bind("<Return>", lambda event: change_password_action()) old_pw_entry.focus_set() def show_lock_window(): global lock_window lock_window = tk.Tk() # 添加以下代码确保窗口获得焦点 lock_window.focus_force() lock_window.grab_set_global() # 捕获所有输入事件 lock_window.after(100, lambda: username_entry.focus_force()) # 延迟100ms确保焦点设置成功 lock_window.title("机台已锁定") lock_window.attributes("-fullscreen", True) lock_window.attributes("-topmost", True) lock_window.configure(bg="#2c3e50") lock_window.option_add("*Font", "Arial 14") main_frame = tk.Frame(lock_window, bg="#2c3e50") main_frame.pack(fill="both", expand=True) center_frame = tk.Frame(main_frame, bg="#34495e", padx=40, pady=40) center_frame.place(relx=0.5, rely=0.5, anchor="center") tk.Label(center_frame, text="机台已锁定", bg="#34495e", fg="#ecf0f1", font=("Arial", 24, "bold")).grid(row=0, column=0, columnspan=2, pady=(0, 20)) tk.Label(center_frame, text="检测到机台长时间未使用", bg="#34495e", fg="#bdc3c7", font=("Arial", 14)).grid(row=1, column=0, columnspan=2, pady=(0, 10)) tk.Label(center_frame, text="账号:", bg="#34495e", fg="#ecf0f1", font=("Arial", 14)).grid(row=2, column=0, padx=5, pady=10, sticky="e") username_var = tk.StringVar() username_entry = tk.Entry(center_frame, textvariable=username_var, font=("Arial", 14), width=20) username_entry.grid(row=2, column=1, padx=5, pady=10, sticky="w") username_entry.focus() tk.Label(center_frame, text="密码:", bg="#34495e", fg="#ecf0f1", font=("Arial", 14)).grid(row=3, column=0, padx=5, pady=10, sticky="e") password_var = tk.StringVar() password_entry = tk.Entry(center_frame, textvariable=password_var, show="*", font=("Arial", 14), width=20) password_entry.grid(row=3, column=1, padx=5, pady=10, sticky="w") status_var = tk.StringVar() status_label = tk.Label(center_frame, textvariable=status_var, bg="#34495e", fg="#e74c3c", font=("Arial", 12)) status_label.grid(row=4, column=0, columnspan=2, pady=10) button_frame = tk.Frame(center_frame, bg="#34495e") button_frame.grid(row=5, column=0, columnspan=2, pady=(20, 10)) def attempt_unlock(): username = username_var.get() password = password_var.get() if not username or not password: status_var.set("账号和密码不能为空") return success, message, role = authenticate(username, password) if success: user_data = load_user_data() if user_data["users"][username]["first_login"]: show_change_password_window(lock_window, username) status_var.set("首次登录,请修改密码") return unlock(username) lock_window.destroy() else: status_var.set(message) # 登录失败后重新聚焦到账号输入框 username_entry.focus_force() def change_password_action(): username = username_var.get() if not username: status_var.set("请先输入账号") return user_data = load_user_data() if username not in user_data["users"]: status_var.set("用户不存在") return show_change_password_window(lock_window, username) login_btn = tk.Button(button_frame, text="登录", command=attempt_unlock, bg="#3498db", fg="white", font=("Arial", 14), padx=20, pady=5, bd=0) login_btn.pack(side="left", padx=10) change_pw_btn = tk.Button(button_frame, text="修改密码", command=change_password_action, bg="#f39c12", fg="white", font=("Arial", 14), padx=20, pady=5, bd=0) change_pw_btn.pack(side="left", padx=10) password_entry.bind("<Return>", lambda event: attempt_unlock()) tk.Label(main_frame, text=f"机台使用时间监控系统 v{CONFIG_VERSION}", bg="#2c3e50", fg="#7f8c8d", font=("Arial", 10)).pack(side="bottom", pady=10) lock_window.protocol("WM_DELETE_WINDOW", lambda: None) lock_window.mainloop() def unlock(username): global is_locked, session_start_time, last_activity_time, current_user is_locked = False session_start_time = datetime.now() last_activity_time = time.time() current_user = username print(f"用户 {username} 已解锁") def on_activity(): global last_activity_time last_activity_time = time.time() def activity_monitor(): global is_locked, session_start_time, current_date, current_user, lock_count while app_running: today = datetime.now().date() if today != current_date: # 新的一天开始,生成前一天的报表 generate_daily_report(current_date) current_date = today inactivity_limit = get_inactivity_limit() inactive_time = time.time() - last_activity_time if inactive_time > inactivity_limit and not is_locked: lock_count += 1 is_locked = True if session_start_time and current_user: end_time = datetime.now() print(f"记录会话: {current_user} 从 {session_start_time} 到 {end_time}") log_session(session_start_time, end_time, current_user) session_start_time = None current_user = None show_lock_window() time.sleep(1) def start_listeners(): mouse_listener = mouse.Listener(on_move=lambda x, y: on_activity(), on_click=lambda x, y, button, pressed: on_activity()) keyboard_listener = keyboard.Listener(on_press=lambda key: on_activity()) mouse_listener.start() keyboard_listener.start() return mouse_listener, keyboard_listener def hide_console(): if sys.platform == "win32": console_window = ctypes.windll.kernel32.GetConsoleWindow() if console_window: ctypes.windll.user32.ShowWindow(console_window, 0) def is_running_as_background(): try: parent_pid = psutil.Process(os.getpid()).ppid() parent_name = psutil.Process(parent_pid).name().lower() return parent_name == "explorer.exe" except: return False def main(): global session_start_time, app_running, first_run, lock_count terminate_existing_instances() if not ctypes.windll.shell32.IsUserAnAdmin(): ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, f'"{__file__}"', None, 1) sys.exit() hide_console() create_shortcut() os.makedirs(REPORT_DIR, exist_ok=True) load_historical_data() first_run = not any( f.startswith(REPORT_FILE_PREFIX) and f.endswith(".xlsx") for f in os.listdir(REPORT_DIR) ) monitor_thread = threading.Thread(target=activity_monitor, daemon=True) monitor_thread.start() mouse_listener, keyboard_listener = start_listeners() session_start_time = datetime.now() if first_run: root = tk.Tk() root.withdraw() messagebox.showinfo("启动成功", "机台使用时间监控系统已成功启动!") root.destroy() try: import pystray from PIL import Image def exit_action(icon, item): global app_running app_running = False icon.stop() sys.exit() def show_info(): root = tk.Tk() root.withdraw() messagebox.showinfo("程序信息", f"机台使用时间监控系统 v{CONFIG_VERSION}\n" f"首次锁定时间: {FIRST_LOCK_LIMIT}秒\n" f"后续锁定时间: {LOCK_LIMIT}秒") root.destroy() image = Image.new('RGB', (64, 64), color='white') menu = pystray.Menu( pystray.MenuItem("程序信息", show_info), pystray.MenuItem("退出", exit_action) ) icon = pystray.Icon("machine_monitor", image, "机台使用监控", menu) icon.run_detached() except ImportError: if not is_running_as_background() and not hasattr(sys, 'tray_warning_shown'): root = tk.Tk() root.withdraw() messagebox.showinfo("后台运行", "机台监控程序已在后台运行") root.destroy() sys.tray_warning_shown = True try: while app_running: time.sleep(1) except KeyboardInterrupt: app_running = False finally: if session_start_time and not is_locked and current_user: log_session(session_start_time, datetime.now(), current_user) mouse_listener.stop() keyboard_listener.stop() if __name__ == "__main__": main() 上面的test4.py原代码代码是可以初次运行后一直在后台运行的成功监控键盘和鼠标状态进行锁定,然后登录允许的账号和密码解锁,以及修改密码的功能,电脑关机重启后,开机自动开始运行后台监控,根据锁定的次数判断等待时间。 如果我想要写一个专门用于窗口的另一个python代码(在同一个工程里面),这个窗口代码收集到的信息会关联到上面的这个test4.py代码的参数。下面是我想要实现的窗口代码的功能: ①在桌面创建快捷方式——(打开之后有个窗口可以登录管理员的账号,就像原代码锁定界面登录的管理员账号密码一样)——登录管理员账号后可以在窗口里修改一些原test4.py代码的参数(修改什么参数在后面几点我会说明)。然后这个快捷方式的窗口上面(也就是登录管理员账号的上面部分)也可以选择退出登录也就是重新进入锁定(不管是管理员账号还是普通账号)。 ②快捷方式的窗口,上面中间部分是选择退出当前登录按键;下面部分是登录管理员账号,可以输入账号和密码,登录后一个新的管理员窗口包含:一个可以修改锁定时间的输入框,一个修改保存的excel的保护密码的输入框,一个选择退出登录管理员账号的按键(右上角),一个可以滑动的子框可以添加多个管理员账号,一个可以滑动的子框可以添加允许登录的普通账号,一个可以重新在cmd里-instal运行修改参数后的原代码的按键,一个确定上面修改的按键,七个部分从上往下依次排。 ③关联原代码参数的说明:在窗口中实时修改原代码的参数(原代码的文件名是test4.py),参数包含:1.选择退出登录按键关联原代码进入锁定界面重新登录;2.管理员账号窗口:2.1修改锁定时间的输入框关联原代码的LOCK_LIMIT (但是这里输入的单位是分钟)。 2.2退出登录管理员账号的按键就返回到快捷方式的窗口。 2.3子框可以添加多个管理员账号和普通账号关联到原代码的user_data允许在锁定界面登录的账号。 2.4修改保存的excel的保护密码的输入框关联到原代码的REPORT_PASSWORD。 2.5重新在cmd里-instal运行修改参数后的原代码的按键关联到原代码修改之后的重新运行(先结束任务后-install运行) ④或者说,这个新的窗口代码关联到原代码的一个配置文件,这样已经在后台运行的原代码就更实时更新到修改的参数呢? 请给我完整的窗口代码的python代码,如果不能这样实现的话请参考②中2.5所说的重新运行按键 原代码只用告诉我需要修改的地方,不用告诉我完整代码了 注意:其他我没叫你修改的地方的原代码不做修改(包括格式)(不改变其他代码的功能!特别是开机自动启动后台运行),代码尽量简洁,逻辑不复杂,适当的地方添加注释便于看懂 下面这个代码是我尝试实现上述功能的代码,虽然窗口差不多是我预设的内容(还需要你稍微修改,添加修改保存的excel的保护密码的输入框),但是不能和正在后台运行的test4.py代码及时联动,退出登录按键按了没反应,管理员修改参数的界面:添加用户显示用户不存在,添加不了,修改等待时间也不成功 import os import sys import json import tkinter as tk from tkinter import ttk, messagebox, simpledialog import subprocess import threading import ctypes from datetime import datetime import psutil import winshell from win32com.client import Dispatch # 配置文件路径 CONFIG_FILE = "monitor_config.json" USER_DATA_FILE = "user_data.json" # 默认配置 DEFAULT_CONFIG = { "lock_limit_minutes": 0.5, # 30秒 = 0.5分钟 "admin_users": ["admin"], "regular_users": ["001", "002", "102"], "lock_immediately": False } class AdminTool: def __init__(self): self.root = tk.Tk() self.root.title("机台监控管理工具") self.root.geometry("600x500") self.root.resizable(True, True) self.root.protocol("WM_DELETE_WINDOW", self.on_closing) # 加载配置 self.config = self.load_config() # 创建主界面 self.create_login_frame() # 创建桌面快捷方式 self.create_desktop_shortcut() self.root.mainloop() def load_config(self): """加载配置文件""" if os.path.exists(CONFIG_FILE): try: with open(CONFIG_FILE, 'r') as f: return json.load(f) except: # 如果文件损坏,创建默认配置 self.save_config(DEFAULT_CONFIG) return DEFAULT_CONFIG.copy() # 如果文件不存在,创建默认配置 self.save_config(DEFAULT_CONFIG) return DEFAULT_CONFIG.copy() def save_config(self, config): """保存配置文件""" with open(CONFIG_FILE, 'w') as f: json.dump(config, f, indent=2) def create_desktop_shortcut(self): """在桌面创建快捷方式""" desktop = winshell.desktop() shortcut_path = os.path.join(desktop, "机台监控管理工具.lnk") # 获取当前脚本路径 if getattr(sys, 'frozen', False): # 打包后的可执行文件 target = sys.executable else: # 脚本模式 target = sys.executable script_path = os.path.abspath(__file__) if not os.path.exists(shortcut_path): shell = Dispatch('WScript.Shell') shortcut = shell.CreateShortCut(shortcut_path) shortcut.Targetpath = target if not getattr(sys, 'frozen', False): shortcut.Arguments = f'"{script_path}"' shortcut.WorkingDirectory = os.path.dirname(os.path.abspath(__file__)) shortcut.IconLocation = target shortcut.Description = "机台监控管理工具" shortcut.save() def create_login_frame(self): """创建登录界面""" self.clear_window() # 顶部退出登录按钮 logout_frame = tk.Frame(self.root, bg="#f0f0f0", height=40) logout_frame.pack(fill=tk.X, side=tk.TOP) logout_btn = tk.Button( logout_frame, text="退出登录", command=self.lock_system, bg="#e74c3c", fg="white", font=("Arial", 10) ) logout_btn.pack(side=tk.RIGHT, padx=10, pady=5) # 登录表单 login_frame = tk.Frame(self.root, padx=20, pady=20) login_frame.pack(fill=tk.BOTH, expand=True) tk.Label( login_frame, text="管理员登录", font=("Arial", 16, "bold") ).pack(pady=(10, 20)) form_frame = tk.Frame(login_frame) form_frame.pack(fill=tk.X, padx=50) tk.Label(form_frame, text="账号:", font=("Arial", 12)).grid(row=0, column=0, sticky="e", pady=5) self.username_var = tk.StringVar() username_entry = tk.Entry(form_frame, textvariable=self.username_var, font=("Arial", 12)) username_entry.grid(row=0, column=1, padx=5, pady=5, sticky="ew") tk.Label(form_frame, text="密码:", font=("Arial", 12)).grid(row=1, column=0, sticky="e", pady=5) self.password_var = tk.StringVar() password_entry = tk.Entry(form_frame, textvariable=self.password_var, show="*", font=("Arial", 12)) password_entry.grid(row=1, column=1, padx=5, pady=5, sticky="ew") form_frame.columnconfigure(1, weight=1) status_frame = tk.Frame(login_frame) status_frame.pack(fill=tk.X, pady=10) self.login_status = tk.Label(status_frame, text="", fg="red") self.login_status.pack() btn_frame = tk.Frame(login_frame) btn_frame.pack(pady=10) login_btn = tk.Button( btn_frame, text="登录", command=self.authenticate_admin, width=15, bg="#3498db", fg="white", font=("Arial", 12) ) login_btn.pack(pady=10) # 绑定回车键 password_entry.bind("<Return>", lambda event: self.authenticate_admin()) username_entry.focus() def authenticate_admin(self): """验证管理员身份""" username = self.username_var.get().strip() password = self.password_var.get().strip() if not username or not password: self.login_status.config(text="账号和密码不能为空") return # 加载用户数据 if not os.path.exists(USER_DATA_FILE): self.login_status.config(text="用户数据文件不存在") return try: with open(USER_DATA_FILE, 'r') as f: user_data = json.load(f) except: self.login_status.config(text="无法读取用户数据") return # 检查用户是否存在 if username not in user_data.get("users", {}): self.login_status.config(text="用户不存在") return user = user_data["users"][username] # 验证密码 import hashlib hashed_password = hashlib.sha256(password.encode()).hexdigest() if user["password"] != hashed_password: self.login_status.config(text="密码不正确") return # 检查是否为管理员 if user.get("role") != "admin": self.login_status.config(text="该账号不是管理员") return # 登录成功,进入管理界面 self.create_admin_panel() def lock_system(self): """锁定系统""" # 更新配置文件设置立即锁定标志 self.config["lock_immediately"] = True self.save_config(self.config) # 创建锁定标志文件 with open("lock_now.flag", "w") as f: f.write(str(datetime.now())) messagebox.showinfo("系统锁定", "系统将在后台监控程序中锁定") # 退出管理员界面 self.create_login_frame() def create_admin_panel(self): """创建管理员面板""" self.clear_window() # 创建主容器 main_container = tk.Frame(self.root) main_container.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 顶部标题和退出按钮 header_frame = tk.Frame(main_container, bg="#34495e", height=40) header_frame.pack(fill=tk.X, side=tk.TOP, pady=(0, 10)) tk.Label( header_frame, text="机台监控管理面板", fg="white", bg="#34495e", font=("Arial", 14, "bold") ).pack(side=tk.LEFT, padx=20) logout_btn = tk.Button( header_frame, text="退出管理员", command=self.create_login_frame, bg="#e74c3c", fg="white", font=("Arial", 10) ) logout_btn.pack(side=tk.RIGHT, padx=10, pady=5) # 锁定时间设置 lock_frame = tk.LabelFrame(main_container, text="锁定时间设置", padx=10, pady=10) lock_frame.pack(fill=tk.X, pady=5) lock_setting_frame = tk.Frame(lock_frame) lock_setting_frame.pack(fill=tk.X, padx=5, pady=5) tk.Label( lock_setting_frame, text="无操作锁定时间(分钟):", font=("Arial", 11) ).pack(side=tk.LEFT, padx=5) self.lock_time_var = tk.DoubleVar(value=self.config["lock_limit_minutes"]) lock_entry = tk.Entry( lock_setting_frame, textvariable=self.lock_time_var, width=8, font=("Arial", 11) ) lock_entry.pack(side=tk.LEFT, padx=5) save_btn = tk.Button( lock_setting_frame, text="保存设置", command=self.save_lock_time, bg="#27ae60", fg="white", width=10 ) save_btn.pack(side=tk.LEFT, padx=10) # 用户管理容器 user_container = tk.Frame(main_container) user_container.pack(fill=tk.BOTH, expand=True, pady=5) # 管理员用户列表 admin_frame = tk.LabelFrame(user_container, text="管理员账号", padx=10, pady=10) admin_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 5)) admin_list_frame = tk.Frame(admin_frame) admin_list_frame.pack(fill=tk.BOTH, expand=True) # 滚动条 admin_scroll = tk.Scrollbar(admin_list_frame) admin_scroll.pack(side=tk.RIGHT, fill=tk.Y) self.admin_listbox = tk.Listbox( admin_list_frame, yscrollcommand=admin_scroll.set, height=6 ) self.admin_listbox.pack(fill=tk.BOTH, expand=True) admin_scroll.config(command=self.admin_listbox.yview) # 加载管理员用户 self.load_admin_users() # 管理员操作按钮 admin_btn_frame = tk.Frame(admin_frame) admin_btn_frame.pack(fill=tk.X, pady=(5, 0)) add_admin_btn = tk.Button( admin_btn_frame, text="添加", command=self.add_admin_user, width=8 ) add_admin_btn.pack(side=tk.LEFT, padx=2) remove_admin_btn = tk.Button( admin_btn_frame, text="移除", command=self.remove_admin_user, width=8 ) remove_admin_btn.pack(side=tk.LEFT, padx=2) # 普通用户列表 user_frame = tk.LabelFrame(user_container, text="普通用户账号", padx=10, pady=10) user_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(5, 0)) user_list_frame = tk.Frame(user_frame) user_list_frame.pack(fill=tk.BOTH, expand=True) # 滚动条 user_scroll = tk.Scrollbar(user_list_frame) user_scroll.pack(side=tk.RIGHT, fill=tk.Y) self.user_listbox = tk.Listbox( user_list_frame, yscrollcommand=user_scroll.set, height=6 ) self.user_listbox.pack(fill=tk.BOTH, expand=True) user_scroll.config(command=self.user_listbox.yview) # 加载普通用户 self.load_regular_users() # 普通用户操作按钮 user_btn_frame = tk.Frame(user_frame) user_btn_frame.pack(fill=tk.X, pady=(5, 0)) add_user_btn = tk.Button( user_btn_frame, text="添加", command=self.add_regular_user, width=8 ) add_user_btn.pack(side=tk.LEFT, padx=2) remove_user_btn = tk.Button( user_btn_frame, text="移除", command=self.remove_regular_user, width=8 ) remove_user_btn.pack(side=tk.LEFT, padx=2) # 重启服务按钮 restart_frame = tk.Frame(main_container) restart_frame.pack(fill=tk.X, pady=10) restart_btn = tk.Button( restart_frame, text="重启监控服务", command=self.restart_monitor_service, bg="#e67e22", fg="white", font=("Arial", 12), height=2 ) restart_btn.pack(fill=tk.X, padx=20) def load_admin_users(self): """加载管理员用户到列表""" self.admin_listbox.delete(0, tk.END) for user in self.config["admin_users"]: self.admin_listbox.insert(tk.END, user) def load_regular_users(self): """加载普通用户到列表""" self.user_listbox.delete(0, tk.END) for user in self.config["regular_users"]: self.user_listbox.insert(tk.END, user) def save_lock_time(self): """保存锁定时间设置""" try: lock_time = float(self.lock_time_var.get()) if lock_time <= 0: raise ValueError("锁定时间必须大于0") # 更新配置 self.config["lock_limit_minutes"] = lock_time self.save_config(self.config) messagebox.showinfo("成功", "锁定时间设置已保存") except ValueError as e: messagebox.showerror("错误", f"无效的输入: {str(e)}") def add_admin_user(self): """添加管理员用户""" username = simpledialog.askstring("添加管理员", "请输入管理员账号:") if username: if username in self.config["admin_users"]: messagebox.showerror("错误", "该用户已是管理员") return # 检查用户是否存在 if not os.path.exists(USER_DATA_FILE): messagebox.showerror("错误", "用户数据文件不存在") return try: with open(USER_DATA_FILE, 'r') as f: user_data = json.load(f) except: messagebox.showerror("错误", "无法读取用户数据") return if username not in user_data.get("users", {}): messagebox.showerror("错误", "该用户不存在") return # 添加到管理员列表 self.config["admin_users"].append(username) self.save_config(self.config) self.load_admin_users() def remove_admin_user(self): """移除管理员用户""" selection = self.admin_listbox.curselection() if not selection: messagebox.showerror("错误", "请选择要移除的管理员") return username = self.admin_listbox.get(selection[0]) if username == "admin": messagebox.showerror("错误", "不能移除默认管理员账号") return self.config["admin_users"].remove(username) self.save_config(self.config) self.load_admin_users() def add_regular_user(self): """添加普通用户""" username = simpledialog.askstring("添加普通用户", "请输入普通用户账号:") if username: if username in self.config["regular_users"]: messagebox.showerror("错误", "该用户已是普通用户") return # 检查用户是否存在 if not os.path.exists(USER_DATA_FILE): messagebox.showerror("错误", "用户数据文件不存在") return try: with open(USER_DATA_FILE, 'r') as f: user_data = json.load(f) except: messagebox.showerror("错误", "无法读取用户数据") return if username not in user_data.get("users", {}): messagebox.showerror("错误", "该用户不存在") return # 添加到普通用户列表 self.config["regular_users"].append(username) self.save_config(self.config) self.load_regular_users() def remove_regular_user(self): """移除普通用户""" selection = self.user_listbox.curselection() if not selection: messagebox.showerror("错误", "请选择要移除的用户") return username = self.user_listbox.get(selection[0]) self.config["regular_users"].remove(username) self.save_config(self.config) self.load_regular_users() def restart_monitor_service(self): """重启监控服务""" # 查找并终止现有监控进程 current_pid = os.getpid() script_name = "test4.py" # 原代码文件名 terminated = False for proc in psutil.process_iter(['pid', 'name', 'cmdline']): try: cmdline = proc.info['cmdline'] if cmdline and len(cmdline) > 1 and script_name in cmdline[1] and proc.info['pid'] != current_pid: proc.terminate() terminated = True except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass # 稍等片刻让进程终止 if terminated: import time time.sleep(1) # 重新启动监控服务 script_path = os.path.abspath(script_name) if os.path.exists(script_path): # 根据运行环境决定如何启动 if getattr(sys, 'frozen', False): # 打包后的可执行文件 subprocess.Popen([sys.executable, script_path]) else: # 脚本模式 subprocess.Popen([sys.executable, script_path]) messagebox.showinfo("成功", "监控服务已重启") else: messagebox.showerror("错误", f"找不到文件: {script_name}") def clear_window(self): """清除窗口中的所有组件""" for widget in self.root.winfo_children(): widget.destroy() def on_closing(self): """关闭窗口时的处理""" self.root.destroy() if __name__ == "__main__": # 检查是否以管理员权限运行 if ctypes.windll.shell32.IsUserAnAdmin() == 0: # 重新以管理员权限运行 ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, f'"{__file__}"', None, 1) sys.exit() app = AdminTool()
10-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值