1. 核心概念
1.1 状态(State)
- 定义:状态是工作流中共享的数据结构,用于在节点之间传递信息。
- 作用:存储上下文数据(如用户输入、中间结果、对话历史)并驱动流程逻辑。
- 代码示例:
from typing import TypedDict, List class State(TypedDict): input_text: str keywords: List[str] summary: str
1.2 节点(Node)
- 定义:节点是执行具体任务的函数,接收状态并返回更新后的状态。
- 作用:模块化任务逻辑(如文本处理、调用工具、生成回复)。
- 代码示例:
def extract_keywords(state: State) -> State: words = state["input_text"].split() state["keywords"] = [w for w in words if len(w) > 5] return state
1.3 边(Edge)
- 类型:
- 默认边:固定顺序执行。
- 条件边:根据状态动态选择下一个节点。
- 代码示例:
# 默认边 workflow.add_edge("extract_keywords", "generate_summary") # 条件边 def should_search_web(state: State) -> str: if len(state["keywords"]) < 3: return "web_search" else: return "generate_summary" workflow.add_conditional_edges("extract_keywords", should_search_web)
2. 工作流构建流程
2.1 初始化工作流
使用 StateGraph
创建工作流容器并定义状态类型:
from langgraph.graph import StateGraph
workflow = StateGraph(State)
2.2 添加节点
将任务逻辑封装为节点并添加到工作流中:
workflow.add_node("extract_keywords", extract_keywords)
workflow.add_node("generate_summary", generate_summary)
2.3 添加边
定义节点之间的连接关系:
# 默认边
workflow.add_edge("extract_keywords", "generate_summary")
# 条件边
def should_search_web(state: State) -> str:
if len(state["keywords"]) < 3:
return "web_search"
else:
return "generate_summary"
workflow.add_conditional_edges("extract_keywords", should_search_web)
2.4 设置入口点
指定工作流的起始节点:
workflow.set_entry_point("extract_keywords")
2.5 编译与执行
编译工作流并执行:
graph = workflow.compile()
result = graph.invoke({"input_text": "人工智能正在改变我们的生活和工作方式"})
print(result)
3. 高级功能
3.1 持久化层(Persistence Layer)
- 作用:保存工作流执行过程中的状态快照,支持调试和恢复。
- 代码示例:
from langgraph.checkpoint.memory import MemorySaver memory = MemorySaver() graph = workflow.compile(checkpointer=memory)
3.2 时间旅行(Time Travel)
- 作用:基于持久化状态快照,从任意历史节点恢复并分叉新路径。
- 代码示例:
thread_id = "user_123" result = graph.invoke({"input_text": "新问题"}, thread_id=thread_id)
3.3 工具节点(ToolNode)
- 作用:集成外部工具(如数据库查询、网络搜索)到工作流。
- 代码示例:
from langgraph.prebuilt import ToolNode from langchain_community.tools import TavilySearch tool = TavilySearch(max_results=2) tool_node = ToolNode(tools=[tool]) workflow.add_node("web_search", tool_node)
4. 智能客服项目示例
4.1 项目目标
构建一个智能客服系统,实现以下功能:
- 用户输入问题。
- 意图识别(分类问题类型)。
- 根据意图选择处理流程(如数据库查询、生成回复)。
- 保存对话历史并支持中断调试。
4.2 状态定义
class CustomerState(TypedDict):
user_input: str
intent: str # 意图分类结果
database_result: str # 数据库查询结果
response: str # 生成的回复
history: List[str] # 对话历史
4.3 节点定义
4.3.1 意图识别
def identify_intent(state: CustomerState) -> CustomerState:
# 使用规则或LLM分类意图
if "订单" in state["user_input"]:
state["intent"] = "order_inquiry"
elif "退货" in state["user_input"]:
state["intent"] = "return_request"
else:
state["intent"] = "general_query"
return state
4.3.2 数据库查询
def query_database(state: CustomerState) -> CustomerState:
# 模拟数据库查询
if state["intent"] == "order_inquiry":
state["database_result"] = "订单状态:已发货,预计2天内送达。"
elif state["intent"] == "return_request":
state["database_result"] = "退货政策:支持7天无理由退货。"
return state
4.3.3 生成回复
def generate_response(state: CustomerState) -> CustomerState:
state["response"] = f"您好!{state['database_result']}"
return state
4.3.4 工具调用
from langgraph.prebuilt import ToolNode
from langchain_community.tools import TavilySearch
tool = TavilySearch(max_results=1)
tool_node = ToolNode(tools=[tool])
def web_search(state: CustomerState) -> CustomerState:
result = tool.run(state["user_input"])
state["database_result"] = result
return state
4.4 工作流构建
from langgraph.graph import StateGraph, END
workflow = StateGraph(CustomerState)
# 添加节点
workflow.add_node("identify_intent", identify_intent)
workflow.add_node("query_database", query_database)
workflow.add_node("web_search", web_search)
workflow.add_node("generate_response", generate_response)
# 添加边
workflow.add_edge("identify_intent", "query_database")
workflow.add_edge("query_database", "generate_response")
workflow.add_edge("web_search", "generate_response")
# 条件边
def route_based_on_intent(state: CustomerState) -> str:
if state["intent"] == "order_inquiry":
return "query_database"
elif state["intent"] == "return_request":
return "query_database"
else:
return "web_search"
workflow.add_conditional_edges("identify_intent", route_based_on_intent)
# 设置入口点
workflow.set_entry_point("identify_intent")
# 启用持久化
memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
4.5 执行与调试
# 用户输入
user_input = "我的订单什么时候能到?"
# 执行工作流
result = graph.invoke({
"user_input": user_input,
"history": ["用户:我的订单什么时候能到?"]
})
print(result["response"])
4.6 功能扩展
4.6.1 多轮对话
- 实现:在状态中维护对话历史,支持上下文理解。
- 代码示例:
def update_history(state: CustomerState) -> CustomerState: state["history"].append(f"系统:{state['response']}") return state workflow.add_node("update_history", update_history) workflow.add_edge("generate_response", "update_history")
4.6.2 人工审核
- 实现:在关键节点插入人工审核流程。
- 代码示例:
def human_review(state: CustomerState) -> CustomerState: # 模拟人工审核 state["response"] = "人工客服已介入,请稍候。" return state workflow.add_node("human_review", human_review) workflow.add_edge("generate_response", "human_review")
5. 总结
LangGraph V0.6.2 提供了灵活的图工作流构建能力,通过状态管理、节点封装和条件分支,可以高效实现复杂任务逻辑。智能客服项目展示了如何整合意图识别、数据库查询、工具调用和持久化功能,为实际应用提供了完整参考。建议结合官方文档进一步探索高级特性(如多智能体协作、中断调试等)。