子弈的 2025 年度总结
学习
2025 年在学习上可以简单分为以下几块内容:
AI 实践学习
每一个同学对于 AI 的了解和学习程度都不一样,我自己简单总结了一下在接触 AI 应用开发过程中可能经历的几个阶段:
今年我发现身边越来越多的同事从对 AI 保持观望到快速进入 Vibe Coding 时代,大家会积极了解和使用市面上成熟的 AI 产品。当然对于前端开发者而言,IDE 是我们日常最直接接触的工具之一,去年我主要使用 Github Copilot 进行辅助开发,而今年则改为使用更强大的智能 IDE 进行编码:
当然随着 AI 的快速发展,智能编码也将进入更加智能的阶段:
目前市面上的智能 IDE 还无法理解各自领域的专业知识,一些隐形的经验或者历史的技术方案也无法为 AI 所复用,除此之外,IDE 也只能聚焦于当前工程项目的智能代码生成,未来的开发模式还会在 Vibe Coding 的基础上进行衍生,走向更加强大的开发范式,例如 SDD:
当然我理解的 SDD 只是一种开发范式,其核心是构建复杂的领域知识体系,并且其难点是如何让内部的一些深度领域知识可以精准的被索引,从而基于实际需求精准智能的生成代码。这些领域知识包括跨工程的知识体系、业务的术语表、Codebase Knowledge Graph RAG(代码的关联关系)以及历史经验的复用等,例如 Qoder 的 Quest 模式。
除了使用市面上存在的一些 AI 产品,更重要的是了解这些 AI 产品的实现原理或者自己尝试去实践一些 AI 技术。去年我深入学习了 Github Copilot 的实现原理,对智能代码补全背后的机制有了深刻认知:
今年则进一步研究了 OpenManus 的设计思路,持续追踪并借鉴社区中的优秀 AI 开源项目。同时,也尝试使用 Python 系统性设计并实现了一个基于 Function Calling 与 Mcp 协议、采用 ReAct 架构的 Agent,从而更直观地理解了基于 Agent 智能调度工具的流程与设计逻辑。
此外,我也系统学习了 Langchain 框架,并基于该框架结合 Playwright Mcp,设计并实现了一款面向前端研发的提效 Agent。虽然这些尝试都还处于初期阶段,但在过程中我收获了大量关于 AI 应用落地的细节认知。
OpenManus 原理学习
OpenManus 的学习过程可以用两个 XMind 思维导图来建立:
OpenManus 是一个开源的 Manus(智能体 / Agent)Python 项目,使用 ReAct 框架设计 Agent 并可以智能调度内部封装的开发者工具,这些工具包括:
利用内部实现的 ReAct 框架,OpenManus Step by Step 智能决策并使用如下工具来实现用户指令,例如:
使用 Google 搜索“钉钉开放平台的前端 JS API 调用示例”,帮我设计一个 HTML,能够引入 JS API 的 CDN 资源,并编写调用示例。
OpenManus 会像人一样思考和操作,它首先利用 Google 搜索引擎工具搜索最相关的 10 个网址,然后利用浏览器(Browser Use)工具逐一打开网址查看是否存在前端 JS API 示例相关的内容,如果第一个网址不存在,则会继续浏览第二个搜索到的网址,直到找到相关的内容并进行提取,最后利用文件系统工具生成代码文件。
OpenManus 是一个学习 Agent 知识非常好的开源项目,它的整体框架如下所示:
ReAct 总体执行流程如下所示:
think 执行流程:
act执行流程:
Browser Use 执行流程:
除此之外,OpenManus 也实现了基于 MCP 协议的工具调用方式,并且实现了 Muti-Agent & 任务规划模式,在原来的基础上进行了框架升级,如下所示:
温馨提示:大家可以思考一下使用这种设计模式可能会存在什么问题?
在 Muti-Agent 模式下能够对用户输入的指令进行 Plan 规划拆解,然后每一个 Step 会寻找合适的 Agent 进行执行,如下所示:
最终我们可以了解一下 OpenManus 的大致执行流程:
温馨提示:如果 Agent 和 Agent 之间需要通信,也可以使用 A2A 标准协议。
Muti-Agent 模式的总体执行流程:
创建流程实例 flow 执行调用了FlowFactory.create_flow,主要用于绑定相应的 Agents 集合:
AI 智能请求:
调用 PlanningTool 生成计划文本,信息如下:
根据任务步骤调用相应的 Agent 执行 Step:
ReAct 总体执行流程:
think 执行流程:
act执行流程:
Browser Use 执行流程:
真正在学习的过程中可以了解更多的细节问题,例如:
- Agent 到底有哪些组成部分?这些组成部分各自有什么功能?
- 工具的调度方式有哪些?什么是 Funcion Calling? 它有什么优点?
- Function Calling 执行后的对话信息需要包含哪些内容,如何描述工具的执行过程和执行结果并使得 LLM 可以更好的决策下一个执行任务?
- 没有 Function Calling 之前或者某些模型不支持 Function Calling 时该如何实现工具的智能决策调用?
- ReAct 和 CoT 的区别是什么?CoT 相比 ReAct 有什么缺点?ReAct 有哪些优缺点?ReAct 在解决哪些问题时准确性较高?
- 什么是 Reflexion 框架,相比 ReAct 它的优点是什么?
- ReAct 架构如何防止任务死循环或者卡死(幻觉)?它的优缺点是什么?
- 我们如何判断 ReAct 规划的策略是否越来越低效(例如规划步骤花费时间过多并且没有成功的迹象以及在环境中遇到一系列连续相同的动作并产生了相同的结果等)?
- 什么是记忆,什么是短期记忆,什么是长期记忆?记忆超过 LLM 上下文 token 限制该如何处理?
- 在 OpenMansu 中如何管理对话状态(上下文工程信息),对话状态中会包含哪些信息类型?
- 简单描述一下基于 Mcp 协议的工具调用执行流程?是否手动实现过该执行流程?
- 业界有哪些基于任务规划的 Agent 产品(例如 Same)?
- Muti-Agent 适用的场景有哪些?任务规划适合在什么场景下使用?
- 社区有哪些开源的 Muti-Agent 框架?
- Muti-Agent 的优缺点是什么?
- OpenManus 是如何设计 Flow 任务规划的 System Prompt、Planning Tools Params Prompt?如何设计 Manus Agent 的 System Prompt、User Input Prompt、Next Step Prompt、Tools Params Prompt、Assistant Prompt、Tools Observed Prompt、Page Prompt(从页面提取用户输入相关的内容)等,整个上下文工程是其内部的精髓!
Langchain 框架学习
Langchain 的学习过程可以用两个 XMind 思维导图来建立:
主要学习了Langchain 框架的功能(不包含 LangGraph),也体会到了 Langchain 的强大之处,包括:
目前正在尝试使用 Langchain 来设计前端产研提效的 Agent 工具,能够支持应用的全链路开发模式。在学习和使用 Langchain 框架的同时也能系统地了解和 Agent 相关的功能设计,当然真正在实践的过程中还是会遇到各种问题,例如:
- 如何整理相应的知识文档,需要包含哪些应用研发信息,如何确保这些信息的 RAG 索引的准确性?
- 知识文档如何承载,如何实时更新索引信息?
- RAG 的实现流程可以分为哪几个步骤?
- 为什么需要对文档进行切割?文档切割的策略有哪些(Levels Of Text Splitting)?
- 如何保证检索的连贯性?如何进行国际化检索?RAG 的检索策略有哪些?
- 嵌入模型如何选择,需要考虑哪些衡量指标?向量数据库有哪些,是否有类似的 GUI 工具?
- Agent 设计中常用的 RAG 检索方案是什么?2-Step RAG 和 Agentic RAG 有什么优缺点?
- 如何评估 RAG 的准确性,有什么评估标准?
- 如何解决过多 Mcp 服务的连接压力和性能问题(本质是不要让每个 AI Agent / 会话与 N 个 MCP Server 全量长连接,应改成“按需路由 + 连接池 / 复用 + 分层聚合 + 隔离与限流”的架构,把连接数、握手成本、心跳与上下文维持成本从 N×1000 降到“实际用到的少数几个”)?
- 有哪些压缩记忆的方法方式,各自又有什么优缺点?压缩记忆后如何避免记忆失真?
- 如何抉择 ReAct 和 Flow 执行流程?
- 在 ReAct 中如何抉择并行调用多个工具还是单个工具串行调用?
- 如何处理多步工具调用(multi-step tool calling) 中常见的 "幻觉性规划"(hallucinated planning) 问题?
- Mutil-Agent 模式有什么优点? Tool calling 模式和 Handoffs 模式如何抉择?
- 什么情况下需要设计 Mutil-Agent 模式?
- 在 Langchain 中应该如何抉择使用 PlayWright Browser Toolkit、Browser Use、playwright-mcp 和 playwright?它们各自有什么优缺点?
- Playwright 自定义工具封装和 Playwright Mcp 如何抉择(一个可控且消耗 Token 小,一个不可控但功能更灵活)?
- Playwright 如何解决浏览器免登的问题?
- 在设计 Agent 的过程中有哪些可观测的工具可以追溯 Agent 内部的 ReAct 执行过程?
React 原理学习
虽然对于 Vue 2.x、Svelte 等框架的原理相对比较清晰,但是对于 React 一直没有深入进行原理了解,尽管学习这些原理可能不如学习 AI 来得实在,从某些程度来讲也稍微有些过时,不过出于好奇心,并且为了速成,参考了图解 React 原理快速学习了一把,如下所示:
学习了以后也会产生很多相关的问题,例如:
- React 的启动模式有哪些?什么是 Concurrent 模式?这些模式有什么区别?
- 在 Reconciler 运作流程中同步渲染和并发渲染的区别是什么?
- React 在哪些情况下会让出代码的执行权(可中断与恢复机制),从而用于提升用户体验?
- React 的时间切片为什么是 5ms?
- 简述 React 的任务调度过程?
- React 调度分片工具使用的是什么异步 API ? 为什么不是 rIC、rAF、setTimeout?为什么不使用微任务?
- 如果 Fiber 树的构造过程非常耗时,如何处理构造的中断和恢复?
- 简述一下 Fiber 树构造中使用的双缓冲技术?它有什么优点(并发模式、可中断、回退策略)?
-
setState在什么情况下分别进行同步和异步执行? - 在注册调度任务时对于同时连续多次
setState是如何处理的?调度中心是如何处理节流优化的? - 为什么 Fiber 是树 + 链表的结构?
- 渲染阶段和提交阶段都是可中断的吗?
- 什么是副作用链表?它为什么是链表结构(对于可中断与恢复机制的支持)?
- 在 Fiber 树构造时如何对副作用链表(例如周期函数、
useEffect、useLayoutEffect)进行处理? - 从 Fiber 树角度出发讲述父子节点的副作用执行顺序以及如何避免 DOM 的重排?
- Fiber 树的渲染可以分为哪几个阶段?
useEffect在 Fiber 树渲染的哪个阶段执行?它是异步执行吗? - React Hooks 和
useEffect是在宏任务中执行还是微任务中执行?它是通过调度任务执行的吗?从原理角度出发讲解它为什么能够模拟componentDidMount周期函数? - 在初次 Fiber 树渲染中
componentDidMount周期函数和useEffect副作用的执行时机谁更早? -
useLayoutEffect和componentDidMount、componentDidUpdate执行时机相等吗? - 为什么在 React 中要引入 Hook ?它的动机是什么?
- 在双缓冲机制中如何复用副作用链表?
-
useReducer会进行任务调度执行吗?同时连续的多次dispatch会进行节流优化吗? -
useLayoutEffect是同步执行的吗?为什么会阻塞浏览器的绘制? - 为什么在
useLayoutEffect中可以直接拿到 DOM 的尺寸(即在浏览器绘制之前)? - React 是如何判断 Hook 副作用函数的依赖项变化的?
金融
2025 年开始从 0 到 1 学习理财知识,想要做好理财首先需要学习相关的基础知识,今年学习到的基础知识如下所示:
当然在学习的过程中也需要阅读大量的金融书籍,借鉴伟人的经验和一些历史金融大事件经验,包括:
自从开始理财后,发现自己会关注国家政策的变化、世界的政治大事件、当日股市波动的利空利好信息等,也会关注一些金融博主的短视频信息。目前作为理财小白觉得自己最重要的几个实操学习点如下:
运动
学习固然重要,但是保持好健康的身体才能有更加持续的学习动力,2025 的整体运动情况如下所示: