架构技术评论

从 Langchain 到 Langgraph:构建更智能的 LLM 应用架构

过去一年,大语言模型(LLM)的能力突飞猛进,也带来了“AI 应用开发”这个全新领域的火热。而在所有的工具链中,Langchain 几乎成了构建 LLM 应用的代名词。然而,随着项目复杂度的上升,Langchain 的线性调用方式开始显得力不从心。Langgraph 正是在这样的背景下应运而生。


什么是 Langchain?

Langchain 是一个用于构建 LLM 应用的 Python 框架,它提供了对 LLM、Prompt 模板、Memory、Tool、Chain 等概念的封装,旨在让开发者更容易地把语言模型接入到实际应用中。

一个典型的 Langchain 应用,可能长这样:

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

llm = ChatOpenAI()
prompt = PromptTemplate.from_template("你是谁?")
chain = LLMChain(llm=llm, prompt=prompt)

result = chain.run("")
print(result)

这个例子非常简单,但实际项目通常涉及多个子任务(例如:信息抽取、查询改写、多轮交互、调用工具等),这种线性链式结构会很快遇到瓶颈。


什么是 Langgraph?

Langgraph 是一个在 Langchain 基础上构建的状态机框架,它允许开发者以图(Graph)的方式组织多个节点,并在节点间定义跳转逻辑。简单来说,它把 Langchain 中的链(Chain)升级成了“图”(Graph),解决了流程控制复杂、多轮交互难以建模的问题。

Langgraph 最核心的概念是:

  • • Node(节点):一个节点通常是调用 LLM、运行一个函数、或执行某种任务。
  • • Edge(边):定义了从一个节点到另一个节点的跳转逻辑。
  • • State(状态):每轮对话或执行过程中携带的信息。

下面是一个 Langgraph 的简单例子:

import operator
from langgraph.graph import StateGraph, END
from langchain.chat_models import ChatOpenAI

# 定义状态数据结构
from typing import TypedDict
classMyState(TypedDict):
input: str
    answer: str

# 定义节点函数
defreply_node(state: MyState) -> MyState:
    llm = ChatOpenAI()
    content = llm.predict(f"请回答问题:{state['input']}")
return {"input": state["input"], "answer": content}

# 构建图结构
graph = StateGraph(MyState)
graph.add_node("reply", reply_node)
graph.set_entry_point("reply")
graph.set_finish_point("reply")

app = graph.compile()
result = app.invoke({"input": "地球到月球有多远?"})
print(result)

是不是感觉逻辑更清晰了?相比 Langchain 的链式结构,Langgraph 的图结构更适合处理需要判断、跳转、循环的复杂流程。


典型使用场景对比

场景
Langchain 适用
Langgraph 更优
简单问答
✅
✅
多轮对话
✅
✅(更清晰)
工具调用
✅
✅
条件判断跳转
❌
✅
状态管理
一般
强
多节点分支流程
❌
✅

Langgraph 更像是“Langchain 的 Plus 版本”,适用于对流程控制要求更高的场景,比如:

  • • 多轮问答中动态跳转(比如判断是否结束)
  • • 多 Agent 协作(比如一个审校 Agent,一个改写 Agent)
  • • 复杂任务流程管理(如调用多个工具 + 多轮生成)

图解:Langchain vs Langgraph

Langchain:

  Prompt -> LLM -> Output

Langgraph:

  [input] --> (Node A) --> (Node B) --> END
                 \--> (Node C) --/

图中的 Langchain 是线性的,而 Langgraph 则像流程图,有分支、有判断、更灵活。


实战:一个“旅行助手”示例

假设我们希望构建一个智能旅行助手,它可以:

  1. 1. 获取用户的旅行目的地
  2. 2. 判断用户是想查天气还是推荐景点
  3. 3. 根据判断调用不同的模块

我们使用 Langgraph 来实现这个功能:

from langchain.chat_models import ChatOpenAI
from langgraph.graph import StateGraph, END
from typing import TypedDict

classTravelState(TypedDict):
input: str
    goal: str
    result: str

llm = ChatOpenAI()

defclassify_goal(state: TravelState) -> str:
    text = state["input"]
if"天气"in text:
return"weather"
elif"景点"in text:
return"attractions"
else:
return END

defget_weather(state: TravelState) -> TravelState:
    result = llm.predict(f"请告诉我{state['input']}的天气")
return {**state, "result": result}

defget_attractions(state: TravelState) -> TravelState:
    result = llm.predict(f"请推荐{state['input']}的景点")
return {**state, "result": result}

# 构建图结构
graph = StateGraph(TravelState)
graph.add_node("weather", get_weather)
graph.add_node("attractions", get_attractions)
graph.add_conditional_edges(
"classify",
    classify_goal,
    {"weather": "weather", "attractions": "attractions", END: END}
)
graph.set_entry_point("classify")
graph.set_finish_point("weather")
graph.set_finish_point("attractions")

app = graph.compile()
result = app.invoke({"input": "我要去东京看天气"})
print(result)

你可以很容易扩展更多节点,比如:加一个餐厅推荐、酒店预订、甚至是日语翻译。


总结

Langchain 和 Langgraph 各有所长:

  • • Langchain 更轻量,适合线性流程、原型开发
  • • Langgraph 更强大,适合复杂流程、生产环境

如果你已经在用 Langchain,不妨试着用 Langgraph 改写一下自己的核心链条,你会发现它更易维护、更具扩展性。

未来 LLM 应用会越来越复杂,Langgraph 提供的“状态机 + 图建模”方式,很可能会成为主流。


建议阅读资源:

  • • Langchain 官方文档:https://docs.langchain.com
  • • Langgraph 示例代码:https://github.com/langchain-ai/langgraph