博客

  • 攀岩运动简介

    攀岩技术的兴起最早可追溯到十八世纪的欧洲。当时的登山者为了克服类似阿尔卑斯山等终年积雪的冰岩地形,发展出一套系统的攀登技术。1983年法国人Mr. Francois SAVIGNY 发明了由树脂及混凝土合成的可移动式岩块,奠定了攀岩墙日后发展的基础。
      目前攀岩在国外是一项非常兴盛而且老少咸宜的运动,攀岩墙的设立非常普遍,室内及室外都有。因此常常可以看到一些外国朋友在下班之后,到这些设有岩墙的休闲娱乐中心或健身房活动一下再回家的情形。在节假日,也常常可以看到在设有岩墙的公园里全家同乐的景象。因为对现代都市人而言,到天然岩场攀爬往往要花去不少交通的时间,而且受气候的影响很大。因此在国外,尤其是运动风气鼎盛的欧洲、北美洲,许多岩墙的设立都是由政府出资规划兴建,因为它提供了一个绝佳的旅游休闲的去处。
      现代人随着经济起飞,生活的品质已不再是要求温饱而已,而是希望建立工作与身心健康、休闲品质、家庭亲子关系等相对的平衡。攀岩活动,可以完全满足这些需求,并且完全没有危险性。除了以上这些好处外,更因为攀岩活动没有体型、性别及年龄上的限制,无论男女老少皆可享受攀登的乐趣。现代人饱受生活压力与工作压力之苦,他们可以从攀岩活动中获得成就感,舒缓压力。
      在休闲市场上,目前世界各地一些稍具规模的公园、游乐场、度假饭店都以此设备来招揽客人,以凸显自己的特色。
      除了攀岩活动之外,人工岩墙也可以提供类似高楼逃生,绳索速降等个人或消防单位之训练以及山难搜救技术的训练。高空作业人员,如天线架设、建筑、外墙清洗作业、冷气安装工作人员,也可以在经过简单的训练后将工作的危险性大幅降低,提升产业竞争力,军方及特种部队也常常利用人工岩场开展各种作战技术演练,例如困难地形突破、突击、潜入、人质解救或是巷战、城市战等等。
        攀岩的六大好处
      ●  增加身体柔软度与协调感
      ●  增强体力
      ●  集中力
      ●  进取心
      ●  自信心
      ●  平衡感
        攀岩墙的类型
      攀岩墙发展迄今,依照其用途可分为:
      ● 专业竞技型:专业设计,采用高强度仿真复合材料岩板,精心设计路线及难度,供攀岩专业人士、爱好者以及军、警、高空作业等特种行业训练、比赛。
      ● 仿真娱乐型:创意设计,安全、刺激,充分考虑不同人群的攀登要求,并最大限度的增加投资者的收益。
      ● 儿童型:岩板表面用环保材料喷涂卡通图案,适合幼儿园儿童及小学生,用于对其肌肉发展及手、眼、身体之协调训练方面。

  • Agent架构(二):LangGraph

    项目: langchain-ai/langgraph

    Stars: 41,548 | Forks: 7,018 | License: MIT

    定位: 面向长时间运行、有状态 Agent 的底层编排框架

    灵感来源: Google Pregel、Apache Beam、NetworkX


    一、核心设计哲学:Pregel 计算模型

    LangGraph 的核心是一个 Bulk Synchronous Parallel (BSP) 执行引擎,称为 Pregel。每个执行步骤分为三个阶段:

    1. Plan(规划): 确定本轮需要执行哪些 Actor(节点)
    2. Execute(执行): 并行执行所有选中的 Actor,直到全部完成、失败或超时
    3. Update(更新): 用 Actor 写入的值批量更新 Channel
    # pregel/main.py — Pregel 类的文档字符串(摘录)
    class Pregel(PregelProtocol[StateT, ContextT, InputT, OutputT]):
        """Pregel manages the runtime behavior for LangGraph applications.
    
        Pregel combines **actors** and **channels** into a single application.
        **Actors** read data from channels and write data to channels.
        Pregel organizes the execution of the application into multiple steps,
        following the **Pregel Algorithm**/**Bulk Synchronous Parallel** model.
    
        Each step consists of three phases:
        - **Plan**: Determine which **actors** to execute in this step.
        - **Execution**: Execute all selected **actors** in parallel.
        - **Update**: Update the channels with the values written by the **actors**.
        """

    这种设计意味着:同一轮执行中,节点写入的 Channel 值对其他节点不可见,只有进入下一轮时才生效。这从根本上避免了并发写入的竞争条件,是 LangGraph 保证确定性执行的关键。


    二、Channel 体系:有状态通信原语

    Channel 是 LangGraph 的核心抽象,所有节点间通信都通过 Channel 进行。BaseChannel 定义了统一的接口:

    (更多…)

  • Agent架构(一):LangChain

    基于 langchain-ai/langchain 源码分析,覆盖 langchain-core 与 langchain 两个核心包

    1. 架构哲学:可组合的 Runnable 抽象

    LangChain 的核心设计哲学是 “一切皆 Runnable”。所有组件——LLM、Prompt、OutputParser、Tool、Retriever——都继承自同一个泛型基类 Runnable[Input, Output],从而获得统一的调用接口和组合能力。

    class Runnable(ABC, Generic[Input, Output]):
        """A unit of work that can be invoked, batched, streamed, transformed and composed."""
    
        name: str | None
        """The name of the `Runnable`. Used for debugging and tracing."""
    
        @abstractmethod
        def invoke(self, input: Input, config: RunnableConfig | None = None, **kwargs: Any) -> Output:
            """Transform a single input into an output."""
    
        async def ainvoke(self, input: Input, config: RunnableConfig | None = None, **kwargs: Any) -> Output:
            return await run_in_executor(config, self.invoke, input, config, **kwargs)

    关键设计决策:

    • LCEL(LangChain Expression Language):通过 | 管道运算符实现声明式链式组合,RunnableSequenceRunnableParallel 是核心组合原语
    • 同步/异步双模:每个 Runnable 同时提供 invoke/ainvokestream/astreambatch/abatch,异步默认通过线程池桥接同步实现
    • Pydantic 驱动的 Schema:输入/输出类型通过泛型参数自动推导,生成 JSON Schema 用于验证和文档
    def __or__(self, other) -> RunnableSerializable[Input, Any]:
        """Compose this Runnable with another object to create a RunnableSequence."""
        return RunnableSequence(self, coerce_to_runnable(other))
    
    def pipe(self, *others, name=None) -> RunnableSerializable[Input, Other]:
        """Equivalent to RunnableSequence(self, *others) or self | others[0] | ..."""
        return RunnableSequence(self, *others, name=name)

    2. Agent Loop:观察-行动循环

    LangChain 的 Agent 采用经典的 ReAct(Reasoning + Acting) 模式。核心循环定义在 langchain_core/agents.py 中,通过两个关键数据结构驱动:

    (更多…)

  • AI编程(十二):实战 — 从零做一个价格记录工具

    12篇所学全部用上,做出一个真正能用的程序

    一、恭喜你走到了最后

    这是这个系列的第12篇,也是最后一篇。

    回头看这11篇,你已经学了不少东西:

    篇目 你学会了什么

    |—|—|

    (更多…)

  • AI编程(十一):AI帮你选技术栈 — 不再迷茫

    装修材料类比理解技术栈,让AI帮你做选择

    一、什么是”技术栈”?用装修来理解

    前几篇我们学会了变量、函数、文件操作……但你有没有想过一个问题:我学了这些,到底该用什么”工具”来做项目?

    这就像你学会了拧螺丝、刷油漆,但真正要装修房子的时候,面对建材市场里几百种材料,你懵了——地板用瓷砖还是木地板?墙面用乳胶漆还是墙纸?水管用PPR还是PVC?

    编程世界也一样。做网站、做小程序、做数据分析,每一类项目都需要选一套”材料”组合起来用。这套材料组合,就叫技术栈(Tech Stack)

    (更多…)

  • AI编程(十):错误处理 — 让程序不会”崩溃”

    try/except,给程序装安全网

    程序为什么”一碰就碎”?

    上一篇我们给通讯录加上了文件保存功能,程序已经很好用了。但你有没有遇到过这种情况:

    请输入选择:5
    请输入年龄:abc
    Traceback (most recent call last):
      File "通讯录.py", line 15, in 
        年龄 = int("abc")
    ValueError: invalid literal for int() with base 10: 'abc'

    程序直接崩溃了。红色的报错信息看得人一头雾水。

    这就像一个不会游泳的人跳进了深水区——没有救生圈,直接沉底。

    (更多…)

  • AI编程(九):文件操作 — 让数据存下来

    用抽屉类比理解文件读写

    辛辛苦苦输入的数据,关掉程序就没了?

    上一篇我们学会了用列表和字典来组织数据——通讯录、成绩单、购物清单,都可以用程序来管理了。但你有没有发现一个问题?

    每次运行程序,你辛辛苦苦输入了10个联系人,结果一关程序,全没了

    下次再打开,又得从头输入。

    (更多…)

  • Tailwind v4迁移踩坑:SVG样式控制变色的正确姿势

    一个 SVG 裙摆按钮在 Tailwind v4 下全面失灵的故事,以及如何用 CSS 变量 fallback 模式一劳永逸地解决。


    问题:SVG 描边突然消失了

    最近在做一个仿浏览器标签页的「裙摆按钮」组件(SkirtTabs),用 SVG path 画出标签页的圆角轮廓和底部裙摆效果。在 Tailwind v4 迁移后,活跃标签的 SVG 描边完全消失了。

    代码看起来没问题:

    var(--border) 解析为空值——因为 Tailwind v4 的 @theme 系统把变量名从 --border 改成了 --color-border

    (更多…)

  • AI编程(八):列表和字典 — 处理”一堆数据”

    购物清单和通讯录,Python最常用的数据结构

    前几篇我们学了变量、条件、循环、函数——它们都是处理单个数据的。但真实世界里,数据总是”一堆一堆”的:购物清单上有10样东西,通讯录里存着200个联系人。Python用列表字典来处理这类数据,掌握它们,你才算真正入门。


    一、列表(list)— 你的购物清单

    想象你去超市前写了一张购物清单:

    shopping = ["牛奶", "面包", "鸡蛋", "苹果", "酱油"]

    这就是一个列表——用方括号 [] 包裹,元素之间用逗号隔开。列表有三个特点:

    (更多…)

  • Google Research 180组实验揭示:多Agent协作的三大定量法则,附论文下载

    “More Agents Is All You Need”——这篇2024年的论文曾让整个AI工程圈相信,Agent越多越好。Google Research用180组受控实验推翻了这个结论。

    引言

    2025年12月,Google Research联合MIT、Google DeepMind在arXiv发布了《Towards a Science of Scaling Agent Systems》,2026年7月正式发表于Nature Machine Intelligence。这是第一篇用定量方法研究Agent系统扩展规律的论文。

    论文的核心问题:多Agent协作什么时候有用,什么时候反而有害?

    答案出乎意料——不是”越多越好”,而是”用错架构比不用更差”。

    (更多…)

  • AI编程(七):函数 — 代码的”菜谱”

    把代码打包,随时复用


    上一篇我们学了循环,程序终于能”重复干活”了。但你有没有遇到这种情况:同样的代码块在程序里出现了三四遍,每次只改几个数字?复制粘贴倒是能用,可一旦要改逻辑,就得改三四处——漏了一处就是bug。

    函数(Function)就是解决这个问题的。它的核心思想特别简单:把一段代码打包,取个名字,以后想用就用。


    函数是什么 —— 菜谱的类比

    想象你做番茄炒蛋做得特别好,朋友问你怎么做。你不会每次都从头想”先打蛋还是先切番茄”,而是把步骤整理成一份菜谱:

    (更多…)