Langgraph 构建简单论文生成

from typing import TypedDict, List, Annotated, Optional
from langgraph.graph import StateGraph, END

# ===== 状态类型定义 =====
class AgentState(TypedDict):
    input: str                # 用户原始输入
    plan: Optional[dict]      # 执行计划
    past_steps: List[str]     # 已完成的步骤记录
    response: Optional[str]   # 最终响应
    
# ===== 节点函数定义 =====

# 1. 计划生成节点
def planning_node(state: AgentState):
    """将用户输入转化为执行计划"""
    user_input = state["input"]
    
    # 模拟LLM生成计划的过程
    example_plan = {
        "goal": f"处理请求:{user_input}",
        "steps": [
            "分析核心需求",
            "收集必要信息", 
            "生成初始草稿",
            "验证内容准确性"
        ]
    }
    
    return {"plan": example_plan}

# 2. 任务执行节点
def execution_node(state: AgentState):
    """执行单个任务步骤"""
    current_step = len(state["past_steps"])
    steps = state["plan"]["steps"]
    
    if current_step >= len(steps):
        return {"response": "所有步骤已完成"}
        
    task = steps[current_step]
    
    # 模拟任务执行
    print(f"正在执行步骤:{task}")
    result = f"{task}完成于2024-02-20"  # 替换为实际执行逻辑
    
    return {
        "past_steps": state["past_steps"] + [result],
        "response": None  # 清空中间响应
    }

# 3. 用户确认节点
def user_confirm_node(state: AgentState):
    """请求用户确认是否继续"""
    # 模拟用户输入(实际应替换为真实交互)
    confirm = input(f"步骤 {len(state['past_steps'])+1} 失败,是否重试?(y/n): ")
    return {"need_retry": confirm.lower() == 'y'}

# 4. 响应生成节点 
def response_node(state: AgentState):
    """生成最终响应"""
    return {
        "response": f"处理完成。执行记录:{state['past_steps']}"
    }

# ===== 构建状态图 =====
builder = StateGraph(AgentState)

# 添加节点
builder.add_node("plan", planning_node)
builder.add_node("execute", execution_node)
builder.add_node("confirm", user_confirm_node)
builder.add_node("response", response_node)

# 设置边
builder.set_entry_point("plan")
builder.add_edge("plan", "execute")

# 条件边:执行结果判断
def route_after_execute(state):
    if state.get("response"):
        return END  # 所有步骤完成
    if len(state["past_steps"]) < len(state["plan"]["steps"]):
        return "execute"  # 继续执行
    return "confirm"      # 需要用户确认

builder.add_conditional_edges(
    "execute",
    route_after_execute,
    {
        "confirm": "confirm",
        "execute": "execute",
        END: "response"
    }
)

# 用户确认后的流程
builder.add_conditional_edges(
    "confirm",
    lambda s: "execute" if s["need_retry"] else "plan",  # 重试或重新规划
    {"execute": "execute", "plan": "plan"}
)

builder.add_edge("response", END)

# ===== 编译执行 =====
app = builder.compile()

# 运行示例
result = app.invoke({
    "input": "需要生成季度报告",
    "plan": None,
    "past_steps": [],
    "response": None
})

print("\n最终结果:", result["response"])

代码结构解析

1. 状态设计
class AgentState(TypedDict):
    input: str                # 用户原始输入
    plan: Optional[dict]      # 计划结构体
    past_steps: List[str]     # 执行历史
    response: Optional[str]   # 输出结果

使用TypedDict确保状态结构的类型安全,各字段含义:

  • input:原始用户请求的持久化存储
  • plan:动态生成的执行计划
  • past_steps:记录每个步骤的执行结果
  • response:最终输出或中间状态
2. 核心工作流
未完成
需要确认
重试
重新规划
全部完成
用户请求
计划生成
任务执行
完成判断
用户确认
生成响应
3. 关键节点说明

planning_node

  • 输入:原始用户请求
  • 处理:生成结构化计划(实际应集成LLM调用)
  • 输出:更新plan字段

execution_node

  • 机制:
    • 通过past_steps长度判断当前步骤
    • 按顺序执行plan.steps中的任务
    • 记录执行结果到past_steps

user_confirm_node

  • 模拟用户交互场景
  • 返回need_retry布尔值指导流程走向
4. 条件路由逻辑
def route_after_execute(state):
    # 如果已产生最终响应
    if state.get("response"): 
        return END  
    
    # 判断是否所有步骤完成
    steps_done = len(state["past_steps"])
    total_steps = len(state["plan"]["steps"])
    
    if steps_done < total_steps:
        return "execute"  # 继续执行
    else:
        return "confirm"  # 请求用户确认

该函数实现三种状态转换:

  1. 正常完成 → 结束流程
  2. 步骤未完成 → 继续执行
  3. 异常完成 → 进入确认环节

运行示例输出

当执行代码时会看到类似以下交互流程:

正在执行步骤:分析核心需求
正在执行步骤:收集必要信息
步骤 3 失败,是否重试?(y/n): y
正在执行步骤:生成初始草稿
正在执行步骤:验证内容准确性

最终结果: 处理完成。执行记录:[
    '分析核心需求完成于2024-02-20',
    '收集必要信息完成于2024-02-20', 
    '生成初始草稿完成于2024-02-20',
    '验证内容准确性完成于2024-02-20'
]

扩展建议

  1. 真实集成LLM
from langchain_community.llms import OpenAI

def real_planner(state):
    llm = OpenAI()
    prompt = f"将以下请求分解为步骤:{state['input']}"
    return {"plan": llm.invoke(prompt)}
  1. 错误处理增强
def execution_node(state):
    try:
        # 执行逻辑
    except Exception as e:
        return {"error": str(e)}
  1. 持久化存储
from langgraph.checkpoint import FileCheckpoint

app = builder.compile(
    checkpointer=FileCheckpoint("./checkpoints/")
)
### 图灵 LangGraph 技术概述 图灵 LangGraph 是一种基于自然语言处理(NLP)的技术框架,旨在构建高效的语义表示模型并优化大规模文本数据的处理效率。该技术的核心在于利用生成式表征学习方法来调整指令微调过程中的参数分布[^1]。具体而言,LangGraph 结合了预训练语言模型的强大泛化能力和特定领域任务的需求定制能力。 #### 关于 LangGraph 的开发文档和技术资料 目前关于 LangGraph 的公开资源主要集中在以下几个方面: 1. **学术研究背景** LangGraph 的设计灵感来源于最新的 NLP 进展以及生成对抗网络的应用场景。其核心理念是在保持通用性的同时提升模型对于复杂结构化输入的理解力。开发者可以通过阅读相关论文了解其实现细节及其理论依据。 2. **社区实践经验分享** 社区平台如 GitHub 和 Medium 上存在大量由个人贡献者撰写的教程文章和案例分析。这些材料通常会详细介绍如何部署 LangGraph 至实际项目当中,并附带代码片段以便快速上手[^2]。例如,Dify 平台上的开发者已经成功实现了多个涉及 LangGraph 的应用场景,证明了这项技术的实际可行性。 3. **官方指导手册** 如果希望获得更加权威的信息来源,则可以查阅来自原作者团队发布的正式文档。这类文件一般涵盖了从安装配置到高级功能使用的全流程说明,并配有详尽的例子帮助理解每一个概念点。 以下是实现简单版本 LangGraph 所需的部分 Python 伪代码示例: ```python import torch from transformers import BertTokenizer, BertModel def lang_graph_encoder(input_text): tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') inputs = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True) outputs = model(**inputs) embeddings = outputs.last_hidden_state.mean(dim=1).detach().numpy() return embeddings ``` 此函数展示了如何借助 BERT 预训练权重完成基础向量化操作,这是构建更复杂的 LangGraph 架构的基础之一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值