Workflows

使用LangGraph实现一个Agentic Workflow

我们使用LangGraph实现一个多角色协作的“研究助手”系统,当用户问一个问题(如“AI 对医疗行业有哪些影响?”),系统自动: 1. Planner Agent:制定研究计划(分几步查什么) 2. Researcher Agen…

TL;DR

我们使用LangGraph实现一个多角色协作的“研究助手”系统,当用户问一个问题(如“AI 对医疗行业有哪些影响?”),系统自动: 1. Planner Agent:制定研究计划(分几步查什么) 2. Researcher Agen…

我们使用LangGraph实现一个多角色协作的“研究助手”系统,当用户问一个问题(如“AI 对医疗行业有哪些影响?”),系统自动: 1. Planner Agent:制定研究计划(分几步查什么) 2. Researcher Agent:按计划搜索信息(模拟调用搜索引擎) 3. Writer Agent:整合信息写报告 4. Reviewer Agent:检查报告质量,若不满意则要求重写(形成反思循环) 使用langgraph来实现,初始化环境:

uv init agentic_workflow_test
cd agentic_workflow_test
uv venv
source .venv/bin/activate

编写main.py中的代码:

import os
from typing import Annotated, Literal, TypedDict, List
from langgraph.graph import StateGraph, START, END
from langchain_openai import ChatOpenAI

## === 配置 ===
OPENAI_API_KEY = "你的 api key"
OPENAI_API_BASE = "https://dashscope.aliyuncs.com/compatible-mode/v1"

llm = ChatOpenAI(
    model="deepseek-v3",
    api_key=OPENAI_API_KEY,
    base_url=OPENAI_API_BASE,
    temperature=0.1,
)

## ================================
## 1. 定义全局状态
## ================================
class ResearchState(TypedDict):
    question: str
    plan: List[str]
    research_notes: str
    draft: str
    feedback: str
    approved: bool
    revision_count: int

## ================================
## 2. 增强版 Agent(带详细日志)
## ================================

def planner_agent(state: ResearchState):
    print("\n" + "="*50)
    print("🧠 [Planner] 接收到任务")
    print(f"  用户问题: {state['question']}")

    prompt = f"""
    用户问题:{state['question']}
    请制定一个清晰的研究计划,分3-5个具体步骤,每步说明要查什么。
    只输出步骤列表,不要解释。
    """
    response = llm.invoke(prompt)
    plan_steps = [step.strip() for step in response.content.split("\n") if step.strip()]

    print("✅ [Planner] 输出研究计划:")
    for i, step in enumerate(plan_steps, 1):
        print(f"   {i}. {step}")
    return {"plan": plan_steps}


def researcher_agent(state: ResearchState):
    print("\n" + "="*50)
    print("🔍 [Researcher] 开始执行研究")
    print("  研究计划:")
    for i, step in enumerate(state["plan"], 1):
        print(f"   {i}. {step}")

    plan_text = "\n".join(f"{i+1}. {step}" for i, step in enumerate(state["plan"]))
    prompt = f"""
    根据以下研究计划,模拟搜索并总结关键信息:
    {plan_text}
    请输出简洁的研究笔记(300字以内)。
    """
    response = llm.invoke(prompt)

    print("✅ [Researcher] 输出研究笔记:")
    print(f"   {response.content.strip()}")
    return {"research_notes": response.content}

def writer_agent(state: ResearchState):
    print("\n" + "="*50)
    print("✍️ [Writer] 开始撰写报告")
    print(f"  基于问题: {state['question']}")
    print(f"  研究笔记预览: {state['research_notes'][:100]}{'...' if len(state['research_notes']) > 100 else ''}")

    # 构造基础 prompt
    prompt = f"""
    基于以下研究笔记,为问题“{state['question']}”写一份专业、简洁的回答(200字左右):
    {state['research_notes']}
    """

    # 如果存在反馈,则加入修改指令
    if state.get("feedback"):
        print(f"  📝 评审反馈: {state['feedback']}")
        prompt += f"\n\n请根据以下评审意见进行修改:\n{state['feedback']}\n确保回答准确、简洁、有洞察力。"

    response = llm.invoke(prompt)

    print("✅ [Writer] 输出草稿:")
    print(f"   {response.content.strip()}")
    return {"draft": response.content}

def reviewer_agent(state: ResearchState):
    print("\n" + "="*50)
    print("👀 [Reviewer] 评审当前草稿")
    print(f"  草稿内容: {state['draft']}")

    prompt = f"""
    评审以下回答是否满足:准确、简洁、有洞察力。
    如果满意,只回复“APPROVED”。
    如果不满意,请给出具体修改建议(50字以内):

    回答:{state['draft']}
    """
    response = llm.invoke(prompt)
    review_text = response.content.strip()

    print("✅ [Reviewer] 评审结果:")
    if "APPROVED" in review_text.upper():
        print("   👍 批准通过!")
        return {"approved": True, "feedback": ""}
    else:
        print(f"   ❌ 需要修改: {review_text}")
        return {
            "approved": False,
            "feedback": review_text,
            "revision_count": state["revision_count"] + 1
        }


## ================================
## 3. 增强版路由逻辑
## ================================
def route_after_review(state: ResearchState) -> Literal["writer", "end"]:
    print("\n" + "-"*40)
    print("🚦 [Router] 决策中...")
    print(f"  当前修订次数: {state['revision_count']}")
    print(f"  是否批准: {state['approved']}")

    if state["approved"]:
        print("  → 决定: 流程结束(已批准)")
        return "end"
    elif state["revision_count"] >= 2:
        print("  → 决定: 流程结束(已达最大修订次数)")
        return "end"
    else:
        print(f"  → 决定: 返回 Writer 进行第 {state['revision_count'] + 1} 次修改")
        return "writer"


## ================================
## 4. 构建工作流(保持不变)
## ================================
workflow = StateGraph(ResearchState)
workflow.add_node("planner", planner_agent)
workflow.add_node("researcher", researcher_agent)
workflow.add_node("writer", writer_agent)
workflow.add_node("reviewer", reviewer_agent)

workflow.add_edge(START, "planner")
workflow.add_edge("planner", "researcher")
workflow.add_edge("researcher", "writer")
workflow.add_edge("writer", "reviewer")

workflow.add_conditional_edges(
    "reviewer",
    route_after_review,
    {"writer": "writer", "end": END}
)

app = workflow.compile()

## ================================
## 5. 运行示例
## ================================
if __name__ == "__main__":
    user_question = "AI 对医疗行业有哪些影响?"

    print("🚀 启动 Agentic Research Workflow")
    print(f"📌 用户问题: {user_question}\n")

    result = app.invoke({
        "question": user_question,
        "plan": [],
        "research_notes": "",
        "draft": "",
        "feedback": "",
        "approved": False,
        "revision_count": 0
    })

    print("\n" + "="*60)
    print("✅ 最终报告:")
    print(result["draft"])

    print(f"\n📊 执行统计:")
    print(f"  - 总修订次数: {result['revision_count']}")
    print(f"  - 是否最终批准: {'是' if result['approved'] else '否(达到最大修订次数)'}")

添加依赖:uv add langgraph langchain-openai 运行代码:uv run main.py 最终输出结果如下:

🚀 启动 Agentic Research Workflow
📌 用户问题: AI 对医疗行业有哪些影响?


==================================================
🧠 [Planner] 接收到任务
  用户问题: AI 对医疗行业有哪些影响?
✅ [Planner] 输出研究计划:
   1. 1. 调查AI在医疗诊断中的应用,包括影像识别、病理分析和早期疾病预测。
   2. 2. 研究AI在医疗管理中的作用,如电子病历处理、医院资源优化和患者流程自动化。
   3. 3. 分析AI在药物研发中的贡献,包括靶点发现、临床试验设计和个性化药物方案。
   4. 4. 评估AI对医患互动的影响,如虚拟助手、远程医疗和健康监测设备。
   5. 5. 探讨AI在医疗行业中的伦理与法律问题,包括数据隐私、算法偏见和监管框架。

==================================================
🔍 [Researcher] 开始执行研究
  研究计划:
   1. 1. 调查AI在医疗诊断中的应用,包括影像识别、病理分析和早期疾病预测。
   2. 2. 研究AI在医疗管理中的作用,如电子病历处理、医院资源优化和患者流程自动化。
   3. 3. 分析AI在药物研发中的贡献,包括靶点发现、临床试验设计和个性化药物方案。
   4. 4. 评估AI对医患互动的影响,如虚拟助手、远程医疗和健康监测设备。
   5. 5. 探讨AI在医疗行业中的伦理与法律问题,包括数据隐私、算法偏见和监管框架。
✅ [Researcher] 输出研究笔记:
   **AI在医疗领域的研究笔记**

1. **医疗诊断**:AI在影像识别(如X光、MRI)中准确率接近专家水平,病理分析可辅助癌症检测,早期预测模型(如糖尿病、阿尔茨海默病)提升干预效率。

2. **医疗管理**:AI优化电子病历结构化与检索,通过预测患者流量改善资源分配,自动化流程(如分诊)缩短等待时间。

3. **药物研发**:加速靶点筛选(如AlphaFold预测蛋白质结构),优化临床试验设计(患者匹配),推动个性化药物(基于基因组数据)。

4. **医患互动**:虚拟助手(如ChatGPT)解答基础咨询,远程医疗平台扩大覆盖,可穿戴设备实时监测慢性病。

5. **伦理与法律**:数据隐私(匿名化处理)、算法偏见(数据多样性不足)、监管滞后(需跨学科协作制定标准)是主要挑战。

**总结**:AI显著提升医疗效率与精准度,但需平衡创新与伦理风险,完善法规以实现可持续发展。 (298字)

==================================================
✍️ [Writer] 开始撰写报告
  基于问题: AI 对医疗行业有哪些影响?
  研究笔记预览: **AI在医疗领域的研究笔记**

1. **医疗诊断**:AI在影像识别(如X光、MRI)中准确率接近专家水平,病理分析可辅助癌症检测,早期预测模型(如糖尿病、阿尔茨海默病)提升干预效率。
...
✅ [Writer] 输出草稿:
   **AI对医疗行业的影响**

AI正在深刻变革医疗行业。在**诊断领域**,AI影像识别(如X光、MRI)准确率媲美专家,病理分析助力癌症早期筛查,预测模型提升慢性病干预效率。**医疗管理**方面,AI优化电子病历处理、预测患者流量以合理分配资源,自动化分诊缩短等待时间。**药物研发**中,AI加速靶点筛选(如AlphaFold)、优化临床试验,推动个性化药物开发。**医患互动**通过虚拟助手、远程医疗和可穿戴设备,提升服务可及性与实时监测能力。

然而,AI应用面临**数据隐私**、**算法偏见**和**监管滞后**等挑战,需通过跨学科协作完善伦理与法律框架。总体而言,AI显著提升医疗效率与精准度,但需平衡创新与风险,以实现可持续发展。 (199字)

==================================================
👀 [Reviewer] 评审当前草稿
  草稿内容: **AI对医疗行业的影响**

AI正在深刻变革医疗行业。在**诊断领域**,AI影像识别(如X光、MRI)准确率媲美专家,病理分析助力癌症早期筛查,预测模型提升慢性病干预效率。**医疗管理**方面,AI优化电子病历处理、预测患者流量以合理分配资源,自动化分诊缩短等待时间。**药物研发**中,AI加速靶点筛选(如AlphaFold)、优化临床试验,推动个性化药物开发。**医患互动**通过虚拟助手、远程医疗和可穿戴设备,提升服务可及性与实时监测能力。

然而,AI应用面临**数据隐私**、**算法偏见**和**监管滞后**等挑战,需通过跨学科协作完善伦理与法律框架。总体而言,AI显著提升医疗效率与精准度,但需平衡创新与风险,以实现可持续发展。 (199字)
✅ [Reviewer] 评审结果:
   👍 批准通过!

----------------------------------------
🚦 [Router] 决策中...
  当前修订次数: 0
  是否批准: True
  → 决定: 流程结束(已批准)

============================================================
✅ 最终报告:
**AI对医疗行业的影响**

AI正在深刻变革医疗行业。在**诊断领域**,AI影像识别(如X光、MRI)准确率媲美专家,病理分析助力癌症早期筛查,预测模型提升慢性病干预效率。**医疗管理**方面,AI优化电子病历处理、预测患者流量以合理分配资源,自动化分诊缩短等待时间。**药物研发**中,AI加速靶点筛选(如AlphaFold)、优化临床试验,推动个性化药物开发。**医患互动**通过虚拟助手、远程医疗和可穿戴设备,提升服务可及性与实时监测能力。

然而,AI应用面临**数据隐私**、**算法偏见**和**监管滞后**等挑战,需通过跨学科协作完善伦理与法律框架。总体而言,AI显著提升医疗效率与精准度,但需平衡创新与风险,以实现可持续发展。 (199字)

📊 执行统计:
  - 总修订次数: 0
  - 是否最终批准: 是

以上的示例中,这个工作流具备了目标驱动、自主决策、多智能体协作、自我反思与迭代等特点。

目标驱动

整个工作流围绕一个明确的用户问题 question 展开,所有 Agent 的行为都服务于回答该问题。 - 入口状态包含 "question": "AI 对医疗行业有哪些影响?" - 所有 Agent 的行为都服务于回答这个问题: - Planner 制定针对该问题的研究计划 - Researcher 搜集与该问题相关的信息 - Writer 撰写对该问题的回答 - Reviewer 评估回答是否准确、简洁、有洞察力(即是否达成“高质量回答”这一子目标) 系统不是随机生成内容,而是以“高质量回答用户问题”为终极目标,所有步骤都是为目标服务的——典型的目标驱动架构。

自主决策

每个 Agent 基于当前状态独立生成输出,Reviewer 能动态决定流程走向。 - 每个节点函数(如 planner_agent)不依赖外部指令,而是: - 读取共享状态(如 state['question']) - 调用 LLM 自主生成下一步内容(如 plan、notes、draft) - 最关键的是 reviewer_agent 和 route_after_review: - Reviewer 自主判断草稿是否合格(通过 LLM 评审) - 路由函数根据 approved 和 revision_count自主决定是结束还是返回修改 没有中央控制器硬编码“第几步该做什么”,而是每个 Agent 根据上下文自主推理并行动,符合“自主决策”原则。

多智能体协作

✅ 体现方式:四个角色分工明确,通过共享状态接力协作。 | 智能体 | 职责 | 依赖输入 | 输出贡献 | | --- | --- | --- | --- | | Planner | 制定研究路径 | 用户问题 | plan | | Researcher | 信息搜集 | plan | research_notes | | Writer | 内容生成 | research_notes | draft | | Reviewer | 质量把关 | draft | approved |

  • 它们不直接调用彼此,而是通过读写 ResearchState 进行松耦合协作
  • 流程图构成一个协作流水线 + 反馈环,体现“团队合作”模式 不是单个大模型端到端生成,而是多个专业化“角色”像团队一样协同完成复杂任务——这是多智能体系统的核心思想。

自我反思与迭代

系统具备“写 → 评 → 改”的反馈循环,实现自我优化。 - Reviewer 不仅判断好坏,还提供具体修改建议(如“请补充临床应用案例”); - Writer 在下一轮会结合反馈重写(prompt 中显式加入 feedback); - 虽然最多允许 2 次修订,体现有限但有效的自我修正能力。(也可以设置更多得次数) 系统能识别自身输出的不足,并主动改进——这是“反思”的本质。

版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。