跳转至

所有文章

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)

Python 包与模块机制深度解析:从 import 到底层命名空间

在 Python 工程中,我们每天都在写 import xxx,但很少停下来思考:当解释器执行这行代码时,内存中到底发生了什么?为什么有时候 import 一个文件夹就能使用其中的功能,有时候却不行?__init__.py 到底扮演着什么角色?

本文将从模块即对象的本质出发,深入解析 Python 的包管理机制,帮你建立对 import 系统的完整认知。

Package 与 Module:容器与内容的关系

首先明确一个常被混淆的概念:Package 本质是包含 Python 文件的文件夹,而 Module 是具体的 Python 文件

mymath/                 ← 这是一个 Package
    __init__.py
    calculator.py       ← 这是一个 Module
    geometry.py         ← 这是另一个 Module

关键区别在于:Package 是一个命名空间容器,Module 是实际执行代码的单元。当你执行 import mymath 时,Python 并不是递归执行包内所有 .py 文件,而是精确地执行 mymath/__init__.py,并将这个包目录封装成一个 module 对象。

这种设计体现了 Python 的显式优于隐式哲学——你需要在 __init__.py 中明确声明"这个包对外暴露什么",而不是自动暴露所有子模块。

Mem0:为 AI Agent 构建持久化记忆层的技术解析与实现原理

Mem0 是什么?

Mem0 是一个开源的 AI 记忆层(Memory Layer) 框架,专为大型语言模型(LLM)应用提供长期记忆能力。与简单的对话历史存储不同,Mem0 实现了语义理解、实体关系图谱、个性化偏好学习等高级记忆机制,使 AI 能够像人类一样"记住"用户、积累知识、并在多次会话中保持连续性。

其核心定位是介于传统 RAG(检索增强生成)与简单对话管理之间的智能记忆中间件,通过 分层记忆架构(Tiered Memory Architecture) 实现从短时记忆到长时记忆的完整生命周期管理。

MCP 完全指南:从入门到精通

入门篇:什么是 MCP?

MCP 的定义与价值

MCP(Model Context Protocol,模型上下文协议) 是一个开源标准协议,用于连接 AI 应用程序与外部系统。它就像 USB-C 接口 一样,为 AI 应用提供了一种标准化的方式来连接数据源、工具和工作流。

MCP 能做什么?

  • 让 AI 助手访问你的 Google Calendar 和 Notion,成为个性化助理
  • 让 Claude Code 根据 Figma 设计生成完整 Web 应用
  • 让企业聊天机器人连接多个数据库,通过对话分析数据
  • 让 AI 模型创建 3D 设计并通过 3D 打印机输出

为什么 MCP 很重要?

角色 收益
开发者 减少开发时间和复杂度,无需为每个集成重复造轮子
AI 应用 接入丰富的数据源和工具生态,增强能力
终端用户 获得更强大的 AI 应用,能访问个人数据并执行操作

Kimi官方 Prompt 最佳实践指南

本文转载自 Kimi 官方文档入门指南:Prompt 最佳实践一文。

System Prompt最佳实践:system prompt(系统提示)指的是模型在生成文本或响应之前所接收的初始输入或指令,这个提示对于模型的运作至关重要

大模型中 system prompt指的是什么,为什么它很重要?

在大型机器学习模型,尤其是自然语言处理(NLP)模型中,"system prompt"(系统提示)指的是模型在生成文本或响应之前所接收的初始输入或指令。这个提示对于模型的运作至关重要,原因如下:

  1. 指导生成内容:系统提示为模型提供了生成文本的起点,帮助模型理解用户的需求和上下文。
  2. 确定响应类型:提示可以明确告诉模型需要生成哪种类型的响应,比如回答问题、撰写文章、进行翻译等。
  3. 设定上下文:通过包含必要的上下文信息,系统提示可以帮助模型更好地理解问题,并生成更准确的回答。
  4. 影响生成文本的风格和语气:系统提示还可以设定文本的风格和语气,比如正式、非正式、幽默、严肃等。
  5. 控制生成文本的长度:在某些情况下,系统提示可以包含对生成文本长度的要求。
  6. 避免不当内容:通过精心设计系统提示,可以减少模型生成不当或不安全内容的风险。
  7. 提高效率:一个好的系统提示可以提高模型的效率,因为它减少了模型需要猜测的内容,从而加快了生成过程。
  8. 用户交互:在交互式应用中,系统提示是用户与模型之间沟通的桥梁,确保了用户意图的准确传达。

在设计系统提示时,需要考虑到这些因素,以确保模型能够生成高质量、相关且符合预期的输出。

编写清晰的说明

为什么需要向模型输出清晰的说明?

模型无法读懂你的想法,如果输出内容太长,可要求模型简短回复。如果输出内容太简单,可要求模型进行专家级写作。如果你不喜欢输出的格式,请向模型展示你希望看到的格式。模型越少猜测你的需求,你越有可能得到满意的结果。

马修·伯恩斯坦讲线性代数系列:矩阵作为函数

原文:Matrices as functions

线性代数的核心思想是将矩阵表示函数。在本文中,我们将考察几个常见的初等函数,并讨论它们对应的矩阵。

引言

回想一下,矩阵-向量乘法 的定义使我们能够从以下意义上将矩阵视为函数:如果我们固定一个矩阵 \(\boldsymbol{A} \in \mathbb{R}^{m \times n}\),该矩阵将 \(\mathbb{R}^n\) 中的向量映射到 \(\mathbb{R}^m\) 中的向量。也就是说,我们可以定义一个函数 \(T : \mathbb{R}^n \rightarrow \mathbb{R}^m\)

\[ T(\boldsymbol{x}) := \boldsymbol{A}\boldsymbol{x} \]

在本文中,我们将考察几个常见的初等函数,并讨论它们对应的矩阵。

ConnectRPC:下一代 Protobuf RPC 框架——当 gRPC 遇见现代 Web 开发

为什么我们需要"更好的 gRPC"?

自 2016 年 Google 开源 gRPC 以来,它凭借 Protocol Buffers 的高效序列化和 HTTP/2 的多路复用,迅速成为微服务间通信的事实标准。然而,随着云原生架构的演进和前后端分离开发的普及,gRPC 的一些设计局限日益凸显:

  • 浏览器兼容性:gRPC 依赖 HTTP/2 的底层特性,浏览器无法直接调用,必须借助 grpc-web + Envoy 代理
  • 调试困难:二进制协议让 curl 和浏览器开发者工具束手无策
  • 部署复杂:需要特殊的负载均衡器支持 HTTP/2 trailers
  • 代码冗长:生成的客户端代码模板化严重,与现代开发体验脱节

ConnectRPC(简称 Connect)正是 Buf 团队为解决这些痛点而打造的现代化 RPC 框架。它不仅完全兼容 gRPC 生态,更带来了浏览器原生支持、HTTP/1.1 回退、以及 REST 般的调试体验。