跳转至

所有文章

跟着动画学最小二乘法:从直觉到矩阵推导

发展历程

最小二乘法(Least Squares Method)是一种数学优化技术,广泛用于数据拟合、回归分析等领域。最小二乘法起源于18世纪,最早由 卡尔·弗里德里希·高斯(Carl Friedrich Gauss)阿德里安-马里·勒让德(Adrien-Marie Legendre) 提出。1801年,高斯在预测小行星谷神星的轨道时使用了最小二乘法,并于1809年在《天体运动论》中正式发表相关理论。 1805年,勒让德在《新方法》中首次公开描述了最小二乘法,称其为“méthode des moindres carrés”(最小平方方法)。

两人关于谁是首创者存在争议,但高斯声称他在1795年就已使用该方法。到19世纪,高斯进一步发展了最小二乘法的理论基础,结合概率论和正态分布,建立了误差分析的统计框架。

LLM 到底是如何工作的

原文:How LLMs Actually Work

这篇文章是对 LLM 工作原理的一次梳理。现代 LLM 大多是通过把 transformer 块层层堆叠起来的,所以理解了 transformer 的内部机制,你就理解了大部分内容。

我会讲现代基于 transformer 的 LLM 内部的核心机制,但不涉及那些粘手的数学细节。别误会,数学你还是该学的,但这篇可以当作入门读物。

大多数现代 LLM 都共享同一套 transformer 家族的骨架。它们之间的差异主要来自训练数据、规模与配置选择,以及在此基础上做的后训练。读完本文,你应该能够阅读许多现代 LLM 论文或模型卡,并知道每一节在讲架构的哪个部分。

Anthropic 官方指南:构建高效的 AI 智能体

来源:Building Effective AI Agents

在过去一年里,我们与跨行业的数十支团队合作,构建基于大语言模型(LLM)的智能体。我们一致观察到:最成功的实现并没有使用复杂的框架或专门的库,而是用简单、可组合的模式来构建。

在这篇文章中,我们分享了从与客户合作以及自己构建智能体过程中学到的经验,并为开发者提供构建高效智能体的实用建议。

什么是智能体?

“智能体(Agent)”可以有多种定义。一些客户把智能体定义为完全自主的系统,能够长时间独立运行,使用各种工具完成复杂任务。另一些客户则用这一术语描述更具规约性的实现,按预定义的工作流执行。在 Anthropic,我们把所有这些不同形态都归为智能体系统(agentic systems),但在架构上对工作流(workflows)智能体(agents)做出重要区分:

  • 工作流是指通过预定义代码路径来编排 LLM 和工具的系统。
  • 智能体则是指由 LLM 动态指挥自身流程和工具使用、对如何完成任务保持控制权的系统。

下面我们将详细探讨这两种智能体系统。在 附录 1: 智能体实践 中,我们描述了客户从这类系统中获得特别价值的两个领域。

语音AI与语音智能体——图解入门指南(2025版)

原文:Voice AI & Voice Agents: An Illustrated Primer

1. 2025 年的对话式语音 AI

LLM 很擅长对话。

如果你花过不少时间与 ChatGPT 或 Claude 进行自由形式的对话,就会直观地感受到:和 LLM 交谈相当自然,而且在很多场景中都很有用。

LLM 也很擅长把非结构化信息转换为结构化数据1

新的语音 AI 智能体正是利用了 LLM 的这两项能力——对话,以及从非结构化数据中提取结构——来创造一种新的用户体验。

如今,语音 AI 已经被部署到广泛的商业场景中。例如:

  • 在医疗预约前收集患者数据
  • 跟进 inbound sales leads(入站销售线索)
  • 处理越来越多类型的呼叫中心任务
  • 协调公司之间的排期与物流
  • 以及为几乎所有类型的小企业接听电话

在消费端,对话式语音(以及视频)AI 也开始进入社交应用和游戏。开发者每天都在 GitHub 和社交媒体上分享个人语音 AI 项目与实验。

LangGraph Interrupt 从入门到深入

在构建 AI Agent 应用时,一个常见的需求是 人在回路(Human-in-the-Loop,简写HITL)——让 Agent 在关键节点停下来,等人工审核/确认后再继续。LangGraph 提供了 interrupt 机制来实现这一功能。

本文将带你从零开始理解 interrupt,先讲清楚概念,再用代码一步步深入,最后总结踩坑经验。

什么是 interrupt?

interrupt 是 LangGraph 提供的一个函数,调用它可以让当前正在执行的图在某个节点 暂停(暂停整个图,不是只暂停当前节点),等待外部通过 Command(resume=...) 恢复执行。

它的典型工作流程:

用户输入 → LLM 推理 → 调用工具 → 工具内 interrupt()
                              图暂停,等待 resume
                        外部调用 Command(resume=data)
                              工具继续执行 → 返回结果给 LLM → 输出

关键特性:

  1. 暂停是整个图级别的 — 不只是退出当前节点,整个 graph.stream() 调用都会返回
  2. 需要 checkpointer — 没有 checkpoint,interrupt 无法保存状态
  3. 恢复需要 resume — 使用 Command(resume=...) 从暂停点恢复

基于《什么是 Kubernetes(K8s)》——示范“费曼技巧(Feynman Technique)”用于学习与写作流程

题记

“如果你无法用简单的语言讲清楚一个概念,那你就还没真正理解它。” —— 理查德·费曼

费曼技巧(Feynman Technique) 是一个非常高效的学习和理解方法,是一种通过 “教别人”来强化自己理解的学习法,适用于任何你想深入掌握的知识或技能。 它得名于著名物理学家 理查德·费曼(Richard Feynman),他以惊人的理解力和通俗解释复杂概念的能力而闻名,被称为“伟大的解释者”。

下面我用一个技术主题——《什么是 Kubernetes(K8s)》——完整示范一次 费曼技巧(Feynman Technique) 用于学习与写作流程。

我会故意展示:

  1. 如何从“自以为懂”到“真正讲明白”

  2. 如何发现知识漏洞

  3. 如何不断简化表达

  4. 如何让一个完全不懂技术的人也能理解

同时我也会指出常见错误,以及如何避免。

LangGraph 完全指南:从入门到精通与源码级原理剖析

LangGraph 的诞生背景与架构全景

LLM 应用编排的演进史

在理解 LangGraph 之前,我们需要回顾 LLM 应用编排框架的演进历程。这个演进本质上是 "如何让 LLM 应用的控制流从线性走向复杂" 的过程。

第一阶段:Prompt 模板 + API 调用(2022 年)

最初的 LLM 应用极其简单——写一个 prompt 模板,调用 OpenAI API,获取结果。这适合单轮问答,但无法处理多步推理。

# 2022年的典型LLM应用
import openai
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "翻译:Hello World"}]
)

LangGraph 入门到精通教程:从零基础到实现简易版 LangGraph

LangGraph 是 LangChain 生态中最重要的低层编排框架之一,它让开发者能够以“图”(Graph)的形式构建复杂、状态持久、多 Actor 的 LLM 应用。不同于传统的 LangChain Chain 或 Agent,LangGraph 真正解决了“长生命周期、有状态、可恢复、可中断、可调试”的核心痛点,被广泛用于构建生产级 Agent、自主工作流、多 Agent 协作系统等场景。

本文从入门(零基础快速上手)到深入(源码级原理分析),再到实践(基于 LangGraph 原理手写一个简易版 LangGraph),帮助你真正“精通”LangGraph。所有代码均在 Python 3.10+ 环境下测试通过,基于官方仓库原理提炼。

LangGraph 是什么?为什么需要它?

LangGraph 的核心思想源于 Google Pregel(一种大规模图计算框架)和 NetworkX 图接口。它把 LLM 应用建模为有向图

  • 节点(Node):执行具体动作的函数或 Runnable(LLM 调用、工具调用、Python 函数等)。
  • 边(Edge):控制流(无条件边、条件分支边、动态 Send)。
  • 状态(State):共享的 TypedDict,通过 Channel(通道)进行更新,支持多种归约器(reducer,如 append、last_value)。
  • 执行引擎:Pregel 算法 —— “超级步”(superstep)模型,实现 Bulk Synchronous Parallel(BSP),支持循环、并行、检查点持久化。

与 LangChain 的区别

  • LangChain Chain 是线性/树状流程,适合简单任务。
  • LangGraph 是循环有向图(支持 cycle),天然适合 ReAct Agent、规划-执行-反思循环、多 Agent 协作。
  • 官方文档定位:LangGraph 是“为长期运行、有状态 Agent 设计的低层框架”,LangChain 很多高级 Agent(如 create_react_agent)底层就是 LangGraph。

核心优势

  1. 持久化(Checkpoint):任意时刻保存状态,支持故障恢复、人机协同。
  2. Human-in-the-Loop:中断执行,人工修改状态后继续。
  3. 流式 + 调试:stream_mode 支持 values/updates/debug/messages,与 LangSmith 无缝集成。
  4. 可扩展:自定义 Channel、Subgraph、Remote Pregel。
  5. 生产就绪:支持 Postgres/SQLite 持久化、异步执行、重试策略。

官方最新版本(2026 年 4 月):langgraph==1.1.7a1(预发布),核心位于 libs/langgraph/langgraph/ 下,主要模块包括:

  • graph/:StateGraph、MessageGraph、分支逻辑。
  • pregel/_loop.py_runner.py_algo.py_checkpoint.py 等实现 Pregel 执行引擎。
  • channels/:LastValue、Topic、BinaryOperatorAggregate 等通道实现。

Python 泛型与型变完全指南:从宠物医院看类型安全

引言:兽医科室的类型危机

假设你经营一家宠物医院。你有一个 "犬科专科住院部",只收治狗狗。某天,由于"动物住院部"床位紧张,护士打算把一只刚送来的哈士奇安排进"犬科专科住院部"——毕竟狗也是动物,对吧?

问题出现了:如果允许这样做,其他医生可能基于"这是普通动物住院部"的认知,往里面收治一只猫。结果当你去查房时,期待看到一只狗,却发现笼子里是一只猫——类型契约被破坏了

class Animal: pass
class Dog(Animal): pass  
class Cat(Animal): pass

class Ward(Generic[T]):  # 住院部
    def admit(self, patient: T) -> None: ...      # 收治(写入)
    def discharge(self) -> T: ...                 # 出院(读取)

def general_ward(ward: Ward[Animal]) -> None:
    ward.admit(Cat())  # 对于普通动物病房,收治猫很合理!

dog_ward = Ward[Dog]()  # 犬科专科
general_ward(dog_ward)  # ❌ 类型检查器阻止了这一步!
# 如果允许:下一行会在运行时出问题
dog: Dog = dog_ward.discharge()  # 期望得到狗,结果可能是猫!

这个"猫住进犬科病房"的问题,引出了泛型编程中最核心的概念:型变(Variance)

Python 上下文管理器深度解析:从资源管控到优雅编程

在 Python 编程中,资源管理是最容易引发错误的领域之一。文件未关闭、锁未释放、数据库连接泄漏——这些问题往往不会在代码运行时立即显现,而是在高并发或长时间运行的系统中突然爆发。

传统的 try-finally 模式虽然能保证资源释放,但会带来代码臃肿和逻辑分散的问题:

# 传统方式:繁琐且容易出错
f = open('data.txt', 'r')
try:
    data = f.read()
    process(data)
finally:
    f.close()  # 忘记写这一行,文件句柄就泄漏了

Python 的 Context Manager(上下文管理器) 正是为了解决这一痛点而生。通过 with 语句,它将资源获取与释放绑定在一起,实现了确定性清理(Deterministic Cleanup)