包含关键字 typecho 的文章

Generate Random String in Bash

随机字符串是随机生成的字符序列,而不是由固定的模式或预先决定的序列。随机字符串通常用作密码、密钥或标识符。Bash 中生成随机字符串非常简单和便利,Bash 中可以使用几种内置程序和命令生成随机字符串的。在本文中,我们将探索实现这一目标的各种方法,并提供相关的示例。

1. 使用 $RANDOM 变量

Bash shell 提供了一个名为 $RANDOM 的特殊变量,它返回 0 到 32767 之间的随机数。您可以利用这个变量来生成一个随机字符串。

echo $RANDOM

但是,这只会返回一个数字。如果您想要一个包含字符的字符串,那么您可能需要更具创造性一些。

echo $(date +%s%N) | sha256sum | head -c 10

该命令使用当前时间戳(以纳秒为单位),并将其输送到 sha256sum 命令,然后取前 10 个字符。

2. 使用 /dev/urandom

/dev/urandom 是一个设备文件,它提供了一个加密安全的随机数源。

例如,生成一个长度为 10 的随机字符串

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1

相关参数说明如下:

  • cat /dev/urandom : 从 /dev/urandom 输出随机字节
  • tr -dc 'a-zA-Z0-9' : 删除非字母数字的字符
  • fold -w 10 : 将输出封装为 10 个字符宽,实际上每行 10 个字符
  • head -n 1 : 只需要第一行

3. 使用 openssl

可以使用 openssl 命令和 base64 编码函数,例如:生成长度为 10 的随机字符串(包括字母、数字和特殊字符)

openssl rand -base64 10

你也可以使用 tr 命令删除不希望包含的任何字符。例如:生成一个长度为 10 的随机字符串(只包含大写字母和数字)

openssl rand -base64 10 | tr -dc 'A-Z0-9'

4. 使用 pwgen

pwgen 是一个专门用来生成密码的工具,也就是说可以产生随机字符串。如果你没有安装它,你可以通常通过包管理器(apt-get、 yum、 brew)获取安装。

例如,生成一个长度为 10 的随机字符串。

pwgen 10 1

5. 使用 Bash Arrays

您可以将 bash 数组与 $RANDOM 组合以生成随机字符串。

ARRAY=('a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z')
RAND_STR=""
for i in {1..10}; do
  RAND_STR+="${ARRAY[$RANDOM % ${#ARRAY[@]}]}"
done
echo $RAND_STR

我的开源项目

酷瓜云课堂-开源知识付费解决方案

我把它叫做 [举起手来] 视频播放器。

如图

你需要打开电脑摄像头,选择本地视频文件,然后举起你的双手,视频才会播放

如果你中途放下你的手,视频会自动暂停

PixPin_2026-02-26_23-13-25.png
PixPin_2026-02-26_23-18-21.png

你们一定想找这种播放器很久了吧 [doge]

哈哈哈哈哈哈哈哈

https://handsup.1link.fun/

对了,上次做的颈椎贪吃蛇游戏(摄像头识别转头方向控制贪吃蛇游戏),正在做桌面离线版本,进度大概 80% 了。

玩键盘这件事,我算是折腾了挺多年。

前前后后入手过十几把,青轴、红轴、茶轴、黑轴、矮轴都试过,Cherry、佳达隆、凯华这些主流轴体也基本体验了一遍,各种配列从 100%、75% 到 60% 也都换着用。但说到底,不管怎么换,始终都没跳出 QWERTY 标准键盘的架构。

折腾到最后,我一度觉得找到了自己的舒适区 —— NiZ 静电容键盘,手感对我最友好,甚至打算就用它「养老」,也确实安安静静用了好几年。

但最近还是没忍住,又一次开始「剁手」了,决定试试人体工学键盘。

纠结了很久,最终选了最便宜的一款,毕竟不确定自己能不能适应。布局也挑了最容易上手的 ALICE 布局,先从入门款开始体验。

640

拿到手刚用三天,感受还不错。

第一天完全不适应,键位经常按错,打一句话就要改两三个字,磕磕绊绊很不习惯。

第二天开始明显好转,感觉肌肉记忆慢慢形成了,打中文已经能比较流畅地输入 (不得不说微信输入法的自动纠错帮了不少忙)。不过输入英文,尤其是无规律的验证码,还是得低头找键。

整体适应速度比我预想的要好,网上说一般 7 天左右能恢复正常输入效率,照目前的状态,应该差不多。

还有个意外收获:强制纠正了我不标准的指法。比如我以前习惯用右手按 B 和 F6 等键位,用人体工学键盘后,不得不改回正确手法,也算一个正向改变。

640 (1)

用到现在也就两三天,输入效率在慢慢回升,但还没到平时的水平。至于大家说的,对肩膀、手臂、尤其是手腕的舒适度提升,目前还没明显感受到,应该需要更长时间才能体现出来。

另外也有个小疑问:等彻底适应人体工学布局后,再用回 MacBook 自带的标准键盘,会不会反而不习惯?这个只能后续观察了。

640 (2)

这篇就单纯是个初体验记录,等用一两个月之后,我再写一篇完整的使用报告。如果确实好用、值得推荐,到时候也会整理出来跟大家详细分享。


全文链接 人体工学键盘初体验

都说职场如戏,全靠演技。但有时候,现实剧情的荒诞程度,甚至都远超了你我的想象。

过年假期在家刷到这样一个职场帖子,看完是既觉得搞笑,又觉得无奈,原文大概是这样描述的:

“有个同事,去年年中的绩效是C,年底还是C。他主动提了离职,结果领导死活不让他走,还说后面还有机会。起初我还以为领导是真心挽留,结果他私下透露,他走了,就没人背这个绩效了。”

提到「绩效」这个事情,相信大多同学在公司都经历过。

尤其像是在年前、年后这阵,往往是和过去一年的年终奖什么的,都直接挂钩的。

本来「绩效」这个东西的推出初衷是为了激励团队进步、识别高潜人才,但到了执行层面,尤其是在一些管理能力欠缺的中层大聪明领导手中,它就异化成了一场充满算计的数字游戏。

第一种就是搞所谓的绩效锁定。

有些公司,为了所谓的优胜劣汰,实行强制分布式的绩效考核制度。

简单点来说,就是公司要求每个部门,必须按比例评出一定数量的 S、A、B,甚至 C。

初衷或许是好的,想打破大锅饭,但到了执行层面,当一个团队整体都很优秀,或者领导不想得罪人时,那个必须存在的 C,就成了一个烫手山芋。

于是,谁是那个最没有话语权、最不会向上管理、最不懂人情世故、或者最“老实”的人,谁就很有可能成为那个背锅的人。

还有一种公司也挺搞笑的,人家不搞绩效锁定,但是搞起了所谓的绩效轮转。

什么意思呢?

公司也是要求团队必须比例评出一定数量的 S、A、B、C 绩效,但是拿 C 的员工会轮着来。

这次你拿 C,下次他拿 C,然后上次拿过 C 的同事在后面的绩效评比中再通过给 S 再勾回来,以此达到一种动态的平衡。

说实话,这种比起上面那种所谓的绩效锁定,找人背 C 来说,看起来似乎还要稍微那么良心一点。

再回过头来看,像上面帖子中这位同事的遭遇,就是典型的绩效考核异化的受害者,纯纯的被当成了团队里背 C 的工具人。


那么,面对这种“被背锅”的局面,如果是你,你会怎么办呢?

这里也来聊聊我自己的几点想法。

首先,也是最重要的,就是心态的转变和调整。

我们首先要明白,绩效评价并不完全等同于你的个人实际价值。

拿了一个 C,只能代表在那个特定的时间、特定的领导、特定的游戏规则下,你被选中了。它不能定义你的技术能力,更不能否定你过去的努力。

拿到一个不公正的绩效评价,不一定是你能力的问题,有可能是公司制度的问题,或者是领导管理能力的问题,甚至有可能是某些人特意耍的心机而已。

不要轻易否定自己,不要让别人的错误,来惩罚自己。

其次,面对这种不公,沉默和忍让往往换不来尊重,只会让对方得寸进尺。

如果可能,尝试去沟通,去了解那个 C 背后的真实理由。

如果沟通无效,那么就要开始为自己谋划后路,同时注意保留好自己的工作成果、沟通记录等证据,以备不时之需。

最后,也是最重要的一点,我们要能有随时离开的勇气和能力。

这一点之前咱们这里多次提及,在技术行业,吃老本是最危险的。

当今的技术世界变化太快,而作为程序员的我们则恰好处于这一洪流之中,这既是挑战,也是机会。

还是那句话,一定要定期评估一下自己的市场价值:如果明天就离开现在的公司,你的技能和经验是否足以让你在市场上获得同等或更好的位置?

无论在公司工作多久,都要不断更新自己的技能和知识,确保自己始终具有市场竞争力。

有一说一,如果一个环境已经坏到需要你靠背锅来生存,那么这个地方,不待也罢。

虽然离开可能会面临短期的阵痛,比如空窗期、比如收入的暂时减少,但是从长远来看,未必是坏事。

因为虽说大环境寒冷,但有时候摆脱一个有毒的团队和一个扭曲的环境,才是对自己职业生涯最大的负责,大家觉得呢?

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

我大多数情况都是跑步使用,每次使用完不太方便清理;

索性就直接放进去了也不影响听觉,但是就会越来越脏,如图。。。

是不是需要随手准备一把刷子用完刷一刷,或者有其它更方便的建议,请大佬们支招~

AirPods

AirPods

连续两天 还有谁 昨天一个老哥说 1 不是最低,0 才是最低,好家伙 今天直接喜提 0sobbing

图片

图片

作者:高玉龙(元泊)

背景介绍

最近,基于 AI Agent 的各种手机助手在社交媒体上爆火,它能够通过 AI 自动操作手机完成下单、比价、搜索等复杂任务。用户只需说一句“帮我找最便宜的 iPhone”,AI 就能自动打开购物 App、搜索商品、对比价格并完成下单。这种“AI 接管手机”的场景,让很多人看到了未来人机交互的新形态。

然而,当 AI 开始大规模操作手机时,传统的用户行为分析将会面临严重的数据污染问题,如:

  • 转换率虚高:AI 自动下单会对转换率数据造成干扰,导致业务决策误判
  • 用户路径分析失效:AI 操作的路径高度优化且重复,会污染用户行为路径的分析
  • 推荐算法偏差:基于 AI 操作数据训练的推荐模型,会偏离真实用户偏好

如何识别“非人”操作?我们先拆解下 AI 或脚本是如何操作手机的。

技术拆解

我们先看下 AI Agent 操作手机的原理。

image

主要分为以下几个层次:

  • 用户入口层:用户通过文字/语音等方式下达操作指令
  • 屏幕捕获层:获取原始屏幕信息
  • 云端通信层:云端推理服务器
  • 操作执行层:点击、滑动、长按、输入等

从移动端监控角度去识别“非人”操作,需要重点关注“操作执行层”。以 Android 平台为例,在“操作执行层”常见的有三种技术路径可以实现“非人”操作:

  • 通过 AccessibilityService(无障碍服务)输入事件
  • 通过 INJECT_EVENTS 注入事件
  • 通过 adb shell input 注入事件

除此之外,定制 ROM、外接硬件等也可以实现“非人”操作,这部分暂时不在本文的讨论范围。

通过 AccessibilityService 输入事件

AccessibilityService 是 Android 提供的无障碍服务框架,原本用于辅助残障人士使用手机,但也可以用于自动化操作。是各种辅助功能应用、游戏辅助工具实现自动化操作的主要技术路径。

AccessibilityService 的工作机制可以分为三个阶段:

  • 阶段一:事件监听
  • 阶段二:屏幕读取
  • 阶段三:自动化操作

阶段一:事件监听

当应用界面发生变化时(如新页面打开、按钮状态改变),系统会通过 AccessibilityEvent 通知已注册的无障碍服务。服务可以监听多种事件类型,包括窗口状态变化、内容变化、视图滚动等。

阶段二:屏幕读取

无障碍服务可以获取当前活动窗口的视图层次结构(View Hierarchy),通过 AccessibilityNodeInfo 对象访问屏幕上的所有 UI 元素,包括:

  • 文本内容(按钮文字、输入框内容等)
  • 视图属性(位置、大小、可点击性等)
  • 视图层次关系(父子节点、兄弟节点等)
  • 这使得 AI Agent 能够“看到”屏幕上的内容,理解当前界面状态

阶段三:自动化操作

基于读取的屏幕内容,无障碍服务可以执行两种类型的操作:

  • 节点操作:直接对 UI 节点执行操作(点击、长按、输入文本等)
  • 手势操作:通过 GestureDescription API 执行复杂的触摸手势(滑动、拖拽、多点触控等)

通过无障碍服务输入事件,有以下特点:

  • 需要用户授权:用户需要在系统设置中手动开启无障碍服务
  • 屏幕内容读取:可以完整读取屏幕上的文本、视图层次结构等信息
  • 操作能力灵活:支持点击、滑动、长按、输入文本等复杂操作

通过 INJECT_EVENTS 注入事件

INJECT_EVENTS 是 Android 系统级权限,允许应用直接向输入系统注入触摸事件,模拟用户操作。这个是 Android 系统层面提供的底层事件注入机制。

INJECT_EVENTS 的工作机制也可以分为三个阶段:

  • 阶段一:事件构造
  • 阶段二:权限验证
  • 阶段三:系统注入

阶段一:事件构造

应用通过 Instrumentation 或反射调用系统 API,构造 MotionEvent 对象。这个对象包含了触摸的坐标、动作类型(ACTION_DOWN、ACTION_UP 等)等基本信息。

阶段二:权限验证

Android 系统会检查调用者是否具有 INJECT_EVENTS 权限。这个权限是系统级权限,普通应用无法获取,只有以下情况下才能使用:

  • 系统应用(具有系统签名)
  • Root 权限的应用

阶段三:系统注入

通过权限验证后,事件会被直接注入到 Android 的输入子系统(Input System)。输入子系统负责处理所有输入事件(触摸、按键等),注入的事件会被当作真实的硬件输入事件处理,分发给当前焦点窗口。

通过 INJECT_EVENTS 注入事件有以下特点:

  • 底层注入:事件直接注入到系统,发生在更底层
  • 无需用户授权:不需要用户手动授权(但需要系统签名或 root 权限)
  • 更难检测:注入发生在系统底层,更难被应用层检测

通过 adb shell input 注入事件

adb shell input 是 Android Debug Bridge(ADB)提供的命令行工具,用于通过 USB 连接或网络连接向设备注入输入事件。这是开发调试和自动化测试中常用的方式。与 INJECT_EVENTS 在本质上是一样的,在调用主体和权限获取方面存在差异。

通过 adb shell input 注入事件的工作机制主要分为四个阶段:

  • 阶段一:命令发送
  • 阶段二:ADB 协议传输
  • 阶段三:守护进程处理
  • 阶段四:系统注入

阶段一:命令发送

在 pc 端或远程设备上(如 USB 设备等),可以通过 ADB 客户端发送 input 命令,如下:

adb shell input tap 500 1000                 # 点击坐标(500, 1000)
adb shell input swipe 100 200 300 400        # 从(100, 200)滑动到(300, 400)
adb shell input text "hello"                 # 输入文本 "hello"

阶段二:ADB 协议传输

ADB 客户端通过 USB 或 TCP/IP 网络,将命令发送到 Android 设备端的 ADB 守护进程(adbd)。ADB 协议负责命令的序列化、传输和反序列化。

阶段三:守护进程处理

设备端的 adbd 守护进程接收到命令后,解析命令参数,构造相应的 MotionEvent 或 KeyEvent 对象。adbd 进程以系统权限(通常是 shell 或 root)运行,具有系统级权限。

阶段四:系统注入

adbd 调用系统 API(InputManager.injectInputEvent()),将事件注入到输入子系统。这个过程与应用内 INJECT_EVENTS 的最终注入路径相同。

与 INJECT_EVENTS 对比,adb shell input 方式注入事件有以下特点:

  • 需要经过 ADB 协议传输
  • 权限获取方式:只要建立了 ADB 连接就能获取到权限,不需要修改应用
  • 事件注入的底层实现与 INJECT_EVENTS 一致

如何检测“非人”操作

不少外挂和脚本,包含可以操作手机的 AI Agent 等都在使用上述方案。但特殊人群(如视障用户)也在使用无障碍服务。简单的通过特征值对事件进行分析,可能会造成误判。下文将主要探讨当操作事件发生时,如何通过采集事件的特征以及外部环境的特征,辅助分析“非人”操作事件。

识别 AccessibilityService 输入事件

通过 AccessibilityService 操作手机,需要先在手机系统设置中开启对应的障碍服务。Android 系统提供了可以判断是否有无障碍服务在运行的相关 API,如下:

  • 支持检测是否存在正在运行的无障碍服务
  • 支持读取无障碍服务的 ID
  • 支持检测屏幕内容是否被读取
  • 支持检测是否具备操作应用的能力
// 检测是否存在正在运行的无障碍服务
public boolean hasAccessibilityServiceRunning() {
      AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
      return am != null && am.isEnabled();
}
// 检测无障碍服务的Id
public void checkServiceId() {
    List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
    for (AccessibilityServiceInfo service : enabledServices) {
        // 获取服务 ID (通常是 "包名/类名")
        String id = service.getId();
    }
}
// 检测是否具备操作应用的能力
public boolean hasFullControlAgent() {
    List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
    for (AccessibilityServiceInfo service : enabledServices) {
        int capabilities = service.getCapabilities();
        // 1. 检查是否有可以读取屏幕
        boolean canRetrieve = (capabilities & AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0;
        // 2. 检查是否可以操作应用
        boolean canPerform = (capabilities & AccessibilityServiceInfo.CAPABILITY_CAN_PERFORM_GESTURES) != 0;
        // 具备操作应用的能力
        if (canRetrieve && canPerform) {
            return true;
        }
    }
    return false;
}

除此之外,还可以通过检查 MotionEvent 的 flags 来判断事件是否通过无障碍服务产生:

// 检测事件是否由无障碍服务产生(有API版本要求)
public boolean isAccessibilityEvent(MotionEvent event) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        int flags = event.getFlags();
        // 使用位运算检查是否包含 0x800
        return (flags & FLAG_IS_ACCESSIBILITY_EVENT) != 0;
    }
    return false;
}

通过以上方式,应用虽然可以检测到当前是否存在正在运行的无障碍服务,但也可能对正常的无障碍服务造成误伤。

识别 INJECT_EVENTS 注入事件

INJECT_EVENTS 注入的事件一般有以下特征:

  • 事件属性可能缺少压力值、触摸面积等属性
  • 标志位可能是 FLAG_IS_GENERATED_GESTURE
  • 事件来源可能是 SOURCE_UNKNOWN

检测逻辑如下:

public boolean isEventInjected(MotionEvent event) {
    if (event == null) {
        return false;
    }
    // 方法1:检查事件属性
    // 注入的事件可能缺少压力值、触摸面积等属性
    boolean hasPressure = event.getPressure() > 0;
    boolean hasSize = event.getSize() > 0;
    boolean hasToolType = event.getToolType(0) != MotionEvent.TOOL_TYPE_UNKNOWN;
    // 如果事件缺少这些基本属性,可能是注入的(可能会误判)
    if (!hasPressure && !hasSize && !hasToolType) {
        return true;
    }
    // 方法2:检查事件标志位
    int flags = event.getFlags();
    // FLAG_IS_GENERATED_GESTURE 表示是程序生成的手势
    if ((flags & 0x08000000) != 0) {
        return true;
    }
    // 方法3:检查事件来源
    int source = event.getSource();
    if (source == InputDevice.SOURCE_UNKNOWN) {
        return true;
    }
    return false;
}

通过 INJECT_EVENTS 注入的事件,目前并没有非常可靠的单一方法,因为注入的事件发生在更底层,可以绕过应用层的检测机制。对于这类事件的注入,往往需要多维度综合检测的方式进行识别(也适用其他类型的注入事件检测)。即便如此,也可以尝试对事件特征进行检测,用于提升识别“非人”操作的成功率。

识别 adb shell input 注入事件

通过 adb shell input 注入的事件,本质上与通过 INJECT_EVENTS 注入的事件是一样的。但由于需要连接 ADB,相对 INJECT_EVENTS 的注入,可以通过检测 ADB 连接状态等进行识别。

检测 ADB 是否开启:

public static boolean isAdbEnabled(Context context) {
    return Settings.Global.getInt(
        context.getContentResolver(),
        Settings.Global.ADB_ENABLED, 0
    ) > 0;
}

检测 USB 连接状态:

private static boolean isUsbConnected(Context context) {
    Intent intent = context.registerReceiver(
        null,
        new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
    );
    if (intent == null) return false;
    int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    // 判断是否通过 USB 供电
    return plugged == BatteryManager.BATTERY_PLUGGED_USB;
}

检测 ADB 端口是否打开:(无线调试和模拟器场景)

  private static boolean isAdbPortOpen() {
      // 常见的 ADB 端口,5555 是默认,部分模拟器可能是 5554-5585
      int[] ports = {5555, 5554, 5556, 5557, 5558, 5559, 5560};
      for (int port : ports) {
          try (Socket socket = new Socket()) {
              socket.connect(new InetSocketAddress("127.0.0.1", port), 50);
              Log.w(TAG, "isAdbPortOpen, opened. port: " + port);
          } catch (Exception e) {
              // ignored
              e.printStackTrace();
              Log.w(TAG, "isAdbPortOpen, closed. port: " + port);
          }
      }
      return false;
  }

检测调试器状态:

public static boolean isDebuggerAttached() {
    return android.os.Debug.isDebuggerConnected();
}

检测 USB ADB 状态:

private static boolean isUsbAdbActive() {
    try {
        Class<?> systemPropertiesClass = Class.forName("android.os.SystemProperties");
        Method getMethod = systemPropertiesClass.getMethod("get", String.class);
        String usbState = (String) getMethod.invoke(null, "sys.usb.state");
        // 判断是否包含 adb
        // 常见的返回值:
        // "mtp,adb" -> 开启了 MTP 传输且 ADB 已连接
        // "adb"     -> 仅充电模式且 ADB 已连接
        // "mtp"     -> 仅 MTP,未开启 ADB
        if (usbState != null && usbState.contains("adb")) {
            return true;
        }
        // 双重校验:有些厂商可能用 persist.sys.usb.config
        String usbConfig = (String) getMethod.invoke(null, "persist.sys.usb.config");
        if (usbConfig != null && usbConfig.contains("adb")) {
            return true;
        }
    } catch (Exception e) {
        // 反射失败或权限不足(部分高版本 Android 可能限制读取)
        e.printStackTrace();
    }
    return false;
}

通过以上方式,可以采集到操作时的 ADB 相关环境信息。在分析操作事件发生时,结合 ADB 相关的状态信息,可以协助判断当前应用“非人”操作的可能性。

通过 RUM + 自定义 Query 识别异常操作

以上三种方式检测的结果字段将会通过 RUM SDK 上报到用户体验监控产品,通过对结果字段的查询分析可以快速识别可疑的非人操作。以下是几个分析场景。

场景一:识别开启无障碍服务的用户

通过分析无障碍服务的开启状态和服务 ID,快速定位可能存在非人操作的用户。

-- 查询最近1小时内开启无障碍服务的用户及其操作次数
* and context.accessibility_enabled: true | 
SELECT 
  "user.name",
  "context.accessibility_service_id",
  COUNT(*) as operation_count,
  COUNT(DISTINCT "session.id") as session_count
GROUP BY 
  "user.name", "context.accessibility_service_id"
ORDER BY 
  operation_count DESC
LIMIT 100

分析说明:如果某个用户的操作次数异常高,且开启了非系统的无障碍服务,需要重点关注。

场景二:识别具备全控能力的无障碍服务

重点分析具备读取屏幕和操作应用双重能力的无障碍服务。

-- 查询具备全控能力的无障碍服务及影响的用户数
* and context.can_retrieve_window: true and context.can_perform_gestures: true | 
SELECT 
 "context.accessibility_service_id",
 COUNT(DISTINCT "user.name") as affected_users,
 COUNT(DISTINCT "device.id") as affected_devices
FROM log
GROUP BY "context.accessibility_service_id"
ORDER BY affected_users DESC

分析说明:同时具备屏幕读取和手势操作能力的服务,更有可能被用于自动化操作。

场景三:识别 ADB 连接环境下的操作

分析在 ADB 连接状态下的用户操作,可能存在脚本或自动化工具。

-- 查询 ADB 开启状态下的用户操作特征
* and context.adb_enabled: true or context.usb_adb_active:true or context.adb_port_open: true | 
SELECT 
 "user.name",
 "device.id",
 CASE 
 WHEN "context.adb_enabled" = true THEN 'ADB已开启'
 WHEN "context.usb_adb_active" = true THEN 'USB-ADB已连接'
 WHEN "context.adb_port_open" = true THEN 'ADB端口已打开'
 END as adb_status,
 COUNT(*) as event_count
FROM log
GROUP BY "user.name", "device.id", adb_status
ORDER BY event_count DESC
LIMIT 100

分析说明:ADB 连接状态下的操作,可能是自动化脚本。

场景四:识别注入事件特征

通过事件标志位和属性缺失情况,识别可能通过 INJECT_EVENTS 注入的事件。

-- 查询具有注入特征的事件
* and event_type: "action" and (
 context.is_generated_gesture: true or context.event_source = 'SOURCE_UNKNOWN' or (context.has_pressure: false and context.has_size: false and context.has_tool_type: false)
) | 
SELECT 
 "user.name",
 "device.id",
 COUNT(*) as injected_event_count,
 COUNT(DISTINCT session_id) as session_count,
 ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (PARTITION BY "user.name"), 2) as inject_ratio
FROM log
GROUP BY "user.name", "device.id"
HAVING injected_event_count > 50
ORDER BY inject_ratio DESC
LIMIT 100

分析说明:如果某个用户的注入事件占比过高(如超过 50%),很可能存在非人操作。

结语

以上内容对 AI Agent 或脚本操作手机的技术原理进行了分析,同时也介绍了三种技术路径下如何提取事件的特征信息。AutoGLM、豆包手机等 AI Agent 的兴起,标志着移动端交互即将进入新的阶段。AI 能够自动完成复杂的交互操作,这既是技术的进步,也为如何识别“非人”操作带来新的挑战。移动端监控要做到准确的“非人”识别,需要通过多个维度进行检测和识别。包括但不限于:应用运行环境检测能力的增强,无障碍服务包名特征的检测,设备特征的检测,行为特征的检测,屏幕轨迹特征的检测等。当前,阿里云可观测用户体验监控 SDK 已经采集相关属性,基于这些属性可以自定义分析当前是否可能存在非人操作(功能灰度中,可以加入钉钉交流群联系笔者,群号:67370002064)。

起因

先说结论:用了一个假期的 OpenClaw 之后,我决定自己造一个。

不是 OpenClaw 不好,Telegram UI 确实香,但用深了之后问题实在太多,多到我一个写代码的人每天花一半时间在跟工具较劲,而不是在干活。

痛点一:发了消息之后完全不知道它在干什么

这是最让我抓狂的。你给 Claude 一个任务,然后呢?然后就是对着 Telegram 聊天窗口干瞪眼。它在读文件?在跑命令?在思考人生?你不知道。配了消息切分也不行——切太碎 Telegram 直接 429 ,指数退避之后两条消息要等 10 分钟才发出来。10 分钟。你坐在那里等 10 分钟看一条消息,这体验跟拨号上网有什么区别?

痛点二:两个 Agent 打架

这是架构层面的硬伤。Claude Code 本身已经是一个非常成熟的 Agent 了,有完整的工具链:Bash 、Read 、Write 、Edit 、Grep 、WebSearch……它自己就能干活。但 OpenClaw 的 pi-mono 框架也是个 Agent ,也想管事。结果就是两个 Agent 互相抢活干,你不得不把 Claude 本来就能做的事情委托给 OpenClaw 去调度,这太不 AI 了。

说白了我需要的只是一个监工 + 调度器,不是另一个 Agent 。那堆 SAUL 和 SKILL 对我来说完全用不上——Claude 自己就能做。唯一算有点用的计划任务和 heartbeat ,对稍微有点经验的人来说也是鸡肋。

痛点三:Anthropic 封了 OpenClaw

嗯,这个不多说了。


所以我做了 ClawRelay

架构图一目了然:

Flutter 桌面客户端
    ↓ HTTP/SSE ( OpenAI 兼容协议)
Go Relay Server (:50009 )
    ↓ subprocess fork
Claude Code CLI (带完整工具链)
    ↓
Anthropic API → Claude Opus/Sonnet/Haiku

核心设计哲学:Claude Code 是干活的人,ClawRelay 只是给它装了个好看的壳。

不抢活,不加戏,不搞中间商赚差价。Go relay 是一个无状态的透传层,把 Claude Code 的 stream-json 转成 OpenAI 兼容的 SSE 格式,Flutter 客户端接住渲染。所有工具调用、文件读写、命令执行,全部由 Claude Code 自己搞定。

你能看到 Claude 在干什么

这是我最在意的功能。消息发出去之后:

  • 实时 token 流:Claude 打一个字你就看到一个字
  • Extended Thinking 面板:Claude 的思考过程实时展示,默认折叠,点开看完整思维链
  • Tool Call 标签:Claude 每调用一个工具,底部就多一个 chip——Bash 、Read 、Edit 、WebSearch……一目了然

再也不用对着屏幕发呆猜它在干嘛了。

多项目管理

每个项目独立配置:

  • 工作目录( Claude 在哪个目录下干活)
  • System Prompt (你的个性化指令)
  • 模型选择( Opus / Sonnet / Haiku 随便切)
  • 独立的消息历史,SQLite 本地持久化

项目之间互不干扰,有新消息还会亮未读标记。同时盯三四个项目的进度完全没问题。

OpenAI 兼容协议

/v1/chat/completions,标准的 OpenAI API 格式。这意味着理论上你可以用任何支持 OpenAI API 的客户端连上来。Go relay 做了模型别名映射:gpt-4 → Opus ,gpt-4o → Sonnet ,gpt-3.5-turbo → Haiku 。还有 /v1/stats 端点追踪 token 用量。


技术栈

组件 技术
桌面客户端 Flutter + Riverpod + Drift(SQLite) + Material Design 3
Relay 服务 Go 1.24 ,无框架,subprocess 管理
流式传输 SSE ( Server-Sent Events )
本地存储 SQLite (~/.config/clawrelay/clawrelay.sqlite )

整个项目没用什么花里胡哨的依赖,Go 后端甚至没引 web 框架,标准库直接撸。


跟 OpenClaw 的本质区别

OpenClaw ClawRelay
架构 Agent 调度 Agent 纯 UI 壳 + 透传 Relay
工具执行 框架接管 Claude Code 原生执行
UI Telegram Bot Flutter 原生桌面应用
消息延迟 受 Telegram API 限制 本地直连,零延迟
可观测性 黑盒 实时 streaming + thinking + tool chips
复杂度 重( pi-mono + SAUL + SKILL ) 轻(一个 Go binary + 一个 Flutter app )

手机上和电脑上之前都没法愉快地做监工,现在终于舒服了。


最后

代码已开源,欢迎 PR:https://github.com/roodkcab/clawrelay

如果你也是 Claude Code 重度用户,如果你也受够了终端的不好体验或者对着 Telegram 猜 Claude 在干什么,试试 ClawRelay 。

它不多管闲事,不跟 Claude 抢活干,只做一件事:随时随地让你清清楚楚地看到 Claude Code 在帮你干什么。


一个假期的怨气,化成了代码。

ClawRelay

用了一圈 AI 聊天 App ,有三个点一直不习惯,所以自己做了一个。

1. "角色"比"助手"更清晰。 助手这个叫法我一直不习惯,所以改为角色了。Talkio 用角色系统:苏格拉底、毒舌评论家、代码审查员,每个有自己的性格和说话方式。

2. 交互参考微信。 中国人最熟悉的聊天界面就是微信,没有学习成本,打开就会用。

3. 为什么 AI 群聊不流行? 这是我最不理解的。把多个 AI 拉进同一个群聊,让它们辩论、接龙、协作,深度讨论问题总能给我惊喜。

v2.0 发布 — 从 React Native 迁移到 Tauri 2 ,新增桌面端

Talkio 2.0 完成了技术栈迁移:从 Expo + React Native 迁移到 Tauri 2,现在一套代码同时支持 Windows / macOS / Linux / Android

为什么迁移?

  • React Native 桥接机制在长对话、流式渲染场景下性能瓶颈明显
  • Tauri 2 使用原生 WebView ,Markdown / Mermaid / KaTeX 渲染更流畅
  • 一套前端代码覆盖桌面和移动端,不用维护两套

GitHub: https://github.com/llt22/talkio 如果觉得有用,多多 star 谢谢

下载: https://github.com/llt22/talkio/releases ( Windows / macOS / Linux / Android )


桌面端

桌面端主界面

移动端


功能亮点

  • 支持任何 OpenAI 兼容 API ( DeepSeek / Claude / Gemini / Ollama…)
  • 多模型群聊 — 把不同 AI 拉进同一个对话,各自扮演不同角色
  • 托管讨论 — 让 AI 之间自动轮流发言,围绕话题展开讨论
  • 流式输出、Markdown 、代码高亮、Mermaid 图表、HTML 实时预览
  • 深度推理( reasoning_content / <think> 标签)
  • MCP 工具调用、语音输入、消息分支、数据备份
  • 本地优先,数据不经过任何服务器


欢迎提意见和 Issue 👉 https://github.com/llt22/talkio/issues

题外话

全程 vibe coding ,说实话虽然不手写代码,但是开发起来也挺费劲的,尤其是性能问题。

作者:欧弋

引言:在这个算法统治的世界,你为什么还在用冷兵器战斗?

这是一个最好的时代,任何人都可以通过一根网线,触达亿万用户。这也是一个最坏的时代,信息的洪流每秒钟都在淹没无数平庸的声音。

作为一名内容创作者,你是否经历过这样的至暗时刻:

  • 凌晨两点,你盯着空白的屏幕,光标闪烁如同嘲讽,大脑一片空白——所谓的“灵感枯竭”。
  • 早晨八点,你刚发出一篇精心打磨的深度好文,结果阅读量只有两位数。而隔壁那个只会复制粘贴、标题惊悚的“低质内容号”,一篇水文阅读量 10 万+。
  • 全天候,你感到深深的焦虑。你听说有人做矩阵号,日产 100 篇,月入几万,而你连日更都费劲。

你痛斥“标题党”扰乱视听。但你是否想过:如果他们掌握的不仅是低门槛的手段,而是一套你看不见的高效生产力系统呢?

如果是十年前,拼的是文采;五年前,拼的是排版;那么今天,拼的是算力自动化

今天,我不卖课,不灌鸡汤,我要带你拆解一套真实的、可部署的、基于 AI 原生架构的“实时热点洞察 + 自动化内容生产系统” ——Inspo Radar(创作热点捕捉助手)。这不仅仅是一个工具,它是一套关于数据、效率与技术方法论的工程化实践。

AI Agent 如何取代你的编辑团队?

实时热点洞察用一套多智能体系统,分工明确地完成了灵感发现、深度检索、报告撰写的全流程。

猎犬(Browser Agent)—— 全网 24 小时巡逻

它是基于 Playwright 技术构建的无头浏览器集群。它像几只不知疲倦的猎犬,潜伏在微博、澎湃新闻、各大热榜的后台。

  • 抗反爬:像真人一样浏览页面,模拟指纹特征,避免平台的风控。
  • 智能清洗:网页上充斥着广告、推荐阅读。AI 会自动识别并剔除这些噪音,只提取纯净的新闻标题和热度值。

侦探(Deep Search Agent)—— 拒绝“开局一张图”

对于每一条需要深度探索的内容,系统都会在网络上进行搜索,并且真正打开搜索结果,阅读相关的内容,去理解到底发生了什么。

基于收集到的信息,它会自动生成一份情报简报,为后续的撰写步骤提供了更加可靠的信息来源。

主编(Inspiration Agent)—— 注入“传播工程”的策略

有了内容,但是未必会有读者。好的文章也要先能把人吸引过来,才能有机会陈述自己的观点。

实时热点洞察不仅仅是交付一篇报告,也是在尝试帮助大家理清思路,分析如何根据当前话题有哪些受众,应该从哪个角度进行撰写。

image

image

编辑(LLM)—— 完成最终的文章撰写

有了“主编”的分析,只需要遵循主编的要求,一篇文章就新鲜出炉了。

喝果汁也能喝出致命病毒?别再乱喝“天然饮品”了!💀

你还在为健康每天一杯鲜榨果汁?

你以为的“养生”,可能正在把致命病毒直接喝进肚子里!

没错,不是吓唬你——喝果汁,真能喝出人命!

🚨 喝一口果汁,命就没了?

最近,印度西孟加拉邦突发尼帕病毒疫情,已确诊 5 例,多人死亡,甚至有医护人员在救治过程中不幸“中招”!更可怕的是,这种病毒没有疫苗、没有特效药,一旦感染,致死率高达 40%-75%

那它是怎么传给人的?不是靠蚊子,也不是靠空气,而是——你手里的那杯果汁!

🦇 果蝠的“口水”,正在悄悄流进你的杯子!

你以为的“纯天然、无添加”椰枣汁、鲜榨果汁,背后可能藏着一个致命真相:
果蝠(狐蝠)是尼帕病毒的天然宿主。它们在夜间偷喝椰枣汁、啃食水果时,会把含有病毒的唾液、尿液留在果实上。

而很多地方采集的生椰枣汁(Tari) ,根本未经高温杀菌,直接饮用,等于直接把病毒喝下去

有图有真相:

  • 🥥 蝙蝠舔过的椰枣 → 榨汁 → 你喝 → 感染!
  • 🍎 落地水果沾了蝙蝠尿 → 洗都不洗 → 榨汁 → 中毒!

1998 年马来西亚疫情,就是猪吃了被污染的水果,人再接触猪或吃未煮熟的肉,导致上百人丧命!而这次印度疫情,直接源头就是“被污染的食物”

🥤 你以为的“健康”,其实是“高危”!

别以为只有印度人才喝椰枣汁,我们身边的风险也不少:

  • 街头现榨果汁:水果是否被动物污染?谁也不知道!
  • 自采野果生吃:果园落地果,可能沾了蝙蝠排泄物!
  • 生饮椰子水、棕榈汁:未经煮沸,病毒活蹦乱跳!

尼帕病毒潜伏期最长 45 天,一开始就像感冒:发烧、头痛、呕吐。但几天内就会发展成脑炎、昏迷、呼吸衰竭,幸存者还可能留下癫痫后遗症!

🛡️ 怎么保命?记住这 3 点!

别慌,只要做对这几点,病毒根本近不了身:

1. 果汁必须煮沸!

无论是椰枣汁、椰子水还是自榨果汁,100℃ 煮 15 分钟,病毒才能被彻底灭活!

2. 水果要洗+要削皮!

别吃落地果!别啃没削皮的水果!削皮+流水清洗,是最后的防线!

3. 别碰野生动物和病畜!

不去蝙蝠洞、不接触不明死亡动物,养猪户、果农更要做好防护!

🌍 疫情离我们远吗?

虽然目前我国暂无本土病例,但尼泊尔、泰国等邻国已紧急加强边境检疫!
病毒没有国界,尤其是这种“人传人”能力虽弱、但致死率极高的病毒,一旦传入,后果不堪设想!

📢 转发提醒家人!

别再觉得“天然=安全”了!

一杯没煮开的果汁,可能就是生命的代价!

转发给那个还在天天喝鲜榨果汁的朋友,救的可能是全家的命!

尼帕病毒 #果汁危险 #果蝠病毒 #食品安全 #健康警示 #印度疫情 #科普一下] #小心病从口入

实时热点洞察的能力实现

以下方案均基于函数计算 AgentRun 实现的。函数计算 AgentRun 是一个以高代码为核心的一站式 Agentic AI 基础设施平台。秉持生态开放和灵活组装的理念,为企业级 Agent 应用提供从开发、部署到运维的全生命周期管理。

借助于 AgentRun 提供的各种 Infra 能力,可以更加方便地完成 Agent 的开发。

  • 大模型:将大模型注册到 AgentRun 后,后续在各个需要使用大模型的地方,只需要填入 AgentRun 的资源名称,即可自动导出 API Key/BaseURL/Model 三元组生成的模型实例,快速与框架集成。
  • 浏览器沙箱:Agent 与沙箱解耦,让开发聚焦于流程,而非周边资源,填入沙箱的资源名称,即可与沙箱绑定,享受秒级的沙箱弹性,实现请求级别的隔离沙箱。

整个开发过程中,只需要将精力聚焦于拆分子 Agent,调整提示词即可

  • browser_agent:驱动无头浏览器,提取搜索结果与网页正文。
  • hot_normalizer_agent:对热榜条目进行结构化归一。
  • hot_filter_agent:对噪声条目进行规则/语义过滤。
  • hot_analyzer_agent:产出热点维度的快速分析结论。
  • topic_analyzer_agent:对单条话题做深度分析与事实梳理。
  • summary_agent:生成阶段性摘要与情报简报。
  • inspiration_agent:生成多切入角度、标题与写作建议。

image

日产 100 篇-部署“实时热点洞察”案例

  1. 打开 AgentRun 探索页面(https://functionai.console.aliyun.com/cn-hangzhou/agent/explore ),找到“实时热点洞察”

image

  1. 填写必要的参数
  • 权限配置:代码需要访问您在 AgentRun 上绑定的资源(模型、沙箱),需要包含 AgentRun 相关的权限。
  • 大语言模型:用于分析网络内容,撰写报告,建议使用 qwen3-max 获取更好的效果。
  • 浏览器沙箱:用于访问网络上的信息,模拟人工操作。

image

  1. 点击确认创建后,稍等 3~5 分钟,等待部署完成。部署完成后,点击域名最右侧的按钮,可以访问项目内容(该域名仅供测试,一天有效)

image

  1. 跳转进入页面后,点击“开始创作”,即可开始“实时热点洞察”

image

  1. 首先进入的是热搜获取阶段,系统会并发打开多个平台获取热搜关键词,并剔除无关内容,保留真正的热搜内容

image

  1. 经过分析,大模型会留下相对更值得深入的热搜词进行深度检索。每个热搜词都会在网络上进行检索,并根据检索的结果进行总结、分析

image

  1. 最后是报告撰写阶段(涉及多篇报告的撰写,请耐心等待)

image

  1. 在报告中,选择您感兴趣的内容,可以针对其生成完整的文章。点击开始创作,即可跳转到千问进行文章撰写

image

image

  1. 完整的报告内容如下

image

通过实时热点洞察,你一个人就能搭建一条可复用的热点洞察与内容生产流水线

调整参数,进一步优化流程,每天自动产生 100 篇文章也并非天方夜谭。文章的质量,只取决于你的想象。

结语:做工具的主人,而非算法的奴隶

或许有人会问:“这样生成的文章,有灵魂吗?”

工具本身没有倾向,而是由使用者来控制。深度检索的关键词列表、分析的倾向、最终文章的风格均是可控的。

  • 你可以将它作为科技博主的好帮手,获取热点的科技话题,自动去检索相关技术,将知识嚼碎喂给你的读者。
  • 也可以为了流量不则手段,聚焦于娱乐圈八卦,深挖明星绯闻,短时间输出大量内容,引导舆论。

无论如何,AI 都不能替你承担法律责任和道德风险

  • 可以标题党,但绝不能造谣。
  • 可以煽动情绪,但绝不能触碰红线。

检测有没有玩手机的检测数据集(10,000+张图片已划分、已标注)| AI训练适用于目标检测任务


一、项目背景

随着智能手机的普及,人们在日常生活和工作中频繁使用手机,导致注意力分散、生产效率下降以及潜在的安全隐患。例如,驾驶或行走过程中使用手机可能增加交通事故风险,办公或工厂场景中玩手机也可能影响工作效率和安全管理。因此,能够自动检测人们是否使用手机的行为,对于安全监控、行为分析以及人机交互研究具有重要意义。

传统的人工监控方式成本高、效率低,难以覆盖大范围场景。而计算机视觉和深度学习技术的发展,使得通过图像或视频自动识别手机使用行为成为可能,为安全管理、行为分析和智能交互提供了数据支持。为了满足这一需求,本数据集针对玩手机行为检测进行了系统化收集和标注,涵盖多种场景和光照条件,可直接用于目标检测模型的训练与评估。
在这里插入图片描述


数据集下载

链接:https://pan.baidu.com/s/1YeHCon3JABhYTTM7QbfCEA?pwd=59pj
提取码:59pj

数据集说明

玩手机目标检测数据集

本数据集专注于检测人们使用手机的行为,共收集约 10,000 张图像,涵盖室内、室外、不同光照和多角度场景。每张图片均标注了手机的位置,适用于目标检测任务。

数据集分为训练集、验证集和测试集,目录结构为:

train: ../train/images
val: ../valid/images
test: ../test/images

该数据集可用于行为监测、智能安全管理以及人机交互研究,为深度学习模型提供高质量训练数据。

二、数据集概述

本数据集共包含 约10,000张图像,涵盖室内、室外、办公室、街道、公共场所等多种场景,具有良好的泛化能力。每张图像均标注了手机所在位置的边界框信息,便于训练深度学习目标检测模型。

📂 数据目录结构

dataset/
├── train/
│   └── images/
├── valid/
│   └── images/
├── test/
│   └── images/
└── labels/
  • train/images:训练集图像
  • valid/images:验证集图像
  • test/images:测试集图像
  • labels:YOLO格式标注文件

数据集已完成训练、验证、测试集划分,可直接适配YOLO系列及其他目标检测模型训练。


三、数据集标注说明

  • 标注类型:目标边界框
  • 标注格式:YOLO标准txt文件
  • 每张图像可标注一部或多部手机
  • 可直接适配:YOLOv5 / YOLOv7 / YOLOv8 / YOLOv10、Faster R-CNN、SSD、DETR 等

随着智能手机在日常生活和工作中的普及,人们在各种场景下频繁使用手机的行为愈发常见。然而,过度或不当使用手机可能带来安全隐患、分散注意力,甚至影响生产效率和公共安全。例如,行人、学生或驾驶员在使用手机时容易分心,增加事故风险;办公或工厂场景中玩手机也可能影响作业效率和安全管理。传统人工监控方式成本高、覆盖面有限且效率低,难以满足现代智能管理系统对实时性和准确性的要求。计算机视觉和深度学习技术的发展为自动检测手机使用行为提供了可行方案,使行为监测、智能安全管理和人机交互研究能够基于大规模图像数据实现自动化分析和决策。为此,本数据集专注于玩手机行为检测,收集了约10,000张覆盖室内、室外、不同光照、不同角度的高质量图像,并提供精确的手机边界框标注,已完成训练集、验证集和测试集划分,可直接用于YOLO系列、Faster R-CNN、SSD、DETR等主流目标检测模型的训练与评估。该数据集不仅具备科研价值,可支持小目标检测、行为识别算法优化及复杂环境下的模型鲁棒性分析,也具有工程应用价值,为办公场所安全管理、工厂生产线监控、公共场所违规行为检测以及驾驶行为监控等智能化场景提供数据支撑,助力提升行为监控和安全管理的自动化水平与智能化能力。

四、数据集特点

  1. 场景多样:室内、室外、办公室、街道等多场景覆盖
  2. 光照条件丰富:白天、夜晚、强光、阴影等多种光照
  3. 数据量充足:10,000+张图像,满足深度学习训练需求
  4. 标注规范:目标边界框精确,可直接用于模型训练
  5. 行为监测导向:专注于手机使用行为,可用于行为分析和安全管理

五、适用场景

在这里插入图片描述

📱 智能安全管理

  • 办公场所、工厂及生产线行为监控
  • 公共场所违规使用手机检测
  • 驾驶行为监控

🧠 行为分析与研究

  • 人机交互研究
  • 用户行为分析
  • 小目标检测、姿态分析结合应用

🤖 深度学习模型训练与实验

  • YOLO系列目标检测训练
  • 多场景小目标识别研究
  • 模型泛化能力测试与优化

在这里插入图片描述

六、结语

本玩手机行为检测数据集以实际场景为基础,提供了规范标注和合理划分的10,000+图像资源,可直接用于目标检测模型的训练与评估。数据集覆盖室内、室外、多光照、多角度场景,兼顾科研和工程应用需求。无论是行为监控、智能安全管理、驾驶风险分析,还是人机交互研究,该数据集都能够为深度学习模型提供高质量训练数据,助力智能行为识别技术的发展,提高安全管理和监控的自动化水平。
总体而言,本玩手机行为检测数据集是一份高质量、场景丰富且工程价值与科研价值兼具的数据资源。数据集包含约10,000张图像,覆盖室内、室外、办公室、街道、公共场所等多种环境,同时囊括不同光照、角度和拍摄距离,保证了模型训练的泛化能力。每张图像均提供精确的手机目标边界框标注,可直接适配YOLO系列、Faster R-CNN、SSD、DETR等主流目标检测模型,显著降低模型训练和实验准备成本。该数据集不仅适用于目标检测模型的训练与评估,也可用于行为分析、人机交互研究和智能安全管理系统的开发。从科研角度来看,数据集可支持多场景小目标检测、复杂光照下的行为识别、模型泛化性与鲁棒性测试等技术探索;从工程应用角度看,能够为办公安全、工厂生产线监管、公共场所违规使用手机检测以及驾驶行为监控等提供可靠的数据支撑。整体而言,这一数据集不仅满足教学实验、毕业设计和科研论文的需求,也为智能行为识别、自动化安全监控及人机交互研究提供了坚实的数据基础,为提升公共安全管理和行为监控的智能化水平提供了切实可行的技术支撑。

小猫都能懂的大模型原理 1 图片来源 pixabay.com

本文旨在用简单易懂的语言解释大语言模型的基本原理,不会详细描述和解释其中的复杂数学和算法细节,希望各位小猫能有所收获 🐱 原文链接

AI 的科技树

我们先来通过一条简单的链路,定位大模型在 AI 领域的位置: 人工智能 > 机器学习 > 深度学习 > 大语言模型

机器学习最开始就用大量数据线性回归从而对未知数据进行推测。

举个最简单的例子,二维的数据。直接就可以使用数学课就学过的线性回归求方程获取数据的趋势。当时就觉得算线性回归真麻烦呀,计算量那么大,没想到这都蹭到人工智能的边了,还能不难算吗?

接着,人类不满足于简单的线性回归,想要让计算机自动学习更复杂的数据特征,于是就有了深度学习。

深度学习

深度学习之所以深度是因为,它基于多层神经网络自动学习数据特征。多层神经网络就像人脑的神经元互相连接。每根连接的强度就是权重,网络会反复调整这些强度,让结果越来越接近正确答案。

代表性模型有:卷积神经网络(CNN)、循环神经网络(RNN)、Transformer、GAN 等。

大语言模型

Transformer 无情压榨 GPU 产生的奇迹,起初应该没人觉得这效果能这么好。

与深度学习一样,Transformer 也是使用多层神经网络处理矩阵,只不过矩阵异常的大,不到硬件发展到一定水平根本无法实现。

关于大语言模型我们停一下,先比较基础的机器学习原理!

训练的方式

还是从最简单的二维数据开始。

当我们有一堆房产离市中心距离及其价格的数据时,我们可以在一个二维坐标轴表示这些数据,例如 x 轴是距离,y 轴是价格。

在数据都画上坐标轴之后,作为一个人类可能一眼就能粗略看出整个曲线的趋势,从而“拟合”出一条距离价格的关系。

它很可能是一个类似这样的函数:price = distance * w + b

对于计算机,要求出 w 和 b 的最优解,就要让真实价格和通过 w b 计算出来的价格的差值最少。

最常用的方式是均方误差(Mean Squared Error, MSE)

$$
L(w, b) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
$$

我们要求的就是这个函数的最小值,在人工智能领域常用的就是梯度下降,也就是求 w 和 b 的偏导数,乘上学习率 α,让它自己慢慢收敛。

梯度下降

过拟合

在拟合出一条接近“规律”的线条后,其实就差不多了。

如果你硬加更多的节点,会造成过拟合,也就所有的训练数据的损失值都很完美,但是一让它生成训练数据以外的东西,它就猜不准了。

就上面房价的例子,假如本来趋势基本就是一个斜线,但是你最后硬是求得一条曲线方程,把所有的点都穿过了,损失值为 0,但是这样计算用户给你的值,反而是算不准的。

这也就是所谓的失去泛化能力

神经网络

上面只用二维数据,就只有一个 price = distance * w + b,但是如果想要做成神经网络,参数就会很多,并且与权重相乘的值的含义,人类并不能轻易理解,例如:

$$
a = w_1 a_1 + w_2 a_2 + w_3 a_3 + w_4 a_4 + b
$$

又因为如果只用权重,无论经过多少层都无法拟合曲线,所以最后要添加一个非线性的激活函数计算结果:

$$
a = \mathrm{ReLU}(w_1 a_1 + w_2 a_2 + w_3 a_3 + w_4 a_4 + b)
$$

这只是一个层对某一个神经元的计算,下面是一个比较形象的图(请忽略数字)

某层对下一个神经元的计算

所以当一个神经网络有多层,每层多个神经元的话计算量还是挺可怕的。

神经网络

比如判断一张图片有没有猫,你没法用一条简单的线来划分"有猫"和"没猫"的区域。

多层网络的魔力在于:

  • 逐层特征提取:第一层可能只学到边缘和颜色,第二层学到边缘组成的形状,第三层学到眼睛、耳朵,第四层才认识完整的猫脸
  • 非线性组合:通过激活函数,每一层都能创造新的特征组合,让网络可以表示任意复杂的函数
  • 层次化抽象:就像人类认识世界一样,先学简单概念,再组合成复杂概念

这就等于在计算的时候把数据的内涵升维到隐藏层,经过隐藏层额外的处理可以得到更精确的结果。当然这个时候你输入的值也要有足够的信息量它才能学到东西。

但问题又来了既然多层这么强大,那是不是层数越多越好?也不是的。神经网络有两个维度可以调整:

深度(Deep):层数多,每层神经元少

  • 参数少,计算效率高
  • 适合层次化特征学习
  • 容易出现梯度消失(层数太多,误差传不到前面)
  • 训练困难

宽度(Wide):层数少,每层神经元多

  • 训练相对简单
  • 能并行处理更多信息
  • 参数量大,容易过拟合
  • 缺乏层次化抽象能力

实际训练时深度和宽度的平衡需要把握好。

反向传播

上面我们知道用梯度下降的方式调节 w 和 b,对于神经网络也是一样的数学原理,需要通过链式法则(Chain Rule)一层一层反向调整所有权重。

这里就不详细解释怎么层层反推了,就结果而言,我们给出了正确的输入和输出,最开始,这个网络只是瞎猜权重,到最后计算出来,经过损失函数梯度下降调整各种权重,到最后,竟然就可以像魔法一样推导出准确率比较高的答案,喵,喵,喵呀!

P.S. 如果你真的找虐很想了解更多反向传播的计算过程,可以看 3blue1brown 🐱

参考资料

家属在某三甲医院呼吸科 ICU 治疗过程中发生了一起医疗事件,具体事件如下:
2 月 1 日 11 时 45 分左右的一次吸痰过程中,患者突然心跳骤停,后可能由于抢救不及时导致陷入重度昏迷至今,由于抢救后患者被移入家属无法看护的大病房,医生隐瞒病情,未意识到事情的严重性,期间还做气切手术,给人希望,直到 2 月 11 日医生说病情严重甚至会永远醒不来,才意识到严重,后来在家属的要求下才在 2 月 12 日转入小病房,家属在陪护中突然意识到可能当时就由于缺氧造成脑部永久性损伤,于是后来在 2 月 20 日找王主任沟通这个情况,当时焦点还集中在心跳骤停是否跟吸痰有关,王主任并未否认吸痰过程发生心跳骤停的情况,只是极力否认吸痰跟心跳骤停的因果关系,并且不给看病历,以及毫无对家属的同情心。2 月 21 日下午向医务处提交材料,然后封存病历,封存病历的时候发现抢救记录上并未写吸痰过程,直接写患者突发血氧下降,心跳骤停,然后抢救。等我们刚回到病房不久,随后王主任跑到病房说取消小病房,所有病人转移到大病房,意图强制剥夺家属的看护权,被我们当场拒绝。后来陆续通过保安、其他小病房家属、民警来对家属进行骚扰。2 月 22 日向 12320 反映该问题,下午我们到医生办公室要求主治医生对病历添加吸痰过程被拒绝,让其当场打电话给吸痰护士求证也被拒绝,当场报警,警察来后说这是卫健委负责就走了。2 月 23 日又向医务处单独提交了调取监控的申请。2 月 24 日上班第一天才给把封存的病历复印,这时候看到护理记录单上面也缺失了那次吸痰记录。
我真的很难想象,居然为了逃避责任,居然公然做出伪造篡改病历这种违法的事情。
目前家属还在小病房内深度昏迷中,医务处故意拖延,尚未得到书面回复,口头中得知的是监控未开启,监护仪以及呼吸机历史数据就说不清楚。(监护仪的型号是 mindray BeneVision M17 ,呼吸机型号是 mindray SV600)
期间打了几次 12320 询问进展,就说已转给属地卫健委,是办理状态中,但是我们从未得到卫健委的联系。

这种情况应该如何解决?请广大网友帮忙出谋划策,谢谢了🙏🙏🙏

补充:吸痰的时候有两位家属陪护

提交给医务处的材料是下面两张图片



抢救记录单如下

mindmapcn

就像你平时 npx shadcn add button 一样,现在思维导图也能这么安装了。

为什么要做这个?

最近在项目里想加个思维导图功能,试了几个库,要么配置贼复杂,要么样式跟我的 shadcn 项目完全不搭。想着既然 shadcn/ui 那么好用,为什么不能有个思维导图组件呢?

于是就有了 mindmapcn。

一行命令搞定

npx shadcn@latest add https://mindmapcn.vercel.app/mindmaps/mindmap.json

装完就能用,不用配一堆东西,不用费心搞 SSR 异步加载那堆代码,这就是我开发 mindmapcn 的初衷。

它长什么样?

如果你在用 shadcn/ui,那这个组件应该会让你觉得很舒服:

  • 自动适配你的主题(亮色/暗色)
  • 用的是 Tailwind CSS,想改样式很方便
  • 完整的 TypeScript 类型,写起来很爽
  • 看起来就像是 shadcn 自带的组件

底层用的什么?

核心是基于 Mind Elixir 这个库。选它是因为:

  1. 功能齐全 - 拖拽、缩放、编辑、导出
  2. 性能不错 - 节点多了也不卡
  3. 数据结构灵活 - 支持标签、图标、颜色这些
  4. API 开放 - 想做点高级功能也能实现

mindmapcn 做的事情就是把它包装成 shadcn 风格,让它用起来更顺手。

基本用法

装完之后,代码大概长这样:

import { MindMap } from "@/components/ui/mindmap";

export default function MyMindMap() {
  const data = {
    nodeData: {
      topic: "我的思维导图",
      root: true,
      children: [{ topic: "子节点 1" }, { topic: "子节点 2" }],
    },
  };

  return (
    <div className="h-screen w-full">
      <MindMap data={data} />
    </div>
  );
}

注意: 记得给容器设个高度,不然组件不知道该渲染多大。可以用 h-screen 或者 h-[600px] 这种。

能用来干嘛?

我自己用它做过这些:

  • 知识图谱展示
  • 项目任务规划
  • 组织架构图
  • 头脑风暴工具

基本上需要树状结构可视化的场景都能用。

主题适配

如果你的项目有亮色/暗色主题切换,思维导图会自动跟着变。不用写任何额外代码,它会自己检测 CSS 变量然后调整颜色。(当然这个还是要跟 Tailwind 的主题系统配合使用)

定制化

shadcn 生态的优势就是文件直接到你代码库里,所以定制化是很简单的事情,以下是一些常见的定制方式:

  • 思维导图配置
  • 样式变更
  • 事件监听
  • 数据导入导出

不过你可能需要先熟悉 Mind Elixir 的 API。

快速开始

安装

npx shadcn@latest add https://mindmapcn.vercel.app/mindmaps/mindmap.json

用起来

import { MindMap } from "@/components/ui/mindmap";

function App() {
  return (
    <div className="h-screen w-full">
      <MindMap
        data={{
          nodeData: {
            topic: "开始",
            root: true,
            children: [{ topic: "简单" }, { topic: "好用" }],
          },
        }}
      />
    </div>
  );
}

更多例子可以看官网文档

设计想法

做这个组件的时候,我就想着三点:

简单 - 不想让用户配一堆东西。装上就能用,这是最基本的。

好看 - 既然是 shadcn 生态的,样式得跟得上。主题适配、响应式这些都得有。

够用 - 基础功能要全,但也不能太复杂。大部分场景能覆盖到就行,不够用户也可以根据自己需求改。

技术栈

  • React/Next.js
  • TypeScript
  • Tailwind CSS
  • Mind Elixir
  • shadcn/ui

都是 React 生态标准配置,也是 AI 前端的主流技术栈,所以交给 AI 接入思维导图问题也不大。

开源

代码都在 GitHub 上:https://github.com/SSShooter/mindmapcn

MIT 协议,随便用。有问题可以提 issue,想贡献代码也欢迎 PR~

感谢

这个项目能做出来,得感谢:

试试看

ebook-to-mindmap 已经率先用上这个小组件了,目前效果还不错。

如果你正好需要在项目里加个思维导图,欢迎试用:

npx shadcn@latest add https://mindmapcn.vercel.app/mindmaps/mindmap.json

有任何问题或建议,欢迎在 GitHub 上交流。

相关链接

大多数人以为客服系统不过是一个聊天框。

其实不是。

在那个小小的悬浮窗口背后,是一个实时消息核心,它必须在不可预测的流量下以低延迟传递消息。系统中存在并发控制,用来管理成千上万——有时甚至是几十万——的同时连接。内存管理也在高压下进行,低效的分配模式可能悄无声息地引入延迟尖峰。多租户隔离确保一个客户的工作负载永远不会影响另一个客户的系统稳定性。部署策略在 SaaS 与私有化环境下有根本性的差异。可靠性保证决定了消息是在边缘条件下“只送一次”、“至少送一次”,还是可能丢失。而在这一切之下,还有长期的架构权衡,这些权衡决定了系统在几年中的演进,而非几周。

表面上看似简单的界面,实际上是一个分层系统,需要在性能、隔离、可靠性和可维护性之间取得平衡。界面可能极简,但其背后的工程复杂度绝不简单。

在过去几年里,我构建了一个名为 升讯威在线客服与营销系统 的实时客服系统。它支持 SaaS 与私有化部署,并围绕高并发、可维护性以及清晰的架构设计。最初只是一个最小化原型,但逐渐发展为生产级系统:拥有真实的消息管道、租户隔离、访客追踪、可扩展 API,以及一个面向适应性而非偶然复杂性的结构。

本系列文章记录了这一技术演进——在从零构建和优化实时基础设施系统的过程中,所做的决策、面临的约束、进行的修正,以及获得的经验教训。

为什么要写这个系列?

工程透明度能够建立信任——尤其是在基础设施级软件领域。

在客服系统领域,有许多产品可供选择。它们是经过多年迭代打磨的成熟系统,背后有强大的资源支持。从外部看,它们呈现出干净的界面和精心设计的用户体验。

然而,通常不为人所见的是支撑这些系统在大规模下可靠运行的工程思考。界面可能看起来很简单,但其背后的基础设施必须能够持续承载负载、应对流量突发、可靠地隔离租户,并在不断演进中不会因自身复杂性而崩塌。这些设计选择——权衡、约束和修正——很少在公开讨论中出现。

  • 如何在 .NET 中设计一个实时消息核心,使其在持续高并发下仍保持稳定?
  • 如何管理十万级 WebSocket 连接而不引入延迟尖峰?
  • 在分配模式直接影响响应性的系统中,如何降低 GC 压力?
  • 多租户隔离在实际场景中又是怎样实现的,而不仅仅是理论图示?
  • 当企业客户需要私有化部署而非纯 SaaS 交付时,又会带来哪些架构妥协?

这些问题不是功能列表能够回答的,它们需要通过受约束条件塑造的架构思维来解答。

本系列将从工程视角探讨这些问题。它会审视当时看似合理、但后来需要修正的决策;讨论简洁性与可扩展性、抽象性与性能、即时交付与长期可维护性之间的权衡。

这不是市场宣传,也不是提供生产级代码的逐步教程。而是对架构决策、实践中遇到的约束,以及在构建和演进实时系统过程中获得的经验教训的系统性探索。

本系列将涵盖的内容

本系列将跟随系统的发展历程,从最初的假设到更成熟的架构形态。它将从一个核心问题出发:为什么从零构建一套客服系统是合理的——以及哪些约束条件支撑了这一决策。随后,它会讲述从最小化原型向生产级架构的演变过程,展示早期的简洁性如何逐步让位于结构上的严谨性。

讨论内容将包括在 .NET 中设计实时消息核心,以及在持续负载下处理高并发 WebSocket 连接的实际情况。还会探讨延迟敏感环境中的内存分配模式与 GC 行为,这些不是理论话题,而是直接影响用户体验的关键因素。稳定性机制,如背压、队列管理和故障隔离,也将在防止级联崩溃的背景下进行分析。

随着系统扩展,架构关注点转向多租户隔离、部署灵活性和可靠性保证。支持 SaaS 与私有化环境引入了不同的运维约束,并迫使团队对可配置性、自动化和环境假设做出明确决策。消息可靠性模型——以及理论保证与实际可操作性之间的妥协——成为核心考量。

后续文章还将回顾当早期设计决策不足时对核心组件的重写,如何在不造成过度抽象的情况下设计可扩展 API,以及在不破坏底层系统稳定性的前提下,将 AI 功能集成到延迟敏感的实时消息管道中。

每篇文章都将聚焦于工程思考,而非表面功能。在适当情况下,我会讨论权衡方案、被舍弃的替代方案和架构妥协——因为真实系统往往更多地由约束条件塑造,而非理想设计。架构图可能看起来清晰,但真正的清晰往往是在不断修正之后才显现出来。

本系列不是围绕产品能做什么来组织的,而是围绕系统如何在增长、负载和时间的考验下生存和演进来展开的。

计划的文章主题包括:

  • 为什么要从零构建一套客服系统?
  • 从 MVP 到生产架构
  • 在 .NET 中设计实时消息核心
  • 高并发 WebSocket 连接处理
  • 实时系统中的内存优化与 GC 压力管理
  • 消息管道中的背压与稳定性
  • 多租户架构:逻辑隔离 vs 物理隔离
  • 面向私有化部署的设计
  • 消息可靠性与投递保证
  • 核心组件重写的经验教训
  • 面向可扩展性的 Open API 设计
  • 将 AI 集成到实时客服系统中

每篇文章都会聚焦于工程思考,而非表面功能的堆砌。

在适当的地方,我还会讨论权衡方案、被舍弃的替代方案以及架构妥协——因为真实系统往往更多地由约束条件塑造,而非理想设计。

范围与界限

本系列将聚焦于架构、设计思维以及从构建和演进生产环境下实时系统中总结出的工程经验。重点在于思考过程:为什么做出某些决策、哪些约束条件影响了这些决策,以及这些决策随时间推移表现如何。

本系列不会披露敏感的安全细节、客户数据、特定部署配置或内部专有实现机制。真实系统运行在特定的运维环境中,这些内容既不能公开,也不应公开。稳定性和安全性不是理论问题,而是实际责任。

在提供示例时,将以抽象形式展示模式,而非暴露内部结构。基准测试可能会以方向性描述呈现,而非具体生产数据。若包含架构图,也仅代表概念模型,而非真实基础设施布局。

目的在于分享思考方式,而不是暴露运营风险。工程透明度并不意味着发布每行代码或每条部署细节,而是要对塑造系统的决策保持清晰,对伴随这些决策的权衡保持诚实。

这些界限不是讨论的限制,而是负责任的工程实践的一部分。

本系列适合谁阅读

如果你正在构建实时系统,其中延迟、高并发和可靠性不是抽象概念,而是日常工程约束,那么本系列可能对你有帮助。
如果你在设计 SaaS 基础设施,并发现架构决策很少能孤立存在——它们会波及部署模型、租户隔离、运维复杂性以及长期可维护性——你也会对本系列产生共鸣。

如果你正在探索多租户架构,超越理论图示的层面,或者处理以 WebSocket 为主的工作负载,其中连接生命周期管理和内存行为直接影响系统稳定性,那么本系列讨论的话题可能与你面临的问题高度相关。同样,如果你关注系统在经过多年迭代后仍能保持可理解性和可适应性——而不仅仅是几周的开发——本系列也正是以这种视角编写的。

这不是为了快速消化而优化的内容。它假设你愿意用权衡而非绝对的思路思考问题,用演进而非速成的视角看待系统。重点不在于功能对比,而在于结构化思考。目标不是构建一次就能工作的东西,而是构建随着复杂性增长仍能持续可靠运行的系统。

如果你只是想找一份“10 分钟教你做聊天应用”的快速指南,本系列不适合你。市面上有很多优秀的快速原型资源。本系列关注的是原型开始面对真实流量、真实约束和真实运维责任后的那些问题。

长期的工程记录

软件系统在不断演进。

随着功能增加和边缘场景出现,系统会逐渐积累复杂性。早期设计中看不见的瓶颈会意外浮现,你不得不重新审视那些曾经完全合理的假设。架构图上看似清晰的设计,在生产环境中往往会变得分层、需要协商和调整。

没有任何系统会保持与最初版本完全相同。并发模型会被调整,数据结构会被替换,消息管道会被重写。部署流程会被简化——有时又会因新需求而再次复杂化。随着时间推移,挑战不再仅仅是让系统运行,而是确保系统在累积的决策下仍能持续稳定运行。

本系列旨在记录这一过程——不是作为完美成功的故事,而是作为一个持续的工程实践。内容将包括修正、结构性调整,以及最初的自信如何让位于更深层次理解的瞬间。系统的稳定性很少依赖单一的“正确决策”,它通常是迭代、约束与精炼的结果。

在基础设施级的 SaaS 系统中,演进不是可选项。真实流量会暴露隐藏的弱点;真实客户会带来重塑架构的新需求;真实的运维责任会改变权衡的评估方式。随着时间推移,工程工作不再只是增加功能,而是如何在适应变化的同时保持系统清晰可控。

如果你对实时架构、分布式设计权衡,或构建和维护必须持续运行的系统的实际挑战感兴趣,那么关注这段工程记录会对你有所启发。

致谢与后记

感谢大家耐心阅读本系列内容,也非常期待各位的指正与交流——每一条反馈都是对工程思考的促进和完善。

需要说明的是,本系列分享的是一个真实的产品——升讯威在线客服与营销系统,它服务着真实用户,承载着实际业务场景。你可以访问我们的官网了解更多:https://kf.shengxunwei.com

希望未来能与大家在架构设计、实时系统以及工程实践上进行更深入的探讨和交流,共同成长、共同进步。再次感谢关注与支持!

升讯威在线客服与营销系统访客端

升讯威在线客服与营销系统客服端

规模不等于利润、员工不等于产出、融资不等于成功。

追求规模是别人的游戏,追求自由才是你的游戏。


大家好,我是数字游民Hugo。

今天看了些OPC相关文章,和大家聊聊我的认知共鸣。


01 你正在经历的困境

你每天朝九晚六,做着不喜欢的工作,换取一份"稳定"的薪水。

你想过辞职创业,但一想到要租办公室、招员工、融资、管理团队——你就打了退堂鼓。

你觉得自己被困住了:打工没前途,创业太复杂。

你不是没有能力,你是没有找到适合你的模式。

真相是:传统创业的"做大"逻辑,正在被一种新模式颠覆。


02 为什么"做大做强"是少数人的游戏

看看那些融资几个亿的公司,最后倒闭时欠一屁股债。

看看那些管理几十人团队的创业者,每天处理的是人际关系而不是产品。

看看那些"成功"的老板,表面风光,背后被公司绑架,比打工还累。

规模不等于利润。

员工不等于产出。

融资不等于成功。

真正的自由,是用最小的投入,获得最大的回报,同时保留对时间的完全掌控。

这就是一人公司的核心逻辑。


03 一人公司的底层原理

一人公司不是"小公司",而是一种刻意保持小规模的商业哲学。

它的核心假设是:

第一,互联网让一个人可以触达百万用户。

你不需要销售团队,不需要渠道代理。一篇爆款文章、一条爆款视频,就能让你被千万人看见。

第二,自动化工具让一个人可以完成十人的工作。

AI 编程、AI 写作、AI 设计、自动化营销……2026 年的工具链,已经能让单人产出媲美小团队。

第三,数字产品的边际成本趋近于零。

你写一份电子书,卖 1 份和卖 1 万份,成本几乎一样。你录一套课程,1 个人学和 1 万人学,交付成本几乎为零。

当这三点成立,你就不需要团队来"放大"你的价值。

你需要的不是更多人手,而是更好的系统。


04 构建一人公司的四大支柱

支柱一:打造可复制的产品,而非出卖时间

打工和传统服务业的问题在于:你的收入和时间挂钩。

一天只有 24 小时,你的天花板写死了。

一人公司的核心是产品化

  • 把你的知识做成课程
  • 把你的经验写成电子书
  • 把你的技能做成模板或工具
  • 把你的洞察做成付费社群

你创造一次,卖出无数次。睡觉时也在赚钱。

穷人卖时间,富人卖系统。


支柱二:用内容获取信任,而非广告买流量

广告是花钱买注意力。内容是让注意力主动找你。

一人公司没有营销预算,但有一个秘密武器:持续输出有价值的内容。

  • 写文章,展示你的思考深度
  • 发视频,展示你的真实人格
  • 做播客,建立长期的信任连接

当你持续输出 6 个月、1 年、3 年——你就建立了一个不需要付费就能持续获客的引擎。


支柱三:自动化一切可自动化的

一人公司的"一人"不是指所有事都亲力亲为。而是指决策层只有你一个人。

执行层,交给系统:

  • 营销自动化(内容定时发布、邮件序列)
  • 支付和交付自动化(知识星球、小鹅通)
  • 客服机器人处理常见问题
  • 日程和任务管理工具

你的时间只用在两件事上:创造和决策。其他的,都应该被自动化或外包。


支柱四:保持小,是一种选择

传统商业的陷阱是:有了 10 万收入就想做到 100 万,有了 100 万就想做到 1000 万。

于是你招人、扩张、承担更大的风险和压力。

一人公司的心法是:够了就是够了。

当你一个人年入 100 万,没有员工、没有办公室、没有债务——

你的实际自由度,超过 99% 年入千万但被公司绑架的创业者。

追求规模是别人的游戏。追求自由,才是你的游戏。


05 一人公司的真实路径

别把它想得太复杂。简化到极致就是三步:

第一步:选择一个领域,持续输出内容

不需要完美,不需要专业,只需要真实和持续。

6 个月后,你会有第一批信任你的受众。

第二步:把你的知识打包成产品

可以是 99 元的电子书,可以是 999 元的课程,可以是 9999 元的咨询服务。

从小开始,快速验证。

第三步:建立自动化系统,解放你的时间

用工具替代重复劳动,把省下的时间投入到创造更好的内容和产品上。

循环往复,飞轮转动。


06 最后,还有一个选择

打工熬资历,或者创业背风险。

你也可以选择第三条路:一个人,一台电脑,一套系统,一种自由的生活方式。

这条路不适合所有人。

它需要耐心,需要自律,需要忍受早期没人关注的孤独。

但如果你想要的是真正的自由——

对时间的掌控、对生活的选择权、对未来的安全感——一人公司是 2026 年最清晰的路径。

你不需要许可,不需要融资,不需要团队。

你只需要开始。


07 今天就行动

选择一个你擅长且热爱的领域,在任何一个平台发布你的第一篇内容。

不要等到准备好。你永远不会准备好。

即刻开始->现在就动起来,这是唯一的准备。


我是胡戈 Carey,一人公司 OPC 的实践者,专注 AI 编程应用开发领域。

📌 公众号:AI 编程开发创客实战

📌 视频号:胡氏真言 + 王炸实验

📌 私域:AI 赋能圈知识星球

大道至简,返璞归真。真诚利他,成人之美。


如果你也正在探索一人公司路径,欢迎在评论区聊聊

如果你也对AI编程应用开发感兴趣,欢迎关注一起同行


一人公司 #数字游民 #个人IP #AI编程 #轻创业 #OPC


本文由mdnice多平台发布

RAG系统返回了完美的文本块,提示词写得很漂亮,但LLM还是在产生幻觉;文档加得越多,回复质量反而越差。这些问题问题不出在提示词上,而是出在上下文上。

提示工程告诉模型怎么说话;context engineering 控制模型说话时看到什么。以下是把生产系统和Demo区分开的6种上下文工程技术。

什么是 Context Engineering

Context engineering 是在运行时决定AI模型看到什么信息、何时看到、以何种结构看到的工程实践。

提示工程关注的是如何提问,context engineering 关注的是提供什么。

实际系统中,大语言模型出错往往不是因为理解不了指令,而是因为看到了太多不相关的信息、相互矛盾的数据,或者缺失了关键事实。Context engineering 把上下文当作一条动态管道来处理,而非一段静态提示词:选对文档而不是全量灌入;将长文档压缩为面向任务的摘要;在检索之前重新表述模糊的用户查询;跨会话注入记忆和用户状态;用实时工具和数据锚定答案;组织所有输入,让模型知道什么最重要。

一句话概括:context engineering 是在生产环境中控制模型注意力的手段。

上下文工程做得好,小模型也能有不错的表现;做得差,最好的模型照样幻觉。

选择性检索:别再把什么都往里塞

如果我们把50个文档全部塞进上下文指望模型自己找到需要的内容。即便上下文窗口足够大,模型的注意力分布仍然不均匀,它会重点关注开头和结尾的 Token,中间部分被忽略。这就是所谓的"lost in the middle"效应。

正确的做法是评分、重排、裁剪,只让相关且不重复的片段进入上下文窗口。

以下三步逐层过滤。

相关性重排:初始搜索基于向量相似度或关键词匹配返回前50个结果,但相似不等于相关。交叉编码器会把查询和每个文档放在一起联合阅读,重新排序。速度慢一些准确度高得多,重排之后只保留前5个。

冗余消除:同一个概念在文档库里出现在多个地方是常态,比如营销材料、技术规格、FAQ都可能提到同一功能。用 Embedding 对相似文本块做聚类,余弦相似度超过0.9的基本就是重复内容删掉一个即可。模型不需要看同一个事实10遍。

任务感知过滤:利用元数据做筛选。每个文档都应打上标签:文档类型、最后更新日期、产品版本、地区、部门。查询进来时按相关维度过滤。

举个实际例子:查询是"总结最新的退款政策变更"。

过滤之前向量搜索返回50个关于退款的文本块,有些来自2018年旧政策,有些是其他公司的文档,有些是从未面向客户的内部备忘录。LLM看到了14天和30天窗口期的矛盾说法、不同的排除条款、相互冲突的流程,试图综合所有信息后幻觉出了一条根本不存在的政策。

过滤之后加上

region='CN'

updated_at >= 2025-01-01

两个条件,立刻排除40个文本块。剩余10个用交叉编码器重排,保留前5个再检查近似重复(余弦相似度 > 0.9)。最终送进上下文的只有3个高相关、无冗余的文本块。

LLM现在看到的是清晰的政策声明、具体的时间线和例外清单——全部最新,全部对齐。没有幻觉,没有混淆。

效果:提示更短,回答更清晰,没有矛盾。实验数据显示,移除噪声上下文后准确率提高15–30%,Token消耗降低20–40%。但真正的收益在于可追溯性——确切知道模型看到了什么上下文,才能调试失败;50个文本块全灌进去,只能靠运气。

实现上可以从简单处着手:给所有文档加

last_updated

时间戳,按日期过滤,仅凭这一步就能消除大部分噪声。接着加重排,再加去重,根据实际效果逐步叠加复杂度。

上下文压缩:让每个 Token 都有价值

长篇原始文档容易撑破上下文限制,同时稀释注意力。多个案例研究表明,经过压缩可以在保持甚至提升准确率的同时砍掉50–75%的 Token。

核心思路是在把长文档放进上下文之前,将其压缩成面向当前任务的密集摘要:不是通用摘要,而是针对当前查询定制的摘要。

三种压缩策略各有侧重。

带约束的LLM摘要:不要只说"总结这个文档",而是说"总结这个文档,只保留2025年1月之后关于定价变更的事实"。约束条件指明了保留什么、丢弃什么。每个检索到的文档根据查询生成各自的约束。产出从3000个 Token 缩减到5–10个要点。

句子级评分:用较小的模型(如BERT变体)为每个句子计算与查询的相关性分数,按分数排序后只保留前20%。这种方法叫Context-Preserving Compression,速度快,效果好,自动留下最相关的信息。

层次化摘要:适合非常长的文档。先按章节分块每个章节独立生成摘要,再把这些摘要归纳成一个元摘要。最终形成三级结构,完整文档 → 章节摘要 → 最终摘要。根据上下文预算选用合适的层级。

看一个实际例子。查询是"比较API文档中Plan A与Plan B的速率限制"。

API文档共30页,涵盖认证、速率限制、错误代码、Webhook、分页、SDK和变更日志,其中只有2页涉及速率限制。检索管道取回3个相关章节(共30页),每章10页。LLM摘要器收到的指令是:"仅提取Plan A和Plan B的速率限制和配额,包括具体数字,忽略认证、示例和其他功能。"

第一个章节的摘要(从10页压缩到100个 Token):"Plan A:1000次请求/小时,10,000次/天。Plan B:5000次请求/小时,50,000次/天。两个计划均允许1分钟内20%的突发流量。"

第二个章节的摘要:"速率限制错误返回HTTP 429。Retry-After头部指示等待时间。速率限制在UTC午夜重置。"

第三个章节的摘要:"企业版计划可定制速率限制。请联系销售团队。"

三份摘要合计500个 Token,加上查询一起送入最终生成。模型看到的恰好是它需要的内容,不必在认证流程或SDK示例里翻找。

模型拿到的是聚焦后的信息,而不是期望它从30页文档里正确提取相关部分。

代价是多了一步延迟,因为每个文档额外做一次LLM调用,3个文档就是3次。但最终生成调用中节省的 Token 往往更值钱。具体值不值得要看场景,文档超过2000个 Token 时,压缩的收益大于开销。

层次化布局:结构本身就在传达重要性

不要把所有内容混成一面文字墙。LLM对上下文前部和后部的注意力分配不同,结构化的分区能帮助它区分指令、数据和示例。

想想阅读研究论文的过程:摘要是总结,引言提供背景,方法部分有技术细节,讨论部分解读结果。这种结构让信息提取变得高效,LLM从同样的结构中受益。因此需要在上下文内部设计一套固定的、分区清晰的格式。

以下是一个经过验证的布局:

 [System Rules]  
You are a precise financial research assistant.  
Answer only from provided context.  
If information is missing, say "I don't have that information."  
Never make assumptions about numerical data.

[Task]  
Goal: Answer user question using context below.  
Output format: Start with direct answer, then provide supporting details.  

[User Profile / Memory]  
- Risk tolerance: Low  
- Investment horizon: 5-10 years  
- Region: India  
- Previous sessions: Asked about HDFC Bank 3 times, showed interest in banking sector  
- Preferences: Conservative investments, dividend-paying stocks  

[Retrieved Context]  
DOC 1: HDFC Bank Q4 2024 earnings report  
- Revenue: ₹45,000 crores (up 15% YoY)  
- Net profit: ₹12,000 crores (up 18% YoY)  
- NPA ratio: 1.2% (improved from 1.5%)  
DOC 2: Competitor analysis Q4 2024  
- ICICI Bank revenue growth: 12% YoY  
- SBI profit growth: 10% YoY  
- HDFC Bank leading in digital banking adoption  

[Tool Outputs]  
- live_price("HDFCBANK"): ₹1,842.50 (updated 2 minutes ago)  
- news_summary("HDFCBANK"): "Announced dividend of ₹19 per share for FY2024. Ex-dividend date March 15, 2025."  
- sector_analysis("Banking"): "Banking sector up 8% this month due to positive earnings"  

[Question]  
 User: What's the latest on HDFC Bank?

系统规则排在最前面,模型在任何其他内容之前先看到它们,用来划定行为边界。任务说明紧随其后,让模型明确目标。用户档案提供个性化信息——模型知道该用户偏好保守投资,之前多次问过HDFC,于是在组织答案时会相应调整侧重点。检索到的文档被标记为源材料,模型将其视为引用依据。工具输出标记为实时数据,意味着当前且权威,不是猜测。问题放在最后,模型在看到要回答什么之前已经掌握了所有上下文。

分区带来的好处很直接:每种信息的角色一目了然,矛盾指令减少,各部分可以独立替换而不破坏整体。在多智能体系统中这一点尤为关键,不同智能体需要不同的上下文布局。

为什么比非结构化上下文更好

可以自己做个测试,把5000 Token 的指令、数据、示例和问题全部混在一起扔给LLM,再用同样的信息以结构化分区呈现。对比准确率,结构化版本在多数领域胜出10–20%。

原因在于注意力模式:LLM在训练中学到了开头和结尾的文本更重要。把关键指令放在开头、问题放在结尾,是在顺应模型的注意力偏好而非与之对抗。

动态查询重构:修复模糊问题

用户提出的问题往往是模糊的:缺少关键词、实体、时间范围。直接拿原始问题去检索效果不好,应该先让LLM重写或扩展查询。

已有研究证实,在检索前生成一条优化过的搜索查询能带来可观的准确率提升。

这看起来有点混乱,因为多加一步似乎应该让事情变复杂,但是其实逻辑很简单:模糊的查询返回模糊的结果,精确的查询返回精确的结果。

三种可行的模式。

澄清优先(适用于智能体场景),与其猜用户什么意思不如直接问。智能体回复:"要比较业绩表现,需要明确几个信息——哪个时间段?包含哪些竞争对手?最关注哪些指标(收入、利润还是市场份额)?"用户给出具体条件后,检索随之变得精确。这种策略只适用于多轮对话的智能体,单次问答系统用不上。但在智能体场景下效果很好——用户并不介意回答两三个澄清问题,如果换来的是更准确的答案。

HyDE(Hypothetical Document Embeddings)用户问"产品最新的改进有哪些",不直接用这个问题去搜索,而是让LLM先生成一段假答案:"最新的产品改进包括重新设计的仪表板、40%的加载速度提升、新增的协作功能和增强的移动端应用。"把这段假答案做 Embedding 后用于检索。为什么有效?因为假答案的措辞和实际文档的措辞一致。文档里不会写"最新的改进是什么",而会写"重新设计了仪表板""加载时间缩短了40%"。假答案的 Embedding 比原始问题的 Embedding 更贴近真实文档。

多查询扩展,对原始查询生成3–5个改写版本。"最新产品改进"可以展开为"最近的产品更新""本季度发布的新功能""产品增强变更日志""2.0版本有什么新内容"。每个查询分别检索,合并去重。这种方式能覆盖语义变体和不同的表述习惯。

举个实际例子。用户问"上季度的表现与竞争对手相比如何"。

这个问题里缺了太多信息:哪些竞争对手?哪一年的上季度?衡量什么指标——收入、利润、市场份额还是用户增长?

LLM将其重写为"比较2024年第四季度(2024年10月至12月)公司X与竞争对手A、B、C在内部财务报告中的收入增长和利润率"。注意具体程度——精确的时间段、精确的竞争对手、精确的指标、明确的数据来源。检索时还会结合记忆中已知的竞争对手名单(层次化布局的用户档案部分记录了该用户之前多次查询过竞争对手A和B)。

最终上下文对齐的是用户的意图,而非用户键入的字面内容。LLM拿到的是精确数据,不是模糊相关的内容。

实现模式如下:

 User query  
     ↓  
 LLM rewriter: "Expand this into a precise search query.   
 Add time ranges, entity names, and specific metrics."  
     ↓  
 Rewritten query  
     ↓  
 Retrieval

重写器需要能访问当前日期、用户档案和会话中的先前查询,从而推断出"上季度"对应的具体日期,以及"竞争对手"指的是哪几家公司。

记忆与状态:保留的是关系,不只是事实

初学者容易在这里混淆两个概念。检索回答的是当前问题;记忆保留的是用户关系。

检索是实时的,每次查询都在全部文档中搜索相关文本块,每次查询都被当作独立事件。今天问HDFC银行,明天再问,检索都是从零开始。

记忆则不同,它记住的是该用户三次问过HDFC银行,偏好保守型股票,住在印度,投资期限5–10年。这些信息跨会话持续存在。

正确的做法是给智能体配备持久化记忆,而不是依赖一条不断增长的历史字符串。把摘要、偏好和关键事实存下来,在每轮对话时重新注入。

三种记忆类型各有分工。

情景记忆,即过去对话的摘要。例如:"上次会话讨论了为法律文档构建RAG系统,用户关心的是如何处理100多页的合同,最终决定采用512 Token 块配合50 Token 重叠的语义分块策略。"注意,这不是完整的对话记录,而是一份200 Token 左右的摘要,只保留了关键内容。

语义记忆,存储在向量数据库中的过去交互记录。例如:"用户3周前问过关于HDFC的类似问题,当时问的是季度收益,当前查询是关于股息公告,两者都涉及HDFC的财务表现,可以复用之前查询中关于公司基本面的上下文。"语义记忆的价值在于发现模式:用户依次问了HDFC的收益、竞争对手、风险因素,可以判断他正在对HDFC做深度研究,从而主动推送相关信息。

偏好记忆,很少变化的稳定事实。"用户是初学投资者""偏好TypeScript""风险承受能力低""在医疗保健领域工作""位于孟买时区"。这些事实影响每一次交互——初学者得到更简洁的解释,低风险用户和高风险用户收到的建议完全不同。

为什么记忆比塞入完整聊天历史更好?

设想一个50轮的对话,轻松超过20,000个 Token。这些内容既塞不进上下文,也不应该塞进去——大部分与当前问题无关。换一种做法:50轮对话压缩为5个情景摘要(1000 Token),提取10个稳定偏好(200 Token),检索与当前问题最相关的3个历史情景(600 Token),合计1800 Token。信息量没有减少,聚焦程度高出一个量级。

只压缩和选取与当前轮次相关的部分,就能避开上下文限制,保持注意力清晰,让智能体在不依赖更大模型的情况下呈现出个性化效果。

落地时有两个执行点。每轮对话结束后做一次LLM摘要——"用户问了什么?提供了什么?用户表达了哪些偏好或需求?"——将摘要与 Embedding 一起存入向量数据库。每轮对话开始前,用当前查询在历史情景摘要库中做向量搜索,取回最相关的3条,再从另一张表加载稳定偏好(这些不需要向量搜索,每次都带上),全部插入层次化布局的 [User Profile / Memory] 区块。

用编程助手的场景来说明。

某用户在构建一个React仪表板,10次会话中先后问过状态管理、API集成、组件组合和测试方面的问题。存入记忆的内容如下:

  • 技术栈:React、TypeScript、Redux、Jest
  • 编码风格:偏好函数组件,使用 Hooks,喜欢描述性变量名
  • 项目上下文:为医疗保健数据可视化构建仪表板
  • 过去的问题:Redux异步操作曾遇到困难,最终用Redux Toolkit解决
  • 常见模式:使用自定义 Hooks 发起API调用,偏好Material-UI

当用户提了新问题"仪表板中如何处理实时更新",智能体在检索之前已经从记忆中看到了完整背景:React/TypeScript仪表板、Redux、Hooks偏好、医疗保健数据。于是可以直接给出上下文化的回答:"考虑到现有的Redux架构和对Hooks的偏好,建议使用Redux Toolkit的RTK Query配合WebSocket订阅,与当前模式完全兼容。"

对比一下没有记忆的智能体——它会先问"用什么框架?状态管理是什么?数据类型是什么?"用户已经回答过这些问题10遍了。记忆消除的正是这种重复带来的挫败感。

上下文保持聚焦,智能体行为保持一致,用户感到被理解。

工具感知上下文:把答案锚定在现实中

通过Model Context Protocol (MCP)等协议配合函数调用,可以让模型以统一格式看到来自工具、API和数据库的实时数据。不要依赖静态的文本知识。这正是 context engineering 的一部分——改变的是运行时有什么信息进入上下文、以何种形式进入。工具输出作为结构化上下文注入后,幻觉率会大幅下降,答案的时效性也有保障。

纯LLM知识有一个根本问题:它是静态的。训练数据有截止日期,不知道今天的股价、当前天气、最新新闻或内部数据库的状态。工具通过运行时数据弥补了这个缺口,但集成不当的工具会引入新的问题。

MCP风格的工具注册。智能体没有硬编码的工具集成,而是在运行时发现可用工具。智能体发出请求:"什么工具可以解决当前问题?"MCP服务器返回工具描述、输入Schema和能力清单,模型据此决定调用什么。这意味着新增工具无需重新部署智能体——加到MCP服务器上即可,智能体自动发现。生产系统正是靠这种机制扩展到数十乃至上百个工具。

结构化的工具返回值。工具不应返回原始字符串,而应返回带有明确键的JSON:

price

date

source

confidence

。把这些结果作为层次化布局中的独立区块插入,标记为权威事实。例如,工具返回

{"price": 1842.50, "currency": "INR", "timestamp": "2025-02-19T14:30:00Z", "source": "NSE", "change": "+2.3%"}

,模型看到的是结构化数据,知道1842.50是价格而不是文本中随意出现的一个数字。

带护栏的回答。对可靠性至关重要。在指令中写明:"只从 [Tool Outputs] 和 [Retrieved Context] 中回答。如果信息缺失,说'当前数据源中没有该信息。'绝不编造数字或事实。"一旦价格工具调用失败,模型会如实说明,而不是自行猜测。

用一个金融助手的场景贯穿整个流程。

查询是"HDFCBANK的最新股价和今天的新闻"。

智能体通过MCP发现可用工具:

get_live_price

get_news

get_historical_data

get_competitors

get_analyst_ratings

。根据查询判断需要调用

get_live_price

get_news

,拿到结构化响应:

 {  
  "get_live_price": {  
    "symbol": "HDFCBANK",  
    "price": 1842.50,  
    "currency": "INR",  
    "timestamp": "2025-02-19T14:30:00Z",  
    "change": "+2.3%",  
    "volume": 12500000  
  },  
  "get_news": {  
    "articles": [  
      {  
        "headline": "HDFC Bank Announces ₹19 Dividend",  
        "summary": "Board approves dividend of ₹19 per share for FY2024",  
        "date": "2025-02-19",  
        "source": "Economic Times"  
      }  
    ]  
  }  
 }

这些内容插入层次化布局的

[Tool Outputs]

区块,末尾附上用户问题。模型生成的答案是:"HDFC Bank当前交易价格₹1,842.50,今日上涨2.3%。该银行宣布FY2024每股派息₹19。"

注意模型引用了来自工具输出的具体数字,没有产生幻觉,也没有把股息金额和股价搞混。

这里的关键信息是:提示词本身很简单,真正起作用的是工程化后的运行时上下文。模型表现好,是因为它看到了结构化的权威数据,而不是因为有一段完美的提示词。

实现路径上建议从3–5个关键工具开始,确保它们稳定可靠后再扩展。不要第一天就试图接入50个工具——每个工具都需要错误处理、重试逻辑、超时管理和结果校验,先把基础设施为少数工具搭建好。

决策框架

选择性检索适用于文档集合庞大(1000+个文档)、检索返回结果过多(20+个文本块)、上下文接近容量上限(32K Token 附近)、或需要控制成本的场景。

压缩适用于文档篇幅长(单个超过5000 Token)、所需信息深埋在文本中、或按 Token 计费且需要成本优化的场景。如果文档本身已经很短(少于1000 Token),压缩带来的开销不划算。

层次化布局适用于多智能体系统(不同智能体需要不同的上下文结构)、多种上下文来源并存(文档、工具、记忆同时出现)、或需要分段调试(结构化分区让定位故障变得容易)的场景。单轮问答且只有一个来源时,布局多半是多余的。

查询重构适用于用户常提出模糊问题(消费类产品中的常见情况)、领域有专业术语但用户不使用(医疗、法律、金融领域)、或查询与文档之间存在词汇鸿沟(用户说"退款",文档写"退货授权")的场景。

记忆适用于对话式智能体(聊天产品、编程助手)、用户跨会话回访(有登录体系的B2B产品)、需要个性化(推荐、偏好起决定性作用)、或对话轮数超过20轮导致历史上下文溢出的场景。

工具感知上下文适用于答案依赖实时数据(股价、天气、库存)、构建的是智能体而非纯对话机器人(智能体会采取行动,聊天机器人只输出文本)、准确性取决于信息时效(不能凭空生成数字)、或需要降低幻觉率(工具提供事实依据)的场景。

总结

每种技术都有代价。重排消耗算力,压缩需要额外的LLM调用,记忆需要存储空间,工具需要API调用。收益是否覆盖成本,需要衡量。一个更简单的管道准确率稍低一点,有时候比一个复杂10倍、成本也高10倍的管道更合适。

https://avoid.overfit.cn/post/7be5e3180f7641c48da7d2e73da76224

by Divy Yadav

  1. 老男人论坛, 氛围很好, 讨论话题多数和怀旧游戏以及中年男人生活相关bad_smile
    https://bbs.oldmantvg.net
  2. 无损音乐下载站, 原网站资源特别丰富, 只可惜因为不可抗力原因站长关闭了, 这是网友自发重建的,数据没有那么多但是一直在上传
    https://www.hifiti.com/
  3. 小众软件下载站
    https://www.appinn.com/category/android/
  4. 千千静听, 网友自己维护的"官网", 可以下载各个版本的千千静听, 怀旧党狂喜
    https://www.ttplayer.co/index.php
  5. 苹果产品参数中心. 需要购买苹果产品的时候, 就会跑来反复对比每一代的参数, 看看买新好还是买旧好, 是一位大佬自己维护的, 非常推荐
    https://hubweb.cn/
  6. 4k 影视, 自从低端影视关闭以后我就用这个看一些美剧, 清晰度有 1080p, 但是最新剧集有时更新较慢
    https://www.4kvm.net/
  7. 小众软件论坛, 专门讨论小众软件 😂
    https://meta.appinn.net/

水面5种垃圾目标检测数据集(8000+张图片已划分、已标注)| AI训练适用于目标检测任务


一、项目背景

随着工业化进程加快和生活垃圾排放量增加,水体污染问题日益严峻,漂浮垃圾成为河道、湖泊、水库等水域环境监测的重要指标。水面垃圾不仅影响生态环境和水质安全,还会阻碍水流、破坏景观,甚至对水生生物产生危害。传统人工巡检和清理方式效率低、成本高,难以满足大规模水域环境监测的需求。

近年来,计算机视觉和深度学习技术的发展,为水面漂浮垃圾的自动检测与识别提供了新的解决方案。基于图像识别的智能监测系统可以实时检测水面垃圾类型和分布情况,辅助环保管理部门开展科学治理、数据分析和决策支持。因此,构建一份高质量、水面漂浮垃圾标注数据集,对于水域环境监测、智慧河道管理以及环保科研应用具有重要价值。
在这里插入图片描述
在这里插入图片描述

数据集下载

链接:https://pan.baidu.com/s/1mWyiyUSh-YgixFvb5KxM9w?pwd=7a7m
提取码:7a7m

水面5种垃圾目标检测数据集

本数据集面向水体环境监测与水面漂浮垃圾智能识别场景构建,主要用于训练与评估基于深度学习的目标检测模型(如 YOLO等)。
数据集聚焦于真实水面环境中常见的五类漂浮垃圾目标,覆盖河道、湖泊、水库等多种水域背景,具有较强的实际应用价值。

数据集总规模约 8000 张高质量图像,全部完成精细化人工标注,适用于水面垃圾检测算法的训练、验证与测试。

数据集中共包含 5 个目标类别,类别定义清晰,覆盖水面高频垃圾类型:

类别编号 英文类别名 中文含义
0 bottle 瓶子
1 can 易拉罐
2 carton 纸盒
3 paper 纸张
4 plastic 塑料制品

上述类别在水体环境中具有较高出现频率,对水质评估与水域治理具有重要监测意义。

真实水面场景采集:包含反光、水波、遮挡、背景干扰等复杂环境因素

类别分布合理:覆盖常见水面垃圾形态与材质差异

标注质量高:人工逐帧校验,目标边界精准

即插即用:无需额外处理即可直接训练 YOLO 模型

工程落地性强:适合水环境监测、智慧河道、环保监管等实际项目

二、数据集概述

本数据集共包含 约8,000张高质量水面图像,覆盖河道、湖泊、水库等多种水域场景,拍摄环境真实,包含反光、水波、遮挡和背景干扰等复杂因素。每张图像均经过人工精细标注,提供目标边界框信息,可直接用于目标检测模型训练和评估。

📂 数据目录结构

dataset/
├── train/
│   ├── images/
│   └── labels/
├── valid/
│   ├── images/
│   └── labels/
├── test/
│   ├── images/
│   └── labels/
  • train/images:训练集图像
  • valid/images:验证集图像
  • test/images:测试集图像
  • labels:YOLO格式标注文件

数据集已完成训练、验证和测试集划分,可直接适配YOLO及其他主流目标检测模型。
在这里插入图片描述


随着环境保护和生态治理理念的不断深入,水体污染问题日益成为城市与乡村管理的重要课题。漂浮在水面上的垃圾不仅影响水质和景观,还会破坏水生生态系统,甚至造成河道堵塞和安全隐患。传统的人工巡查和清理方式效率低、成本高,难以覆盖大范围水域,无法满足现代水环境监测和治理的需求。随着计算机视觉和深度学习技术的发展,通过图像识别实现水面垃圾的自动检测和分类成为可能,为智慧河道、环保监管和水质评估提供了新的解决方案。针对这一需求,本数据集专注于水面漂浮垃圾目标检测,收集了约8,000张覆盖河道、湖泊、水库等多种水域环境的高质量图像,并针对五类高频漂浮垃圾——瓶子、易拉罐、纸盒、纸张和塑料制品——进行了精细化人工标注。数据集在采集过程中充分考虑了复杂水面环境因素,包括水波反光、遮挡、背景干扰等,使得训练出的模型在真实场景中具备更高的鲁棒性与泛化能力。该数据集不仅可直接用于YOLO系列及其他主流目标检测模型训练和评估,也适用于水环境监测、智慧河道管理、环保科研以及深度学习算法研究,为推动水域污染治理、提升环保监管智能化水平提供了坚实的数据基础和技术支撑。

三、数据集类别说明

数据集聚焦水面常见垃圾,包含5个类别,类别定义清晰,覆盖高频出现的垃圾类型:

类别编号英文类别名中文含义
0bottle瓶子
1can易拉罐
2carton纸盒
3paper纸张
4plastic塑料制品

特点说明

  • 真实水面场景采集:水面反光、水波、遮挡、背景干扰均包含在内,增强模型鲁棒性
  • 类别分布合理:覆盖常见水面垃圾形态和材质差异
  • 标注质量高:人工逐帧校验,边界框精准
  • 即插即用:无需额外处理,可直接训练YOLO系列模型

在这里插入图片描述

四、适用场景

🌊 水环境监测

  • 河道、湖泊、水库漂浮垃圾检测
  • 水质评估与污染预警
  • 环境治理效果统计

🧹 智慧河道与环保监管

  • 自动化水面巡检
  • 数据驱动垃圾清理调度
  • 智能化环保管理系统

🤖 深度学习模型训练与研究

  • YOLO及其他目标检测模型训练与测试
  • 小目标检测与复杂场景识别研究
  • 模型鲁棒性及泛化能力分析

五、数据集优势

  1. 场景多样:覆盖多种水体环境,增强模型泛化能力
  2. 类别高频:覆盖水面常见垃圾类型,具有实际监测意义
  3. 标注精准:人工精细校验,目标边界框准确
  4. 训练便捷:标准目录结构与YOLO格式,可直接用于深度学习模型
  5. 工程落地性强:适合智慧河道、环保监测及科研实验

在这里插入图片描述

六、结语

本水面垃圾目标检测数据集以真实水面环境为基础,提供高质量图像和精确标注,可直接用于目标检测模型的训练、验证和测试。数据集覆盖五类高频漂浮垃圾,适应复杂环境条件,兼顾科研实验和工程应用需求。无论是智慧河道监控、水质评估、环保监管,还是深度学习算法研究和模型优化,该数据集都能为模型训练和智能化水面监测系统开发提供可靠的数据支撑,为推动水环境治理和环保技术智能化提供坚实基础。

总体来看,本水面5种垃圾目标检测数据集是一份兼具科研价值与工程应用价值的高质量数据资源,涵盖约8,000张真实水面场景图像,覆盖河道、湖泊、水库等多种水域环境。数据集中包含瓶子、易拉罐、纸盒、纸张和塑料制品五类高频漂浮垃圾,标注精准,类别定义清晰,可直接适配YOLO系列及其他目标检测模型。数据采集过程中充分考虑了复杂环境因素,如水面反光、水波、遮挡及背景干扰,使得模型训练后的泛化能力和鲁棒性更强。该数据集不仅适用于目标检测模型训练与评估,还可用于水环境监测、智慧河道管理、环保监管系统开发,以及深度学习算法研究和复杂场景识别实验。从科研角度,它可支持小目标检测、复杂背景识别、模型性能优化及鲁棒性分析;从工程应用角度,它能够为水面垃圾自动识别、智能巡检、数据驱动清理调度以及水质管理提供可靠的数据基础。整体而言,本数据集为水域环境智能监测提供了切实可行的技术支撑,是推动水环境治理、提升环保监管自动化和智能化水平的重要资源。

SHA在线加密工具分享

想做密码校验、文件指纹、接口签名时,很多人会接触 SHA 系列算法。它是不可逆的哈希算法,输出固定长度的摘要,适合用于校验一致性,而不是用来“解密”。

这款工具是我用 Vue 开发的网页小工具,界面简单,打开即用。核心计算在浏览器本地完成,不需要上传原文,适合对隐私比较敏感的场景。

在线工具网址:https://see-tool.com/sha-encryptor
工具截图:

使用方式也很直观:把要处理的文本粘贴到输入框,工具会实时生成 SHA 结果;需要时还可以复制结果用于系统配置、日志比对或接口签名。

适用场景:

  • 注册或登录时对密码做哈希处理
  • 校验文本是否被篡改
  • 生成唯一标识或请求签名

注意事项:

  • SHA 是不可逆的,无法把摘要还原成原文
  • 不要把它当作“加密后可解密”的方案
  • 涉及账号安全时,建议配合加盐和更高层的安全策略

如果你只是想快速得到可靠的 SHA 摘要,打开工具即可完成,无需安装任何软件。