博客

  • 攀岩运动简介

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

  • AI编程(二十五):CSV文件入门 — 让表格数据流动起来

    工资条、账单、通讯录、成绩表——程序世界和Excel世界的第一次握手

    一、你的数据,大多锁在表格里

    先想想你电脑里有多少表格文件:

    • 银行卡导出的账单(.csv 或 .xlsx)
    • 公司发的工资条
    • 通讯录导出的联系人列表
    • 上课时的成绩表、考勤表
    • 网店后台导出的订单明细

    这些数据有个共同的尴尬:Excel能看,但没法”自动化”。想算点东西要手动拉公式,想整理几百行要拖到手酸,想每周重复做一遍——每周都得重来一次。

    从今天起不一样了。我们开始爬阶段3的第一个台阶:文件和数据处理。第一站就是CSV——因为它是表格数据里最简单、最通用、最好上手的格式。

    (更多…)

  • AI编程(二十三):番茄钟计时器 — 把专注力管起来

    学习25分钟、休息5分钟——把第二十一篇的倒计时升级成完整的工作法工具

    一、为什么你学不进去,可能不是意志力的问题

    你有没有过这种经历:坐下来学习,刚看了两页书,手机亮了;回完消息想继续,脑子里开始想晚饭吃什么;等回过神,半小时没了,书还在第2页。

    结论通常是”我意志力太差”。但有个意大利人不同意。

    1980年代,Francesco Cirillo发明了一种方法:不要求你学一整天,只要求你专注25分钟。25分钟后休息5分钟,算一个”番茄”。攒够4个番茄,来一次长休息。

    (更多…)

  • 15.DSPy架构深度分析

    项目: stanfordnlp/dspy | Stars: 37.6k | 许可: MIT

    定位: “Programming — not prompting — Foundation Models”

    全称: Declarative Self-improving Python

    DSPy 是 Stanford NLP 团队开发的声明式语言模型编程框架,核心理念是用组合式 Python 代码替代脆弱的 prompt 工程,通过编译器自动优化 LM 的 prompt 和权重。本文从 10 个维度深入分析其架构设计。


    1. 核心哲学:从 Prompt 到 Program 的范式转换

    DSPy 的根本创新在于将 LM 调用从”手写 prompt 字符串”提升为”声明式 Python 程序”。用户定义输入/输出签名(Signature),编写组合逻辑(Module),框架自动处理 prompt 构造和优化。

    README 中明确阐述:

    (更多…)

  • 14.SemanticKernel

    项目: microsoft/semantic-kernel

    Stars: 28.5K+ | License: MIT | 语言: Python / .NET / Java

    定位: 企业级 AI Agent SDK,模型无关,支持构建、编排和部署 AI Agent 及多 Agent 系统

    一、整体架构概览

    Semantic Kernel(SK)是微软推出的模型无关 SDK,其核心设计理念是将 LLM 能力与传统代码通过统一的 Kernel(内核) 模式整合。架构分为四层:

    ┌─────────────────────────────────────────────┐
    │            Agent Layer (Agent 抽象)           │
    │  ChatCompletionAgent / AzureAIAgent / ...    │
    ├─────────────────────────────────────────────┤
    │          Kernel Layer (核心调度)              │
    │  Plugins → Functions → Filters → Services    │
    ├─────────────────────────────────────────────┤
    │        Connector Layer (AI 服务连接器)        │
    │  OpenAI / Azure / HuggingFace / ...          │
    ├─────────────────────────────────────────────┤
    │        Content Layer (内容模型)               │
    │  ChatMessage / Streaming / FunctionCall       │
    └─────────────────────────────────────────────┘

    SK 现已演化为 Microsoft Agent Framework (MAF),作为其企业级后继者,但 SK 本身仍是 MAF 的核心引擎。


    二、十个维度深度分析

    1. Kernel 核心 —— 组合式设计

    Kernel 是整个框架的中枢调度器,通过多重继承组合了四个扩展能力:

    (更多…)

  • 13.Haystack架构深度分析

    项目: deepset-ai/haystack

    定位: 开源 AI 编排框架,用于构建生产级 LLM 应用(RAG、Agent、语义搜索、多模态应用)

    版本: Haystack 3.0(2024年发布,重大重构版本)

    许可证: Apache-2.0

    分析时间: 2026-09


    1. 核心架构理念:管道(Pipeline)驱动的组件编排

    Haystack 的核心思想是将 AI 应用拆解为可组合的组件(Component),通过有向无环图(DAG)管道连接。每个组件有明确的输入/输出接口,管道负责数据流转、调度执行。

    1.1 Pipeline 调度引擎

    Pipeline 是 Haystack 的心脏,负责根据执行图(graph)调度组件运行。核心运行循环采用优先队列机制:

    # haystack/core/pipeline/pipeline.py - Pipeline.run() 核心循环
    while True:
        candidate = self._get_next_runnable_component(priority_queue, component_visits)
    
        # 如果没有可运行的组件,退出循环
        if candidate is None:
            break
    
        priority, component_name, component = candidate
    
        # 如果下一个组件被阻塞,检查管道是否可能被卡住
        if priority == ComponentPriority.BLOCKED:
            if self._is_pipeline_possibly_blocked(current_pipeline_outputs=pipeline_outputs):
                self._find_components_blocking_pipeline(
                    priority_queue=priority_queue, component_visits=component_visits, inputs=inputs
                )
            # 总是退出循环,因为无法运行下一个组件
            break
    
        # 如果下一个组件已经调度,等待任务完成以取得进展
        if component_name in scheduled_components:
            async for partial_outputs in self._wait_for_tasks(
                running_tasks, scheduled_components, return_when=asyncio.FIRST_COMPLETED
            ):
                yield partial_outputs
            continue
    
        # HIGHEST 优先级组件必须单独运行
        if priority == ComponentPriority.HIGHEST:
            async for partial_outputs in self._run_component_in_isolation(...):
                yield partial_outputs
            continue
    
        # READY 优先级组件可以并发调度
        if priority == ComponentPriority.READY:
            self._schedule_component(...)
            # 尽可能调度更多 READY 任务
            while len(priority_queue) > 0 and not ready_sem.locked():
                peek_priority, peek_name = priority_queue.peek()
                if peek_priority != ComponentPriority.READY:
                    break

    1.2 组件执行模型

    每个组件的运行被封装为独立的执行单元,支持同步和异步两种路径:

    (更多…)

  • AI编程(二十四):个人档案管理器 — 阶段2毕业作品

    证件、账号、联系方式——把这一路学的所有东西,装进一个真正属于你的程序

    一、你有多少”重要信息”散落在各处?

    先别写代码,盘点一下:

    • 身份证号、护照号、驾照号——平时用不到,用到时找不到
    • 各种账号:邮箱、视频网站、购物网站、健身房卡号……
    • 家人的身份证号(订机票要用)
    • 银行卡号、社保号、保单号
    • 重要日期:签证过期、证件到期、保修截止

    这些信息有个共同点:不用时想不起,要用时找不到。翻聊天记录、翻抽屉、问家人——每次都要折腾半天。

    手机备忘录?可以,但查找麻烦、没法分类、明文摆着还不安全。

    (更多…)

  • 12. Dify 架构深度分析

    基于 langgenius/dify 源码分析(154k+ Stars,24.4k Forks)

    分析源码:api/core/agent/base_agent_runner.py、api/core/agent/cot_agent_runner.py、api/core/tools/tool_manager.py


    1. 项目概览与技术栈

    Dify 是一个开源 LLM 应用开发平台,提供 AI 工作流、RAG 管道、Agent 能力、模型管理和可观测性。后端使用 Python(Flask + SQLAlchemy),前端使用 Next.js,支持 Docker Compose 一键部署。

    # 项目结构(从仓库目录可见)
    # api/          — Python 后端核心(Agent、工具、模型运行时)
    # web/          — Next.js 前端
    # docker/       — Docker Compose 部署
    # dify-agent/   — 独立 Agent 运行时
    # dify-agent-runtime/ — Agent 运行时包
    # sdks/         — 多语言 SDK
    # packages/     — 共享包

    Dify 的 Agent 系统基于 graphon 模型运行时抽象层,支持数百种 LLM 提供商,通过统一的 PromptMessage 体系与模型交互。


    2. Agent 继承体系——三层架构

    Dify 的 Agent 采用清晰的三层继承结构:AppRunner → BaseAgentRunner → CotAgentRunner。

    (更多…)

  • 11. Composio 架构深度分析

    仓库: ComposioHQ/composio (26.2k ⭐)

    定位: 为 AI Agent 提供 1000+ 预认证工具集、会话管理、认证、触发器和沙箱执行环境

    语言: Python SDK + TypeScript SDK(monorepo)


    1. 整体架构:Provider 泛型 + Session 模型

    Composio 采用 Provider 泛型模式,核心 Composio 类通过泛型参数 TTool 和 TToolCollection 实现框架无关的工具适配。默认使用 OpenAI 格式,但可以无缝切换到 Anthropic、LangChain 等任何框架。

    # sdk.py - 核心 SDK 类定义
    class Composio(t.Generic[TTool, TToolCollection], WithLogger):
        """
        Generic parameters:
            TTool: The individual tool type returned by the provider
            TToolCollection: The collection type returned by get_tools
        """
    
        tools: "Tools[TTool, TToolCollection]"
    
        @t.overload
        def __init__(
            self: "Composio[OpenAITool, OpenAIToolCollection]",
            provider: None = None,
            **kwargs: te.Unpack[SDKConfig],
        ) -> None:
            """Initialize with default OpenAI provider."""
            ...
    
        @t.overload
        def __init__(
            self,
            provider: BaseProvider[TTool, TToolCollection],
            **kwargs: te.Unpack[SDKConfig],
        ) -> None:
            """Initialize with an explicit provider. Types are inferred from the provider."""
            ...

    设计亮点: 通过 @t.overload 实现两个初始化路径——无 provider 时默认 OpenAI 类型,有 provider 时自动推断泛型参数。这意味着 Composio(provider=AnthropicProvider()) 会自动得到 Composio[ToolParam, list[ToolParam]] 类型。


    2. HTTP 客户端:Stainless 生成器 + 运行时环境检测

    HTTP 客户端基于 Stainless 自动生成的 API 客户端包装,增加了运行时环境检测和请求拦截能力。

    (更多…)

  • AI编程(二十二):简易记账本 — 月底看看钱都去哪了

    文件存账目、列表管记录、函数做统计——第十二篇价格工具的”理财升级版”

    一、月底的灵魂拷问

    每个月底总有那么一个瞬间:看看银行卡余额,倒吸一口凉气,然后问出那个经典问题——

    “我钱呢??”

    明明没买什么大件,钱就是没了。吃饭、打车、奶茶、网购……每笔都不大,加起来吓人。

    (更多…)

  • 10. Letta 深度架构分析

    项目: letta-ai/letta | Stars: 24.6K | License: Apache 2.0

    定位: 有状态 AI Agent 平台——具有高级记忆系统,能够随时间学习和自我改进

    前身: MemGPT(UC Berkeley BAIR 实验室研究成果)

    当前状态: V1 服务器代码归档于此仓库 archive 分支,新代码已迁移至 letta-ai/letta-code


    1. 整体架构哲学:LLM 即操作系统

    Letta 的核心理念源自 MemGPT 论文——将 LLM 视为操作系统的内核,Agent 就是运行在这个操作系统上的进程。系统采用分层记忆架构,灵感来自计算机体系结构中的虚拟内存管理:

    • 核心记忆(Core Memory) → 寄存器/L1 缓存:始终在上下文窗口内
    • 对话记忆(Recall Memory) → RAM:可搜索的历史对话
    • 归档记忆(Archival Memory) → 磁盘:长期向量存储
    • 文件系统(Filesystem) → 外部存储:Git 版本化的文件
    class ContextWindowOverview(BaseModel):
        """Overview of the context window, including the number of messages and tokens."""
        context_window_size_max: int = Field(..., description="The maximum amount of tokens the context window can hold.")
        context_window_size_current: int = Field(..., description="The current number of tokens in the context window.")
        num_messages: int = Field(..., description="The number of messages in the context window.")
        num_archival_memory: int = Field(..., description="The number of messages in the archival memory.")
        num_recall_memory: int = Field(..., description="The number of messages in the recall memory.")
        num_tokens_external_memory_summary: int = Field(..., description="The number of tokens in the external memory summary.")
        num_tokens_system: int = Field(..., description="The number of tokens in the system prompt.")
        num_tokens_core_memory: int = Field(..., description="The number of tokens in the core memory.")
        num_tokens_memory_filesystem: int = Field(0, description="The number of tokens in the memory filesystem section.")
        num_tokens_summary_memory: int = Field(..., description="The number of tokens in the summary memory.")
        num_tokens_functions_definitions: int = Field(..., description="The number of tokens in the functions definitions.")

    这个 ContextWindowOverview 精确追踪上下文窗口中每个组成部分的 token 消耗,类似于操作系统的内存使用报告。


    2. Agent 类型体系:多形态 Agent 设计

    Letta 定义了丰富的 Agent 类型枚举,每种类型对应不同的运行时行为和工具集:

    (更多…)