你们的 AirPods 每次使用后如何维护的(生图慎入)
我大多数情况都是跑步使用,每次使用完不太方便清理;
索性就直接放进去了也不影响听觉,但是就会越来越脏,如图。。。
是不是需要随手准备一把刷子用完刷一刷,或者有其它更方便的建议,请大佬们支招~


xiaohack博客专注前沿科技动态与实用技术干货分享,涵盖 AI 代理、大模型应用、编程工具、文档解析、SEO 实战、自动化部署等内容,提供开源项目教程、科技资讯日报、工具使用指南,助力开发者、AI 爱好者获取前沿技术与实战经验。


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


作者:高玉龙(元泊) 最近,基于 AI Agent 的各种手机助手在社交媒体上爆火,它能够通过 AI 自动操作手机完成下单、比价、搜索等复杂任务。用户只需说一句“帮我找最便宜的 iPhone”,AI 就能自动打开购物 App、搜索商品、对比价格并完成下单。这种“AI 接管手机”的场景,让很多人看到了未来人机交互的新形态。 然而,当 AI 开始大规模操作手机时,传统的用户行为分析将会面临严重的数据污染问题,如: 如何识别“非人”操作?我们先拆解下 AI 或脚本是如何操作手机的。 我们先看下 AI Agent 操作手机的原理。 主要分为以下几个层次: 从移动端监控角度去识别“非人”操作,需要重点关注“操作执行层”。以 Android 平台为例,在“操作执行层”常见的有三种技术路径可以实现“非人”操作: 除此之外,定制 ROM、外接硬件等也可以实现“非人”操作,这部分暂时不在本文的讨论范围。 AccessibilityService 是 Android 提供的无障碍服务框架,原本用于辅助残障人士使用手机,但也可以用于自动化操作。是各种辅助功能应用、游戏辅助工具实现自动化操作的主要技术路径。 AccessibilityService 的工作机制可以分为三个阶段: 阶段一:事件监听 当应用界面发生变化时(如新页面打开、按钮状态改变),系统会通过 AccessibilityEvent 通知已注册的无障碍服务。服务可以监听多种事件类型,包括窗口状态变化、内容变化、视图滚动等。 阶段二:屏幕读取 无障碍服务可以获取当前活动窗口的视图层次结构(View Hierarchy),通过 AccessibilityNodeInfo 对象访问屏幕上的所有 UI 元素,包括: 阶段三:自动化操作 基于读取的屏幕内容,无障碍服务可以执行两种类型的操作: 通过无障碍服务输入事件,有以下特点: INJECT_EVENTS 是 Android 系统级权限,允许应用直接向输入系统注入触摸事件,模拟用户操作。这个是 Android 系统层面提供的底层事件注入机制。 INJECT_EVENTS 的工作机制也可以分为三个阶段: 阶段一:事件构造 应用通过 Instrumentation 或反射调用系统 API,构造 MotionEvent 对象。这个对象包含了触摸的坐标、动作类型(ACTION_DOWN、ACTION_UP 等)等基本信息。 阶段二:权限验证 Android 系统会检查调用者是否具有 INJECT_EVENTS 权限。这个权限是系统级权限,普通应用无法获取,只有以下情况下才能使用: 阶段三:系统注入 通过权限验证后,事件会被直接注入到 Android 的输入子系统(Input System)。输入子系统负责处理所有输入事件(触摸、按键等),注入的事件会被当作真实的硬件输入事件处理,分发给当前焦点窗口。 通过 INJECT_EVENTS 注入事件有以下特点: adb shell input 是 Android Debug Bridge(ADB)提供的命令行工具,用于通过 USB 连接或网络连接向设备注入输入事件。这是开发调试和自动化测试中常用的方式。与 INJECT_EVENTS 在本质上是一样的,在调用主体和权限获取方面存在差异。 通过 adb shell input 注入事件的工作机制主要分为四个阶段: 阶段一:命令发送 在 pc 端或远程设备上(如 USB 设备等),可以通过 ADB 客户端发送 input 命令,如下: 阶段二: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 方式注入事件有以下特点: 不少外挂和脚本,包含可以操作手机的 AI Agent 等都在使用上述方案。但特殊人群(如视障用户)也在使用无障碍服务。简单的通过特征值对事件进行分析,可能会造成误判。下文将主要探讨当操作事件发生时,如何通过采集事件的特征以及外部环境的特征,辅助分析“非人”操作事件。 通过 AccessibilityService 操作手机,需要先在手机系统设置中开启对应的障碍服务。Android 系统提供了可以判断是否有无障碍服务在运行的相关 API,如下: 除此之外,还可以通过检查 MotionEvent 的 flags 来判断事件是否通过无障碍服务产生: 通过以上方式,应用虽然可以检测到当前是否存在正在运行的无障碍服务,但也可能对正常的无障碍服务造成误伤。 INJECT_EVENTS 注入的事件一般有以下特征: 检测逻辑如下: 通过 INJECT_EVENTS 注入的事件,目前并没有非常可靠的单一方法,因为注入的事件发生在更底层,可以绕过应用层的检测机制。对于这类事件的注入,往往需要多维度综合检测的方式进行识别(也适用其他类型的注入事件检测)。即便如此,也可以尝试对事件特征进行检测,用于提升识别“非人”操作的成功率。 通过 adb shell input 注入的事件,本质上与通过 INJECT_EVENTS 注入的事件是一样的。但由于需要连接 ADB,相对 INJECT_EVENTS 的注入,可以通过检测 ADB 连接状态等进行识别。 检测 ADB 是否开启: 检测 USB 连接状态: 检测 ADB 端口是否打开:(无线调试和模拟器场景) 检测调试器状态: 检测 USB ADB 状态: 通过以上方式,可以采集到操作时的 ADB 相关环境信息。在分析操作事件发生时,结合 ADB 相关的状态信息,可以协助判断当前应用“非人”操作的可能性。 以上三种方式检测的结果字段将会通过 RUM SDK 上报到用户体验监控产品,通过对结果字段的查询分析可以快速识别可疑的非人操作。以下是几个分析场景。 场景一:识别开启无障碍服务的用户 通过分析无障碍服务的开启状态和服务 ID,快速定位可能存在非人操作的用户。 分析说明:如果某个用户的操作次数异常高,且开启了非系统的无障碍服务,需要重点关注。 场景二:识别具备全控能力的无障碍服务 重点分析具备读取屏幕和操作应用双重能力的无障碍服务。 分析说明:同时具备屏幕读取和手势操作能力的服务,更有可能被用于自动化操作。 场景三:识别 ADB 连接环境下的操作 分析在 ADB 连接状态下的用户操作,可能存在脚本或自动化工具。 分析说明:ADB 连接状态下的操作,可能是自动化脚本。 场景四:识别注入事件特征 通过事件标志位和属性缺失情况,识别可能通过 INJECT_EVENTS 注入的事件。 分析说明:如果某个用户的注入事件占比过高(如超过 50%),很可能存在非人操作。 以上内容对 AI Agent 或脚本操作手机的技术原理进行了分析,同时也介绍了三种技术路径下如何提取事件的特征信息。AutoGLM、豆包手机等 AI Agent 的兴起,标志着移动端交互即将进入新的阶段。AI 能够自动完成复杂的交互操作,这既是技术的进步,也为如何识别“非人”操作带来新的挑战。移动端监控要做到准确的“非人”识别,需要通过多个维度进行检测和识别。包括但不限于:应用运行环境检测能力的增强,无障碍服务包名特征的检测,设备特征的检测,行为特征的检测,屏幕轨迹特征的检测等。当前,阿里云可观测用户体验监控 SDK 已经采集相关属性,基于这些属性可以自定义分析当前是否可能存在非人操作(功能灰度中,可以加入钉钉交流群联系笔者,群号:67370002064)。背景介绍
技术拆解

通过 AccessibilityService 输入事件
通过 INJECT_EVENTS 注入事件
通过 adb shell 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"如何检测“非人”操作
识别 AccessibilityService 输入事件
// 检测是否存在正在运行的无障碍服务
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;
}// 检测事件是否由无障碍服务产生(有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 注入事件
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;
}识别 adb shell input 注入事件
public static boolean isAdbEnabled(Context context) {
return Settings.Global.getInt(
context.getContentResolver(),
Settings.Global.ADB_ENABLED, 0
) > 0;
}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;
} 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();
}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;
}通过 RUM + 自定义 Query 识别异常操作
-- 查询最近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 开启状态下的用户操作特征
* 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-- 查询具有注入特征的事件
* 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结语
先说结论:用了一个假期的 OpenClaw 之后,我决定自己造一个。
不是 OpenClaw 不好,Telegram UI 确实香,但用深了之后问题实在太多,多到我一个写代码的人每天花一半时间在跟工具较劲,而不是在干活。
这是最让我抓狂的。你给 Claude 一个任务,然后呢?然后就是对着 Telegram 聊天窗口干瞪眼。它在读文件?在跑命令?在思考人生?你不知道。配了消息切分也不行——切太碎 Telegram 直接 429 ,指数退避之后两条消息要等 10 分钟才发出来。10 分钟。你坐在那里等 10 分钟看一条消息,这体验跟拨号上网有什么区别?
这是架构层面的硬伤。Claude Code 本身已经是一个非常成熟的 Agent 了,有完整的工具链:Bash 、Read 、Write 、Edit 、Grep 、WebSearch……它自己就能干活。但 OpenClaw 的 pi-mono 框架也是个 Agent ,也想管事。结果就是两个 Agent 互相抢活干,你不得不把 Claude 本来就能做的事情委托给 OpenClaw 去调度,这太不 AI 了。
说白了我需要的只是一个监工 + 调度器,不是另一个 Agent 。那堆 SAUL 和 SKILL 对我来说完全用不上——Claude 自己就能做。唯一算有点用的计划任务和 heartbeat ,对稍微有点经验的人来说也是鸡肋。
嗯,这个不多说了。
架构图一目了然:
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 自己搞定。
这是我最在意的功能。消息发出去之后:
再也不用对着屏幕发呆猜它在干嘛了。
每个项目独立配置:
项目之间互不干扰,有新消息还会亮未读标记。同时盯三四个项目的进度完全没问题。
/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 | 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 在帮你干什么。
一个假期的怨气,化成了代码。

用了一圈 AI 聊天 App ,有三个点一直不习惯,所以自己做了一个。
1. "角色"比"助手"更清晰。 助手这个叫法我一直不习惯,所以改为角色了。Talkio 用角色系统:苏格拉底、毒舌评论家、代码审查员,每个有自己的性格和说话方式。
2. 交互参考微信。 中国人最熟悉的聊天界面就是微信,没有学习成本,打开就会用。
3. 为什么 AI 群聊不流行? 这是我最不理解的。把多个 AI 拉进同一个群聊,让它们辩论、接龙、协作,深度讨论问题总能给我惊喜。
Talkio 2.0 完成了技术栈迁移:从 Expo + React Native 迁移到 Tauri 2,现在一套代码同时支持 Windows / macOS / Linux / Android。
为什么迁移?
GitHub: https://github.com/llt22/talkio 如果觉得有用,多多 star 谢谢
下载: https://github.com/llt22/talkio/releases ( Windows / macOS / Linux / Android )







<think> 标签)欢迎提意见和 Issue 👉 https://github.com/llt22/talkio/issues
全程 vibe coding ,说实话虽然不手写代码,但是开发起来也挺费劲的,尤其是性能问题。
作者:欧弋 这是一个最好的时代,任何人都可以通过一根网线,触达亿万用户。这也是一个最坏的时代,信息的洪流每秒钟都在淹没无数平庸的声音。 作为一名内容创作者,你是否经历过这样的至暗时刻: 你痛斥“标题党”扰乱视听。但你是否想过:如果他们掌握的不仅是低门槛的手段,而是一套你看不见的高效生产力系统呢? 如果是十年前,拼的是文采;五年前,拼的是排版;那么今天,拼的是算力和自动化。 今天,我不卖课,不灌鸡汤,我要带你拆解一套真实的、可部署的、基于 AI 原生架构的“实时热点洞察 + 自动化内容生产系统” ——Inspo Radar(创作热点捕捉助手)。这不仅仅是一个工具,它是一套关于数据、效率与技术方法论的工程化实践。 实时热点洞察用一套多智能体系统,分工明确地完成了灵感发现、深度检索、报告撰写的全流程。 它是基于 Playwright 技术构建的无头浏览器集群。它像几只不知疲倦的猎犬,潜伏在微博、澎湃新闻、各大热榜的后台。 对于每一条需要深度探索的内容,系统都会在网络上进行搜索,并且真正打开搜索结果,阅读相关的内容,去理解到底发生了什么。 基于收集到的信息,它会自动生成一份情报简报,为后续的撰写步骤提供了更加可靠的信息来源。 有了内容,但是未必会有读者。好的文章也要先能把人吸引过来,才能有机会陈述自己的观点。 实时热点洞察不仅仅是交付一篇报告,也是在尝试帮助大家理清思路,分析如何根据当前话题有哪些受众,应该从哪个角度进行撰写。 有了“主编”的分析,只需要遵循主编的要求,一篇文章就新鲜出炉了。 喝果汁也能喝出致命病毒?别再乱喝“天然饮品”了!💀 你还在为健康每天一杯鲜榨果汁? 你以为的“养生”,可能正在把致命病毒直接喝进肚子里! 没错,不是吓唬你——喝果汁,真能喝出人命! 最近,印度西孟加拉邦突发尼帕病毒疫情,已确诊 5 例,多人死亡,甚至有医护人员在救治过程中不幸“中招”!更可怕的是,这种病毒没有疫苗、没有特效药,一旦感染,致死率高达 40%-75% ! 那它是怎么传给人的?不是靠蚊子,也不是靠空气,而是——你手里的那杯果汁! 你以为的“纯天然、无添加”椰枣汁、鲜榨果汁,背后可能藏着一个致命真相: 而很多地方采集的生椰枣汁(Tari) ,根本未经高温杀菌,直接饮用,等于直接把病毒喝下去! 有图有真相: 1998 年马来西亚疫情,就是猪吃了被污染的水果,人再接触猪或吃未煮熟的肉,导致上百人丧命!而这次印度疫情,直接源头就是“被污染的食物” ! 别以为只有印度人才喝椰枣汁,我们身边的风险也不少: 尼帕病毒潜伏期最长 45 天,一开始就像感冒:发烧、头痛、呕吐。但几天内就会发展成脑炎、昏迷、呼吸衰竭,幸存者还可能留下癫痫后遗症! 别慌,只要做对这几点,病毒根本近不了身: 1. 果汁必须煮沸! 无论是椰枣汁、椰子水还是自榨果汁,100℃ 煮 15 分钟,病毒才能被彻底灭活! 2. 水果要洗+要削皮! 别吃落地果!别啃没削皮的水果!削皮+流水清洗,是最后的防线! 3. 别碰野生动物和病畜! 不去蝙蝠洞、不接触不明死亡动物,养猪户、果农更要做好防护! 虽然目前我国暂无本土病例,但尼泊尔、泰国等邻国已紧急加强边境检疫! 别再觉得“天然=安全”了! 一杯没煮开的果汁,可能就是生命的代价! 转发给那个还在天天喝鲜榨果汁的朋友,救的可能是全家的命! 以下方案均基于函数计算 AgentRun 实现的。函数计算 AgentRun 是一个以高代码为核心的一站式 Agentic AI 基础设施平台。秉持生态开放和灵活组装的理念,为企业级 Agent 应用提供从开发、部署到运维的全生命周期管理。 借助于 AgentRun 提供的各种 Infra 能力,可以更加方便地完成 Agent 的开发。 整个开发过程中,只需要将精力聚焦于拆分子 Agent,调整提示词即可 通过实时热点洞察,你一个人就能搭建一条可复用的热点洞察与内容生产流水线。 调整参数,进一步优化流程,每天自动产生 100 篇文章也并非天方夜谭。文章的质量,只取决于你的想象。 或许有人会问:“这样生成的文章,有灵魂吗?” 工具本身没有倾向,而是由使用者来控制。深度检索的关键词列表、分析的倾向、最终文章的风格均是可控的。 无论如何,AI 都不能替你承担法律责任和道德风险。引言:在这个算法统治的世界,你为什么还在用冷兵器战斗?
AI Agent 如何取代你的编辑团队?
猎犬(Browser Agent)—— 全网 24 小时巡逻
侦探(Deep Search Agent)—— 拒绝“开局一张图”
主编(Inspiration Agent)—— 注入“传播工程”的策略


编辑(LLM)—— 完成最终的文章撰写
🚨 喝一口果汁,命就没了?
🦇 果蝠的“口水”,正在悄悄流进你的杯子!
果蝠(狐蝠)是尼帕病毒的天然宿主。它们在夜间偷喝椰枣汁、啃食水果时,会把含有病毒的唾液、尿液留在果实上。🥤 你以为的“健康”,其实是“高危”!
🛡️ 怎么保命?记住这 3 点!
🌍 疫情离我们远吗?
病毒没有国界,尤其是这种“人传人”能力虽弱、但致死率极高的病毒,一旦传入,后果不堪设想!📢 转发提醒家人!
尼帕病毒 #果汁危险 #果蝠病毒 #食品安全 #健康警示 #印度疫情 #科普一下] #小心病从口入
实时热点洞察的能力实现

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










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

随着智能手机的普及,人们在日常生活和工作中频繁使用手机,导致注意力分散、生产效率下降以及潜在的安全隐患。例如,驾驶或行走过程中使用手机可能增加交通事故风险,办公或工厂场景中玩手机也可能影响工作效率和安全管理。因此,能够自动检测人们是否使用手机的行为,对于安全监控、行为分析以及人机交互研究具有重要意义。 传统的人工监控方式成本高、效率低,难以覆盖大范围场景。而计算机视觉和深度学习技术的发展,使得通过图像或视频自动识别手机使用行为成为可能,为安全管理、行为分析和智能交互提供了数据支持。为了满足这一需求,本数据集针对玩手机行为检测进行了系统化收集和标注,涵盖多种场景和光照条件,可直接用于目标检测模型的训练与评估。 数据集说明 玩手机目标检测数据集 本数据集专注于检测人们使用手机的行为,共收集约 10,000 张图像,涵盖室内、室外、不同光照和多角度场景。每张图片均标注了手机的位置,适用于目标检测任务。 数据集分为训练集、验证集和测试集,目录结构为: train: ../train/images 该数据集可用于行为监测、智能安全管理以及人机交互研究,为深度学习模型提供高质量训练数据。 本数据集共包含 约10,000张图像,涵盖室内、室外、办公室、街道、公共场所等多种场景,具有良好的泛化能力。每张图像均标注了手机所在位置的边界框信息,便于训练深度学习目标检测模型。 数据集已完成训练、验证、测试集划分,可直接适配YOLO系列及其他目标检测模型训练。 随着智能手机在日常生活和工作中的普及,人们在各种场景下频繁使用手机的行为愈发常见。然而,过度或不当使用手机可能带来安全隐患、分散注意力,甚至影响生产效率和公共安全。例如,行人、学生或驾驶员在使用手机时容易分心,增加事故风险;办公或工厂场景中玩手机也可能影响作业效率和安全管理。传统人工监控方式成本高、覆盖面有限且效率低,难以满足现代智能管理系统对实时性和准确性的要求。计算机视觉和深度学习技术的发展为自动检测手机使用行为提供了可行方案,使行为监测、智能安全管理和人机交互研究能够基于大规模图像数据实现自动化分析和决策。为此,本数据集专注于玩手机行为检测,收集了约10,000张覆盖室内、室外、不同光照、不同角度的高质量图像,并提供精确的手机边界框标注,已完成训练集、验证集和测试集划分,可直接用于YOLO系列、Faster R-CNN、SSD、DETR等主流目标检测模型的训练与评估。该数据集不仅具备科研价值,可支持小目标检测、行为识别算法优化及复杂环境下的模型鲁棒性分析,也具有工程应用价值,为办公场所安全管理、工厂生产线监控、公共场所违规行为检测以及驾驶行为监控等智能化场景提供数据支撑,助力提升行为监控和安全管理的自动化水平与智能化能力。 本玩手机行为检测数据集以实际场景为基础,提供了规范标注和合理划分的10,000+图像资源,可直接用于目标检测模型的训练与评估。数据集覆盖室内、室外、多光照、多角度场景,兼顾科研和工程应用需求。无论是行为监控、智能安全管理、驾驶风险分析,还是人机交互研究,该数据集都能够为深度学习模型提供高质量训练数据,助力智能行为识别技术的发展,提高安全管理和监控的自动化水平。检测有没有玩手机的检测数据集(10,000+张图片已划分、已标注)| AI训练适用于目标检测任务
一、项目背景

数据集下载
链接:https://pan.baidu.com/s/1YeHCon3JABhYTTM7QbfCEA?pwd=59pj
提取码:59pj
val: ../valid/images
test: ../test/images二、数据集概述
📂 数据目录结构
dataset/
├── train/
│ └── images/
├── valid/
│ └── images/
├── test/
│ └── images/
└── labels/train/images:训练集图像valid/images:验证集图像test/images:测试集图像labels:YOLO格式标注文件三、数据集标注说明
四、数据集特点
五、适用场景

📱 智能安全管理
🧠 行为分析与研究
🤖 深度学习模型训练与实验

六、结语
总体而言,本玩手机行为检测数据集是一份高质量、场景丰富且工程价值与科研价值兼具的数据资源。数据集包含约10,000张图像,覆盖室内、室外、办公室、街道、公共场所等多种环境,同时囊括不同光照、角度和拍摄距离,保证了模型训练的泛化能力。每张图像均提供精确的手机目标边界框标注,可直接适配YOLO系列、Faster R-CNN、SSD、DETR等主流目标检测模型,显著降低模型训练和实验准备成本。该数据集不仅适用于目标检测模型的训练与评估,也可用于行为分析、人机交互研究和智能安全管理系统的开发。从科研角度来看,数据集可支持多场景小目标检测、复杂光照下的行为识别、模型泛化性与鲁棒性测试等技术探索;从工程应用角度看,能够为办公安全、工厂生产线监管、公共场所违规使用手机检测以及驾驶行为监控等提供可靠的数据支撑。整体而言,这一数据集不仅满足教学实验、毕业设计和科研论文的需求,也为智能行为识别、自动化安全监控及人机交互研究提供了坚实的数据基础,为提升公共安全管理和行为监控的智能化水平提供了切实可行的技术支撑。
我们先来通过一条简单的链路,定位大模型在 AI 领域的位置: 人工智能 > 机器学习 > 深度学习 > 大语言模型 机器学习最开始就用大量数据做线性回归从而对未知数据进行推测。 举个最简单的例子,二维的数据。直接就可以使用数学课就学过的线性回归求方程获取数据的趋势。当时就觉得算线性回归真麻烦呀,计算量那么大,没想到这都蹭到人工智能的边了,还能不难算吗? 接着,人类不满足于简单的线性回归,想要让计算机自动学习更复杂的数据特征,于是就有了深度学习。 深度学习之所以深度是因为,它基于多层神经网络自动学习数据特征。多层神经网络就像人脑的神经元互相连接。每根连接的强度就是权重,网络会反复调整这些强度,让结果越来越接近正确答案。 代表性模型有:卷积神经网络(CNN)、循环神经网络(RNN)、Transformer、GAN 等。 Transformer 无情压榨 GPU 产生的奇迹,起初应该没人觉得这效果能这么好。 与深度学习一样,Transformer 也是使用多层神经网络处理矩阵,只不过矩阵异常的大,不到硬件发展到一定水平根本无法实现。 关于大语言模型我们停一下,先比较基础的机器学习原理! 还是从最简单的二维数据开始。 当我们有一堆房产离市中心距离及其价格的数据时,我们可以在一个二维坐标轴表示这些数据,例如 x 轴是距离,y 轴是价格。 在数据都画上坐标轴之后,作为一个人类可能一眼就能粗略看出整个曲线的趋势,从而“拟合”出一条距离价格的关系。 它很可能是一个类似这样的函数: 对于计算机,要求出 w 和 b 的最优解,就要让真实价格和通过 w b 计算出来的价格的差值最少。 最常用的方式是均方误差(Mean Squared Error, MSE): $$ 我们要求的就是这个函数的最小值,在人工智能领域常用的就是梯度下降,也就是求 w 和 b 的偏导数,乘上学习率 α,让它自己慢慢收敛。 在拟合出一条接近“规律”的线条后,其实就差不多了。 如果你硬加更多的节点,会造成过拟合,也就所有的训练数据的损失值都很完美,但是一让它生成训练数据以外的东西,它就猜不准了。 就上面房价的例子,假如本来趋势基本就是一个斜线,但是你最后硬是求得一条曲线方程,把所有的点都穿过了,损失值为 0,但是这样计算用户给你的值,反而是算不准的。 这也就是所谓的失去泛化能力。 上面只用二维数据,就只有一个 $$ 又因为如果只用权重,无论经过多少层都无法拟合曲线,所以最后要添加一个非线性的激活函数计算结果: $$ 这只是一个层对某一个神经元的计算,下面是一个比较形象的图(请忽略数字) 所以当一个神经网络有多层,每层多个神经元的话计算量还是挺可怕的。 比如判断一张图片有没有猫,你没法用一条简单的线来划分"有猫"和"没猫"的区域。 多层网络的魔力在于: 这就等于在计算的时候把数据的内涵升维到隐藏层,经过隐藏层额外的处理可以得到更精确的结果。当然这个时候你输入的值也要有足够的信息量它才能学到东西。 但问题又来了既然多层这么强大,那是不是层数越多越好?也不是的。神经网络有两个维度可以调整: 深度(Deep):层数多,每层神经元少 宽度(Wide):层数少,每层神经元多 实际训练时深度和宽度的平衡需要把握好。 上面我们知道用梯度下降的方式调节 w 和 b,对于神经网络也是一样的数学原理,需要通过链式法则(Chain Rule)一层一层反向调整所有权重。 这里就不详细解释怎么层层反推了,就结果而言,我们给出了正确的输入和输出,最开始,这个网络只是瞎猜权重,到最后计算出来,经过损失函数梯度下降调整各种权重,到最后,竟然就可以像魔法一样推导出准确率比较高的答案,喵,喵,喵呀! P.S. 如果你真的找虐很想了解更多反向传播的计算过程,可以看 3blue1brown 🐱
本文旨在用简单易懂的语言解释大语言模型的基本原理,不会详细描述和解释其中的复杂数学和算法细节,希望各位小猫能有所收获 🐱 原文链接
AI 的科技树
深度学习
大语言模型
训练的方式
price = distance * w + b。
L(w, b) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
$$
过拟合
神经网络
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)
$$

反向传播
参考资料




OpenClaw 中文版 Molili 更新:接入钉钉、飞书、Siri 语音同步上线 8000 款 Skill 技能,有点值得期待!
入口: https://www.molili.com.cn/
亮点:
1 、一键部署、一键安装
2 、简单、易用



最近在项目里想加个思维导图功能,试了几个库,要么配置贼复杂,要么样式跟我的 shadcn 项目完全不搭。想着既然 shadcn/ui 那么好用,为什么不能有个思维导图组件呢? 于是就有了 mindmapcn。 装完就能用,不用配一堆东西,不用费心搞 SSR 异步加载那堆代码,这就是我开发 mindmapcn 的初衷。 如果你在用 shadcn/ui,那这个组件应该会让你觉得很舒服: 核心是基于 Mind Elixir 这个库。选它是因为: mindmapcn 做的事情就是把它包装成 shadcn 风格,让它用起来更顺手。 装完之后,代码大概长这样: 注意: 记得给容器设个高度,不然组件不知道该渲染多大。可以用 我自己用它做过这些: 基本上需要树状结构可视化的场景都能用。 如果你的项目有亮色/暗色主题切换,思维导图会自动跟着变。不用写任何额外代码,它会自己检测 CSS 变量然后调整颜色。(当然这个还是要跟 Tailwind 的主题系统配合使用) shadcn 生态的优势就是文件直接到你代码库里,所以定制化是很简单的事情,以下是一些常见的定制方式: 不过你可能需要先熟悉 Mind Elixir 的 API。 更多例子可以看官网文档。 做这个组件的时候,我就想着三点: 简单 - 不想让用户配一堆东西。装上就能用,这是最基本的。 好看 - 既然是 shadcn 生态的,样式得跟得上。主题适配、响应式这些都得有。 够用 - 基础功能要全,但也不能太复杂。大部分场景能覆盖到就行,不够用户也可以根据自己需求改。 都是 React 生态标准配置,也是 AI 前端的主流技术栈,所以交给 AI 接入思维导图问题也不大。 代码都在 GitHub 上:https://github.com/SSShooter/mindmapcn MIT 协议,随便用。有问题可以提 issue,想贡献代码也欢迎 PR~ 这个项目能做出来,得感谢: ebook-to-mindmap 已经率先用上这个小组件了,目前效果还不错。 如果你正好需要在项目里加个思维导图,欢迎试用: 有任何问题或建议,欢迎在 GitHub 上交流。
就像你平时
npx shadcn add button 一样,现在思维导图也能这么安装了。为什么要做这个?
一行命令搞定
npx shadcn@latest add https://mindmapcn.vercel.app/mindmaps/mindmap.json它长什么样?
底层用的什么?
基本用法
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] 这种。能用来干嘛?
主题适配
定制化
快速开始
安装
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>
);
}设计想法
技术栈
开源
感谢
试试看
npx shadcn@latest add https://mindmapcn.vercel.app/mindmaps/mindmap.json相关链接
大多数人以为客服系统不过是一个聊天框。 其实不是。 在那个小小的悬浮窗口背后,是一个实时消息核心,它必须在不可预测的流量下以低延迟传递消息。系统中存在并发控制,用来管理成千上万——有时甚至是几十万——的同时连接。内存管理也在高压下进行,低效的分配模式可能悄无声息地引入延迟尖峰。多租户隔离确保一个客户的工作负载永远不会影响另一个客户的系统稳定性。部署策略在 SaaS 与私有化环境下有根本性的差异。可靠性保证决定了消息是在边缘条件下“只送一次”、“至少送一次”,还是可能丢失。而在这一切之下,还有长期的架构权衡,这些权衡决定了系统在几年中的演进,而非几周。 表面上看似简单的界面,实际上是一个分层系统,需要在性能、隔离、可靠性和可维护性之间取得平衡。界面可能极简,但其背后的工程复杂度绝不简单。 在过去几年里,我构建了一个名为 升讯威在线客服与营销系统 的实时客服系统。它支持 SaaS 与私有化部署,并围绕高并发、可维护性以及清晰的架构设计。最初只是一个最小化原型,但逐渐发展为生产级系统:拥有真实的消息管道、租户隔离、访客追踪、可扩展 API,以及一个面向适应性而非偶然复杂性的结构。 本系列文章记录了这一技术演进——在从零构建和优化实时基础设施系统的过程中,所做的决策、面临的约束、进行的修正,以及获得的经验教训。 工程透明度能够建立信任——尤其是在基础设施级软件领域。 在客服系统领域,有许多产品可供选择。它们是经过多年迭代打磨的成熟系统,背后有强大的资源支持。从外部看,它们呈现出干净的界面和精心设计的用户体验。 然而,通常不为人所见的是支撑这些系统在大规模下可靠运行的工程思考。界面可能看起来很简单,但其背后的基础设施必须能够持续承载负载、应对流量突发、可靠地隔离租户,并在不断演进中不会因自身复杂性而崩塌。这些设计选择——权衡、约束和修正——很少在公开讨论中出现。 这些问题不是功能列表能够回答的,它们需要通过受约束条件塑造的架构思维来解答。 本系列将从工程视角探讨这些问题。它会审视当时看似合理、但后来需要修正的决策;讨论简洁性与可扩展性、抽象性与性能、即时交付与长期可维护性之间的权衡。 这不是市场宣传,也不是提供生产级代码的逐步教程。而是对架构决策、实践中遇到的约束,以及在构建和演进实时系统过程中获得的经验教训的系统性探索。 本系列将跟随系统的发展历程,从最初的假设到更成熟的架构形态。它将从一个核心问题出发:为什么从零构建一套客服系统是合理的——以及哪些约束条件支撑了这一决策。随后,它会讲述从最小化原型向生产级架构的演变过程,展示早期的简洁性如何逐步让位于结构上的严谨性。 讨论内容将包括在 .NET 中设计实时消息核心,以及在持续负载下处理高并发 WebSocket 连接的实际情况。还会探讨延迟敏感环境中的内存分配模式与 GC 行为,这些不是理论话题,而是直接影响用户体验的关键因素。稳定性机制,如背压、队列管理和故障隔离,也将在防止级联崩溃的背景下进行分析。 随着系统扩展,架构关注点转向多租户隔离、部署灵活性和可靠性保证。支持 SaaS 与私有化环境引入了不同的运维约束,并迫使团队对可配置性、自动化和环境假设做出明确决策。消息可靠性模型——以及理论保证与实际可操作性之间的妥协——成为核心考量。 后续文章还将回顾当早期设计决策不足时对核心组件的重写,如何在不造成过度抽象的情况下设计可扩展 API,以及在不破坏底层系统稳定性的前提下,将 AI 功能集成到延迟敏感的实时消息管道中。 每篇文章都将聚焦于工程思考,而非表面功能。在适当情况下,我会讨论权衡方案、被舍弃的替代方案和架构妥协——因为真实系统往往更多地由约束条件塑造,而非理想设计。架构图可能看起来清晰,但真正的清晰往往是在不断修正之后才显现出来。 本系列不是围绕产品能做什么来组织的,而是围绕系统如何在增长、负载和时间的考验下生存和演进来展开的。 计划的文章主题包括: 每篇文章都会聚焦于工程思考,而非表面功能的堆砌。 在适当的地方,我还会讨论权衡方案、被舍弃的替代方案以及架构妥协——因为真实系统往往更多地由约束条件塑造,而非理想设计。 本系列将聚焦于架构、设计思维以及从构建和演进生产环境下实时系统中总结出的工程经验。重点在于思考过程:为什么做出某些决策、哪些约束条件影响了这些决策,以及这些决策随时间推移表现如何。 本系列不会披露敏感的安全细节、客户数据、特定部署配置或内部专有实现机制。真实系统运行在特定的运维环境中,这些内容既不能公开,也不应公开。稳定性和安全性不是理论问题,而是实际责任。 在提供示例时,将以抽象形式展示模式,而非暴露内部结构。基准测试可能会以方向性描述呈现,而非具体生产数据。若包含架构图,也仅代表概念模型,而非真实基础设施布局。 目的在于分享思考方式,而不是暴露运营风险。工程透明度并不意味着发布每行代码或每条部署细节,而是要对塑造系统的决策保持清晰,对伴随这些决策的权衡保持诚实。 这些界限不是讨论的限制,而是负责任的工程实践的一部分。 如果你正在构建实时系统,其中延迟、高并发和可靠性不是抽象概念,而是日常工程约束,那么本系列可能对你有帮助。 如果你正在探索多租户架构,超越理论图示的层面,或者处理以 WebSocket 为主的工作负载,其中连接生命周期管理和内存行为直接影响系统稳定性,那么本系列讨论的话题可能与你面临的问题高度相关。同样,如果你关注系统在经过多年迭代后仍能保持可理解性和可适应性——而不仅仅是几周的开发——本系列也正是以这种视角编写的。 这不是为了快速消化而优化的内容。它假设你愿意用权衡而非绝对的思路思考问题,用演进而非速成的视角看待系统。重点不在于功能对比,而在于结构化思考。目标不是构建一次就能工作的东西,而是构建随着复杂性增长仍能持续可靠运行的系统。 如果你只是想找一份“10 分钟教你做聊天应用”的快速指南,本系列不适合你。市面上有很多优秀的快速原型资源。本系列关注的是原型开始面对真实流量、真实约束和真实运维责任后的那些问题。 软件系统在不断演进。 随着功能增加和边缘场景出现,系统会逐渐积累复杂性。早期设计中看不见的瓶颈会意外浮现,你不得不重新审视那些曾经完全合理的假设。架构图上看似清晰的设计,在生产环境中往往会变得分层、需要协商和调整。 没有任何系统会保持与最初版本完全相同。并发模型会被调整,数据结构会被替换,消息管道会被重写。部署流程会被简化——有时又会因新需求而再次复杂化。随着时间推移,挑战不再仅仅是让系统运行,而是确保系统在累积的决策下仍能持续稳定运行。 本系列旨在记录这一过程——不是作为完美成功的故事,而是作为一个持续的工程实践。内容将包括修正、结构性调整,以及最初的自信如何让位于更深层次理解的瞬间。系统的稳定性很少依赖单一的“正确决策”,它通常是迭代、约束与精炼的结果。 在基础设施级的 SaaS 系统中,演进不是可选项。真实流量会暴露隐藏的弱点;真实客户会带来重塑架构的新需求;真实的运维责任会改变权衡的评估方式。随着时间推移,工程工作不再只是增加功能,而是如何在适应变化的同时保持系统清晰可控。 如果你对实时架构、分布式设计权衡,或构建和维护必须持续运行的系统的实际挑战感兴趣,那么关注这段工程记录会对你有所启发。 感谢大家耐心阅读本系列内容,也非常期待各位的指正与交流——每一条反馈都是对工程思考的促进和完善。 需要说明的是,本系列分享的是一个真实的产品——升讯威在线客服与营销系统,它服务着真实用户,承载着实际业务场景。你可以访问我们的官网了解更多:https://kf.shengxunwei.com。 希望未来能与大家在架构设计、实时系统以及工程实践上进行更深入的探讨和交流,共同成长、共同进步。再次感谢关注与支持!为什么要写这个系列?
本系列将涵盖的内容
范围与界限
本系列适合谁阅读
如果你在设计 SaaS 基础设施,并发现架构决策很少能孤立存在——它们会波及部署模型、租户隔离、运维复杂性以及长期可维护性——你也会对本系列产生共鸣。长期的工程记录
致谢与后记


规模不等于利润、员工不等于产出、融资不等于成功。 追求规模是别人的游戏,追求自由才是你的游戏。 大家好,我是数字游民Hugo。 今天看了些OPC相关文章,和大家聊聊我的认知共鸣。 你每天朝九晚六,做着不喜欢的工作,换取一份"稳定"的薪水。 你想过辞职创业,但一想到要租办公室、招员工、融资、管理团队——你就打了退堂鼓。 你觉得自己被困住了:打工没前途,创业太复杂。 你不是没有能力,你是没有找到适合你的模式。 真相是:传统创业的"做大"逻辑,正在被一种新模式颠覆。 看看那些融资几个亿的公司,最后倒闭时欠一屁股债。 看看那些管理几十人团队的创业者,每天处理的是人际关系而不是产品。 看看那些"成功"的老板,表面风光,背后被公司绑架,比打工还累。 规模不等于利润。 员工不等于产出。 融资不等于成功。 真正的自由,是用最小的投入,获得最大的回报,同时保留对时间的完全掌控。 这就是一人公司的核心逻辑。 一人公司不是"小公司",而是一种刻意保持小规模的商业哲学。 它的核心假设是: 第一,互联网让一个人可以触达百万用户。 你不需要销售团队,不需要渠道代理。一篇爆款文章、一条爆款视频,就能让你被千万人看见。 第二,自动化工具让一个人可以完成十人的工作。 AI 编程、AI 写作、AI 设计、自动化营销……2026 年的工具链,已经能让单人产出媲美小团队。 第三,数字产品的边际成本趋近于零。 你写一份电子书,卖 1 份和卖 1 万份,成本几乎一样。你录一套课程,1 个人学和 1 万人学,交付成本几乎为零。 当这三点成立,你就不需要团队来"放大"你的价值。 你需要的不是更多人手,而是更好的系统。 打工和传统服务业的问题在于:你的收入和时间挂钩。 一天只有 24 小时,你的天花板写死了。 一人公司的核心是产品化: 你创造一次,卖出无数次。睡觉时也在赚钱。 穷人卖时间,富人卖系统。 广告是花钱买注意力。内容是让注意力主动找你。 一人公司没有营销预算,但有一个秘密武器:持续输出有价值的内容。 当你持续输出 6 个月、1 年、3 年——你就建立了一个不需要付费就能持续获客的引擎。 一人公司的"一人"不是指所有事都亲力亲为。而是指决策层只有你一个人。 执行层,交给系统: 你的时间只用在两件事上:创造和决策。其他的,都应该被自动化或外包。 传统商业的陷阱是:有了 10 万收入就想做到 100 万,有了 100 万就想做到 1000 万。 于是你招人、扩张、承担更大的风险和压力。 一人公司的心法是:够了就是够了。 当你一个人年入 100 万,没有员工、没有办公室、没有债务—— 你的实际自由度,超过 99% 年入千万但被公司绑架的创业者。 追求规模是别人的游戏。追求自由,才是你的游戏。 别把它想得太复杂。简化到极致就是三步: 第一步:选择一个领域,持续输出内容 不需要完美,不需要专业,只需要真实和持续。 6 个月后,你会有第一批信任你的受众。 第二步:把你的知识打包成产品 可以是 99 元的电子书,可以是 999 元的课程,可以是 9999 元的咨询服务。 从小开始,快速验证。 第三步:建立自动化系统,解放你的时间 用工具替代重复劳动,把省下的时间投入到创造更好的内容和产品上。 循环往复,飞轮转动。 打工熬资历,或者创业背风险。 你也可以选择第三条路:一个人,一台电脑,一套系统,一种自由的生活方式。 这条路不适合所有人。 它需要耐心,需要自律,需要忍受早期没人关注的孤独。 但如果你想要的是真正的自由—— 对时间的掌控、对生活的选择权、对未来的安全感——一人公司是 2026 年最清晰的路径。 你不需要许可,不需要融资,不需要团队。 你只需要开始。 选择一个你擅长且热爱的领域,在任何一个平台发布你的第一篇内容。 不要等到准备好。你永远不会准备好。 即刻开始->现在就动起来,这是唯一的准备。 我是胡戈 Carey,一人公司 OPC 的实践者,专注 AI 编程应用开发领域。 📌 公众号:AI 编程开发创客实战 📌 视频号:胡氏真言 + 王炸实验 📌 私域:AI 赋能圈知识星球 大道至简,返璞归真。真诚利他,成人之美。 如果你也正在探索一人公司路径,欢迎在评论区聊聊 如果你也对AI编程应用开发感兴趣,欢迎关注一起同行 本文由mdnice多平台发布
01 你正在经历的困境
02 为什么"做大做强"是少数人的游戏
03 一人公司的底层原理
04 构建一人公司的四大支柱
支柱一:打造可复制的产品,而非出卖时间
支柱二:用内容获取信任,而非广告买流量
支柱三:自动化一切可自动化的
支柱四:保持小,是一种选择
05 一人公司的真实路径
06 最后,还有一个选择
07 今天就行动
一人公司 #数字游民 #个人IP #AI编程 #轻创业 #OPC
RAG系统返回了完美的文本块,提示词写得很漂亮,但LLM还是在产生幻觉;文档加得越多,回复质量反而越差。这些问题问题不出在提示词上,而是出在上下文上。 提示工程告诉模型怎么说话;context engineering 控制模型说话时看到什么。以下是把生产系统和Demo区分开的6种上下文工程技术。 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天窗口期的矛盾说法、不同的排除条款、相互冲突的流程,试图综合所有信息后幻觉出了一条根本不存在的政策。 过滤之后加上 和 两个条件,立刻排除40个文本块。剩余10个用交叉编码器重排,保留前5个再检查近似重复(余弦相似度 > 0.9)。最终送进上下文的只有3个高相关、无冗余的文本块。 LLM现在看到的是清晰的政策声明、具体的时间线和例外清单——全部最新,全部对齐。没有幻觉,没有混淆。 效果:提示更短,回答更清晰,没有矛盾。实验数据显示,移除噪声上下文后准确率提高15–30%,Token消耗降低20–40%。但真正的收益在于可追溯性——确切知道模型看到了什么上下文,才能调试失败;50个文本块全灌进去,只能靠运气。 实现上可以从简单处着手:给所有文档加 时间戳,按日期过滤,仅凭这一步就能消除大部分噪声。接着加重排,再加去重,根据实际效果逐步叠加复杂度。 长篇原始文档容易撑破上下文限制,同时稀释注意力。多个案例研究表明,经过压缩可以在保持甚至提升准确率的同时砍掉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从同样的结构中受益。因此需要在上下文内部设计一套固定的、分区清晰的格式。 以下是一个经过验证的布局: 系统规则排在最前面,模型在任何其他内容之前先看到它们,用来划定行为边界。任务说明紧随其后,让模型明确目标。用户档案提供个性化信息——模型知道该用户偏好保守投资,之前多次问过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拿到的是精确数据,不是模糊相关的内容。 实现模式如下: 重写器需要能访问当前日期、用户档案和会话中的先前查询,从而推断出"上季度"对应的具体日期,以及"竞争对手"指的是哪几家公司。 初学者容易在这里混淆两个概念。检索回答的是当前问题;记忆保留的是用户关系。 检索是实时的,每次查询都在全部文档中搜索相关文本块,每次查询都被当作独立事件。今天问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、Hooks偏好、医疗保健数据。于是可以直接给出上下文化的回答:"考虑到现有的Redux架构和对Hooks的偏好,建议使用Redux Toolkit的RTK Query配合WebSocket订阅,与当前模式完全兼容。" 对比一下没有记忆的智能体——它会先问"用什么框架?状态管理是什么?数据类型是什么?"用户已经回答过这些问题10遍了。记忆消除的正是这种重复带来的挫败感。 上下文保持聚焦,智能体行为保持一致,用户感到被理解。 通过Model Context Protocol (MCP)等协议配合函数调用,可以让模型以统一格式看到来自工具、API和数据库的实时数据。不要依赖静态的文本知识。这正是 context engineering 的一部分——改变的是运行时有什么信息进入上下文、以何种形式进入。工具输出作为结构化上下文注入后,幻觉率会大幅下降,答案的时效性也有保障。 纯LLM知识有一个根本问题:它是静态的。训练数据有截止日期,不知道今天的股价、当前天气、最新新闻或内部数据库的状态。工具通过运行时数据弥补了这个缺口,但集成不当的工具会引入新的问题。 MCP风格的工具注册。智能体没有硬编码的工具集成,而是在运行时发现可用工具。智能体发出请求:"什么工具可以解决当前问题?"MCP服务器返回工具描述、输入Schema和能力清单,模型据此决定调用什么。这意味着新增工具无需重新部署智能体——加到MCP服务器上即可,智能体自动发现。生产系统正是靠这种机制扩展到数十乃至上百个工具。 结构化的工具返回值。工具不应返回原始字符串,而应返回带有明确键的JSON: 、 、 、 。把这些结果作为层次化布局中的独立区块插入,标记为权威事实。例如,工具返回 ,模型看到的是结构化数据,知道1842.50是价格而不是文本中随意出现的一个数字。 带护栏的回答。对可靠性至关重要。在指令中写明:"只从 [Tool Outputs] 和 [Retrieved Context] 中回答。如果信息缺失,说'当前数据源中没有该信息。'绝不编造数字或事实。"一旦价格工具调用失败,模型会如实说明,而不是自行猜测。 用一个金融助手的场景贯穿整个流程。 查询是"HDFCBANK的最新股价和今天的新闻"。 智能体通过MCP发现可用工具: 、 、 、 、 。根据查询判断需要调用 和 ,拿到结构化响应: 这些内容插入层次化布局的 区块,末尾附上用户问题。模型生成的答案是:"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
什么是 Context Engineering
选择性检索:别再把什么都往里塞

region='CN'updated_at >= 2025-01-01last_updated上下文压缩:让每个 Token 都有价值

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

[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?动态查询重构:修复模糊问题

User query
↓
LLM rewriter: "Expand this into a precise search query.
Add time ranges, entity names, and specific metrics."
↓
Rewritten query
↓
Retrieval记忆与状态:保留的是关系,不只是事实

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

pricedatesourceconfidence{"price": 1842.50, "currency": "INR", "timestamp": "2025-02-19T14:30:00Z", "source": "NSE", "change": "+2.3%"}get_live_priceget_newsget_historical_dataget_competitorsget_analyst_ratingsget_live_priceget_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]决策框架
总结

随着工业化进程加快和生活垃圾排放量增加,水体污染问题日益严峻,漂浮垃圾成为河道、湖泊、水库等水域环境监测的重要指标。水面垃圾不仅影响生态环境和水质安全,还会阻碍水流、破坏景观,甚至对水生生物产生危害。传统人工巡检和清理方式效率低、成本高,难以满足大规模水域环境监测的需求。 近年来,计算机视觉和深度学习技术的发展,为水面漂浮垃圾的自动检测与识别提供了新的解决方案。基于图像识别的智能监测系统可以实时检测水面垃圾类型和分布情况,辅助环保管理部门开展科学治理、数据分析和决策支持。因此,构建一份高质量、水面漂浮垃圾标注数据集,对于水域环境监测、智慧河道管理以及环保科研应用具有重要价值。 水面5种垃圾目标检测数据集 本数据集面向水体环境监测与水面漂浮垃圾智能识别场景构建,主要用于训练与评估基于深度学习的目标检测模型(如 YOLO等)。 数据集总规模约 8000 张高质量图像,全部完成精细化人工标注,适用于水面垃圾检测算法的训练、验证与测试。 数据集中共包含 5 个目标类别,类别定义清晰,覆盖水面高频垃圾类型: 类别编号 英文类别名 中文含义 上述类别在水体环境中具有较高出现频率,对水质评估与水域治理具有重要监测意义。 真实水面场景采集:包含反光、水波、遮挡、背景干扰等复杂环境因素 类别分布合理:覆盖常见水面垃圾形态与材质差异 标注质量高:人工逐帧校验,目标边界精准 即插即用:无需额外处理即可直接训练 YOLO 模型 工程落地性强:适合水环境监测、智慧河道、环保监管等实际项目 本数据集共包含 约8,000张高质量水面图像,覆盖河道、湖泊、水库等多种水域场景,拍摄环境真实,包含反光、水波、遮挡和背景干扰等复杂因素。每张图像均经过人工精细标注,提供目标边界框信息,可直接用于目标检测模型训练和评估。 数据集已完成训练、验证和测试集划分,可直接适配YOLO及其他主流目标检测模型。 随着环境保护和生态治理理念的不断深入,水体污染问题日益成为城市与乡村管理的重要课题。漂浮在水面上的垃圾不仅影响水质和景观,还会破坏水生生态系统,甚至造成河道堵塞和安全隐患。传统的人工巡查和清理方式效率低、成本高,难以覆盖大范围水域,无法满足现代水环境监测和治理的需求。随着计算机视觉和深度学习技术的发展,通过图像识别实现水面垃圾的自动检测和分类成为可能,为智慧河道、环保监管和水质评估提供了新的解决方案。针对这一需求,本数据集专注于水面漂浮垃圾目标检测,收集了约8,000张覆盖河道、湖泊、水库等多种水域环境的高质量图像,并针对五类高频漂浮垃圾——瓶子、易拉罐、纸盒、纸张和塑料制品——进行了精细化人工标注。数据集在采集过程中充分考虑了复杂水面环境因素,包括水波反光、遮挡、背景干扰等,使得训练出的模型在真实场景中具备更高的鲁棒性与泛化能力。该数据集不仅可直接用于YOLO系列及其他主流目标检测模型训练和评估,也适用于水环境监测、智慧河道管理、环保科研以及深度学习算法研究,为推动水域污染治理、提升环保监管智能化水平提供了坚实的数据基础和技术支撑。 数据集聚焦水面常见垃圾,包含5个类别,类别定义清晰,覆盖高频出现的垃圾类型: 本水面垃圾目标检测数据集以真实水面环境为基础,提供高质量图像和精确标注,可直接用于目标检测模型的训练、验证和测试。数据集覆盖五类高频漂浮垃圾,适应复杂环境条件,兼顾科研实验和工程应用需求。无论是智慧河道监控、水质评估、环保监管,还是深度学习算法研究和模型优化,该数据集都能为模型训练和智能化水面监测系统开发提供可靠的数据支撑,为推动水环境治理和环保技术智能化提供坚实基础。 总体来看,本水面5种垃圾目标检测数据集是一份兼具科研价值与工程应用价值的高质量数据资源,涵盖约8,000张真实水面场景图像,覆盖河道、湖泊、水库等多种水域环境。数据集中包含瓶子、易拉罐、纸盒、纸张和塑料制品五类高频漂浮垃圾,标注精准,类别定义清晰,可直接适配YOLO系列及其他目标检测模型。数据采集过程中充分考虑了复杂环境因素,如水面反光、水波、遮挡及背景干扰,使得模型训练后的泛化能力和鲁棒性更强。该数据集不仅适用于目标检测模型训练与评估,还可用于水环境监测、智慧河道管理、环保监管系统开发,以及深度学习算法研究和复杂场景识别实验。从科研角度,它可支持小目标检测、复杂背景识别、模型性能优化及鲁棒性分析;从工程应用角度,它能够为水面垃圾自动识别、智能巡检、数据驱动清理调度以及水质管理提供可靠的数据基础。整体而言,本数据集为水域环境智能监测提供了切实可行的技术支撑,是推动水环境治理、提升环保监管自动化和智能化水平的重要资源。水面5种垃圾目标检测数据集(8000+张图片已划分、已标注)| AI训练适用于目标检测任务
一、项目背景


数据集下载
链接:https://pan.baidu.com/s/1mWyiyUSh-YgixFvb5KxM9w?pwd=7a7m
提取码:7a7m
数据集聚焦于真实水面环境中常见的五类漂浮垃圾目标,覆盖河道、湖泊、水库等多种水域背景,具有较强的实际应用价值。
0 bottle 瓶子
1 can 易拉罐
2 carton 纸盒
3 paper 纸张
4 plastic 塑料制品二、数据集概述
📂 数据目录结构
dataset/
├── train/
│ ├── images/
│ └── labels/
├── valid/
│ ├── images/
│ └── labels/
├── test/
│ ├── images/
│ └── labels/train/images:训练集图像valid/images:验证集图像test/images:测试集图像labels:YOLO格式标注文件
三、数据集类别说明
类别编号 英文类别名 中文含义 0 bottle 瓶子 1 can 易拉罐 2 carton 纸盒 3 paper 纸张 4 plastic 塑料制品 特点说明

四、适用场景
🌊 水环境监测
🧹 智慧河道与环保监管
🤖 深度学习模型训练与研究
五、数据集优势

六、结语
想做密码校验、文件指纹、接口签名时,很多人会接触 SHA 系列算法。它是不可逆的哈希算法,输出固定长度的摘要,适合用于校验一致性,而不是用来“解密”。 这款工具是我用 Vue 开发的网页小工具,界面简单,打开即用。核心计算在浏览器本地完成,不需要上传原文,适合对隐私比较敏感的场景。 使用方式也很直观:把要处理的文本粘贴到输入框,工具会实时生成 SHA 结果;需要时还可以复制结果用于系统配置、日志比对或接口签名。 适用场景: 注意事项: 如果你只是想快速得到可靠的 SHA 摘要,打开工具即可完成,无需安装任何软件。SHA在线加密工具分享
在线工具网址:https://see-tool.com/sha-encryptor
工具截图:
这篇文章聚焦本项目中 SHA 在线加密工具的核心 JS 实现思路,强调数据在浏览器端完成计算的流程组织与结果生成方式。 工具的本质是把输入文本稳定地映射为固定长度的摘要。实现上以浏览器原生加密能力为核心,通过统一的数据编码、哈希计算与结果格式化,保证输出一致且可复现。 输入内容变化时触发计算流程。文本先被规范为字符串,再通过编码器转换为字节序列,避免不同环境的字符编码差异造成结果不一致。这个字节序列是哈希算法的直接输入。 核心计算使用 Web Crypto API 的摘要能力,算法类型作为参数传入,返回二进制缓冲区。该过程是异步的,计算完成后再进入结果处理阶段。整个流程可被封装为一个纯函数式的异步方法,便于在响应式场景中复用。 摘要结果需要从二进制转换为十六进制字符串,便于展示与复制。常见做法是遍历字节数组,将每个字节转换为两位十六进制并拼接成最终字符串,确保长度稳定且前导零不丢失。 实现可以拆为四层:输入规范化、字节编码、摘要计算、结果格式化。每一层都保持纯函数,便于组合和测试,也让响应式框架更容易驱动结果更新。 下面是 SHA 计算的核心 JS 代码,包含算法校验、文本编码、摘要计算与十六进制输出。默认使用 SHA-256,也可以通过参数切换其他 SHA 算法。 用户输入频繁变化时,异步计算可能出现结果乱序。可以用递增序号的方式只保留最新一次结果,保证界面始终显示最新输入的哈希值。 把输入、算法选择、结果状态拆成独立状态即可形成清晰的数据闭环。输入或算法变化时触发计算,输出只由最新一次计算决定。SHA在线加密 核心JS实现
在线工具网址:https://see-tool.com/sha-encryptor
工具截图:
核心思路
数据流
哈希计算
结果格式化
代码结构
核心计算
const supportedAlgorithms = new Set(['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512'])
const normalizeInput = (value) => {
if (typeof value === 'string') return value
if (value === null || value === undefined) return ''
return String(value)
}
const encodeText = (text) => {
return new TextEncoder().encode(text)
}
const toHex = (buffer) => {
const bytes = new Uint8Array(buffer)
let result = ''
for (const byte of bytes) {
result += byte.toString(16).padStart(2, '0')
}
return result
}
const shaHex = async (text, algorithm = 'SHA-256') => {
const normalized = normalizeInput(text)
if (!normalized) return ''
if (!supportedAlgorithms.has(algorithm)) {
throw new Error('不支持的算法类型')
}
const data = encodeText(normalized)
const hashBuffer = await crypto.subtle.digest(algorithm, data)
return toHex(hashBuffer)
}并发处理
const createShaRunner = () => {
let taskId = 0
return async (text, algorithm, onResult) => {
const currentId = ++taskId
try {
const hash = await shaHex(text, algorithm)
if (currentId !== taskId) return
onResult({ hash, error: '' })
} catch (error) {
if (currentId !== taskId) return
onResult({ hash: '', error: error?.message || '计算失败' })
}
}
}状态驱动
import { ref, watch } from 'vue'
const inputText = ref('')
const algorithm = ref('SHA-256')
const outputHash = ref('')
const errorText = ref('')
const runSha = createShaRunner()
const compute = async () => {
await runSha(inputText.value, algorithm.value, ({ hash, error }) => {
outputHash.value = hash
errorText.value = error
})
}
watch([inputText, algorithm], compute, { immediate: true })
如下图,身处四川,总是忍不住点进去看。

Hi,你好,我是Carl,一个本科进大厂做了2年+AI研发后,裸辞的AI创业者。 给飞书群造机器人这件事,我半年重复了十几次。每一次都得让AI重新翻飞书官方文档,然后反复搏斗好一阵子才能完全搞好。 最后我受不了了,做了这样一个开源Skill,现在说几句话就能交付一个完整的飞书机器人项目,并且把我实践中踩过的坑、各个需求的实现流程等都集成了进去,即使产物与预期有出入,迭代修改的效率也要远高于前。 这篇文章,我会告诉你它是什么、怎么用,以及背后一个可以迁移到任何领域的思路。 半年造了十几个飞书机器人,我受够了每次从0开始 说实话,给飞书群搞个机器人这事,需求一点都不复杂。每天早上发条热点汇总,或者做个能对话的群助手,或者集成OpenClaw之类的,场景很日常。 但问题是,每次构建总会有千奇百怪的问题,而且随着创业的事情越来越多,我要构建的频率越来越高。 第一次,我让Claude帮我写飞书Webhook机器人。代码给得很快,但签名校验逻辑写错了,时间戳和签名拼接顺序搞反,调了好一阵子。 第二次,需要自建应用机器人。Claude又去"理解"飞书的事件订阅机制,结果把Flask路由和SDK适配器搞混了,搞得我中午没睡觉一直在调。 每一次都是同样的循环:AI先查文档→编代码→跑不通→查文档→理解一半→改→又出新问题。十几次。 不是AI不够聪明。问题在于飞书开放平台有自己的规矩——SDK的builder模式、事件验签逻辑、卡片JSON嵌套结构、两种机器人完全不同的鉴权方式——散落在几十页文档里,每次都要从头学。 但是,让AI在最开始的时候直接吞下这些内容也不现实,而且它也并不清楚哪些是重点。 一句话造一个完整的飞书机器人 后来我把所有经验、所有坑、所有标准做法,打包成了一份Skill。 包括我实践里总结的SOP、各种坑,以及需求挖掘的流程,还有必要的参考资料。 Skill说白了就是AI的结构化知识包。装上它,AI就知道该怎么一步步构建飞书机器人,什么该问、什么该做、什么地方容易翻车。 说了这么多,演示一下吧。首先,把 Skill 下载到对应位置: Copilot 放到 ~/.copilot/skills/,Claude Code 放到 ~/.claude/skills/; Cursor 没有同名 Skill 目录,通常用规则替代,把规则放到 .cursor/rules/。 比如,我懒得思考了,就跟AI说一句话: 「帮我做一个飞书机器人」 可有看到,它已经读取到了这个Skill的内容。下一步,它没有直接写代码。先反问了2个关键问题: 逐一回答后,它进行第二轮需求澄清: 第二轮是更细粒度的确认,用来确认具体是什么样的业务场景。如果有定时需求等,这里也会确认具体几点发送等等的信息,帮助使用者讲清楚自己的需求,来让AI执行的更加精确。 最后,它给了这样一份完整的需求确认。如果有遗漏处,这里是最后一次在构建前的补充,比如我们还需要能在群里@它对话之类的。 等到需求确认无误,才开始按步骤生成代码。 几分钟后,这样一个完整项目出来了: src/ 核心业务代码,按职责拆分 config/ 配置管理,统一读取环境变量 .env.example 列出所有需填配置 QUICKSTART.md 五步跑起来 README.md 架构说明、命令列表、部署指南 配置上所需的App ID和App Secret,以及群聊的Chat ID等信息,启动服务,机器人就在飞书群里活了。 整个过程,不过5分钟。 补充:Skill是什么?为什么它比工作流更适合这件事 做这个项目的过程中我愈发觉得:模型能力够强之后,Skill在中小型任务上远强于工作流。 用个比喻的话,工作流是流水线,Skill是岗前培训手册。 工作流预先定义好每一步,并且更加重量级一些,往往用于企业级固定SOP的工作。 数据从A到B到C,节点固定。适合重复执行、流程不变的任务——定时拉数据→生成报表→发邮件,跑得很好。 但飞书机器人构建不是这样。每次需求都不一样:Webhook通知、双向交互、接AI模型、定时消息、各种卡片样式。你没法画一条流水线覆盖所有情况。 Skill的逻辑不同。它不是告诉AI"第一步做A,第二步做B",而是告诉AI:你是飞书机器人构建专家,这是你的知识体系和工作规范,用户来了你自己判断。 工作流是给新员工一本操作手册,写死了每种情况。Skill是做一周岗前培训,让他理解业务逻辑,之后什么情况都能自己判断。前者僵硬,后者灵活。而现在的大模型,底层能力已经够强了。 AI编程工具的生态里这个趋势已经很明显。各个编程IDE都支持了Skills,无论是rules还是其他特殊定义,本质上都是给AI一份结构化上下文知识,让它在特定领域更强。 这个Skill是怎么做的?3个关键设计决策 如果你对实现思路感兴趣,这三个设计决策可以直接迁移到任何领域。 决策一:需求挖掘前置——不许上来就写代码 大多数人用AI写代码,是需求一股脑扔过去。但这个Skill规定了四个阶段:需求澄清→确认→开发→验证。没搞清楚你要什么之前,禁止写一行代码。 比如用户说"我要定时发消息",AI不能直接写定时器。它得追问:发什么内容?从哪来?发到哪个群?什么频率?异常了怎么办?每轮最多4个问题,问完还要复述完整需求让你确认。 看起来慢了,实际省掉了80%的返工。 决策二:给AI标准答案,而非让它自己编 Skill里我直接写好了两种机器人的完整参考实现。Webhook怎么发消息、签名怎么算、自建应用怎么初始化客户端、事件服务器怎么搭——全基于官方 lark-oapi。 AI不需要去"理解"文档了。有现成模板,根据需求做适配就行。就像你不用教厨师什么是"炒"——给菜谱,他照着调配料就行。 决策三:完整给出交付标准——不只是代码,是可运行的项目 Skill规定了项目该长什么样:src/ 放业务代码,config/ 放配置,根目录放入口。每个项目必须有 .env.example、QUICKSTART.md(50行以内)、README.md。 AI最容易出的问题不是代码逻辑写错,而是交付不完整——少配置文件、没写环境变量说明、入口找不到。这些小问题加起来能额外花一两个小时。Skill把这些全标准化了,拿到手就能跑。 写在最后:自动化是起点,标准化才是终点 做这个Skill让我想明白了一件事:AI时代大家都在聊自动化,但自动化只是起点,标准化才是真正拉开差距的东西。 自动化解决"能不能用AI替代人工"。标准化解决"AI每次都能稳定交付高质量结果"。 没有标准化的自动化,就是把一个不靠谱的流程跑得更快而已。 Skill不是让AI更聪明,而是让AI更稳定、更可预期。我之前聊过,好的上下文工程体系就像船,模型能力就像水,随着水涨,船也会高。Skill,就是上下文工程很朴素但很有效的一种形态。 项目级Skill机制正在成为AI编程标配,而这个思路完全可以延伸到任何需要AI反复执行的任务。 如果你现在还在每次从零跟AI沟通,试试把经验打包成一份Skill。一份Markdown,写清规则、贴上参考实现、定义交付标准,以及需要的工具和脚本。 也许,会给你带来想不到的效率提升。 既然看到这了,如果觉得不错,随手点个赞、收藏、转发三连吧~ 我是Carl,大厂研发裸辞的AI创业者,只讲能落地的AI干货。 关注我,更多AI趋势与实战,我们下期再见!













