LangGraph V0.6.2 构建自定义工作流知识点总结

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 项目目标

构建一个智能客服系统,实现以下功能:

  1. 用户输入问题。
  2. 意图识别(分类问题类型)。
  3. 根据意图选择处理流程(如数据库查询、生成回复)。
  4. 保存对话历史并支持中断调试。

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 提供了灵活的图工作流构建能力,通过状态管理、节点封装和条件分支,可以高效实现复杂任务逻辑。智能客服项目展示了如何整合意图识别、数据库查询、工具调用和持久化功能,为实际应用提供了完整参考。建议结合官方文档进一步探索高级特性(如多智能体协作、中断调试等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值