一.LangChain 和 LangGraph 介绍

LangChain 是⼀个用于开发由大语言模型(LLM)驱动的应用程序的框架。它通过将自然语言处理(NLP)流程拆解为标准化组件,让开发者能够自由组合并高效定制工作流。

LangChain 框架的设计精髓在于以链式(Chain)的方式整合多个组件,从而构建出功能丰富的大语言模型应用。链式表示 LangChain 允许将多个步骤或多个组件串联起来,无需各个组件各自完成其能力,而是一次性执行这个"链"上的所有流程。

LangChain 框架提供了一系列标准化模块与接口,主要包括以下方面:

统一的模型调用 通过抽象化的接口支持多种大语言模型(例如 OpenAI GPT-4/5、AnthropicClaude 等)和嵌入模型,使开发者可以灵活切换不同模型供应商
灵活的提示词管理 提供提示词模板(Prompt Templates),支持动态生成输入内容,并可管理少样本示例与提示选择策略,以提升模型响应质量
可组合的任务链(Chains) 允许将多个步骤串联成完整流程,如先检索文档再生成回复,或组合多次模型调用。开发者能够通过自定义链实现复杂的任务编排
上下文记忆机制(Memory) 用于存储多轮对话中的状态信息。LangChain 曾提供多种记忆管理方案(如对话历史记忆和摘要记忆),以实现连贯的交互体验(注:该功能目前已由 LangGraph支持,原有实现已过时)
检索与向量存储集成 支持从外部加载文档,经分割和向量化处理后存储至向量数据库,在查询时检索相关信息并输入大模型模型,帮助构建检索增强生成(RAG)类应用。LangChain 兼容多种主流向量数据库(如 FAISS、Pinecone、Chroma)和文档加载工具,简化知识库应用的开发流程

LangChain 框架的链式结构有一定的局限性:

1)链式流程通常是线性的、预先定义好的步骤,难以处理需要循环、分支或长期状态维护的复杂场景;

2)在构建多智能体协作、需要人工介入(Human-in-the-loop)或长时间行为的任务时,需要更灵活的工作流管理和状态持久化支持。

为了解决这些问题,LangChain 团队于 2024 年推出了 LangGraph 框架,旨在提供一种图结构的、状态化的方式来构建复杂的 AI 代理应用。

LangChain 团队将 LangGraph 定位为“低层次的编排框架”,用于构建可控、可靠的 AI 代理工作流。

LangGraph 并不是要取代 LangChain,而是对 LangChain 的扩展和补充。LangGraph 底层大量复用了 LangChain 的组件(如模型接口、工具、记忆等),开发者可以在 LangGraph 的节点中直接使用 LangChain 的链或代理作为子流程。

LangGraph 将应用逻辑建模为图(Graph)结构,其中:

节点 表示操作或状态
表示节点之间的转移和数据流

二.LangChain 软件包安装

LangChain 生态系统包含不同的包如下图:

1.主 langchain包

pip install langchain

2.langchain-core 包

这个包由 langchain 包自动安装,不需要再安装,但是如果要使用的功能仅在该依赖项的特定版本中可用,则可以选择这样做。

pip install langchain-core

3.Integrations 集成包

LangChain 的大部分价值来自于将各种能力进行集成,如各类模型集成(如 OpenAI 和 Anthropic)、各类组件集成(如数据存储、工具等)等。

LangChain 中集成好的包:Integration packages - Docs by LangChain

对于所需依赖项,我们需要单独安装。比如安装 deepseek 的:

pip install langchain-deepseek

4.langchain-community 包

pip install langchain-community

5.langgraph 包

langgraph 是一个库,用于使用 LLM 构建有状态的应用程序。

pip install langgraph

6.LangSmith SDK

LangSmith SDK 由 LangChain 自动安装。但它不依赖于 langchain-core ,如果需要,可以独立安装和使用

pip install langsmith

三.快速上手

1.简单使用

# 1. 定义大模型
model = ChatDeepSeek(model_name="deepseek-reasoner", api_key="你的API KEY")

# 2. 定义消息
# 系统提示消息 SystemMessage  通常作为第一条消息传入
# 用户消息 HumanMessage
# AI 消息 AIMessage
messages = [
    SystemMessage(content="Translate the following from English into Chinese"),
    HumanMessage(content="hi!")
]

# 3. 调用大模型
result = model.invoke(messages)
print(result)

# 4. 定义输出解析器组件
parser = StrOutputParser()
print(parser.invoke(result))

# 5. 定义链
chain = model | parser
print(chain.invoke(messages))

2.Runnable 接口

Runnable 接口是使用 LangChain Components(组件)的基础。

Runnable 定义了一个标准接口,允许 Runnable 组件:

Invoked(调用) 单个输入转换为输出
Batched(批处理) 多个输入被有效地转换为输出
Streamed(流式传输) 输出在生成时进行流式传输
Inspected(检查) 可以访问有关 Runnable 的输入、输出和配置的原理图信息
spected(检查) 可以访问有关 u able 的输入、输出和配置的原理图信息
Composed(组合) 可以组合多个 Runnable,以使用 LCEL 协同工作以创建复杂的管道

像上面的语言模型,输出解析器,都是 Runnable 接口的实例(组件)。

3.LangChain Expression Language

LangChain Expression Language(LCEL):采用声明性方法,从现有 Runnable 对象构建新的Runnable 对象。

通过 LCEL 构建出的新的 Runnable 对象,被称为 RunnableSequence ,表示可运行序列。RunnableSequence 就是一种链。

重要的是, RunnableSequence 也是 Runnable 接口的实例 ,它实现了完整的 Runnable 接口。

# 原本的写法
model = ChatDeepSeek(model_name="deepseek-reasoner")
result = model.invoke(messages)

parser = StrOutputParser()
parser.invoke(result)
# 链写法
model = ChatDeepSeek(model_name="deepseek-reasoner")
# result = model.invoke(messages)

parser = StrOutputParser()
# parser.invoke(result)

chain = model | parser

LCEL 其实是一种编排解决方案,它使 LangChain 能够以优化的方式处理链的运行时执行。任何两个 Runnable 实例都可以“链”在一起成序列。上一个可运行对象的 .invoke() 调用的输出作为输入传递给下一个可运行对象。

model 的输出结果当作 parser 的输入。

除了使用 | 运算符,还可以使用下面两种方法:

chain = RunnableSequence(first=model, last=parser)
chain = model.pipe(parser)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐