从 0 开发一个 agent(1)
agent 发展到现在,已经有很多成熟的方案了,但是为了更高的设计一致性和项目掌握度,需要从 0-1 设计一套。期间会借鉴参考很多开源项目。项目全程遵循 KISS 原则。 概念和技术栈选择 查了一下 agent 的概念其实比较久远,很早以前的经典理论我们不提,本文只针对目前的 生成式 AI 所代表的 agent。 对于 agent 的执行机制,你可能听说过 ReAct (reasoning and acting)ReAct 来自 2022 年论文《ReAct: Synergizing Reasoning and Acting in Language Models》1,概念如下 可以说这是 agent 最基本和常见的执行框架,属于评估优化式的架构,也就是通过迭代反馈不断改进输出来逼近目标。 而在两年前还有一些 workflow 产品比如扣子、dify 等,也常被误称为 agent/智能体。但其实他们还是链式处理任务的工作流为主。 我定义智能体的一个核心边界就是他能自己决定使用什么工具以及怎么使用。 截止到开始本项目之前,市面上已经有了很多类似产品,各有特色,但是最底层的原理还是一样的。现在需要在一些业务场景用到或者开发一个平台来提供 agent 服务,所以需要从自构建开始保证设计的一致性和对系统的了解性。 在技术栈的选择上,选择全力投入 python,如果熟悉 python 语法,借助 python 的生态。开发agent 的 MVP 将降低很多心智负担,但是显而易见的缺点是对底层控制降低(比如一些隐形的 runtime error 和性能消耗),但是个人判断,结合我的技术栈掌握和现处公司项目的情况,我决定第一个发行版本将全量使用 python 构建,后续选择使用 Rust 语言作为 热点模块 的替换直至开发团队掌握 rust 技术栈后进行全量重构。(如果这个项目胎死腹中也无需谈什么未来。) 架构设计 基于 ReAct 架构设计的基础思路 还是比较容易的,这里参考王二老师的文章,列一些功能和设计思路。2 ...
豆包输入法你能不能只负责语音
最近豆包输入法的语音输入很火。 我是在开放后下载下来用了一下,确实很好用,对比之前用的 type less 对我而言有点修饰过头,微信输入法整体效果还行但是略逊于豆包。我设置的快捷键是 Command + Option ,按住说话,松开就上屏,体验很顺。 但是我现在主力打字输入法还是微信输入法。 原因也很简单,它有多端剪切板同步。 虽然这个同步率我感觉也就 90% 左右吧,不是每次都稳,但是有总比没有强。用久了之后就有点回不去了。手机上复制点什么,电脑这边能接着用,虽然偶尔抽风,但是整体还是方便的。 所以问题就来了。 我不想把主力输入法换成豆包输入法,但是我又想用豆包的语音输入。我想偷个懒。 我想到我的流程是,平时打字继续用微信输入法,需要语音的时候,按住 Command + Option 临时切到豆包语音,松开之后再回微信输入法。 那么理论可以全自动做这件事情。我把这个需求丢给了 macbook 上跑着的 Hermes,我坚信它以及它背后的 GPT-5.5 能做到。 最终思路 最后 Hermes 先搓了一个后台 agent,后来又把它收成了一个顶栏 mini app: 1 doubao-voice-wetype-agent 它干的事情不是破解豆包,也不是改输入法,而是在中间当一个代理。 更准确地说,它现在像一个很小的插件,常驻在 macOS 顶栏,没有 Dock 图标。平时显示 豆 OK,权限或者监听有问题的时候显示 豆 !,按住语音的时候会变成 豆 REC。 这个小状态栏后来证明很重要。 因为这种系统级快捷键代理如果没有可视状态,真的太黑盒了。你不知道是权限没拿到,还是 event tap 被系统关了,还是输入法切过去了但豆包没接住。现在点开顶栏菜单,至少能看到权限、当前输入法、最近一次事件和监听状态。 大概流程是这样: [text] 显示已折叠代码(33 行) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 当前输入法是微信输入法 | | 按下 Command + Option v agent 捕获到这个组合键 | v 检查当前输入法不是豆包 | v 切换到豆包输入法 | v 重新发送一组干净的 Command + Option keyDown | v 豆包开始语音输入 | | 我继续按住,说话 v 松开 Command + Option | v agent 捕获释放事件 | v 重新发送 Command + Option keyUp | v 豆包结束语音输入 | v 切回微信输入法 一句话就是: ...
顶级临阵磨枪(软考高级系统架构-1)
计算机操作系统 常见指令集有 CISC 和 RISC。 CISC 指令复杂、数量多,比如 x86 架构; RISC 指令简单、执行快,像 ARM、MIPS、RISC-V。 CPU 类型按指令集分, 有 x86 系列,常用于 PC 和服务器; ARM 系列,多用在手机、嵌入式设备;还有 RISC-V 这种开源指令集的 CPU 除了 CPU,常见的处理器还有 GPU,擅长并行计算,主要用于图形渲染和 AI 训练;DSP,专为数字信号处理设计,像音频、图像处理设备常用;FPGA,可编程逻辑器件,可根据需求定制硬件逻辑,适合实时性高的场景;还有 TPU,是谷歌专为深度学习优化的处理器 嵌入式操作系统 嵌入式操作系统特点是微型化、可定制、可靠性和一植移植性,常采用硬件抽象层Hardware Abstraction Layer,HAL和板级支撑包BSP 嵌入式操作系统应具备实时性、可裁剪性和安全性等特征。 基本开发工具是交叉编译器、交叉链接器和源代码调试器 计算机网络 局域网有总线型、星型、树型、环型、网状五种拓扑结构 WLAN拓扑结构有点对点型、Hub型和完全分布型。 完全分布型则处于理论探讨阶段无具体应用 广域网由通信子网与资源子网组成。广域网可以分为公共传输网络、专用传输网、络和无线传输网络3类。 主要有同步光纤网络(SONET)、同步数字体系(SDH)、数字数据网(DDN)、帧中继(FR)和异步传输技术(ATM) 。 以太网规定最小帧长为64字节,最大帧长为1518字节。设置最小帧长是为了避免冲突,最小帧长是根据网络中检测冲突的最长时间来定的。 信息系统基础 信息系统的功能有:输入、存储、处理、输出和控制 信息系统的生命周期分为产生、开发、运行和消亡4个阶段。 企业的所有资源包括三大流:物流、资金流和信息流。 信息安全技术基础 信息安全的基本要素有机密性、完整性、可用性、可控性与可审查性。 范围包括设备安全、数据安全、内容安全和行为安全。 DES 56位密钥长度,三重DES 112位是因为他用了两个密钥 K1加密 K2解密 K1加密 系统工程基础知识 MIPS=指令条数/(执行时间×10^-6) 软件工程基础知识 碎碎念 看到这里已经困的不行了,明天早上七点起来路上复习后去考试 案例分析第一题连考四次质量属性,所以押他还考,这里需要特别准备,然后准备一个主流技术,如果是微服务 / 云原生、缓存 / 数据库、新兴技术,新兴技术大概率是AI,其实都在我的打击范围,只是深度都不够,明天早上起来接着看案例 历年论文四题范围 我直接押题今年会有大模型应用,直接撞在我这两年最熟悉的领域,所以我将把复习重点放在案例分析可能会出现的概念上,好好准备一下 ...
GitHub Actions 编译 + Cloudflare Pages 部署踩坑全记录
我的主域名空着很久了,很久以前有一个非常简易的 home page,但是有了 AI 之后看来看去,太繁杂的又不喜欢,让我自己写又嫌烦,昨天终于狠下心让 codex 开始干活,然后部署流程记录一下。 这是个 Vite + React 的静态主页,本地跑没问题,想丢到线上去。之前一直用 Cloudflare Pages 直接连 GitHub 仓库自动部署,但这次想换个方式——用 GitHub Actions 编译,然后通过 Wrangler 做 Direct Upload 部署到 Cloudflare Pages。 思路比较简单,但是觉得可以记录一下。 整体链路 先说清楚整个链路长什么样: 1 2 3 4 5 6 7 8 本地代码 -> git push 到 GitHub main 分支 -> GitHub Actions 触发 CI + Deploy workflow -> npm ci -> npm run build -> 生成 dist -> wrangler pages deploy dist -> 发布到 Cloudflare Pages 跟 Cloudflare 自动连接 GitHub 仓库那种方式不一样,这里是 GitHub Actions 主动用 Wrangler 把构建产物推上去,算是个 Direct Upload 的方案。 ...
顶级临阵磨枪(软考高级系统架构-0)
前趋图(Precedence Graph) 前趋图(Precedence Graph)是一种用于描述任务、事件或进程之间先后依赖关系的有向无环图(Directed Acyclic Graph,DAG)。 通常记作: G = (P, E) 其中: P:顶点集合(Vertex Set),表示进程、任务或事件 E:边集合(Edge Set),表示前驱约束关系 边一般表示为: E = {(p_i, p_j)} 表示进程 p_i 必须先执行完成,进程 p_j 才能开始执行,即: p_i ➡️ p_j 由于前趋图只描述“先后依赖关系”,因此图中不能出现环路,所以它属于有向无环图(DAG)。 在实际分析中,本质上就是按照“节点大小关系 + 箭头方向”记录每一条边的依赖关系。 PV 操作(Semaphore Operations) PV 操作是操作系统中用于实现进程同步与互斥的一种经典机制,其核心是信号量(Semaphore)。 信号量通常记作: S_i 其中: S:Semaphore(信号量) 下标 i:表示第 i 个信号量 PV 操作包括两种基本原语: P 操作(Proberen) P 操作来源于荷兰语 “Proberen”,含义为“测试”或“申请资源”。 执行逻辑: 对信号量 S 减 1 若结果小于 0,则当前进程阻塞等待 若结果大于等于 0,则继续执行 因此: 执行前需要进行 P 操作 表示“申请资源”或“进入临界区” 常写作: P(S_i) V 操作(Verhogen) V 操作来源于荷兰语 “Verhogen”,含义为“增加”或“释放资源”。 ...