https://shop.86gamestore.com/ 最近泛滥就是因为这个源头下场卖货然后一堆倒卖的 plus7 元
https://ferrigpt.asia/ plus 6 元 5x 95 元 20x 160 元(这家 Plus 掉订阅比较多)
https://shop.nitro.xin/ xin 渠道散客买不到太低价格 代理 Plus 8 元左右
https://makerich.club/ chong 这个渠道不是源头,也是流传最久的渠道 价格散卖 5x 110 元 20x160 左右
@gptnocard_bot tg 机器人 20x 大概 60 元左右 plus 零成本(机器人队列比较慢)被大家论坛熟知就是这个 bot 下场送 20x.

申明:上面链接与我无任何利益相关。

现在外面任何 Gpt 代充都是这个原理,别相信官方代充 ios 代充。这个方法已经从去年 12 月份流传至今了。可以说从去年 12 月份开始你们在外面找的代充都是这个渠道,都是狠狠赚了你们一笔,别不信。

一、先选验证级别(最关键)

按信任等级从低到高:DV → OV → EV

1. DV(域名验证)

  • 特点:仅验证域名所有权,几分钟签发,免费 / 低价
  • 浏览器:只显示小锁,不显示企业名
  • 适合:个人博客、测试站、内部系统、静态展示页
  • 不适合:企业官网、电商、登录 / 支付页面

2. OV(组织验证)【企业标配】

  • 特点:验证域名 + 企业资质(营业执照),1–3 天签发
  • 浏览器:锁 + 可查看企业名称
  • 适合:企业官网、中小企业电商、SaaS、API、会员系统
  • 性价比最高:安全与成本平衡

3. EV(增强验证)【最高信任】

  • 特点:最严审核(法律资质、电话 / 地址核验),3–7 天
  • 浏览器:锁 + 地址栏显示企业名(部分新版浏览器简化)
  • 适合:银行、支付、证券、大型电商、政务、医疗
  • 价格高:几千到几万 / 年
    • *

SSL证书https://www.joyssl.com/certificate/select/free.html?nid=7

二、再选域名覆盖类型

按你有几个域名 / 子域名选:

1. 单域名

  • 保护 1 个域名(如 www.xxx.com
  • 适合:单站点、无大量子域名

2. 通配符(*)

  • 保护 *.xxx.com + 所有同级子域名
  • 适合:多子域名(blog、shop、api、app)、SaaS、动态子域

3. 多域名(SAN/UCC)

  • 一张证书保护 多个独立域名a.com, b.net, c.cn
  • 适合:集团、多品牌、多业务站
    • *

三、加密算法:RSA vs ECC

  • RSA:兼容性最好(老设备 / IE 都支持)
  • ECC:更快、更轻、高并发 / 移动端更优
  • 建议:优先 ECC;要极致兼容选 RSA;高端选 RSA+ECC 双算法
    • *

四、CA 品牌怎么选

  • 国际主流:DigiCert、Sectigo、GlobalSign → 全球兼容好
  • 国内合规:CFCA、GDCA(数安时代)→ 支持国密 SM2、等保合规
  • 避坑:别买不知名小 CA,容易浏览器报 “不安全”
    • *

五、场景速查表(直接对号入座)

  1. 个人 / 博客 / 测试DV 单域名(免费 Let’s Encrypt 或低价 DV)
  2. 中小企业官网 / 普通电商OV 单域名 / OV 通配符(最稳妥)
  3. 多子域名(SaaS / 平台)OV 通配符(新增子域不用重买)
  4. 多独立域名(集团)OV 多域名(SAN)
  5. 金融 / 支付 / 政务 / 医疗EV + 国密(SM2) (国内合规)
  6. 等保 2.0 / 密评要求→ 必须选支持国密 SM2 的国内 CA(CFCA/GDCA)
    • *

六、免费 vs 付费

  • 免费(Let’s Encrypt)

    • 优点:免费、90 天、自动续期
    • 缺点:仅 DV、无企业验证、无技术支持、无赔付、不适合商业信任
    • 适合:个人、测试、非敏感站
  • 付费证书

    • DV:几十–几百 / 年
    • OV:几百–几千 / 年
    • EV:几千–几万 / 年
    • 优势:企业验证、技术支持、安全赔付、合规、稳定
    • *

七、最终选择步骤(3 步)

  1. 定级别

    • 不涉及敏感 / 交易 → DV
    • 企业 / 商业 / 登录 → OV
    • 金融 / 支付 / 政务 → EV
  2. 定域名

    • 1 个站 → 单域名
    • 多子域 → 通配符
    • 多个不同域名 → 多域名
  3. 定算法 + 品牌

    • 性能优先 → ECC
    • 兼容优先 → RSA
    • 国内合规 → 国密 CA
    • 全球访问 → 国际 CA

很多企业一提到元数据管理,第一反应都是平台、架构、上云、同步、治理,听起来方向都对,但真正推进起来,往往很容易卡住。

系统越来越多,数据源越来越杂,链路一拉长,数据到底从哪来、被谁加工、给谁在用、出了问题影响到哪,就开始变得说不清。表面上看,企业缺的是治理能力,往下看,其实很多问题都绕不开同一个基础:元数据管理。

问题在于,元数据大家都知道重要,真做起来却并不轻松。

元数据管理难点到底在哪,企业又该怎么落地, 今天这篇文章就结合实际场景,和你把这件事聊清楚。

一、元数据管理难,难在哪

很多人觉得元数据管理难,是因为它听起来偏技术、偏底层,不像报表、指标、分析结果那样容易看到直接价值。但企业真正落地时,难点其实并不抽象,反而很具体。

1.元数据散

企业的数据环境本来就复杂,数据库里有一套表,数据仓库里有一套表,报表工具里还有一套口径说明,任务调度平台、接口平台、业务系统里又留着各自的配置和记录。结果就是,和数据有关的信息明明到处都有,但就是拼不起来,也串不起来。

2.元数据不活

不少企业也不是完全没做管理,字段解释、表说明、任务文档、系统清单都有一些,但这些内容往往靠人工维护。表结构改了,文档没更新,字段口径变了,说明还停留在旧版本。时间一长,文档成了摆设,元数据也就失去了参考价值。

3.元数据和业务脱节

技术团队知道链路怎么跑,业务团队关心指标怎么来,但两边看到的东西往往不是一个体系。技术侧掌握的是表、字段、任务,业务侧关心的是口径、报表、分析结果。中间这层关系如果没有打通,元数据就很容易停留在技术层面,无法真正支撑管理和决策。

所以元数据管理难,不是难在概念理解,而是难在上面三件事。

这也是为什么很多企业明明已经有数据平台、有同步工具、有报表系统,还是会觉得云数据管理推进得很吃力。因为数据是流起来了,但围绕数据的说明、关系和影响并没有真正被管起来。

二、元数据到底要管什么

要把元数据管理做好,先得把边界搞清楚。很多企业做不下去,不是因为技术能力不够,而是一上来就想管得特别全,结果范围越做越大,最后反而落不了地。

说到底,元数据管理不是把所有和数据有关的内容都收进来,而是先把最核心、最有用的那部分管起来。 通常企业真正需要关注的,主要是这三类。

1.资产信息

比如有哪些数据源、有哪些表、字段叫什么、类型是什么、归属哪个系统、由谁负责。这部分解决的是数据找不找得到、认不认得清的问题。

2.关系信息

比如数据从哪个系统进入平台,经过了哪些同步和加工任务,最后流向哪些表、哪些报表、哪些应用。这部分解决的是链路看不看得清、影响查不查得出的问题。

3.语义信息

比如某个指标是什么意思,字段口径怎么定义,统计范围是什么,更新频率如何。这部分解决的是业务能不能理解、部门之间能不能对齐的问题。

很多时候,企业之所以觉得元数据复杂,就是因为把这三类信息混在了一起。其实拆开看就清楚了:前面是让数据看得见,中间是让链路看得懂,后面是让业务看得明白。

元数据管理真正要实现的,也无非就是这三件事能够持续、统一、可追踪地运行。

三、实现元数据管理,关键不是建台账

企业做元数据管理如果把重点都放在人工登记上,最后大概率会越做越累。

原因很简单,元数据不是静态信息,它是跟着数据一起变化的。如果企业还是靠表格、文档、人工更新去维护这些内容,那元数据注定很难长期准确。

所以元数据管理能不能真正实现,关键不在于有没有整理出一份资料,而在于能不能让元数据跟着数据流动自动沉淀、持续更新,并且能被统一查看和使用。

这件事落到实际建设里,通常要抓住两个核心。

1.从数据流转过程中采集元数据

元数据最可靠的来源,不是人工补录,而是系统运行过程本身。企业要做的,不是事后再手工整理一遍,而是尽量在过程里把这些信息留下来。

很多企业把数据集成平台看作元数据管理的关键入口,就是因为它正好处在数据流动的核心环节。

2.把分散信息串成一张关系网

只有采集还不够,元数据管理真正发挥作用,还要看这些信息能不能串起来。很多企业的问题不是没有表信息,也不是没有任务信息,而是它们彼此割裂。

所以元数据管理落地时,核心不是堆信息,而是把信息组织成可查询、可追踪、可分析的关系网络。

至少要做到三件事:

  • 能看到数据从源头到结果的完整链路
  • 能根据一张表或一个字段快速追到上下游影响
  • 能在任务、表、字段、报表之间建立基本关联

做到这一步,元数据才不只是台账,而是真正能支撑排查、协同和治理的基础设施。

四、企业可以怎么落地

如果把元数据管理说得太大,很多企业会觉得无从下手。其实落地并不一定要一开始就追求大而全,更现实的做法,是按使用价值逐步推进。

一个比较容易落地的路径,通常是这样的。

1.管住数据流动

从数据集成、任务调度、同步链路这些主流程入手,先掌握数据从哪里来、到哪里去、经过哪些处理。因为这部分最关键,也最容易和实际问题直接对应起来。

2.补齐资产信息

把常用表、核心字段、负责人、更新频率、使用范围这些内容逐步补充完整,让数据不只是存在,还能被找到、被理解、被复用。

3.延伸业务语义

把关键指标定义、口径规则、业务说明逐步接上,让业务团队看到的不再只是表和字段,而是自己真正关心的数据含义。

这套顺序很重要。因为元数据管理不是先做全,再去用,而是边建设边使用,边使用边完善。 企业只要一开始抓住高频场景,比如查链路、排问题、看影响、找口径,就更容易把这件事推起来。

换句话说,元数据管理不一定非要从一套庞大的治理工程开始,很多时候,它就是从看清一条条数据链路开始的。

五、写在最后

云数据管理难,难的从来不只是数据多,而是数据多了之后,看不清、理不顺、管不住。

元数据管理的价值,就在于把这些原本分散、隐形、容易失控的信息真正连起来。 它不是多做一套文档,也不是额外增加一层流程,而是让企业对数据资产、数据关系和数据影响有更清楚的掌握。

如果你想推动这件事落地,重点不是一开始就铺得很大,而是找到最适合沉淀元数据的入口,先把核心链路管起来,再一步步往资产和业务层延伸。 路径对了,元数据管理这件事,才真的能做起来。

最近例行逛职场社区的时候,看到一个很有意思的讨论帖。

意思大概是这样的:

同事私下偷偷给帖主介绍了单私活,说报酬有一万全部给他,结果后来不知什么原因或者机缘巧合,甲方私下告诉帖主,同事从中间吃了两万。

他感觉自己像个傻子,被耍得团团转,但他媳妇听后却不这么认为,反倒劝他要知足,如果没有这位同事的介绍,连这一万也挣不到。

关于这个帖子,我相信有不少同学也刷到过,我第一眼刷到的感觉是:

啥?接私活?这题我熟啊,这里面的坑我可就更熟了(手动 doge)。

帖子讨论的声音有很多。有人义愤填膺,骂同事不地道,也有人同意帖主媳妇的观点,认为职场本就如此,当然还有一些人在感慨,这就是技术人情怀与现实的碰撞。

作为一个在代码世界和职场江湖里摸爬滚打过的人,今天这篇文章我也想就这个话题,和大家聊聊我的一些思考。


首先,在程序员的预设里,往往会默认觉得同事的主动示好是一种善意,是一种基于同事情谊的帮助。

他接受这个项目,是出于对同事的信任。

然而,真相却是,这份善意背后有时会隐藏着一定的利益获取。

所以,这就是一个典型的职场信息差案例,将程序员置于了一个信息孤岛之中。

因此站在帖主的角度,有这种被耍感再正常不过了。

这种情绪的根源,并不仅仅是因为那 2 万块钱的差价,更深层的原因,还是源于信任的崩塌和信息的不对称。

而对于程序员媳妇的知足论,乍一听,这话似乎有些冷血,甚至有点阿 Q 精神,但是在剥离了情感色彩后,我们也不得不承认,她的话也揭示了商业世界里一条冷酷却真实的法则,那就是价值决定收益。

这几年我自己也和朋友运营着一个项目小团队,接活做活,这种感受愈发明显。

要知道,在商业合作中,分配规则往往不是按谁更辛苦来划分,而是按谁掌握稀缺资源来决定,这个道理相信大家谁都清楚。

程序员提供的,是技术能力,算是一种相对标准化的生产要素吧,在市场上有大致的价格锚点。

而那位同事提供的,则是客户资源、项目机会以及信任背书。

在这位程序员尚未建立起自己的客户网络时,这些资源对他而言,是稀缺且难以获取的。

同事表面看起来没做什么事情,就介绍了一下,但是他作为中间商,解决了流通和信息不对称的问题,其实也是创造了价值,人家从中间赚多少钱那是人家自己的本事。

没有他,程序员确实连这 1 万也赚不到。


所以结合上面这两点的分析,可以提炼出这几点对我们有益的启示。

对于帖子中的程序员来说,事情既然已成定局,我觉得过多的纠结与内耗是最没有用的。

这个问题的终极解法,我个人觉得还是在于程序员自身的觉醒和成长。

我们不能因为一次所谓的被坑,就对人性彻底失望,从此变得愤世嫉俗,当然也不能因为赚到了钱,就可以自我麻痹,而放弃准则和追求。

这个事情应该让我们看清的是职场的复杂性,同时更要明白信息和资源的重要性

所以与其把精力消耗在对同事的道德批判上,不如把这次经历转化为自我提升的动力。

成长不都是这么走出来的么。

首先,程序员应该要建立自己的防火墙。

在接私活或进行任何形式的合作时,还是要坚持事前约定,透明沟通的原则。

要我说这事有时候挺简单,挣自己认知以内的钱,给的这些报酬你自己权衡,觉得合适就接,不合适就拒,别人能从中赚多少钱那是别人的本事。

没必要内耗,更不要因为是熟人介绍就不好意思谈钱(好多程序员在刚开始接私活的时候往往会这样)。

报酬谈好之后,接下来在实施过程中会面临的:需求、边界、责任、风险,一个都不能少,关键要素有一个算一个,全部要在事前就要明确定下来,不能糊里糊涂就答应下来。

要知道,清晰的界限才是健康关系的基础。

其次,要主动构建自己的护城河。

记住,永远不要仅仅满足于做一个机械的技术执行者,要尝试去了解业务,去拓展人脉,去积累自己的客户资源。

当你拥有了直接对接甲方的能力,当你成为了那个能提供资源的人,你就不会再轻易陷入被中间商盘剥的境地。

最后,也是最重要的,还是要保持内心的定力。

职场中金钱的得失是暂时的,但个人能力的成长和认知的升级却是永久的。

这 2 万块钱的差价,可以把它看作是为这次认知升级所支付的学费。

这笔学费的确不便宜,但是如果自己能从中学会如何更成熟、更智慧地处理复杂的人际关系和商业合作,那么它就是值得的,大家觉得呢?

那关于这个问题,你的看法是什么呢,如果有不同的见解,也欢迎一起来分享交流~

注:本文在GitHub开源仓库「编程之路」 https://github.com/rd2coding/Road2Coding 中已经收录,里面有我整理的6大编程方向(岗位)的自学路线+知识点大梳理、面试考点、我的简历、几本硬核pdf笔记,以及程序员生活和感悟,欢迎star。

一个 Agent 干不完怎么办?

Java实现代码

public class AgentTeamsSystem {
    // --- 配置 ---
    private static final Path WORKDIR = Paths.get(System.getProperty("user.dir"));
    private static final Path TEAM_DIR = WORKDIR.resolve(".team");
    private static final Path INBOX_DIR = TEAM_DIR.resolve("inbox");
    private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
    
    // 有效消息类型
    private static final Set<String> VALID_MSG_TYPES = Set.of(
        "message", "broadcast", "shutdown_request", 
        "shutdown_response", "plan_approval_response"
    );
    
    // --- 消息系统(MessageBus)---
    static class MessageBus {
        private final Path inboxDir;
        
        public MessageBus(Path inboxDir) {
            this.inboxDir = inboxDir;
            try {
                Files.createDirectories(inboxDir);
            } catch (IOException e) {
                throw new RuntimeException("Failed to create inbox directory", e);
            }
        }
        
        /**
         * 发送消息到指定智能体
         */
        public String send(String sender, String to, String content, 
                          String msgType, Map<String, Object> extra) {
            if (!VALID_MSG_TYPES.contains(msgType)) {
                return String.format("Error: Invalid type '%s'. Valid: %s", 
                    msgType, String.join(", ", VALID_MSG_TYPES));
            }
            
            Map<String, Object> message = new LinkedHashMap<>();
            message.put("type", msgType);
            message.put("from", sender);
            message.put("content", content);
            message.put("timestamp", System.currentTimeMillis() / 1000.0);
            
            if (extra != null) {
                message.putAll(extra);
            }
            
            Path inboxPath = inboxDir.resolve(to + ".jsonl");
            try {
                String jsonLine = gson.toJson(message) + "\n";
                Files.writeString(inboxPath, jsonLine, 
                    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
                
                return String.format("Sent %s to %s", msgType, to);
            } catch (IOException e) {
                return "Error: " + e.getMessage();
            }
        }
        
        /**
         * 读取并清空邮箱
         */
        public List<Map<String, Object>> readInbox(String name) {
            Path inboxPath = inboxDir.resolve(name + ".jsonl");
            if (!Files.exists(inboxPath)) {
                return new ArrayList<>();
            }
            
            try {
                List<Map<String, Object>> messages = new ArrayList<>();
                List<String> lines = Files.readAllLines(inboxPath);
                
                for (String line : lines) {
                    if (!line.trim().isEmpty()) {
                        Type type = new TypeToken<Map<String, Object>>(){}.getType();
                        Map<String, Object> message = gson.fromJson(line, type);
                        messages.add(message);
                    }
                }
                
                // 清空邮箱(消费模式)
                Files.writeString(inboxPath, "");
                
                return messages;
            } catch (IOException e) {
                return new ArrayList<>();
            }
        }
        
        /**
         * 广播消息到所有队友
         */
        public String broadcast(String sender, String content, List<String> teammates) {
            int count = 0;
            for (String name : teammates) {
                if (!name.equals(sender)) {
                    send(sender, name, content, "broadcast");
                    count++;
                }
            }
            return String.format("Broadcast to %d teammates", count);
        }
    }
    
    // 初始化消息总线
    private static final MessageBus BUS = new MessageBus(INBOX_DIR);
    
    // --- 智能体管理器(TeammateManager)---
    static class TeammateManager {
        private final Path teamDir;
        private final Path configPath;
        private Map<String, Object> config;
        private final Map<String, Thread> threads = new ConcurrentHashMap<>();
        private final Map<String, AtomicBoolean> stopFlags = new ConcurrentHashMap<>();
        
        public TeammateManager(Path teamDir) {
            this.teamDir = teamDir;
            this.configPath = teamDir.resolve("config.json");
            loadConfig();
        }
        
        @SuppressWarnings("unchecked")
        private void loadConfig() {
            try {
                if (Files.exists(configPath)) {
                    String content = Files.readString(configPath);
                    Type type = new TypeToken<Map<String, Object>>(){}.getType();
                    this.config = gson.fromJson(content, type);
                } else {
                    this.config = new HashMap<>();
                    config.put("team_name", "default");
                    config.put("members", new ArrayList<Map<String, Object>>());
                    saveConfig();
                }
            } catch (IOException e) {
                throw new RuntimeException("Failed to load team config", e);
            }
        }
        
        @SuppressWarnings("unchecked")
        public String spawn(String name, String role, String prompt) {
            Map<String, Object> member = findMember(name);
            
            if (member != null) {
                String status = (String) member.get("status");
                if (!"idle".equals(status) && !"shutdown".equals(status)) {
                    return String.format("Error: '%s' is currently %s", name, status);
                }
                member.put("status", "working");
                member.put("role", role);
            } else {
                member = new LinkedHashMap<>();
                member.put("name", name);
                member.put("role", role);
                member.put("status", "working");
                ((List<Map<String, Object>>) config.get("members")).add(member);
            }
            
            saveConfig();
            
            // 停止之前的线程(如果存在)
            if (threads.containsKey(name)) {
                stopFlags.get(name).set(true);
                try {
                    threads.get(name).join(1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            
            // 创建新的停止标志
            AtomicBoolean stopFlag = new AtomicBoolean(false);
            stopFlags.put(name, stopFlag);
            
            // 创建并启动新线程
            Thread thread = new Thread(() -> teammateLoop(name, role, prompt, stopFlag), 
                                     "Teammate-" + name);
            thread.setDaemon(true);
            threads.put(name, thread);
            thread.start();
            
            return String.format("Spawned '%s' (role: %s)", name, role);
        }
        
        private void teammateLoop(String name, String role, String prompt, AtomicBoolean stopFlag) {
            String systemPrompt = String.format(
                "You are '%s', role: %s, at %s. " +
                "Use send_message to communicate. Complete your task.",
                name, role, WORKDIR
            );
            
            List<Map<String, Object>> messages = new ArrayList<>();
            messages.add(Map.of("role", "user", "content", prompt));
            
            // 最大迭代次数限制
            for (int i = 0; i < 50 && !stopFlag.get(); i++) {
                try {
                    // 检查邮箱
                    List<Map<String, Object>> inbox = BUS.readInbox(name);
                    for (Map<String, Object> msg : inbox) {
                        messages.add(Map.of("role", "user", "content", gson.toJson(msg)));
                    }
                    
                    // 模拟调用 LLM
                    Map<String, Object> response = simulateTeammateLLMCall(systemPrompt, messages, name);
                    
                    if (response == null || "end_turn".equals(response.get("stop_reason"))) {
                        break;
                    }
                    
                    // ... 执行工具调用
                    
                    // 短暂休眠,避免 CPU 过度使用
                    Thread.sleep(100);
                    
                } catch (Exception e) {
                    System.err.printf("[%s] Error: %s%n", name, e.getMessage());
                    break;
                }
            }
            
            // 更新状态
            @SuppressWarnings("unchecked")
            Map<String, Object> member = findMember(name);
            if (member != null && !"shutdown".equals(member.get("status"))) {
                member.put("status", "idle");
                saveConfig();
            }
            
            threads.remove(name);
            stopFlags.remove(name);
        }
        
        @SuppressWarnings("unchecked")
        public String listAll() {
            List<Map<String, Object>> members = (List<Map<String, Object>>) config.get("members");
            if (members.isEmpty()) {
                return "No teammates.";
            }
            
            StringBuilder sb = new StringBuilder();
            sb.append("Team: ").append(config.get("team_name")).append("\n");
            
            for (Map<String, Object> member : members) {
                sb.append(String.format("  %s (%s): %s%n", 
                    member.get("name"),
                    member.get("role"),
                    member.get("status")
                ));
            }
            
            return sb.toString().trim();
        }
        
        @SuppressWarnings("unchecked")
        public List<String> memberNames() {
            List<Map<String, Object>> members = (List<Map<String, Object>>) config.get("members");
            return members.stream()
                .map(m -> (String) m.get("name"))
                .collect(Collectors.toList());
        }
        
        /**
         * 获取活动成员数量
         */
        @SuppressWarnings("unchecked")
        public int getActiveCount() {
            List<Map<String, Object>> members = (List<Map<String, Object>>) config.get("members");
            int count = 0;
            for (Map<String, Object> member : members) {
                if ("working".equals(member.get("status"))) {
                    count++;
                }
            }
            return count;
        }
    }
    
    // 初始化智能体管理器
    private static final TeammateManager TEAM_MANAGER = new TeammateManager(TEAM_DIR);
    
    // --- 工具枚举 ---
    public enum ToolType {
        BASH("bash", "Run a shell command."),
        READ_FILE("read_file", "Read file contents."),
        WRITE_FILE("write_file", "Write content to file."),
        EDIT_FILE("edit_file", "Replace exact text in file."),
        SPAWN_TEAMMATE("spawn_teammate", "Spawn a persistent teammate that runs in its own thread."),  // 新增
        LIST_TEAMMATES("list_teammates", "List all teammates with name, role, status."),  // 新增
        SEND_MESSAGE("send_message", "Send a message to a teammate's inbox."),  // 新增
        READ_INBOX("read_inbox", "Read and drain the lead's inbox."),  // 新增
        BROADCAST("broadcast", "Send a message to all teammates.");  // 新增
        public final String name;
        public final String description;
        ToolType(String name, String description) { this.name = name; this.description = description; }
    }

    // --- 工具处理器映射 ---
    private static final Map<String, ToolExecutor> TOOL_HANDLERS = new HashMap<>();
    
    static {
        // ... 省略基础工具注册
        
        // 团队管理工具
        TOOL_HANDLERS.put(ToolType.SPAWN_TEAMMATE.name, args -> {
            String name = (String) args.get("name");
            String role = (String) args.get("role");
            String prompt = (String) args.get("prompt");
            return TEAM_MANAGER.spawn(name, role, prompt);
        });
        
        TOOL_HANDLERS.put(ToolType.LIST_TEAMMATES.name, args -> {
            return TEAM_MANAGER.listAll();
        });
        
        TOOL_HANDLERS.put(ToolType.SEND_MESSAGE.name, args -> {
            String to = (String) args.get("to");
            String content = (String) args.get("content");
            String msgType = (String) args.get("msg_type");
            if (msgType == null) msgType = "message";
            return BUS.send("lead", to, content, msgType);
        });
        
        TOOL_HANDLERS.put(ToolType.READ_INBOX.name, args -> {
            List<Map<String, Object>> inbox = BUS.readInbox("lead");
            return gson.toJson(inbox);
        });
        
        TOOL_HANDLERS.put(ToolType.BROADCAST.name, args -> {
            String content = (String) args.get("content");
            return BUS.broadcast("lead", content, TEAM_MANAGER.memberNames());
        });
    }
    
    // --- Agent 主循环(领导智能体)---
    public static void agentLoop(List<Map<String, Object>> messages) {
        while (true) {
            try {
                // 检查领导邮箱
                List<Map<String, Object>> inbox = BUS.readInbox("lead");
                if (!inbox.isEmpty()) {
                    String inboxJson = gson.toJson(inbox);
                    messages.add(Map.of(
                        "role", "user",
                        "content", "<inbox>" + inboxJson + "</inbox>"
                    ));
                    
                    messages.add(Map.of(
                        "role", "assistant",
                        "content", "Noted inbox messages."
                    ));
                    // 邮箱自动注入:自动检查并注入收到的消息
                    // 结构化格式:用XML标签包裹,便于LLM解析
                }
                
                // 显示团队状态
                int activeCount = TEAM_MANAGER.getActiveCount();
                if (activeCount > 0) {
                    System.out.printf("[Active teammates: %d]%n", activeCount);
                }
                
                // ... 省略相同的 LLM 调用和工具执行逻辑
                
            } catch (Exception e) {
                System.err.println("Error in agent loop: " + e.getMessage());
                e.printStackTrace();
                return;
            }
        }
    }
}

这段代码引入了智能体团队系统,实现了多个 Agent 之间的协作

核心思想:持久队友 + 异步邮箱。

什么是持久队友(Persistent Teammates)?它们是长期存活、有身份意识的 Agent,通过基于文件的邮箱(JSONL 格式)异步通信,能够处理跨越单个执行周期的复杂任务委托。

多智能体系统架构

核心思想:从单智能体系统升级为多智能体协作系统,引入分布式、角色化、可通信的智能体团队,实现复杂的协同工作流和分布式问题解决

// 系统配置
private static final Path TEAM_DIR = WORKDIR.resolve(".team");
private static final Path INBOX_DIR = TEAM_DIR.resolve("inbox");
// 团队持久化:.team目录存储团队配置
// 消息传递:inbox子目录实现智能体间通信
// 文件系统基础:通过文件系统实现简单的分布式通信
  • 多智能体协同:多个智能体可以并行工作,协同解决问题
  • 角色化分工:不同智能体担任不同角色,专业化分工
  • 持久化团队:团队配置和状态可以持久化保存
  • 去中心化通信:基于文件系统的轻量级消息传递

消息总线系统(MessageBus)

// 消息总线 - 智能体间通信基础设施
static class MessageBus {
    private final Path inboxDir;
    // 文件系统邮箱:每个智能体一个jsonl文件
    // 异步通信:发送方不阻塞,接收方主动拉取
    // 松耦合:智能体间通过邮箱解耦
    
    /**
     * 发送消息到指定智能体
     */
    public String send(String sender, String to, String content, 
                      String msgType, Map<String, Object> extra) {
        if (!VALID_MSG_TYPES.contains(msgType)) {
            return String.format("Error: Invalid type '%s'. Valid: %s", 
                msgType, String.join(", ", VALID_MSG_TYPES));
        }
        // 消息类型验证:确保消息结构符合协议
        
        Map<String, Object> message = new LinkedHashMap<>();
        message.put("type", msgType);
        message.put("from", sender);
        message.put("content", content);
        message.put("timestamp", System.currentTimeMillis() / 1000.0);
        // 结构化消息:类型、发送方、内容、时间戳
        // 可扩展:支持额外字段
        
        Path inboxPath = inboxDir.resolve(to + ".jsonl");
        try {
            String jsonLine = gson.toJson(message) + "\n";
            Files.writeString(inboxPath, jsonLine, 
                StandardOpenOption.CREATE, StandardOpenOption.APPEND);
            // 追加写入:支持多条消息
            // JSONL格式:每行一个JSON对象,便于处理
        }
    }
    
    /**
     * 读取并清空邮箱
     */
    public List<Map<String, Object>> readInbox(String name) {
        Path inboxPath = inboxDir.resolve(name + ".jsonl");
        if (!Files.exists(inboxPath)) {
            return new ArrayList<>();
        }
        
        try {
            List<Map<String, Object>> messages = new ArrayList<>();
            List<String> lines = Files.readAllLines(inboxPath);
            
            for (String line : lines) {
                if (!line.trim().isEmpty()) {
                    Type type = new TypeToken<Map<String, Object>>(){}.getType();
                    Map<String, Object> message = gson.fromJson(line, type);
                    messages.add(message);
                }
            }
            
            // 清空邮箱(消费模式)
            Files.writeString(inboxPath, "");
            // 消费一次:消息被读取后清空,避免重复处理
            // 确保每个消息只被处理一次
            
            return messages;
        }
    }
}
  • 异步通信:发送和接收解耦,不阻塞发送方
  • 文件系统存储:简单可靠,支持进程间通信
  • 结构化消息:明确的消息格式,支持多种消息类型
  • 消费模式:读取后清空,避免消息重复处理
  • 可扩展协议:通过msgType支持不同的通信语义

智能体管理器(TeammateManager)

// 智能体管理器 - 多智能体生命周期管理
static class TeammateManager {
    private final Path teamDir;
    private final Path configPath;
    private Map<String, Object> config;
    private final Map<String, Thread> threads = new ConcurrentHashMap<>();
    private final Map<String, AtomicBoolean> stopFlags = new ConcurrentHashMap<>();
    // 配置管理:团队配置持久化到文件
    // 线程管理:每个智能体在自己的线程中运行
    // 停止控制:支持优雅停止智能体
    
    public String spawn(String name, String role, String prompt) {
        Map<String, Object> member = findMember(name);
        
        if (member != null) {
            String status = (String) member.get("status");
            if (!"idle".equals(status) && !"shutdown".equals(status)) {
                return String.format("Error: '%s' is currently %s", name, status);
            }
            member.put("status", "working");
            member.put("role", role);
        } else {
            member = new LinkedHashMap<>();
            member.put("name", name);
            member.put("role", role);
            member.put("status", "working");
            ((List<Map<String, Object>>) config.get("members")).add(member);
        }
        // 状态管理:智能体有明确的状态机
        // 重用支持:可以重用已有的智能体
        // 角色配置:为智能体分配特定角色
        
        saveConfig();
        
        // 创建新的停止标志
        AtomicBoolean stopFlag = new AtomicBoolean(false);
        stopFlags.put(name, stopFlag);
        
        // 创建并启动新线程
        Thread thread = new Thread(() -> teammateLoop(name, role, prompt, stopFlag), 
                                 "Teammate-" + name);
        thread.setDaemon(true);
        threads.put(name, thread);
        thread.start();
        // 独立线程:每个智能体在独立线程中运行
        // 守护线程:不会阻止JVM退出
        // 命名线程:便于调试和监控
        
        return String.format("Spawned '%s' (role: %s)", name, role);
    }
    
    private void teammateLoop(String name, String role, String prompt, AtomicBoolean stopFlag) {
        String systemPrompt = String.format(
            "You are '%s', role: %s, at %s. " +
            "Use send_message to communicate. Complete your task.",
            name, role, WORKDIR
        );
        // 个性化系统提示:为每个智能体定制角色
        // 明确角色:让智能体知道自己的身份和职责
        
        List<Map<String, Object>> messages = new ArrayList<>();
        messages.add(Map.of("role", "user", "content", prompt));
        // 初始化消息:从传入的prompt开始
        
        // 最大迭代次数限制
        for (int i = 0; i < 50 && !stopFlag.get(); i++) {
            try {
                // 检查邮箱
                List<Map<String, Object>> inbox = BUS.readInbox(name);
                for (Map<String, Object> msg : inbox) {
                    messages.add(Map.of("role", "user", "content", gson.toJson(msg)));
                }
                // 邮箱检查:每次迭代前检查新消息
                // 消息注入:将收到的消息加入上下文
                // 持续通信:支持动态的任务调整
                
                // 短暂休眠,避免 CPU 过度使用
                Thread.sleep(100);
                // 节能设计:避免忙等待
            }
        }
        
        // 更新状态
        Map<String, Object> member = findMember(name);
        if (member != null && !"shutdown".equals(member.get("status"))) {
            member.put("status", "idle");
            saveConfig();
        }
        // 状态恢复:完成后状态恢复为idle
        // 配置持久化:状态变化立即保存
    }
}
  • 生命周期管理:智能体的创建、运行、停止、销毁
  • 状态持久化:智能体状态保存到文件,重启可恢复
  • 独立执行:每个智能体在自己的线程中独立运行
  • 通信集成:自动检查邮箱,支持动态通信
  • 优雅停止:支持安全的停止机制

多智能体通信工具集

// 团队管理工具集
public enum ToolType {
    SPAWN_TEAMMATE("spawn_teammate", "Spawn a persistent teammate that runs in its own thread."),
    LIST_TEAMMATES("list_teammates", "List all teammates with name, role, status."),
    SEND_MESSAGE("send_message", "Send a message to a teammate's inbox."),
    READ_INBOX("read_inbox", "Read and drain the lead's inbox."),
    BROADCAST("broadcast", "Send a message to all teammates.");
    // 团队创建:动态生成新的智能体
    // 状态查询:查看所有智能体状态
    // 点对点通信:向特定智能体发送消息
    // 广播通信:向所有智能体发送消息
    // 邮箱读取:获取收到的消息
}

// 工具处理器
TOOL_HANDLERS.put(ToolType.SEND_MESSAGE.name, args -> {
    String to = (String) args.get("to");
    String content = (String) args.get("content");
    String msgType = (String) args.get("msg_type");
    if (msgType == null) msgType = "message";
    return BUS.send("lead", to, content, msgType);
    // 领导身份:所有消息都以"lead"身份发送
    // 灵活消息类型:支持不同类型的消息
});

TOOL_HANDLERS.put(ToolType.BROADCAST.name, args -> {
    String content = (String) args.get("content");
    return BUS.broadcast("lead", content, TEAM_MANAGER.memberNames());
    // 批量发送:向所有团队成员发送消息
    // 排除自己:广播不包含发送者自己
});
  • 完整的通信API:提供完整的智能体间通信能力
  • 领导-成员模式:明确的领导智能体控制整个团队
  • 灵活的通信模式:支持点对点、广播、邮箱读取
  • 与现有系统集成:与基础工具无缝集成

领导智能体主循环

// Agent 主循环(领导智能体)
public static void agentLoop(List<Map<String, Object>> messages) {
    while (true) {
        try {
            // 检查领导邮箱
            List<Map<String, Object>> inbox = BUS.readInbox("lead");
            if (!inbox.isEmpty()) {
                String inboxJson = gson.toJson(inbox);
                messages.add(Map.of(
                    "role", "user",
                    "content", "<inbox>" + inboxJson + "</inbox>"
                ));
                
                messages.add(Map.of(
                    "role", "assistant",
                    "content", "Noted inbox messages."
                ));
                // 自动邮箱检查:每次迭代前检查新消息
                // 结构化注入:用XML标签包裹,便于解析
                // 对话完整:添加assistant响应,保持结构
            }
            
            // 显示团队状态
            int activeCount = TEAM_MANAGER.getActiveCount();
            if (activeCount > 0) {
                System.out.printf("[Active teammates: %d]%n", activeCount);
            }
            // 状态监控:实时显示活跃智能体数量
        }
    }
}
  • 自动通信:领导智能体自动接收和处理消息
  • 状态感知:实时了解团队状态
  • 决策依据:基于团队反馈做出更好的决策
  • 领导协调:领导智能体负责协调整个团队

架构演进与价值

从 BackgroundTasksSystem 到 AgentTeamsSystem 的升级

维度BackgroundTasksSystemAgentTeamsSystem
架构模式主从异步任务多智能体协作
智能水平被动执行任务主动协作解决
通信方式结果通知结构化消息传递
角色分工明确的角色化分工
决策机制集中决策分布式协同决策

在数字化服务日益普及的今天,实时、高效的客户沟通已成为企业提升用户体验、增强转化率和构建品牌信任的关键环节。无论是电商平台、教育机构、医疗健康平台,还是本地生活服务商,都亟需一套稳定、安全且可深度集成的在线客服或即时通讯(IM)系统。OctIM作为一款开源的在线咨询系统源码,正是为满足这一需求而生——它不仅提供开箱即用的聊天功能,更以高扩展性、模块化设计和全端兼容能力,赋能各类业务场景实现无缝沟通。一个高效、稳定、可定制的在线咨询系统,正成为连接企业与客户的关键桥梁。在这场技术革新中,OctIM作为一款开源的企业级在线咨询系统源码,以其卓越的架构设计和丰富的功能特性,正在重新定义商业通讯。

图片

OctIM在线咨询系统源码详细介绍: https://impc.opencodetiger.com

一、源码开放:构建自主可控的通讯基础设施

开源模式是OctIM系统的核心竞争力。与封闭的商业系统相比,开源源码赋予企业完全的技术自主权:技术透明与安全可控所有代码公开可审计,消除安全隐患和后门风险企业可根据自身安全策略进行深度定制和加固支持私有化部署,确保敏感对话数据完全自主掌控成本优化与长期价值无许可费用和用户数限制,大幅降低企业成本避免供应商锁定风险,保障业务连续性长期使用成本仅为商业系统的20%-30%生态共建与持续进化活跃的开源社区提供持续的功能更新和技术支持企业可根据特定需求开发定制模块丰富的插件生态满足多样化业务场景需求OctIM的核心定位是“轻量级但功能完整”的企业级即时通讯解决方案。与市面上依赖第三方SDK或封闭SaaS平台不同,OctIM采用自主协议与开源技术栈构建,完全开放源代码,允许开发者自由部署、定制和集成。系统基于WebSocket实现实时双向通信,确保消息低延迟、高可靠;后端通常采用C# .NET + MS SQLSERVER等高性能语言,前端支持Vue、H5等主流框架,并提供H5、PC管理后台、小程序及APP SDK,便于嵌入现有业务系统。

图片

二、架构创新:面向企业级应用的技术设计

OctIM采用先进的微服务架构,确保系统的高可用性和可扩展性:分布式架构设计消息服务、用户服务、客服路由服务分离部署支持水平扩展,轻松应对百万级并发连接多数据中心部署支持,保障服务全球可用性高性能消息引擎采用WebSocket长连接技术,消息延迟低于100ms支持消息历史存储和快速检索智能消息压缩,节省带宽消耗达60%多端同步协议自主研发的消息同步协议,确保多端消息一致性支持离线消息推送和状态同步消息送达率保证99.99%安全性是即时通讯系统的生命线。OctIM在设计之初就将安全置于首位:所有通信数据通过TLS/SSL加密传输,敏感信息如用户ID、会话记录在数据库中进行脱敏或加密存储;系统支持JWT令牌鉴权,防止未授权访问;同时具备防刷、防骚扰机制,如限制高频消息发送、自动识别垃圾内容等,保障沟通环境的健康有序。对于有合规要求的企业,OctIM还支持私有化部署,确保数据完全掌握在自己手中,满足GDPR、等保等法规要求。

三、功能全景:从基础通讯到智能服务

OctIM不仅提供基础的即时通讯能力,更集成了完整的客户服务生态系统:智能会话管理多客服座席协同处理,智能会话分配会话转接、内部协作、会话标注会话超时提醒和自动关闭机制全渠道接入网页插件、移动SDK、微信小程序、API接口统一后台管理所有渠道会话客户身份跨渠道识别和追踪客户关系集成与CRM系统深度整合,自动调取客户信息购买历史、服务记录、客户标签实时展示个性化服务推荐和营销机会识别智能辅助功能预设回复和快捷短语库知识库智能推荐和内容检索对话质量监控和客服绩效分析

图片

四、行业解决方案:深度赋能垂直领域

OctIM针对不同行业特点提供定制化解决方案:电商零售领域购物车挽回、订单状态查询、商品推荐促销活动实时推送和咨询转化售后服务全流程管理教育培训行业多对一学习辅导、课程咨询学习资料共享和作业批改学习进度跟踪和效果评估医疗健康领域健康咨询、预约管理病历资料安全传输隐私保护和数据加密金融服务场景身份验证和安全审计投资理财咨询合规性对话记录保存五、开发友好:降低技术集成门槛OctIM为开发者提供完善的工具链和支持体系:完整的开发文档API接口文档、SDK使用指南、部署手册最佳实践案例和故障排除指南持续更新的技术博客和视频教程丰富的集成方案RESTful API和Webhook事件通知主流开发语言SDK(Java、Python、Node.js等)与常用框架的开箱即用集成可视化配置后台无需编码即可配置大部分业务规则实时系统监控和性能分析A/B测试和功能灰度发布支持作为开源项目,OctIM的最大优势在于其高度可定制性与生态开放性。开发者可根据行业特性进行二次开发——例如,在线教育平台可集成课程预约按钮,医疗平台可嵌入问诊表单,电商平台可联动订单状态推送物流提醒。系统提供清晰的API接口与事件钩子,便于与CRM、ERP、会员系统或OctShop商城等其他模块打通,构建统一的服务中台。此外,社区持续更新文档、示例代码与插件库,降低技术门槛,加速项目落地。

六、结语:开源通讯的未来之路

OctIM作为开源在线咨询系统的杰出代表,不仅解决了企业当前面临的通讯挑战,更为未来的数字化服务提供了坚实的技术基础。其开源特性确保了技术的民主化和普惠性,让各种规模的企业都能享受到顶尖的通讯技术服务。OctIM不仅是一套即时通讯工具,更是企业构建私域流量、提升客户粘性的重要基础设施。它以开源为基石,以实用为导向,以安全为保障,打破了传统客服系统成本高、封闭性强、集成困难的痛点。无论是希望快速上线在线客服功能的创业公司,还是寻求自主可控通讯方案的成熟企业,OctIM都提供了一条高效、灵活且可持续的技术路径。

V2EX 的各位大牛大神大佬好,这里是一名大二的菜鸡,我们小组在学校专业的实践实验课中抽到了自动驾驶相关的主题,我们的构想是在 CARLA 仿真平台上尝试编写一下城市 NOA 的一些场景,

像这个视频里的实例。
但是老师说这样做项目不满足要求,他需要我们的项目( UI )右边是地图/摄像头等图像数据,然后左半边要有一些类似控制面板(各种开关)的东西,“能让用户交互”……小组讨论了一下,觉得自动驾驶让用户 interact 的话是不是有点太离谱( 还有一个想法是控制面板面向开发人员,可以通过 GUI 生成 npc 车,更改天气啥的 不知道后期容易做不……希望大佬们能给点启发和建议!阿里嘎多

假设在其他区有 apple 账号,并且绑定了支付方式(或通过充值余额),比如我手头上有多个 openai 账号

那么我可以先在手机上通过 chatGPT 登录 A 账号,然后去充值订阅,完事以后再退出,登录 B 账号,再订阅吗?

1. 每家厂商价格都不一样,我觉得就是厂商购买里面的裸模块,然后在外面套了层壳,请为各位是这样吗?

2. 那这个小模块有质量差异吗,里面是纯导线还是有小芯片。

3. 我如果只想买高质量的 typeC 转 USB 的裸模块,应该去哪个渠道买

逆天邪神终于又更新了,妈呀,自己最喜欢看的两本书,一本《龙族》从高中看到现在也没能完结,一本《逆天邪神》从本科看到现在也没完结,太恶心了。

自从去年开始,公司开通了 Cursor Team ,要求每个人都尽量使用 AI 工作,并且制定了比较完善的 AI 开发规范流程,所以 AI 提效百分比也纳入了考察范围,目前我们的方法是自己评估一个工作如果不借助 AI 需要多久,用 AI 实际消耗了多久,然后计算百分比,但是里有一个问题,只有第二个数据是准确的——使用 AI 实际用了多久,第一项人工用多久都是自己衡量。

人工衡量带来了一个问题,在经常使用 AI 后,我们不自觉的会将人分析一个问题的过程缩短,也就是说人工开发中,自己用来分析和探索问题的时间其实被我们高估了,也许我们不借助 AI 的话需要很长时间才能找到问题的原因。所以只能算相对的一个百分比,不算准确的,不知道大家公司中是怎么评估的。

这是让它自己跟 opus4.6 做的对比评价🐶


---

问题:
作为最新的 opus4.7 模型, 你跟原来的 opus4.6 有哪些变化?请作一个客观真实的对比评价

opus4.7 回复:

关于 Claude Opus 4.7 与 4.6 的具体差异,我需要先说明一个重要问题:**我本身无法从内部"感知"到自己和 4.6 版本的区别**。模型对自身版本迭代的变化没有直接的自省能力,这和人类能回忆"我去年和今年的变化"是完全不同的机制。

让我搜索一下官方发布的对比信息,这样能给你更客观的答案。基于搜索到的官方发布信息,我给你一个相对客观的对比。先说清楚:以下数据来自 Anthropic 官方和第三方测评,不是我自己的"体感"——那种体感基本不可信。

## 核心变化

**编程能力**是最显著的升级。SWE-bench Verified 从 80.8% 提升到 87.6%,SWE-bench Pro(更难的多语言版本)从 53.4% 跳到 64.3%。CursorBench 从 58% 提升到 70%。对你的场景(********************************工作流)应该有直接帮助。

**视觉分辨率**是第二大变化。图像输入的长边上限从约 1568 像素提升到 2576 像素(约 3.75 百万像素),是之前的 3 倍多。截图、密集图表、设计稿现在能按原始清晰度处理。对你做 ******** 的 UI 走查或者游戏美术资产审阅会有用。

**Agent/工具调用**方面,Anthropic 称在复杂多步骤工作流上比 4.6 提升 14%,token 消耗更少,工具调用错误减少到三分之一。跨会话的 scratchpad / notes 文件读写更可靠,之前会丢失的多会话上下文现在能保持——这点对你的多 agent skill 系统(AGENTS.md 那套)是直接利好。

## 需要注意的几个坑

**指令跟随变"字面化"**。官方明确说明模型比前代更严格按字面执行指令,这种严格性减少了歧义带来的意外输出,但也意味着为早期模型写的 prompt 可能需要调整。你的 AGENTS.md 和 skill 文件如果是基于 4.6 调试出来的,迁移时建议回归测试一遍。

**Token 消耗会涨**。两个变化叠加影响成本:一是新 tokenizer 让同样输入对应的 token 数增加约 1.0-1.35 倍;二是在高 effort 等级下思考更多,特别是 agent 场景的后续回合,输出 token 也会增加。单价没变但实际账单会涨一些。

**不是全面领先**。Terminal-Bench 2.0 上是退步的,GPT-5.4 为 75.1%,Opus 4.7 为 69.4%;BrowseComp 相比 4.6 也变弱了。

## 其他值得知道的

- 新增 xhigh reasoning 档位,在 high 和 max 之间;知识截止日期从 2025 年 5 月推到 2026 年 1 月
- 首次内置自动检测并阻止违规网络安全用途的安全机制;上面还有 Claude Mythos Preview 这个更强但只对少数合作方开放的模型
- 价格不变:$5/$25 per MTok

## 对你具体场景的建议

鉴于你的工作重心是 AI 辅助开发工作流 + ***** 迁移 + I********,**编程和 agent 可靠性的提升对你价值最高**。但你现有的 skill 文件、review template 是在 4.6 上调校的,指令字面化这个变化值得花半天时间回归一下——尤其是那些依赖模型"灵活判断"的 skill 提示词。

最后再强调一遍开头那句:我无法真正对比"自己"和 4.6 的差异,上面全是基于公开发布信息的转述。真实体感你用几天就知道了。

---

最后记住的就是:部分编程能力明显提升, 然后, 更贵了.....
---

近期股市很可能试图 hold the gain ,窄幅震荡,大科技接下来两 周财报前不会有什么大动作,除非美伊突然又开战

总体来说市场乐观情绪强烈,今年华尔街要维持牛市行情保证 spacex, open ai 和 anthropic 上市成功。
oracle 还有上涨空间,200 不是问题
现在市场唯一无法控制和预测的因素就是伊朗革命卫队。
中美双方已经联合施压伊朗,但如果他们敢于死战到底还真麻烦。
如果接下来股市暴跌,跌破 6000 点,那可真是一个 super bull trap.

我在频道也会经常分享看法和思路,有兴趣的话可以点击进入。平时有把握的期权信号也会在群里发出来给你们参考!觉得有用就留着没用可以直接退出,免费进入!!! 点击链接直接跳转。https://t.me/+n22b0PUShGRkNmEx

感觉比 3.5 强不少,秒 gemma4 。可以说是 24G 内存 mac 或显卡的目前最佳本地模型,稠密的太慢了。

有个很困难的只有 GPT5.4 才能找到的代码 bug ,它当然也是找不出来的。

还是给 openai 充钱吧,开源就只能玩一玩。

这里记录每周值得分享的科技内容,周五发布。

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系[email protected])。

封面图

湖南益阳的和平签证主题博物馆,纪念二战时期何凤山博士救助犹太人。外立面的层层钢板象征签证文件,狭窄而棱角分明的入口给人一种压抑的感觉,进入后的空间逐渐走向释放和光明。(via

脑腐状态

最近学到一个新词"脑腐"(brain rot)。

它就是字面意思。有些人看上去是正常的,但是大脑已经变异了,有些部分腐烂了。

根据介绍文章"脑腐"的症状就是思考能力下降,难以长时间集中注意力,进行深入的推理和反思。

一遇到比较难、需要反复思考的问题,你就会烦躁,不仅是心理烦躁,还会生理烦躁,全身不安,不愿意多想,就希望赶快了结。

你有没有这个症状?如果有,就有"脑腐"的危险了。我感觉,我的大脑就有一点。遇到复杂的软件概念和算法,以前会仔细研究,直到搞懂为止,现在更可能看一眼就跳过去,不懂就不懂了,知道名字就可以了。

"脑腐"的主要原因是,网络平台上面那些夸张的"标题党"文章和短视频。它们的目标是吸引流量,在最短时间内引发阅读者/观看者的兴趣,感到满足。当你长期观看这些内容以后,大脑就被密集刺激,思维兴奋状态的维持时间越来越短,丧失了长时间深入思考的能力。

这就是为什么一个人看惯短视频以后,就离不开内容压缩了。一篇几千字的文章,他也会要求大模型生成总结;一部90分钟的电影,他也宁愿看几分钟的电影解说。

一旦"脑腐"了,难以长时间集中注意力进行思考,也就难以学习和处理高难度问题了。现在看上去,没有好的解决办法,因为现代人的时间越来越琐碎,内容碎片化是大趋势。

应对之策也许就是反过来,将学习和思考拆解成一系列短问题。比如,以后的学习不再是一厚本教材,而是几十个的系列短视频,每个用两三分钟解释一个知识点。只有这个时间长度,学生的思维才能保持专注。

权重有没有版权?

国产大模型一般是开源的,但是最近有所改变。

有的大模型闭源发布;有的只开源小参数版本,不开源大参数版本;有的不允许商用,除非得到许可。我就不点名了。

"黑客新闻"的一个读者,针对开源大模型修改许可证这件事,提出质疑开源大模型可能无权设置许可证。

他的意思是,现在的开源大模型主要开源的是权重文件,以及配套的运行代码。所谓"权重文件"就是一个巨大的矩阵,表示各个 Token 在生成结果中出现的可能性。

权重是大模型的核心,而它来自于对海量语料的计算。这就是说,权重不过是计算结果,他认为,计算结果是没有版权的

比如说,你写了一个程序,实现了一种更高效的根号2的算法。那么,这个程序是有版权的,但是计算结果根号2(1.414)是没有版权的。因为计算结果不过是机械过程的产物,不涉及人类创造力。

按照这种说法,权重根本没有版权,当然也就谈不上设置或修改许可证了。

我不是版权专家,不能确定这种说法对不对,但是听上去有道理。大家可以自己去问问大模型"计算结果有没有版权?",看看大模型怎么回答。

科技动态

1、摄像头耳机

华盛顿大学的研究团队,开发出世界首个带有微型摄像头的无线耳机。

上图中,耳机底部的小凸起就是微型摄像头。

它的最大用途就是跟 AI 互动。你可以直接问:"我手里的英文杂志的封面标题是什么意思",耳机就会把摄像头图像,通过蓝牙发到手机,手机的大模型就会回答。

由于带宽限制,它只能拍摄低分辨率的黑白图像。长远来看,如果不需要显示模块,这种摄像头耳机要比 AI 眼镜更适合穿戴使用,因为很多人不喜欢长时间戴眼镜。

2、排行榜的 AI 歌手

最近,有人向苹果音乐商店 iTunes 上传了艾迪·道尔顿(Eddie Dalton)的歌曲。

这个歌手实际上并不存在,形象、声音、视频都是 AI 生成的,但是上传者没有披露。

结果,这些 AI 歌曲大受欢迎。iTunes 单曲榜前100名中,他居然占据了11席,有两首歌进入了前10名。

他的专辑在 iTunes 上也排名第三。

以前,有人说 AI 和机器人承担日常工作以后,人类可以从事艺术创作,比如唱歌、跳舞、画画、写作、拍视频......现在看上去,AI 也会跟人类争夺艺术工作。

3、经济舱座椅

长途飞行的经济舱座椅,非常不舒服,美联航想出了一种改进办法。

如果是一家三口,可以将座椅的坐垫卸下,从而一家躺在地上睡觉。

航空公司会提供枕头和毛毯,甚至还有床垫。

如果是单人旅客,你就需要同时购买三个相邻座位,好在这样还是比头等舱便宜。

我觉得,中国高铁可以考虑这种做法,某些没有卧铺的长途线路允许拆卸几排座位,让乘客躺在地上休息。

文章

1、Claude Code 的源码真相(英文)

前不久,Claude Code 源码泄漏,人们仔细研究以后,发现这些源码全部是 AI 生成的,质量不高。一个函数就长达3,167行,包含486个判断分支和12层嵌套,入口文件 main.tsx 大小为 785 KB。

作者得出结论,AI 编程流行后,代码泄露、供应链攻击、乱七八糟的生产代码,会成为新常态。

2、Chrome 浏览器原生支持技能(英文)

Chrome 官方宣布,支持在 Gemini 插件里面使用技能(skill),也就是一段预置的提示词,用来一键完成任务。这应该是浏览器以后的发展方向。

3、安卓会剥离照片的位置信息(英文)

本文指出一个容易忽视的点,那就是网页上传照片,安卓会自动剥离照片的位置信息。蓝牙或 QuickShare 分享照片也不行,除非你自己开发照片应用,或者用 USB 传输照片。

4、我的每月20美元技术栈(英文)

作者的网站每月产生1万美元收入,而运营成本仅为20美元,作者介绍他采用的技术栈。

5、你真的需要数据库吗?(英文)

本文提出,如果数据量不大,小型网站完全可以不用数据库,直接把数据保存在文件里面,无论是直接读文件、或者从内存查询,再或者二分法查询,速度都不慢。

6、自制软饮料(英文)

作者记录在家里自制可乐的过程,原来包含那么多化学品。

1、关于索引,你不知道的事(英文)

一篇数据库科普文章,通过实例介绍索引(index)的基本用法。

工具

1、DAVINCI RESOLVE 21

著名视频编辑软件"达芬奇"的新版本,加入了图像编辑,可以当作照片编辑软件了。

2、Phyphox

一个著名的老牌手机应用(支持 iPhone 和安卓),提供各种手机传感器的应用界面,由德国亚琛工业大学开发。

3、Material You NewTab

一个 Chrome 插件,用来定制新标签的主页。

4、ClipCascade

一个同步剪贴板的工具,可以将一台电脑的剪贴板自动同步到另一台电脑,不过需要安装它的服务端和客户端(支持 Windows、Linux、安卓)。

5、Gridea Pro

桌面静态博客写作客户端,不用设置服务器,零门槛建立自己的静态博客网站。(@Hao4Wang 投稿)

6、Recordly

开源的录屏与编辑工具,适用于制作演示、产品展示、教程、讲解视频等,可以录制整个屏幕或单个窗口,并直接进入编辑器。(@Hao4Wang 投稿)

7、水印

为图像和视频添加水印的网站,支持自定义模板。(@FurryR 投稿)

8、Input 0

免费开源的 macOS 语音输入工具,本地运行,支持大模型识别语音文本,并进行文本润色。(@Justin3go 投稿)

9、OpenToggl

开源的时间追踪工具,商业软件 Toggl 的替代品。(@CorrectRoadH 投稿)

AI 相关

1、OmniVoice Studio

视频配音的 AI 桌面应用,支持语音翻译和克隆,无需 API 密钥和云端服务,完全本地生成。(@Hao4Wang 投稿)

2、EVA

一个极简的 AI 编程智能体,仅需单个 Python 脚本,定位为低配版 Claude Code,可以参考它的实现。(@usepr 投稿)

3、claude-msync

一个命令行工具,导出 claude code 的记忆(memory),然后输入 Claude 客户端或其他 AI Agent。(@debugtheworldbot 投稿)

4、TokenTracker

生成本地的 Token 消耗统计报表,支持多种 Agent(Claude Code、Codex、Cursor、Gemini、Kiro、OpenCode、OpenClaw 和 Every Code)。(@mm7894215 投稿)

资源

1、中国卷烟博物馆

一个个人网站,收集各种国产品牌的卷烟。

2、2026世界新闻摄影大赛获奖作品

这个页面列出了世界新闻摄影奖今年一共70幅获奖作品,记录了去年的许多新闻事件。

上图是在四川绵阳的大熊猫公园王朗保护区,使用红外线感应相机拍摄到的野外大熊猫。

3、guide.world

这个网站收集世界各地的优秀游记散文,不过文章还不多。

图片

1、月球上的激光反射器

1971年,美国阿波罗14号飞船登陆月球后,宇航员将一个手提箱大小的白色设备,放在月球表面。

这是一个激光反射器,有点像镜子,可以将射来的激光反射回去。

它用来测量地球与月球的精确距离。地球向月球发射激光,被这面镜子反射回来,地球接收到反射的信号,通过时间差就能知道精确距离。

目前的测量精度已经达到了毫米级。科学家发现,月球正以每年3.8厘米的速度远离地球。

文摘

1、合同软件开发的糟糕现状

有些程序员是基于项目的合同工,不是正式的雇员。

这些程序员选择合同工,而不是稳定的全职工作,是因为想要灵活性和短期经济利益。灵活性指的是,工作时间可以自己安排,而且你可以同时签订多份合同。

可惜的是,现实情况是,公司雇佣了大量合同工,他们没有福利,解雇起来也容易得多,而且工资比全职员工低。

我知道这些,因为我干过好几次合同工。

除了薪酬和福利不如全职员工,你还根本没有带薪休假。如果生病了或者需要休息一天,就根本拿不到这一天的工资。

合同工还有一个问题,被告知的工作和最终实际分配的工作,往往存在重大差异。

我曾经面试了一个 Java 的后端职位,但实际情况是,我几乎没有编写或维护任何 Java 代码,而是被要求去写 React 代码,修复从另一个团队继承下来的有问题的 Jest 测试,以及极其缓慢的 Webpack 配置。

两个月后,我被解雇,理由是毫无根据的"绩效原因"。我知道这只是借口,我遇到了太多自己根本无法控制的问题。

我的另一次合同工经历,也是如此。我在团队里轮班待命,周六早上要值班却没有工资;我提交的工时表被断然拒绝,老板打电话问我为什么要加班。

后来我发现,我的雇主不愿意支付我加班费,再后来我被解除了合同,他们在电话里告诉我不胜任这项工作。

总之,现在的软件合同工有各种弊端,却得不到任何好处。如果有人能从合同工变成全职员工,那当然很好,但在我工作过的每家公司里,合同工都是二等公民。

言论

1、

哈佛大学2024-2025学年,成绩为 A 的作业比例约为60%,远远高于2005-2006学年的约25%,可见成绩膨胀有多严重。

-- 《华尔街日报》

2、

Claude Mythos 模型可以发现并利用系统漏洞,外部评测证实了这一点。但是,评测者也发现了一个残酷的事实:你花费的 Token 费用越多,它发现的漏洞就越多,系统也就越安全。

这意味着,你想要系统安全,就必须比攻击者花费更多的 Token。因此,安全行业变得像采矿的工作量证明,谁的投入多,谁就赢。

-- Simon Willison,著名开发者

3、

一年前,我经常收到代码质量低劣、甚至完全不知所云的 pull request,这让我怀疑提交者是不是用了 AI,所以代码才这么糟糕。

今年不同了,当我收到拼写错误、语法错误的低质量 pull request 时,我反而会怀疑贡献者是不是忘了使用 AI 来写代码,因为 AI 会显著提高代码质量的下限。

-- 《ClickHouse 的 AI 编程实践》

4、

当代战争进行时,政府通过表情包和玩偶动画进行宣传,这或许让人觉得匪夷所思,但这正是平台时代的体现。

将战争包装成娱乐性的视觉语言,会使得宣传更容易传播。社交媒体是一个开放的竞技场,最具吸引力的内容将获得最大的传播范围。

-- 《当病毒式传播成为信息》

5、

大模型意味着,Markdown 现在是一种可执行文件格式。你下载一个 Markdown 文件,你的大模型就多了一个新的第三方依赖项,它的任何修改都可能是注入攻击。

-- 《第三方依赖的冷却时间》

往年回顾

未来就是永恒感的丧失(#346)

xz 后门的作者 Jia Tan 是谁?(#296)

永不丢失的网络身份(#246)

掌机的未来(#196)

(完)

📰 今日新闻精选:

  • 一季度国内 GDP 同比增长 5.0%,实现良好开局;一季度内需对经济贡献率达 84.7%,同比提高近 30 个百分点
  • 一季度全国居民人均可支配收入 12782 元,同比名义增长 4.9%;一季度全国城镇调查失业率平均值为 5.3%,与上年同期持平
  • 一季度全国新建商品房销售额约 1.73 万亿元,小阳春带动 3 月单月量价齐升
  • 我国科学家实验室复刻 “类球状闪电”,揭示百年自然之谜,相关成果已在国际学术期刊发表
  • 多国气象机构研判:140 年来最强厄尔尼诺正在太平洋酝酿,或叠加全球变暖冲击历史高温纪录
  • 四川资中县一周连发十几次地震,最高震级 4.2 级,应急局回应:暂无伤亡和损失报告,专家研判系正常构造活动
  • 浙江率先探索建设 “潮汐学校”:学校学段可根据生源变化在初中与高中间动态调整
  • 杭州一诊所义诊用一个针头给 15 人采血,涉事诊所称:员工不懂已开除,并带采血居民体检打疫苗
  • 内蒙古一研究院 1200 元办院士证、1000 元办专家证,官方通报:已叫停,约谈负责人
  • 约 20 位中国学者被美方拒绝入境,外交部提醒赴美国中国公民注意入境安全风险
  • 美媒:皮尤民调显示,美国人对华好感度已连续三年回升‌,并恢复至 2019 年水平
  • 美媒:美国多位机密领域科学家失踪或死亡,白宫回应:若属实,会认真调查
  • 德媒:德国准备参与霍尔木兹海峡安全保障行动;伊朗向美提霍尔木兹海峡开放新方案:允许船只自由通过阿曼一侧水域
  • 外媒:俄罗斯正式承认 2024 年误击阿塞拜疆一客机致 38 人遇难,双方达成和解,俄方将支付赔偿金
  • 外媒:特朗普宣布黎巴嫩与以色列将停火 10 天;以色列确认同意停火 10 天,但表示不会从黎巴嫩撤军

📅 今日信息:

  • 公历:2026-04-17 星期五 白羊座
  • 农历:二〇二六年三月初一
  • 下一节气:2026-04-20,谷雨
  • 今年进度:29.32%(已过 107 天,剩余 257 天)

🌟 历史上的今天

  • 1961 年:美国支持的猪湾入侵事件失败,古巴革命政府成功抵御进攻,这一事件加剧了冷战时期的紧张局势。
  • 2014 年:韩国世越号客轮沉没事故,造成大量人员伤亡,引发了韩国社会对安全监管的广泛反思和改革。

在某东自营买了两瓶六神花露水,收到后发现瓶身上印有电商专供字样。然后打开后使用了一下,感觉味道没有以前的浓了,涂抹身上没有凉凉的感觉。感觉和以前在线上实体超市买的不一样。