work hard work smart

专注于AI+Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LangGraph 第一个LangGraph

Posted on 2026-10-04 21:41  work hard work smart  阅读(5)  评论(0)    收藏  举报

LangChain是基于LangChain构建的,面向智能体多轮交互/状态持久化/分支并执行图结构的工作流框架

LangGraph = LangChain + 图  + 状态机

 

LangChian应用场景

多步复杂推理

长时间运行任务(数小时、数天)

需要人工(Human-in-the-Loop)

追求生产级稳定性

 

LangGraph技术架构

image

 

 

第一个LangGraph

from typing import TypedDict, Annotated, List, Dict
from langgraph.graph import StateGraph, START, END
import uuid

# 1.定义State(可选)
class HelloState(TypedDict):
    name: str
    greeting: str


# 2.定义节点Node
def greet(helloState: HelloState) -> dict:
    name = helloState["name"]
    return {"greeting": f"你好,{name}"}

def add_emoji(helloState:HelloState) -> dict:
    greeting = helloState["greeting"]
    return {"greeting": greeting + "  。。。😄"}


# 3.构建图graph
graph = StateGraph(HelloState)

graph.add_node("greeting",greet)
graph.add_node("add_emoji",add_emoji)

graph.add_edge(START, "greeting")
graph.add_edge("greeting","add_emoji")
graph.add_edge("add_emoji",END)


# 4.编译图
app = graph.compile()

# 5.运行
# invoke()方法只接收状态字典作为核心参数
result = app.invoke({"name":"z3"})
print(result)
print(result["greeting"])



#
# #6 打印图的边和节点信息
#6.1 打印图的ascii可视化结构
print(app.get_graph().print_ascii())
print("="*50)
#
# #6.2 打印图的Mermaid代码可视化结构并通过https://www.processon.com/mermaid编辑器查看
print(app.get_graph().draw_mermaid())
print("="*50)



#6.3 生成 PNG并写入文件
png_bytes = app.get_graph().draw_mermaid_png(max_retries=2,retry_delay=2.0)
output_path = "langgraph" + str(uuid.uuid4())[:8] + ".png"
with open(output_path, "wb") as f:
    f.write(png_bytes)
print(f"图片已生成:{output_path}")

  

运行结果:

 

{'name': 'z3', 'greeting': '你好,z3  。。。😄'}
你好,z3  。。。😄
+-----------+  
| __start__ |  
+-----------+  
      *        
      *        
      *        
+----------+   
| greeting |   
+----------+   
      *        
      *        
      *        
+-----------+  
| add_emoji |  
+-----------+  
      *        
      *        
      *        
 +---------+   
 | __end__ |   
 +---------+   
None
==================================================
---
config:
  flowchart:
    curve: linear
---
graph TD;
	__start__([<p>__start__</p>]):::first
	greeting(greeting)
	add_emoji(add_emoji)
	__end__([<p>__end__</p>]):::last
	__start__ --> greeting;
	greeting --> add_emoji;
	add_emoji --> __end__;
	classDef default fill:#f2f0ff,line-height:1.2
	classDef first fill-opacity:0
	classDef last fill:#bfb6fc

==================================================
图片已生成:langgraph4e0b0152.png

  

将打印的Mermaid代码拷贝到ProcessOn网站

image

 

 

 

LangGraph 中使用LLM作为节点

"""
LangGraph 简单案例HelloWorld:
构建一个最小的有向图,流程是:START → 模型节点 → END

LangGraph的灵魂:State(状态) + Nodes(节点) + Edges(边) + Graph(图)
"""

import uuid
from typing import TypedDict, Annotated, List

from dotenv import load_dotenv
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
import os
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage

load_dotenv()

# ========== 1. 定义状态(State) ==========
# 存储对话消息
class MessageState(TypedDict):
    # messages 是一个消息列表,Annotated + add_messages 表示支持自动追加消息
    messages: Annotated[List, add_messages]

# ========== 2. 定义大模型 ==========
llm = init_chat_model(
    model="qwen-plus",
    model_provider="openai",
    api_key=os.getenv("aliQwen-api"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# ========== 3. 定义节点函数 ==========
# 节点:调用大模型,并把回复加入到 state["messages"] 里
def model_node(state: MessageState):
    reply = llm.invoke(state["messages"])   # 输入历史消息,调用模型
    return {"messages": [reply]}            # 返回新消息,自动加到 state

# ========== 4. 构建图结构 ==========
graph = StateGraph(MessageState)            # 初始化图,指定 State 类型

graph.add_node("model", model_node)         # 添加一个节点,名字叫 "model"

graph.add_edge(START, "model")      # 从 START 到 "model"
graph.add_edge("model", END)        # 从 "model" 到 END
# 打印图的边和节点信息
#print(graph.edges)
print()
#print(graph.nodes)

# ========== 5. 编译==========
app = graph.compile()

# ========== 6. 运行 ==========
#result = app.invoke({"messages": [HumanMessage(content="请用一句话解释什么是 LangGraph。")]})
result = app.invoke({"messages": "请用一句话解释什么是 LangGraph。"})

# 打印模型的最后一条回复
print("模型回答:", result["messages"][-1].content)

print()
# =========================
#1. 打印图的ascii可视化结构
print(app.get_graph().print_ascii())
print("="*50)

#2. 打印图的Mermaid代码可视化结构并通过https://www.processon.com/mermaid编辑器查看
print(app.get_graph().draw_mermaid())
print("="*50)

#3. 生成 PNG并写入文件
# png_bytes = app.get_graph().draw_mermaid_png()
# output_path = "langgraph" + str(uuid.uuid4())[:8] + ".png"
# with open(output_path, "wb") as f:
#     f.write(png_bytes)
# print(f"图片已生成:{output_path}")