月度归档:2025年07月

关于 AI Agent: 从 Manus 聊起

最近几天 Manus 的新闻不停的出现在我的信息流中,从 Manus 官方账号清空了微博、小红书上的所有内容,到裁员争议,据说将核心技术人员迁往了新加坡。一个从北京、武汉出发的纯正中国公司,最终选择了离开。

还记得今年火热的 3 月,Manus 发布当天就引爆了社交网络。邀请码一码难求,甚至在二手平台被炒出天价。创始人肖弘(人称red)带领的这支年轻团队,用一个产品点燃了整个行业对 AI Agent 的热情。

2025 年是 AI Agent 元年。AI Agent 的发展速度惊人。不只是 Manus 这种通用型 Agent,还有各种垂直领域的,如 设计领域的 lovart,编程领域的 Claude Code Cursor 等等。

那什么是 AI Agent,它由什么组成?今天我们聊一聊。

1. 从专家系统说起

要说 AI Agent 的历史,得从上世纪 60 年代说起。那时候,计算机科学家们就在琢磨一个事:能不能让机器像人一样,自己去感知环境、做出决策、然后采取行动?

最早的尝试是专家系统。比如 1970 年代斯坦福大学开发的 MYCIN,这是一个诊断血液感染疾病的系统。它的工作方式很简单:问医生一堆问题,然后根据预设的规则给出诊断建议。虽然现在看来很原始,但在当时,这已经算是「智能」了。

到了 80 年代,出现了更复杂的系统,比如 R1/XCON,帮助 DEC 公司配置计算机系统。这些系统有个共同特点:它们都是基于规则的。你得事先把所有可能的情况都想到,然后写成 if-then 规则。问题是,现实世界太复杂了,你不可能把所有情况都考虑进去。

90 年代,研究者们开始尝试新的路子。他们发现,与其让人去编写所有规则,不如让机器自己去学习。于是有了基于机器学习的 Agent,比如强化学习 Agent。这些 Agent 可以通过试错来学习如何完成任务。

但真正的转折点出现在 2010 年代深度学习兴起之后。特别是 2017 年 Transformer 架构的出现,彻底改变了游戏规则。有了 GPT、BERT 这些大语言模型,AI Agent 突然变得「聪明」了很多。它们不再需要人类事先编写规则,而是可以理解自然语言,根据上下文做出合理的判断。

2. 现代 AI Agent 的样子

要理解现代的 AI Agent,我们得先搞清楚它到底是什么。

简单来说,AI Agent 就是一个能够自主感知环境、制定计划、采取行动来完成特定目标的系统。听起来很抽象?我举个例子:

假设你要让 AI 帮你订一张从北京到上海的机票。一个简单的聊天机器人可能只会回答:”请您登录航空公司网站自行预订。”但一个真正的 AI Agent 会这样做:

  1. 理解你的需求(什么时间、预算多少、有什么偏好)
  2. 搜索多个航空公司的航班信息
  3. 比较价格和时间
  4. 根据你的偏好筛选
  5. 甚至可能帮你完成预订(如果有相应的接口)

这就是 AI Agent 和普通 AI 应用的区别:它不是被动地回答问题,而是主动地解决问题

3. 核心技术和架构

现在咱们来看看 AI Agent 是怎么实现的。核心架构可以分成四个部分:

3.1 感知模块

这是 Agent 的「眼睛」和「耳朵」。它需要理解用户的输入,同时还要感知环境的状态。比如,当你让 AI Agent 帮你写代码时,它需要理解:

  • 你想要实现什么功能
  • 使用什么编程语言
  • 有什么特殊要求
  • 当前的代码结构是什么样的

但这里有个关键点:感知模块需要区分两种不同的信息——状态上下文和意图上下文。

状态上下文是环境的客观信息。比如:

  • 当前项目使用的是 Python 3.9
  • 代码库里已经有了用户认证模块
  • 数据库是 MySQL
  • 使用的是的 FastAPI 框架

这些信息是确定的、可验证的事实。Agent 需要准确地获取和理解这些信息,因为任何误判都可能导致后续行动的失败。

意图上下文则是用户想要达成的目标,这往往更加模糊和主观。比如用户说「帮我优化一下这段代码」,Agent 需要理解:

  • 「优化」是指性能优化还是可读性优化?
  • 用户的性能预期是什么?
  • 有没有特定的约束条件?

区分这两种上下文至关重要。很多 AI Agent 的失败,就是因为混淆了状态和意图。比如,用户说「这个函数太慢了」,Agent 需要识别出:

  • 状态:函数执行时间是 500ms
  • 意图:用户希望降低到 100ms 以内

现代的 AI Agent 通过多种方式来增强感知能力:

多模态感知:不只是文字,还包括图像、语音、甚至视频。Cursor 支持图片上传,代码索引,文档等。

主动询问:当信息不充分时,优秀的 Agent 会主动提问。「你提到要优化性能,具体是想优化响应时间还是内存占用?」这种澄清式的对话,能大大提高后续行动的准确性。

历史记录:通过分析用户的历史行为,Agent 可以更好地理解当前的意图。如果用户之前多次要求「简洁的代码」,那么在新的任务中,Agent 就会倾向于生成更简洁的解决方案。

环境探测:高级的 Agent 还会主动探测环境。比如,在开始写代码前,它可能会先检查项目的配置文件、依赖列表、测试用例等,构建一个完整的环境画像。

感知的准确性直接决定了 Agent 的表现。一个看不清路的司机,再好的驾驶技术也没用。同样,一个不能准确理解用户意图和环境状态的 Agent,后续的规划和执行必然会出问题。

3.2 推理模块

这是 Agent 的「大脑」,也就是大语言模型。现在主流的做法是使用 GPT-4、Claude、Gemini 这样的大模型。但光有大模型还不够,还需要深入理解不同模型的特性,才能让它们更好地工作。

模型的性格差异

就像人有不同的性格,AI 模型也有各自的「个性」。这不是玄学,而是训练方式和优化目标的差异造成的。

以 Cursor 编辑器的实践为例,他们把模型分为两大类:

思考型模型(Thinking Models):

  • Claude 3 Opus:喜欢先理解全局,会主动推断你的意图
  • Gemini 2.0 Flash:自信果断,经常会做出超出预期的大改动
  • o1:专门为复杂推理设计,会花时间深入分析问题

这类模型就像经验丰富的专家,你给它一个大方向,它会自己规划路径。适合探索性任务、大规模重构、或者当你自己也不太确定最终方案时使用。

执行型模型(Non-thinking Models):

  • Claude 3.5 Sonnet:等待明确指令,不会过度推断
  • GPT-4 Turbo:行为可预测,适合精确控制
  • 文心一言 4.0:在中文任务上表现稳定

这类模型像是可靠的助手,严格按照你的要求执行。适合明确的任务、需要精确控制的场景、或者当你已经知道要做什么时使用。

选择模型的艺术

选择合适的模型,就像选择合适的工具。你不会用大锤子去拧螺丝,也不会用螺丝刀去砸钉子。

根据任务类型选择

  • 代码生成:Claude 3.5 Sonnet 和 GPT-4 都很优秀
  • 代码理解和重构:Gemini 2.0 Flash 的长上下文能力突出
  • 复杂 Bug 调试:o1 的深度推理能力更适合
  • 中文文档处理:通义千问、豆包有本土优势

根据交互风格选择

  • 如果你喜欢给出详细指令:选择执行型模型
  • 如果你偏好给出大方向:选择思考型模型
  • 如果你需要创造性方案:选择更”活跃”的模型
  • 如果你需要稳定输出:选择更”保守”的模型

提示词工程的进化

早期的 AI Agent 严重依赖精心设计的提示词。但随着模型能力的提升,这种情况正在改变。

从复杂到简单: 过去我们可能需要这样的提示词:

你是一个专业的Python开发者。请严格遵循PEP8规范。
在编写代码时,请考虑以下几点:
1. 代码的可读性
2. 性能优化
3. 错误处理
...(还有20条)

现在,一句简单的”帮我优化这段代码”就能得到不错的结果。

动态提示词策略: 现代 AI Agent 会根据上下文动态调整提示词:

  • 初次对话:使用更详细的背景说明
  • 后续对话:只提供增量信息
  • 错误修正:加入具体的约束条件
  • 创造性任务:减少限制,鼓励探索

混合模型策略

越来越多的 AI Agent 开始采用混合模型策略,在一个任务流程中使用多个模型:

  1. 理解阶段:使用 Claude 3 Opus 深入分析需求
  2. 规划阶段:使用 o1 制定详细的执行计划
  3. 执行阶段:使用 GPT-4 Turbo 快速生成代码
  4. 优化阶段:使用专门的代码模型进行微调

这种方式能够充分发挥每个模型的优势,同时控制成本。

3.3 记忆模块

人做事情需要记住前面发生了什么,AI Agent 也一样。记忆分成几种:

  • 短期记忆:当前对话的上下文
  • 长期记忆:之前的对话历史、学到的知识
  • 工作记忆:执行任务过程中的中间状态

但实现一个好的记忆系统,比想象中要复杂得多。

3.3.1 记忆的层次结构

就像人脑有不同类型的记忆,AI Agent 的记忆系统也需要分层设计:

感知记忆(Sensory Memory)

  • 保存时间:几秒到几分钟
  • 内容:用户刚刚的输入、系统刚刚的输出
  • 用途:处理连续对话中的指代关系

工作记忆(Working Memory)

  • 保存时间:整个任务周期
  • 内容:当前任务的状态、中间结果、待办事项
  • 用途:复杂任务的分步执行

情景记忆(Episodic Memory)

  • 保存时间:数天到数月
  • 内容:完整的对话历史、任务执行记录
  • 用途:理解用户偏好、避免重复错误

语义记忆(Semantic Memory)

  • 保存时间:永久
  • 内容:领域知识、最佳实践、学到的模式
  • 用途:积累经验、提升能力

3.3.2 实现方案-RAG(检索增强生成)

这是目前最成熟的方案。基本思路是:当 AI Agent 需要回答问题时,先去知识库里检索相关信息,然后把这些信息作为上下文提供给大模型。

比如你问:”我们公司的年假政策是什么?”Agent 会先去检索公司的政策文档,找到相关内容,然后基于这些内容生成回答。

RAG 的进化史

第一代 RAG(2020-2022):

  • 简单的向量检索
  • 使用 BERT 或 Sentence-BERT 做编码
  • 召回 Top-K 相关文档
  • 效果一般,经常找不到真正相关的内容

第二代 RAG(2023-2024):

  • 引入混合检索(向量+关键词)
  • 使用更强的编码模型(如 BGE、E5)
  • 加入重排序(Reranking)步骤
  • 开始考虑文档结构和语义分块

第三代 RAG(2024-现在):

  • 多级索引结构(摘要→章节→段落)
  • 查询改写和扩展
  • 动态上下文窗口调整
  • 引入知识图谱增强检索

实践中的 RAG 优化技巧

  1. 智能分块:不要机械地按字数切分,而是按语义单元切分

    • 代码:按函数/类切分
    • 文档:按章节/段落切分
    • 对话:按话轮切分
  2. 多路召回:同时使用多种检索策略

    • 向量相似度检索
    • BM25 关键词检索
    • 实体链接检索
    • 基于图的检索
  3. 上下文工程:检索到的内容需要精心组织

  4. 增量索引:新知识的实时更新

    • 使用流式处理架构
    • 支持热更新索引
    • 版本控制和回滚机制

3.3.3 实现方案-超长上下文

最新的趋势是直接增加模型的上下文长度。比如 Claude 3 已经支持 200K token 的上下文,Gemini 1.5 Pro 甚至支持 200 万 token。

长上下文的真实挑战

虽然模型号称支持超长上下文,但实际使用中会遇到很多问题:

  1. 「迷失在中间」现象:模型对上下文开头和结尾的内容记忆较好,但中间部分容易遗忘

  2. 注意力稀释:上下文越长,模型对每个部分的注意力就越分散

  3. 推理退化:在超长上下文中,模型的推理能力会显著下降

混合方案:长上下文 + 选择性注意

3.3.4 主动遗忘

这是一个反直觉但很重要的概念:不是记住越多越好,而是要学会遗忘。

为什么需要遗忘?

  1. 降噪:不是所有信息都值得记住
  2. 隐私:某些敏感信息需要及时删除
  3. 效率:保持记忆系统的高效运转
  4. 相关性:过时的信息可能产生负面影响

遗忘策略

  1. 基于时间的遗忘

    • 会话结束后 24 小时删除临时信息
    • 30 天后归档低频访问的记忆
    • 90 天后删除无用的错误记录
  2. 基于重要性的遗忘

    • 使用 LRU(最近最少使用)策略
    • 基于访问频率的动态评分
    • 保留高价值的”关键时刻”
  3. 基于相关性的遗忘

    • 当新信息与旧信息冲突时,更新而非累加
    • 合并相似的记忆,避免冗余
    • 定期整理和压缩记忆库

3.4 行动模块

这是 Agent 的「手脚」,让它能够真正做事情。

行动模块的核心是 Function Calling(函数调用),这是目前最主流的方式。

简单来说,就是预先定义好一系列函数,比如搜索网页、查询数据库、发送邮件等,然后告诉大模型这些函数的作用和参数。

当用户提出需求时,模型会判断需要调用哪个函数,提取相应的参数,执行函数并获取结果。这个过程已经从最初的单次调用,进化到现在可以进行多步骤调用、并行执行、错误重试等复杂操作。

Anthropic 推出的 MCP(Model Context Protocol)协议,试图建立行动模块的统一标准。

MCP 采用服务器-客户端架构,工具提供方作为服务器,AI 应用作为客户端,通过标准化的协议进行通信。这种设计的好处是解耦和复用:AI 应用不需要知道工具的具体实现细节,一个 MCP 服务器可以同时服务多个 AI 应用。更重要的是,MCP 提供了统一的安全管理和权限控制机制,让行动模块的集成变得更加简单和安全。

安全性是行动模块最关键的考虑因素。

在 Manus 刚上线的时候就爆出一个问题,有人用提示词,让 AI Agent 打包了当前执行的环境的所有代码。

给 AI 执行能力就像给孩子一把剪刀,必须设置严格的安全边界。现代 Agent 通常采用多层防护:首先是沙箱环境,所有代码执行都在隔离的容器中进行,限制内存、CPU、网络访问;其次是权限管理,基于用户角色和具体场景动态分配权限;最后是审计日志,记录所有行动的执行情况,便于追溯和分析。这些措施确保 Agent 在帮助用户的同时,不会造成安全风险。

复杂任务往往需要多个行动的协调配合,这就需要工作流引擎来编排。比如”帮我分析竞品并生成报告”这个任务,可能需要先搜索竞品信息,然后提取关键数据,接着进行对比分析,最后生成可视化报告。工作流引擎负责管理这些步骤的执行顺序、处理步骤间的数据传递、应对执行失败等情况。高级的引擎还支持条件分支、循环执行、并行处理等复杂逻辑,让 Agent 能够处理更加复杂的任务。

行动模块的未来发展方向是更强的自主性。目前的 Agent 主要执行预定义的动作,但未来可能会具备动作发现和学习能力,能够自动发现新的 API、学习新的操作模式、甚至创造性地组合已有动作来完成新任务。另一个重要方向是与物理世界的交互,通过机器人或 IoT 设备执行物理动作。随着这些能力的提升,AI Agent 将真正从「会说」进化到「会做」,成为人类在数字世界和物理世界中的得力助手。

4. 当前的局限性

AI 有其局限性,了解这些局限性,对于合理使用和未来改进都很重要。

4.1 幻觉问题

这是所有基于大模型的 AI Agent 都面临的核心挑战。

Agent 可能会编造不存在的 API、虚构执行结果、或者对自己的能力过度自信。比如,当你要求 Agent 查询某个数据库时,它可能会返回看起来合理但实际上完全虚构的数据。

这种幻觉在连续多步骤的任务中会被放大,一个小错误可能导致整个任务链的崩溃。

更危险的是,这些幻觉往往很难被发现,因为它们在表面上看起来完全合理。虽然通过 RAG、工具调用验证等方法可以部分缓解,但彻底解决仍然是个开放性难题。

4.2 可靠性不足

AI Agent 的表现稳定性仍然是个大问题。

同样的任务,在不同时间执行可能得到不同的结果。

这种不确定性来源于多个方面:模型本身的随机性、上下文理解的偏差、外部环境的变化等。

在一些对可靠性要求高的场景,比如金融交易、医疗诊断、工业控制等,目前的 AI Agent 还远远达不到要求。

即使加入了重试机制、结果验证等保障措施,也只能提高而非保证可靠性。这导致在关键业务场景中,AI Agent 更多是作为辅助而非主导。

4.3 成本与效率

运行一个功能完善的 AI Agent 系统成本不菲。

首先是模型调用成本,特别是使用 GPT-4、Claude 等顶级模型时,每次交互都要花费不少钱。复杂任务可能需要多次模型调用,成本会快速累加。

其次是延迟问题,每次函数调用、每次推理都需要时间,一个看似简单的任务可能需要等待数十秒甚至几分钟。对于需要实时响应的场景,当前的 AI Agent 往往力不从心。

虽然可以通过模型蒸馏、缓存优化等手段降低成本,但在性能和成本之间找到平衡点仍然很困难。

4.4 安全与隐私挑战

AI Agent 需要访问大量数据和系统才能发挥作用,这带来了严重的安全隐私问题。

首先是数据泄露风险,Agent 可能无意中将敏感信息包含在给大模型的请求中,而这些数据可能被用于模型训练。

其次是提示注入攻击,恶意用户可能通过精心构造的输入操控 Agent 执行非预期的操作。

还有权限滥用问题,一个被赋予过多权限的 Agent 可能造成严重损害。

虽然业界正在开发各种防护措施,如差分隐私、安全沙箱、细粒度权限控制等,但攻防对抗仍在继续。

4.5 理解与推理的局限

虽然大模型展现出了惊人的能力,但 AI Agent 在深层理解和复杂推理方面仍有明显不足。它们往往只能处理相对直接的任务,面对需要长链条推理、创造性思维或深层次理解的问题时就会暴露短板。

比如,Agent 可能很擅长执行”帮我订一张机票”这样的任务,但如果要求”帮我规划一个考虑预算、时间、个人兴趣的完整旅行方案”,效果就会大打折扣。

此外,Agent 缺乏真正的常识推理能力,可能会提出一些违背基本常识的方案。即使是最新的 o1 模型,虽然推理能力有所提升,但距离人类水平的推理能力还有很大差距。

5. 写在最后

AI Agent 的发展才刚刚开始。虽然现在的技术还不完美,但进步的速度是惊人的。两年前,我们还在惊叹 ChatGPT 能够进行对话;现在,AI Agent 已经能够帮我们写代码、分析数据、制定计划了。

对于技术人员来说,现在是最好的时代。我们有机会参与到这场变革中,创造出真正有用的 AI Agent。但同时,我们也要保持清醒:AI Agent 是工具,不是魔法。它能够提高效率,但不能替代人类的创造力和判断力。

未来的世界,可能每个人都会有自己的 AI Agent 团队。就像现在每个人都有智能手机一样自然。

而现在,正是这个未来的开端。

以上。

海量「免费」的 OPENAI KEY,你敢用吗?

技术群在传一张 X 上发的一个截图,是这样的:

过去:如果你没有 windows 激活码,怎么办?去网上搜一个

现在:如果你没有 OPENAIAPIKEY,怎么办,答案仍然是去 Github 上搜一搜

(警告,不推荐这种行为,发帖的目的是告诉大家不要把环境变量扔到repo里,否则等着被用炸吧….)

我自己去搜了一下,多加了点匹配,如图:

在 GitHub 上搜索 “OPENAI KEY=sk-”,你能找到超过 2.5K 的代码记录。是的,是 2500+ 条。

如果有人拿到这些 KEY 去使用了,刚好有 KEY 可以使用,那对于 KEY 的主人来说,无疑是一个巨坑,一天可能超多的钱就没有了,有个好消息是 OpenAI 有消费上限保护。

这些 KEY 里,有多少是真正可用的?又有多少是已经被销毁的?更重要的是,你真的敢用吗?

为什么会发生这种事?

说到底,这是一个老生常谈却又屡禁不止的问题。

我们喜欢一切能让工作变得简单的方法。把 API KEY 直接写在代码里,确实很方便:

  • 不用每次都去环境变量里配置
  • 团队成员 clone 下来就能跑
  • 部署的时候也省事儿

但是,代价往往是昂贵的。

更深一些的原因是,很多开发者对安全的认知还停留在「我的仓库是私有的」或者「谁会那么无聊来翻我的代码」这种侥幸心理上。殊不知,GitHub 上有大量的自动化机器人,24 小时不间断地扫描新提交的代码,专门寻找各种敏感信息。

另外一个是认知偏差:

  • **临时变永久:「**先这样写,回头再改」——程序员最大的谎言之一。临时方案有一种神奇的特性,就是会变成永久方案。今天的 quick fix,明天就是 production code。
  • **版本控制的特性理解不足:**很多新手不知道,Git 会永久记录所有历史。即使你删除了包含密钥的文件,它依然存在于 Git 历史中。除非你重写整个历史(force push),否则密钥会一直在那里。
  • **公开的定义理解有误:**有人以为”不宣传就等于不公开”。但在互联网上,只要能被访问到,就等于向全世界公开。你不说,不代表爬虫不知道。

不只是 API KEY

在这个图的下面,有大佬回复了,曾经翻墙的代理也在这里找到过。扩展开来,用同样的方法,你能在 GitHub 上找到:

  • 数据库的账号密码
  • 服务器的 SSH 密钥
  • 各种云服务的 Access Key
  • 邮箱的 SMTP 配置
  • 支付接口的密钥
  • 甚至是公司内网的 VPN 账号

这就像是把家里的钥匙随手扔在大街上,还在上面贴了张纸条写着你家地址。

那些血淋淋的教训

说几个真实的案例,都是业内的血泪史。

案例一:Uber 的 5700 万用户数据泄露

2016 年,Uber 因为工程师将 AWS 密钥上传到 GitHub,导致黑客获取了 5700 万用户的个人信息。最后 Uber 不得不支付 10 万美元的”封口费”,试图掩盖这次事故。结果呢?不仅钱白花了,后来还是被曝光,额外付出了巨额罚款。

案例二:2025年 xAI(马斯克旗下AI公司)API 密钥泄露

xAI 开发者在公开 GitHub 仓库提交了包含 私有 API 密钥 的配置文件(.env),该密钥可访问 SpaceX、特斯拉及 Twitter/X 的定制化大语言模型(LLM)

。泄露内容包括:

  • 未发布的 Grok-2.5V 等核心模型开发版本;
  • 至少 60 个私有数据集,涉及内部运营数据。

影响

  • 密钥持续暴露 近两个月(2025年3月2日–4月30日),期间未被及时停用;
  • 攻击者可能窃取未发布模型、滥用内部基础设施或发起供应链攻击;
  • xAI 被迫删除涉事仓库,但未公开回应事件细节。

案例三:加密货币被盗空

这个更刺激。Web3 流媒体应用 Unlonely 的联合创始人 Brian Guan 错误的在 GitHub 上公开了一个包含其钱包私钥的存储库,导致该钱包在 2 分钟内即被盗空,损失了 4 万美元

那么,如何规避呢?

好了,聊完曾经的坑,咱们来说点实际的——怎么避免这种悲剧发生在自己身上。

1. 意识层面

首先得明白一个道理:任何敏感信息都不应该出现在代码里

这就像你不会把银行卡密码写在卡背面一样。哪怕是测试环境的密钥,也不应该直接写在代码里。因为你永远不知道什么时候会手滑把代码推到公开仓库。

2. 上点技术手段

使用环境变量

这是最基本的做法。把所有的敏感配置都放到环境变量里:

python

体验AI代码助手
代码解读
复制代码
import os
openai_key = os.getenv('OPENAI_API_KEY')

使用配置文件 + .gitignore

创建一个 config.example.json,里面是配置模板:

json

体验AI代码助手
代码解读
复制代码
{
  "openai_key": "your-key-here",
  "database_url": "your-database-url"
}

实际使用的 config.json 加入 .gitignore,这样就不会被提交到仓库。

使用密钥管理服务

对于正式的项目,建议使用专门的密钥管理服务:

  • AWS Secrets Manager
  • Azure Key Vault
  • HashiCorp Vault
  • 或者自建的密钥管理系统
  • 或者使用配置管理系统

3. 流程和工具保障

Git Hooks

.git/hooks/pre-commit 里添加检查脚本,自动扫描即将提交的代码中是否包含敏感信息。市面上有很多现成的工具,比如 git-secrets。

代码审查

建立 Code Review 机制,特别关注配置相关的改动。人工审查虽然可能遗漏,但多一道关卡总是好的。

定期扫描

使用工具定期扫描你的代码仓库:

  • TruffleHog:可以扫描整个 git 历史
  • GitGuardian:提供实时监控
  • GitHub 自带的 Secret Scanning

4. 应急响应机制

即使做了万全准备,意外还是可能发生。所以你需要:

快速撤销机制

  • 知道如何快速撤销泄露的密钥
  • 准备好备用密钥,可以快速切换

监控告警

  • 设置异常使用告警
  • 关注账单变化

定期轮换

  • 即使没有泄露,也要定期更换密钥
  • 就像定期换密码一样

本质是什么问题?

说了这么多,我们来思考一个更深层的问题:为什么这种低级错误会一再发生?

我觉得本质上是便利性与安全性的永恒矛盾

作为开发者,我们总是在寻找更高效的工作方式。把密钥写在代码里确实方便,但这种方便是以安全为代价的。这就像是为了省事不锁门,虽然进出方便了,但家里的东西也不安全了。

另一个层面是安全意识的缺失。很多开发者,特别是刚入行的新人,对安全问题的严重性认识不足。他们可能觉得「我就是个小透明,谁会盯上我」,但实际上,自动化的扫描工具可不管你是谁。

还有就是团队管理的问题。很多团队没有建立起完善的安全规范和流程,全凭开发者的自觉。这就像是期望每个人都自觉遵守交通规则,没有红绿灯和交警,结果可想而知。

写在最后

回到开头的问题——「海量免费的 OpenAI KEY,你敢用吗?」

我的答案是:还是不用的好。

这些所谓的「免费」密钥,背后可能是某个开发者的血汗钱,是某个创业公司的生死存亡。使用这些泄露的密钥,不仅是不道德的,更可能让我们卷入法律纠纷。

更重要的是,如果我们真的在做正经项目,这些来路不明的密钥随时可能失效,会让我们的服务变得极不稳定。与其贪这点小便宜,不如老老实实申请自己的密钥,至少睡得安稳。

最后想说的是,安全无小事。今天你可能觉得泄露个 API KEY 没什么大不了,明天可能就是整个数据库被端了。在这个数据就是金钱的时代,保护好自己的数字资产,就是保护好自己的钱包。

别让你的代码仓库成为黑客的 ATM 机。

记住:GitHub 不是你的密码本,代码仓库不是保险箱

如果这篇文章让你想起了什么,赶紧去检查一下你的代码仓库吧。说不定,你的密钥正在某个角落里呆着呢。

以上。

作者:潘锦
链接:https://juejin.cn/post/7523134315641045043
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为什么90%的空降技术管理者都在做同一件事?

最近和几个做技术管理的朋友小聚,聊到曾经各自入职后的第一个月在干什么,答案出奇的一致。

「盘家底。」

「梳理资产。」

「摸排现状。」

说法不同,但干的都是同一件事——技术资产盘点。

这些朋友有从大厂跳到创业公司的,有从创业公司到大厂的,有接手十几人团队的,也有管上百号人的。按理说,不同规模、不同阶段的公司,管理重点应该不一样吧?

但为什么大家不约而同都在做技术资产盘点?

这事儿其实跟公司大小没关系,跟一个更本质的东西有关——手感。

什么是手感

做技术管理,手感是个很玄妙的东西。

举个例子: 团队和你汇报一个系统改造方案,说要花 3 个月,投入 10 个人。你如果此时心里犯嘀咕:这个时间是长还是短?人力是多还是少?如果你没有手感,你大概率会说:”方案不错,但能不能再优化一下时间?”

如果团队回复:”已经是最优方案了。”

然后呢?然后就只能批准了。或者再想其它办法来核实,但心里始终不踏实或者耗费时间。

这就是没有手感的典型表现。

手感是什么?是一种基于深度理解的直觉判断力。

有手感的状态大概这样的:

  • 听到「数据库 CPU 占用 80%」,马上能判断是 SQL 问题还是数据量问题
  • 看到「服务器 500 台」,立刻知道是不是合理规模
  • 团队说「这个需求要一个月」,心里有数是真需要还是在放水
  • 出现故障时,能快速圈定问题范围,而不是干着急

而没有手感的管理者呢?就像在迷雾中开车,处处都是未知,步步都要小心。

有手感的管理者,心里有地图,走到哪里都知道车怎么开。

当一个技术团队的管理者没有手感,你的每一个决策都依赖下属的汇报,而你提不出实质性的意见,这样,你的管理权威就会一点点流失,团队也就不好带了。

这也就是为什么空降管理者都急着做技术资产盘点——不是为了显得自己在做事,而是真的需要通过这个过程快速建立手感

没有手感,你就不是在管理,而是在被管理

手感从哪里来

手感不是天上掉下来的,也不是靠看几本书、听几次汇报就能有的。

我曾经见过太多空降管理者犯同一个错误:急于证明自己。

刚到一个新环境,看到这也不合理,那也不规范,马上就想大刀阔斧地改革。结果呢?不是改革受阻,就是改出更大的问题。

为什么会这样?因为我们所看到的「不合理」可能是合理的。

听说过一个案例。一个朋友刚接手一个团队时,发现新团队的部署流程特别繁琐,一个简单的上线要过五六道关卡。他当时就想,这也太低效了,必须优化。

还好当时忍住了,先做了技术资产盘点。这一盘点才发现,这个「繁琐」的流程背后是血的教训——两年前因为上线流程太简单,出过一次重大故障,损失上千万。从那之后,团队宁可效率低一点,也要确保稳定性。

如果当时贸然「优化」,很可能会重蹈覆梯,当然,也可能不会,至少不要那么急着做事,先缓一缓,看清局势。

手感这个东西,来自于对系统的深度理解。而这种理解,对于一个新接手的管理者来说,可以通过技术资产盘点一点点建立起来。

技术资产盘点就像考古,我们得一层层挖掘:

  • 这个服务为什么会存在?解决什么问题?
  • 这个架构为什么这么设计?有什么历史原因?
  • 这个配置为什么是这个值?踩过什么坑?
  • 这些技术债是怎么欠下的?为什么一直没还?

每个不合理的背后,都可能有一个合理的故事。每个奇怪的设计,都可能是特定时期的最优解。

只有当我们了解了这些前因后果,才能真正理解这个系统,才能培养出那种「一眼就能看出问题」的手感。

这就是为什么技术资产盘点如此重要——它不仅仅是在清点家底,更是在建立我们对整个技术体系的认知地图。有了这张地图,我们才知道哪里能动,哪里不能动;哪里需要改进,哪里需要保持。

手感,就是这样一点一点积累起来的。

掌控感是管理的基础

做管理,最重要的是什么?是掌控感。

什么是掌控?不是说我们要事事插手,而是当出现问题时,能快速定位;当需要决策时,有充分的信息;当团队需要支持时,知道资源在哪里。

没有掌控感的管理者是什么样的?

  • 技术评审时,只能听团队汇报,提不出实质性意见
  • 出现故障时,只能在旁边干着急,帮不上忙
  • 做预算时,不知道哪些该花哪些不该花
  • 定目标时,不知道什么是合理的预期

这样的管理者,很难获得团队的信任和尊重。

而手感,正是掌控感的基础。

有了手感,才能在关键时刻做出正确判断。有了手感,管理才不是空中楼阁,而是脚踏实地。

这就回到了我们的核心问题:为什么空降管理者都要做技术资产盘点?

因为这是建立手感的最快途径,是获得掌控感的必经之路。我们可以慢慢熟悉团队,慢慢了解业务,但技术资产是实实在在摆在那里的,是可以快速盘点和掌握的。

当我们知道每一分钱花在哪里,每一个系统如何运转,每一个瓶颈在什么地方,我们就有了管理的抓手,有了改进的方向,有了说话的底气。

这,才是技术资产盘点的真正价值。

技术资产到底包括什么

很多人以为技术资产就是服务器、数据库这些硬件资源。其实远不止于此。

我把技术资产分为几个层次:

入口层:掌控用户的入口

域名是最容易被忽视的资产。

以今年 6 月初的阿里核心域名 aliyuncs.com 故障为例:6 月 6 日凌晨,阿里云核心域名 aliyuncs.com 遭遇罕见的域名劫持事件,导致其对象存储服务(OSS)、内容分发网络(CDN)以及云解析 DNS 等多项核心云服务出现大范围故障,波及众多依赖阿里云服务的网站和应用。

除此之外,各企业网站、学校网站等等都出现过域名导致的线上故障。

还有 SSL 证书,很多公司的证书管理一团糟,快过期了才想起来续,结果用户访问时浏览器报警,体验极差。

为什么要盘点入口?因为这是用户接触我们的第一步。域名解析慢了,用户可能就走了;证书有问题,用户可能就不信任了。这些看似小事,实则关乎生死。

接入层:了解流量的来龙去脉

负载均衡怎么配的?有没有做 DDoS 防护?WAF 有没有?规则合不合理?

我在上一家公司,一个月 CDN 账单接近百万,我在做技术成本优化的时候发现,是其接入策略有问题,使用的是 OSS 的流量计费,并且当月受到一些图床攻击。这种浪费,比比皆是。不盘不知道,一盘吓一跳。

还有一些业务上线了,基本的安全策略都没有,直接服务器裸奔在线上,最终被黑客侵入,变成「肉鸡」或矿机。

计算层:服务器不只是数量

“我们有 500 台服务器”——这个信息对管理者来说几乎没有价值。

真正有价值的是:

  • 这些服务器的利用率如何?
  • 是否存在资源闲置?
  • 扩缩容策略是否合理?
  • 有没有僵尸服务器在白白烧钱?

我曾经做技术资产盘点发现 30% 的服务器 CPU 利用率不到 10%。为什么?因为之前为了应对突发流量,扩容后就没缩回去。这一项优化,一年就省了上百万。多说一句,大家还真都是草台班子。

中间件层:那些看不见的成本大户

消息队列、搜索引擎、大数据组件……这些中间件往往是成本大户。

比如消息队列,很多团队的使用方式是「能用队列的地方都用队列」,结果消息堆积严重,不仅成本高,还影响性能。盘点时你会发现,有些场景用简单的异步调用就够了,根本不需要引入消息队列。

甚至,连异步调用都不需要,同步调用就能解决问题,当时只是为了考虑扩展性,才做的甚至队列的最终一致性。然而业务一直用不上。

再比如搜索,Elasticsearch 集群动不动就是几十个节点,但真的需要这么多吗?数据的冷热分离做了吗?索引优化了吗?

存储层:数据是核心资产

数据库的盘点要细到什么程度?要细到表、甚至字段级别。

为什么?因为:

  • 得知道核心数据在哪里
  • 得了解数据的流转路径
  • 得评估存储成本是否合理
  • 得发现那些该清理的垃圾数据

曾做过一次数据库盘点,发现数据库中有超过 20 个 copy 表,还有几个超大的日志表,占数据库 80% 的空间,而这些表根本没有人在用,只是当时备份一下。

盘点存储,本质上是在梳理数据链路。

当我们能在脑海中清晰地描绘出「用户在界面上的一个操作,数据是如何流转并最终存储的」,我们才算真正理解了这个系统。

代码资产:不只是代码仓库

代码资产包括:

  • 有多少代码仓库?活跃度如何?
  • 技术栈是否统一?有没有历史包袱?
  • 代码质量如何?技术债务有多少?
  • 文档完善吗?新人能快速上手吗?

很多团队的代码仓库就像仓库一样,堆满了各种「以后可能用得上」的东西。结果就是,真正在维护的可能只有一半,另一半都是历史遗留。

流程资产:效率的关键

CI/CD 流程顺畅吗?从代码提交到上线要多久?

我接手过一个团队,上线一个小改动要两天。为什么?因为 CI/CD 流程设计得太「完美」了,各种检查、各种审批,结果效率极低。

盘点流程,我们会发现很多「以前合理现在不合理」的设计。比如,创业初期为了快速迭代,可能没有代码审查;规模大了之后,可能审查流程又过于繁琐。

在制品管理:别让半成品成为负担

什么是在制品?就是那些做了一半的项目、POC 了但没上线的系统、试验性的功能……

这些在制品是隐形的成本黑洞:

  • 占用服务器资源
  • 消耗维护精力
  • 增加系统复杂度
  • 埋下安全隐患

盘点时会惊讶地发现,可能有 30% 的资源被这些”半成品”占用着。

制品管理:那些容易被遗忘的二进制资产

什么是制品?简单说,就是我们的代码编译打包后生成的那些可执行文件——jar 包、docker 镜像、npm 包等等。这些东西看起来不起眼,但管理不当会成为大麻烦。

我见过最混乱的场景是什么样的?一个团队,所有的jar包都扔在一个共享文件夹里,文件名是这样的:

  • app-1.0.jar
  • app-1.0-final.jar
  • app-1.0-final-final.jar
  • app-1.0-final-真的final.jar

你猜哪个是生产环境在用的?没人知道。

为什么要盘点制品?因为制品管理的混乱会带来一连串问题:

版本追踪的噩梦:出了问题要回滚,找不到上个版本的包在哪。或者找到了,不确定是不是真的上个版本。

存储成本失控:没有清理机制,历史版本堆积如山。我见过一个团队,三年积累了2TB的jar包,其中90%是没用的历史版本。

安全隐患重重:制品里可能包含敏感配置、硬编码的密码。如果管理不当,这些信息很容易泄露。

部署效率低下:每次部署都要到处找包,或者重新编译。本来 10 分钟能完成的部署,硬是搞成了 1 小时。

盘点制品资产时,我们需要搞清楚:

  • 制品存在哪里?是 FTP、还是专业的制品仓库?
  • 版本管理策略是什么?保留多少个历史版本?
  • 制品的构建和发布流程是否标准化?
  • 有没有制品安全扫描?
  • 制品的访问权限管理是否合理?

建立规范的制品管理体系,看似是个小事,但对提升研发效率、保障系统安全都有重要作用。这也是为什么现代化的研发团队都会使用专业的制品仓库,而不是简单粗暴地用文件夹管理。

盘点的过程就是发现问题的过程

技术资产盘点最大的价值,不是得到一份资产清单,而是在这个过程中发现的问题。这些问题,往往就是我们这些空降的技术管理者的破局点。

比如:

  • 为什么同样的功能,A 团队用 10 台服务器,B 团队要用 50 台?
  • 为什么数据库连接数经常爆满,但 QPS 并不高?
  • 为什么 CDN 流量忽高忽低,找不到规律?
  • 为什么某个服务的日志特别多,一天就是几个 T?

这些问题的答案,可能是架构不合理,可能是代码有 bug,可能是产品设计有问题,也可能只是配置错误。但不管是什么原因,都是改进的机会。

如何做好技术资产盘点

说了这么多为什么,该说说怎么做了。

1. 不要贪大求全

很多人一上来就想把所有东西都盘点清楚,结果战线拉得太长,什么都没做好。

正确的做法是:先盘点最重要的,最花钱的,最容易出问题的。比如先看数据库和服务器,这通常占技术成本的大头。如果是内容业务,还有存储,如果是 AI 业务。还有算力或者外部大模型 API 等等。

2. 不要只看数字

“我们有 100 个 API”——这是数字 “我们有 100 个API,其中 30 个是僵尸接口,20 个性能有问题,10 个存在安全隐患”——这是洞察

盘点不是为了得到一个数字,而是为了理解现状,发现问题。

3. 要深入但不要钻牛角尖

盘点数据库要不要细到每个字段?大部分情况下不需要。但核心业务的核心表,我们必须了如指掌。

把握好粒度,既要有全局视角,又要有局部洞察。

4. 借助工具但不依赖工具

市面上有很多资产管理工具,可以自动发现服务器、统计资源使用率等。这些工具很有用,但不要完全依赖它们。

真正的理解来自于和团队的深入交流,来自于对业务的理解,来自于对历史的了解。工具只能告诉我们「是什么」,但只有人才能告诉你「为什么」。

5. 让团队参与进来

技术资产盘点不是管理者一个人的事。让团队参与进来,既能获得更准确的信息,又能让大家都有「当家」的感觉。

可以让每个小组负责盘点自己的模块,然后一起 review。这个过程中,我们会发现很多有意思的事情,比如 A 组和 B 组对同一个服务的理解完全不同。

盘点之后呢

完成技术资产盘点只是开始。真正的价值在于基于盘点结果的行动。

建立资产台账

别让盘点结果躺在Excel里吃灰。建立一个活的资产台账,定期更新,让它成为团队的知识库。

新人入职,先看资产台账;技术决策,先查资产台账;故障排查,资产台账能帮大忙。

制定优化计划

基于盘点发现的问题,制定优化计划。哪些是quick win,可以马上做?哪些需要长期规划?哪些需要跨团队协作?

记住,罗马不是一天建成的,技术债也不是一天能还清的。有节奏地推进,比急于求成更重要。

建立监控体系

光盘点不够,还要建立监控体系。资源使用率、成本趋势、性能指标……这些都要持续监控。

很多问题都是慢慢积累的。如果没有监控,等我们发现时可能已经很严重了。

形成资产管理文化

最高境界是形成资产管理的文化。让每个人都有成本意识,都知道自己用的资源值多少钱,都会主动优化。

这需要时间,需要机制,更需要管理者的坚持。

最后

技术管理空降,最难的不是推新技术、搞创新,而是先把现有的东西搞清楚。这就像医生看病,不把脉、不验血,上来就开药,那是江湖郎中。

技术资产盘点,就是给技术体系做一次全面体检。只有知道了哪里健康、哪里有病,才能对症下药。

这个过程可能很枯燥,可能会发现很多历史遗留问题让人头疼,但这是建立手感、获得掌控、赢得信任的必经之路。

记住,管理的本质是通过他人完成工作。而要想通过他人完成工作,我们首先得知道工作是什么、资源在哪里、问题在哪里。

技术资产盘点,就是回答这些问题的第一步。

不要急着证明自己,先把家底摸清楚。当我们真正理解了这个技术体系,知道了每一分钱花在哪里、每一个系统为什么存在、每一个问题因何而生,我们的管理才能真正落地。

毕竟,空降兵最重要的不是会打仗,而是先活下来。而活下来的第一步,就是搞清楚自己降落在哪里。