当前位置: 首页 > news >正文

LangGraph 及多agent

什么是langgraph ?

是一个由于构建有状态的多参与者应用程序的库,理由LLM构建代理和多代理流程。其核心优势:循环性、可控性和持久性。LangGraph 允许自定义循环流程。

langGraph 的主要功能

循环和分支: 在应用中实现循环和条件语句
持久性:在图中的每个步骤之后自动保持状态。在任何时候暂停和恢复图以支持错误。
人机交互:在中断图执行已批准或编辑代理的计划的下一个动作。
流支持:在每个节点产生输出时流式传输输出(包换令牌流式传输)

LangGraph 的组成部分

LangGraph SDK (API客户端)、LangGraph Cli、LangGraph Studio (用户界面/调试器)。

LangGraph 的核心是将代理工作流建模为图。你可以使用是三个关键的组件来定义代理行为
1:状态:一个共享的数据结构表示程序应用的当前快照,他可以是python的任何类型但一般是dict
2:节点: 代码逻辑的python 函数。接收当前状态作为输入执行一些计算,并返回一个更新的状态(图的状态inactive、active)。
3:遍 python函数,根据当前状态确定要执行的下一个节点。

简单代码示例

from typing import Literal, Annotated
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage
#from langchain_core.pydantic_v1 import BaseModel, Field
from pydantic.v1 import BaseModel, Field
import re# ================== 状态类定义 ==================
class AgentState(BaseModel):messages: Annotated[list, Field(default_factory=list)]next_agent: Literal["researcher", "calculator", "writer", "done"] = "researcher"step_count: int = 0def __getitem__(self, key):return getattr(self, key)def get(self, key, default=None):return getattr(self, key, default)# ================== 消息转换函数 ==================
def convert_messages(raw_messages):return [msg if not isinstance(msg, dict) else {"user": HumanMessage,"system": SystemMessage,"assistant": AIMessage}[msg["role"]](content=msg["content"])for msg in raw_messages]# ================== 模型配置 ==================
model = ChatOpenAI(openai_api_base="http://localhost:23333/v1",model_name="qwen_chat",openai_api_key="EMPTY",max_tokens=150,temperature=0.2
)# ================== 核心函数:create_agent ==================
def create_agent(role: str, prompt: str):"""通用Agent创建函数"""def agent(state: AgentState):current_state = AgentState(**state) if isinstance(state, dict) else statemessages = convert_messages(current_state.messages)messages.append(SystemMessage(content=f"{prompt}\n请用'建议下一步:选项'格式结尾(选项只能是researcher/calculator/writer/done)"))try:response = model.invoke(messages)print(f"[{role}输出] {response.content}")# 解析下一步建议next_agent = "done"if match := re.search(r'建议下一步:\s*(\w+)', response.content, re.IGNORECASE):suggestion = match.group(1).lower()if suggestion in {"researcher", "calculator", "writer", "done"}:next_agent = suggestionreturn AgentState(**{"messages": messages + [response],"next_agent": next_agent,"step_count": current_state.step_count + 1})except Exception as e:print(f"[{role}错误] {str(e)}")return AgentState(**{"messages": current_state.messages,"next_agent": "done","step_count": current_state.step_count + 1})return agent# ================== Supervisor节点 ==================
def supervisor(state: AgentState):current_state = AgentState(**state) if isinstance(state, dict) else stateprint(f"\n[Supervisor] 当前步数: {current_state.step_count}")if current_state.step_count >= 10:return AgentState(**{"messages": current_state.messages,"next_agent": "done","step_count": current_state.step_count + 1})messages = convert_messages(current_state.messages)control_prompt = '''请严格选择并直接回复以下选项(仅单词):
researcher - 需要进一步研究
calculator - 需要数学计算
writer - 生成最终报告
done - 结束流程'''messages.append(SystemMessage(content=control_prompt))try:response = model.invoke(messages)raw_output = response.content.strip().lower()print(f"[Supervisor决策] 原始输出: {raw_output}")# 增强解析逻辑if "writer" in raw_output:next_agent = "writer"elif "calculator" in raw_output:next_agent = "calculator"elif "researcher" in raw_output:next_agent = "researcher"else:next_agent = "done"return AgentState(**{"messages": current_state.messages,"next_agent": next_agent,"step_count": current_state.step_count + 1})except Exception as e:print(f"[Supervisor错误] {str(e)}")return AgentState(**{"messages": current_state.messages,"next_agent": "done","step_count": current_state.step_count + 1})# ================== 初始化各Agent ==================
researcher_agent = create_agent("研究员", "分析GDP趋势")
calculator_agent = create_agent("计算器", "执行增长率计算")
writer_agent = create_agent("作家", "生成最终报告(完成后必须添加[END]标识)")# ================== 工作流配置 ==================
builder = StateGraph(AgentState)builder.add_node("supervisor", supervisor)
builder.add_node("researcher", researcher_agent)
builder.add_node("calculator", calculator_agent)
builder.add_node("writer", writer_agent)builder.add_conditional_edges("supervisor",lambda state: state.next_agent,{"researcher": "researcher","calculator": "calculator","writer": "writer","done": END}
)for agent in ["researcher", "calculator", "writer"]:builder.add_edge(agent, "supervisor")builder.set_entry_point("supervisor")
workflow = builder.compile()# ================== 执行测试 ==================
if __name__ == "__main__":test_input = AgentState(messages=[{"role": "user", "content": "成都市GDP增长率分析"}])try:for step in workflow.stream(test_input):node_name = list(step.keys())[0]state = step[node_name]print(f"\n[系统状态] 当前节点: {node_name}")print(f"[状态] next_agent: {state.get('next_agent')}")print(f"[状态] step_count: {state.get('step_count')}")if node_name == "__end__":print("\n====== 流程正常终止 ======")if state.messages:print("最终报告:")print(state.messages[-1].content)breakexcept Exception as e:print(f"\n!!! 流程异常终止: {str(e)}")

相关文章:

  • Netty学习专栏(四):如何解决粘包/拆包问题及自定义协议的实现
  • 嵌入大模型与LLM技术全面解析与实战指南
  • Day35打卡 @浙大疏锦行
  • 在Linux上安装Miniconda
  • 测试总结(一)
  • QML学习05MouseArea
  • 【LangChain大模型应用与多智能体开发 ② 接入智谱AI】
  • 【大模型面试每日一题】Day 27:自注意力机制中Q/K/V矩阵的作用与缩放因子原理
  • 搜索二叉树
  • InnoDB引擎底层解析(二)之InnoDB的Buffer Pool(三)
  • Linux驱动:基本环境准备
  • 【免费使用】剪Y专业版 8.1/CapCut 视频编辑处理,素材和滤镜
  • 基于CSP模型实现的游戏排行榜
  • AI大模型核心基础:向量与张量原理及实践应用指南
  • ARM笔记-嵌入式系统基础
  • 基于python的百度迁徙迁入、迁出数据分析(城市版)
  • 将ft2232外部的EEPROM中的信息读出来的方法,方便写入到下一个eeprom里面去;
  • Firecrawl MCP Server 深度使用指南
  • Linux系统基础——是什么、适用在哪里、如何选
  • NSSCTF-[羊城杯 2023]程序猿Quby
  • 菏泽网站建设招聘/seo搜索引擎专员
  • wordpress开源博客系统最新版/成都移动seo
  • 网站设计时图片怎么做/今日刚刚发生的国际新闻
  • 网站建设课程设计论文/谷歌aso优化
  • 正规做网站/重庆关键词自动排名
  • wordpress 首页折叠/网站推广优化平台