Songbo Zhang

The true revolutionary is guided by great feelings of love.

随着LLM能力的飞速发展,一个核心问题摆在开发者面前:如何将 LLM 从一个单纯的文本生成器,转变为一个能够执行复杂、多步骤任务,并与外部世界进行动态交互的Agent?LangChain 为此提供了一个功能强大且极具扩展性的开源框架

为什么需要 LangChain

大型语言模型,如 OpenAI 的 GPT 系列,在自然语言的理解与生成方面展现了卓越的能力。然而,一个独立的 LLM 在本质上可以被视为一个无状态(Stateless)的函数调用。它缺乏与外部数据源的实时连接、没有持久化的记忆能力,并且难以独立地执行需要多步规划与推理的复杂任务。

为了构建真正具备高价值的 AI 应用,开发者必须围绕 LLM 构建一个复杂的“认知架构”(Cognitive Architecture)。这套架构需要处理状态管理、外部工具调用、数据检索与整合等一系列问题。这正是 LangChain 框架的核心价值所在。

LangChain 并非要替代 LLM,而是一个强大的编排框架。它通过提供一系列标准化的、模块化的抽象组件,帮助开发者将 LLM 与外部数据源、API 接口以及其他计算逻辑高效地“链接”(Chain)起来,从而构建出具备上下文感知数据驱动行动能力的复杂Agent。

核心组件

LangChain 是模块化的,它将构建复杂 LLM 应用所需的过程分解为一系列独立但可组合的核心组件

1. Models

这是任何 LLM 应用的基础。LangChain 提供了统一的接口来与各种语言模型进行交互,屏蔽了底层模型提供商(如 OpenAI, Hugging Face, Cohere 等)的 API 差异。它主要分为两类:

  • LLMs: 指的是纯文本补全模型,接收一个字符串作为输入,返回一个字符串。
  • Chat Models: 指的是对话模型,其接口更加结构化,接收一个消息列表(ChatMessage)作为输入,返回一个 AIMessage。这种结构更适合处理多轮对话场景。

2. Prompts

Prompt 即给模型的指令。在实际应用中,Prompt 往往是动态生成的。LangChain 提供了强大的提示管理功能:

  • Prompt Templates: 允许开发者创建参数化的提示模板。这使得提示可以根据不同的输入动态生成,提高了复用性和可维护性。代码示例中的 ChatPromptTemplate 就是一个典型的例子,它定义了系统角色和用户输入的结构。

3. Chains

Chain 是 LangChain 的核心概念,代表了一系列对组件的顺序化调用,其中可能包括模型调用、工具调用或数据预处理等。通过 LangChain 表达式语言 (LCEL),开发者可以像拼接管道一样轻松地将不同的组件组合起来,构建出从简单到复杂的逻辑流。最基础的 LLMChain 就是将一个 Prompt Template 和一个 Model 链接起来。

4. Retrieval

为了让 LLM 能够回答关于特定领域或私有数据的问题,需要引入外部数据,这一过程即 RAG。LangChain 为此提供了一整套工具链:

  • Document Loaders: 从各种来源(如文本文件、PDF、网页、数据库)加载数据为标准化的 Document 格式。
  • Text Splitters: 将加载的长文档分割成适合模型处理的、语义完整的小块。
  • Vector Stores & Embeddings: 使用嵌入模型(Embeddings)将文本块向量化,并存入向量数据库(Vector Stores)中,以便进行高效的相似度搜索。
  • Retrievers: 负责根据用户查询,从向量数据库中检索出最相关的文本块。

5. Agents and Tools

如果说 Chain 遵循预设的路径执行任务,那么 Agent 则具备动态决策的能力。

  • Tools: 工具是 Agent 可以使用的具体能力,本质上是接受特定输入并返回结果的函数。例如,执行代码、调用 API、查询数据库等。在下面的代码示例中,search 函数就是一个被 @tool 装饰器定义的工具。
  • Agents: Agent 内部包含一个作为“大脑”的 LLM。它不直接回答问题,而是根据用户的输入和可用的工具集,进行思考和规划,决定下一步应该调用哪个工具,或者直接向用户返回最终答案。
  • Agent Executor: 这是 Agent 的运行时环境,负责实际执行 Agent 的决策,调用工具,并将工具的输出返回给 Agent,循环往复,直到任务完成。

6. Memory

为了解决 LLM 的无状态问题,LangChain 引入了 Memory 组件。它允许 Chain 或 Agent 在多轮交互中“记住”之前的信息,并将这些历史信息(如对话记录)整合到下一次的 Prompt 中,从而实现有状态的、连贯的交互。

简单的代码示例

PINN是什么

PINN 全称为 Physics Informed Neural Network,翻译过来就是物理信息神经网络。顾名思义,就是融合了物理信息的神经网络。

为什么要融合物理信息

最开始看到这个的时候,给我的第一印象其实是:既然深度神经网络已经能够很好地去拟合任何分布了,那么为什么还要去融合一个物理信息?

深度神经网络确实是强大的“通用函数逼近器” ,但它们的强大威力通常建立在“大数据”的基础上。然而,在分析许多复杂的物理、生物或工程系统时,数据的获取成本可能极其高昂,我们往往面临“小数据”的挑战。

在“小数据”情境下,传统的深度学习方法会暴露出明显的弱点 :

  • 缺乏鲁棒性:模型很容易在稀疏的数据点之间做出毫无意义的、错误的推断 。
  • 容易过拟合:网络会“记住”少数几个训练数据点,但其泛化能力极差,无法对未知情况做出准确预测。
  • 无法保证收敛:训练过程可能无法收敛到一个有意义的、符合现实的解 。

这时,物理信息的价值就体现出来了。在这些系统中,我们拥有大量基于第一性原理的先验知识,例如牛顿定律、能量守恒等。PINN的核心思想就是,将这些由偏微分方程(PDEs)描述的物理定律作为一种强大的正则化约束,融入到神经网络的训练中 。

这种做法带来了巨大的优势:

  1. 约束求解空间:物理定律极大地压缩了可行解的搜索空间,排除了那些不符合物理现实的解 。
  2. 提升数据效率:通过将物理规律编码为先验信息,PINN能够放大稀疏数据本身所包含的信息量 。这使得PINN可以仅用少量训练样本就能学习和泛化得很好,成为一种数据高效的学习算法 。

怎么去融合物理信息

PINN的融合方式非常巧妙,其核心在于构建一个特殊的复合损失函数。通过训练神经网络来最小化这个损失函数,从而近似PDE的求解。这个损失函数主要由两部分构成:一部分是监督已知数据的数据损失,另一部分是保证物理定律得以遵守的物理损失

$$MSE = MSE_u + MSE_f$$

1. 数据损失 MSE_u (Data Loss)

这部分和传统的监督学习完全一样。它负责衡量神经网络的预测值与我们已知的、稀疏的物理观测数据(例如初始条件和边界条件)之间的差距。其计算公式如下:

$$MSE_u = \frac{1}{N_u} \sum_{i=1}^{N_u} |u(t_u^i, x_u^i) - u^i|^2$$

这里的 (t_u^i, x_u^i) 是已知数据点的坐标,u^i 是该点的真实物理值,而 u(...) 是神经网络的预测值。

2. 物理损失 MSE_f (Physics Loss)

这是PINN的创新所在。为了让神经网络遵守物理定律,我们首先定义一个物理残差 f。这个残差就是将神经网络 u 代入到待求解的PDE中得到的表达式。以一个通用PDE $u_t + \mathcal{N}[u] = 0$ 为例,其物理残差为:

$$f := u_t + \mathcal{N}[u]$$

理论上,如果网络的解是完美的,那么这个物理残差 f 在求解域内的任何地方都应该等于0。

因此,物理损失的目标就是让这个残差 f 在求解域内的大量随机点(称为**“配置点”**或”collocation points”)上尽可能趋近于0。其计算公式为:

$$MSE_f = \frac{1}{N_f} \sum_{i=1}^{N_f} |f(t_f^i, x_f^i)|^2$$

这里的 (t_f^i, x_f^i) 就是那些随机生成的配置点,f(...) 是在这些点上计算出的物理残差值。

关键技术:自动微分

值得一提的是,在计算物理残差 f 时,我们需要求解神经网络关于其输入(时间和空间坐标)的各阶导数(如$u_t, u_x, u_{xx}$)。这在PINN中是通过**自动微分(Automatic Differentiation)**技术实现的。这项技术能够精确、高效地计算出复杂的导数值,是实现PINN框架的基石。

通过同时最小化这两部分损失,神经网络就被迫去寻找一个函数,这个函数不仅要穿过所有已知的观测数据点,还必须在其广阔的定义域内都遵守潜在的物理学规律。

具体案例:求解伯格斯方程

伯格斯方程是流体力学、非线性声学和交通流等多个应用数学领域中的一个基本偏微分方程。它因能够在粘性参数很小的情况下形成激波而闻名,这种现象用传统的数值方法很难精确求解。

1. 问题设定 (Problem Setup)

论文中研究的具体问题如下:

  • 偏微分方程 (PDE): $u_t + uu_x - (0.01/\pi)u_{xx} = 0$
  • 求解域: 空间 $x \in [-1, 1]$,时间 $t \in [0, 1]$
  • 初始条件: $u(0, x) = -\sin(\pi x)$
  • 边界条件: $u(t, -1) = u(t, 1) = 0$

2. 物理信息神经网络 (PINN) 的求解方法

该方法的核心思想是使用一个深度神经网络来近似解 $u(t, x)$ 。然后,通过最小化一个复合损失函数来训练这个网络,该损失函数包括两部分:

  • $MSE_u$ (数据损失): 这部分确保神经网络的预测值与已知的初始和边界条件数据相匹配。其公式为:
    $MSE_{u}=\frac{1}{N_{u}}\sum_{i=1}^{N_{u}}|u(t_{u}^{i},x_{u}^{i})-u^{i}|^{2}$。
    在这里,${t_{u}^{i},x_{u}^{i},u^{i}}$ 是 $N_u$ 个已知的初始和边界训练数据点 。

  • $MSE_f$ (物理损失): 这是PINN的关键。它定义了一个物理残差项 $f := u_t + uu_x - (0.01/\pi)u_{xx}$ 。理论上,如果网络的预测是完美的,$f$ 在整个求解域内都应该为0。因此,这部分损失函数通过在求解域内部选取大量的“配置点”(collocation points),并强制这些点上的 $f$ 值接近于0,从而将物理定律编码到网络中 。其公式为:
    $MSE_{f}=\frac{1}{N_{f}}\sum_{i=1}^{N_{f}}|f(t_{f}^{i},x_{f}^{i})|^{2}$ 。
    这里的 ${t_{f}^{i},x_{f}^{i}}$ 就是 $N_f$ 个配置点 。

通过同时最小化这两部分损失,网络被迫学习一个不仅拟合已知数据,而且还遵守伯格斯方程的解。

自我感觉大一一整学年过的挺棒的,总体来说算是完成高三毕业的时候对大学第一年的任务了。

真的很感激遇到的所有的人,没有很多来自他们的帮助,是没办法到现在的地步的

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

0%