🌈 个人主页:Zfox_
🔥 系列专栏:LangChain-AI 应用开发框架

一:🔥 LangChain:LLM应⽤开发的核⼼框架

🦋 LangChain介绍

🎀 复杂场景下,LLM嵌⼊应⽤的问题?

使⽤过⼀些原⽣⼤模型的⼈可能会发现⼀些问题,尽管⼤模型的在某些⽅⾯表现振奋⼈⼼,例如将其当作搜索引擎去使⽤,LLM⽣成的答案可能要⽐其他搜索引擎查到的答案更符合你的预期,但要是在复杂的场景下使⽤,如将LLM嵌⼊应⽤程序时却遭遇了全新难题:

  • 简单提⽰词(Prompt)得到的答案经常出现幻觉?
  • 提⽰词结构是否可以统⼀规范?
  • 如何实现开发过程中⼤模型的轻松、灵活切换?
  • ⼤模型输出是⾮结构化的,怎样与要求结构化数据的程序接⼝交互?
  • 如何克服预训练模型知识陈旧的问题,引⼊实时更新?
  • 如何连接模型与外部⼯具或系统,执⾏具体任务?

举个例⼦,我们要开发⼀个智能医疗咨询助⼿,⽤⼾可以向其描述症状(例如:“我最近头痛、发烧,还有些咳嗽”),助⼿能提供初步的疾病可能性分析、建议的⽇常护理⽅法,并提醒是否需要⽴即就医。

在这里插入图片描述
困难:让LLM⾃发地、可靠地决定在何时、如何调⽤哪个外部⼯具,并正确解析⼯具返回的结果,是⼀个极其复杂的系统设计问题。

这个医疗助⼿例⼦集中体现了所有描述中的难题。为了解决它们,业界正在形成⼀整套称为“LLM应⽤⼯程”的最佳实践和技术栈:

  • 针对幻觉、提⽰词规范:采⽤“提⽰词⼯程”和“检索增强⽣成(RAG)”。为医疗助⼿设计严谨、系统的提⽰词模板,并强制模型在回答前先从权威、实时的医疗知识库中检索信息,⽽不是仅凭记忆回答。
  • 针对模型切换:使⽤LLMAPI抽象层(如LangChain)。这些中间件统⼀了不同模型的接⼝,让开发者通过配置⽽⾮修改代码来切换模型。
  • 针对⾮结构化输出:采⽤“输出解析”技术。强制要求模型以JSON等格式输出,并在提⽰词中严格定义JSON的Schema。⼀些框架(如LangChain)可以⾃动将模型输出解析为预定义的Pydantic对象。
  • 针对知识陈旧:主要依靠RAG来注⼊实时、外部的知识。
  • 针对连接外部⼯具:采⽤“智能体(Agent)”框架。让LLM作为⼤脑,根据⽤⼾请求规划步骤、选择⼯具(如计算器、数据库API、搜索引擎),并执⾏任务。

最终,⼀个成熟的“智能医疗咨询助⼿”不会是直接调⽤原⽣⼤模型,⽽是⼀个由精⼼设计的提⽰词、RAG系统、外部⼯具API、输出解析器等共同组成的复杂系统。原⽣⼤模型只是这个系统的核⼼引擎之⼀,⽽⾮全部。

🎀 LangChain:解决痛点

LangChain可以解决上述所有问题!

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

在这里插入图片描述

LangChain:核⼼概念就是“链”(Chain),它将不同的模块(LLM,Prompts,Tools,Memory, OutputParsers)像乐⾼积⽊⼀样组合起来,构建复杂的AI⼯作流。

  • 组件(Components):⽤来帮助当我们在构建应⽤程序时,提供⼀系列的核⼼构建块,例如语⾔模型、输出解析器、检索器等。
  • ⾃然语⾔处理流程(NLP):指的是完成⼀个特定NLP任务所需的⼀系列步骤。例如,构建⼀个“基于公司⽂档的问答机器⼈”的流程可能包括:读取⽂档、分割⽂本、将⽂本转换为向量(嵌⼊)、存储向量、接收⽤⼾问题、搜索相关⽂本段、将问题和⽂本段组合发送给⼤语⾔模型(LLM)、解析模型输出并返回答案等。

🎀 LangChain的技术特点

LangChain框架的设计精髓在于以链式(Chain)的⽅式整合多个组件,从⽽构建出功能丰富的⼤语⾔模型应⽤。链式表⽰LangChain允许将多个步骤或多个组件串联起来,⽆需各个组件各⾃完成其能⼒,⽽是⼀次性执⾏这个"链"上的所有流程!

举⼀个最简单的例⼦,若我们想借助提⽰词完成⼀次对于LLM的提问,在LangChain中⾄少需要定义两个组件:

  • 提⽰词模板组件
  • ⼤模型组件

使⽤时,我们可以:

在这里插入图片描述
这相当于,提⽰词模板组件执⾏了⼀次,⼤模型组件也执⾏了⼀次。⽽对于链式执⾏来说,只需执⾏⼀次链即可:
在这里插入图片描述

LangChain框架提供了⼀系列标准化模块与接⼝,主要包括以下⽅⾯:

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

对于上述技术内容,LangChain的开源组件和第三⽅集成可以轻松⽀持快速上⼿,帮助我们构建应⽤程序。除此之外,使⽤LangGraph可以构建⽀持⼈机交互的有状态代理。LangChain公司也在围绕框架构建完整的⽣态系统,包括推出LangSmith(⼀个⽤于调试、监控和评估LLM应⽤的平台)以及LangGraphPlatform(⽤于LangChain应⽤的部署、运维)等,为开发者提供从开发到⽣产的⼀站式⽀持。

二:🔥 LangGraph:⾯向复杂⼯作流的图式架构

🦋 LangGraph介绍

🎀 LangChain的局限性

LangGraph是LangChain⽣态系统中晚些出现的⼀个框架,其诞⽣背景与⼤型语⾔模型应⽤⽇益增⻓的复杂性密切相关。随着开发者尝试构建更⾼级的AI代理和多轮对话系统,传统链式结构的局限性逐渐显现:

  • 链式流程通常是线性的、预先定义好的步骤,难以处理需要循环、分⽀或⻓期状态维护的复杂场景。
  • 此外,在构建多智能体协作、需要⼈⼯介⼊(Human-in-the-loop)或⻓时间运⾏的任务时,需要更灵活的⼯作流管理和状态持久化⽀持。

举个例⼦,假设我们要构建⼀个AI代理,来⾃动处理⽤⼾提交的客服⼯单(例如:退货请求、产品咨询、投诉等)。⼀个理想的流程是:

在这里插入图片描述
如果⽤传统的 Chain A -> Chain B -> Chain C 的线性结构来构建,会遇到以下具体问题:

问题1:难以处理循环和分⽀(⽆法动态路由和多次询问)

在 “信息收集” 阶段,⽤⼾第⼀次可能提供了⼀个不完整的订单号。链式流程是单向的,它⽆法⾃动“跳回”上⼀步再次请求⽤⼾补充信息。

结果:只能让整个链失败,或者⽣成⼀个僵硬的错误消息,⽤⼾体验⾮常差。⽆法实现“只要信息不完整,就持续询问直到完整”这样的逻辑。

问题2:状态维护困难(⽆法⻓时间运⾏和记忆上下⽂)

客⼾服务对话通常是多轮的,可能持续⼏分钟、⼏⼩时甚⾄⼏天。传统的链在每次调⽤时都是“⽆状态”的。

结果:状态管理(记忆)的重担完全落在了开发者⾝上,需要依赖外部数据库或缓存来⼿动存储和读取对话状态,代码会变得⾮常臃肿和脆弱。

问题3:难以融⼊⼈⼯介⼊(Human-in-the-loop)

当AI⽆法处理时,需要⽆缝地转交给⼈。在链式流程中,这意味着链的执⾏到此中断。⽆法优雅地实现暂停AI流程,等待⼈⼯处理完毕,再将结果返回,继续执⾏后续⾃动化步骤。

结果:整个流程会断裂成两半:AI部分和⼈⼯部分。你需要构建另外的系统来通知⼈⼯、接收⼈⼯处理结果,并重新触发后续的链,这完全破坏了⼯作流的完整性和可管理性。

问题4:僵化的流程(⽆法根据条件动态跳转)

不同的⽤⼾意图需要完全不同的⼦流程。例如判断⽤⼾意图:

  • 是“投诉”。我们的链可能预先设计为⾛ A->B->C 路径。
  • 是“产品咨询”,可能需要⾛ A->D->E 路径。

在链式结构中,实现这种条件分⽀⾮常笨拙,通常需要编写⼀个巨⼤的“主链”,内部⽤⼀系列 if-else 语句来调⽤不同的⼦链。

结果:流程图的逻辑变成了代码中的控制流语句,⽽不是清晰可⻅的图形化结构。这使得⼯作流难以设计、调试和可视化。

🎀 LangGraph:解决痛点

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

LangChain团队将LangGraph定位为“低层次的编排框架”,⽤于构建可控、可靠的AI代理⼯作流。⽬前,LangGraph已经在⼀些⽣产环境中得到应⽤,例如LinkedIn、Uber、GitLab等公司据报道使⽤LangGraph来构建复杂的⽣成式AI代理系统。

例如,我们将上述链式⽰例改为图结构:

在这里插入图片描述
在上述⽰例中,我们可以定义图状态,⽤于存储流程中的临时数据和决策点,例如:

  • intent :⽤⼾意图(字符串,如"return","inquiry","complaint")。
  • collected_info :字典,存储收集到的信息(如订单号、问题描述)。
  • needs_human :布尔值,表⽰是否需要⼈⼯介⼊(默认False)。
  • is_verified :布尔值,表⽰信息是否已验证(默认False)。
  • is_complete :布尔值,表⽰流程是否完成(默认False)。
  • message_history :列表,存储对话历史,⽤于多轮交互。

LangGraph并不是要取代LangChain,⽽是对LangChain的扩展和补充。LangGraph底层⼤量复⽤了LangChain的组件(如模型接⼝、⼯具、记忆等),开发者可以在LangGraph的节点中直接使⽤LangChain的链或代理作为⼦流程。因此,LangGraph与LangChain是互补关系:

  • 对于简单的线性任务,LangChain的链式结构已经⾜够⾼效;
  • ⽽对于需要复杂控制流、⻓期状态和多智能体的场景,LangGraph提供了更强⼤的⽀持。

🎀 LangGraph的技术特点

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

  • 节点:表⽰操作或状态
  • 边:表⽰节点之间的转移和数据流。

在这里插入图片描述

这种图式架构相⽐LangChain的链式结构更加灵活,主要体现在:

  • 循环与分⽀:LangGraph中的节点(Node)可以连接到其他任何节点,包括⾃⼰。你可以轻松设置⼀个“信息收集”节点,如果信息不完整,就让流程再次循环回这个节点本⾝,直到条件满⾜为⽌。
  • 动态路由:通过条件边,可以根据当前状态的值,动态决定下⼀个要执⾏的节点。例如,在“分类”节点之后,可以根据分类结果,⾃动路由到“处理退货”、“处理咨询”或“处理投诉”等完全不同的⼦图中去。
  • 状态维护:LangGraph有⼀个核⼼的状态对象,在整个图的执⾏过程中⾃动持久化和传递。每个节点都可以读取和修改这个状态。这意味着⽤⼾的对话历史、已收集的信息都会⾃动保留,轻松⽀持⻓时间运⾏的任务。
  • 持久执⾏:构建能够经受住故障并能⻓时间运⾏的代理,⾃动从上次中断的地⽅恢复。
  • ⼈机协作:通过在执⾏过程中的任何时刻检查和修改代理状态,⽆缝融⼊⼈⼯监督。
  • 全⾯记忆:创建真正具有状态的代理,兼具⽤于持续推理的短期⼯作记忆和跨会话的⻓期持久记忆。
  • 使⽤LangSmith进⾏调试:借助可视化⼯具深⼊洞察复杂代理⾏为,这些⼯具可追踪执⾏路径、捕获状态转换并提供详细的运⾏时指标。
  • ⽣产级部署:借助专为处理有状态、⻓时间运⾏⼯作流的独特挑战⽽设计的可扩展基础设施,⾃信地部署复杂的代理系统。

总结来说,构建AI代理应⽤时,如果⽤传统链式结构构建,会变成⼀个僵硬、脆弱、难以维护的“⾯条代码”。⽽LangGraph则能将其建模为⼀个灵活、可靠、可视化程度⾼、且⽀持复杂逻辑(循环、分⽀、⼈⼯)的⼯作流图,这正是它为了解决⽇益复杂的LLM应⽤⽽诞⽣的价值所在。

三:🔥 LangChain软件包安装

LangChain⽣态系统包含不同的包,⽤来准确选择要安装的功能。如下图所⽰:

在这里插入图片描述

  • 主 langchain 包

这个包是使⽤LangChain的起点,安装⽅式如下:

pip install langchain
  • langchain-core 包

除了 langsmith SDK之外,LangChain⽣态系统中的所有包都依赖于 langchain-core ,包含其它包使⽤的基类和抽象,以及LangChainLCEL(表达式语⾔)。

它由 langchain 包⾃动安装,不需要显式安装该包。但是,如果使⽤的功能仅在该依赖项的特定版本中可⽤,则可以选择这样做。如果这样做,则应确保已安装或固定的版本与我们使⽤的任何其他集成包兼容。

pip install langchain-core
  • Integrations集成包

LangChain的⼤部分价值来⾃于将各种能⼒进⾏集成,如各类模型集成(如OpenAI和Anthropic)、各类组件集成(如数据存储、⼯具等)等。LangChain中集成好的包⻅这⾥。

对于所需依赖项,我们需要单独安装。例如要使⽤OpenAI,可以运⾏:

pip install langchain-openai
  • langchain-community 包

简单来说,任何尚未拆分到⾃⼰的包中的集成,都存在于 langchain-community 包中。安装⽅式:

pip install langchain-community
  • langgraph 包

langgraph 是⼀个库,⽤于使⽤LLM构建有状态的应⽤程序。它与LangChain顺利集成。安装⽅式:

pip install langgraph
  • LangSmithSDK

LangSmithSDK由LangChain⾃动安装。但它不依赖于 langchain-core ,如果需要,可以独⽴安装和使⽤,安装⽅式:

pip install langsmith

后续学习过程中,若遇到使⽤的功能未在上述提到的包中,我们也会提前说明。这⼀篇章只需了解下 LangChain其主要能⼒的包分布规则即可。

四:🔥 共勉

😋 以上就是我对 LangChain与LangGraph介绍 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐