LangGraph 是一个用于构建和操作语言图(Language Graph)的开源工具库,旨在帮助开发者更高效地处理自然语言处理(NLP)任务。语言图是一种将文本数据表示为图结构的方法,其中节点可以是单词、短语或句子,而边则表示它们之间的关系。通过将文本转化为图结构,LangGraph 使得复杂的语言模式和分析任务变得更加直观和可操作。本文尽量以最简单的demo展示其各种功能,开箱即用,详细使用以及其他功能可参照官网

目录

简单的示例

router路由代理

工具代理

agent代理-react


简单的示例

定义两个节点,节点1负责回答用户提问,节点2负责将节点1的答案翻译成英文

效果图:

from langgraph.graph import StateGraph
from langchain_openai import ChatOpenAI
from typing_extensions import TypedDict, Optional
from langgraph.graph import START, END

# 定义输入的模式
class InputState(TypedDict):
    question: str
    llm_answer: Optional[str]  # 表示 answer 可以是 str 类型,也可以是 None

# 定义输出的模式
class OutputState(TypedDict):
    answer: str

# 将 InputState 和 OutputState 这两个 TypedDict 类型合并成一个更全面的字典类型。
class OverallState(InputState, OutputState):
    pass

from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv('ZHIPU_API_KEY')
base_url = os.getenv('ZHIPU_BASE_URL')

# 添加节点
def first_answer_node(state: InputState):
    messages = [
        ("human", state["question"])
    ]
    llm = ChatOpenAI(api_key=api_key, base_url=base_url, temperature=0, model='glm-4')
    response = llm.invoke(messages) 
    return {"llm_answer": response.content}

def transform_node(state: InputState):
    messages = [
        {'role': 'system', "content": "你是一个翻译机器人,负责将用户的输入的内容翻译成英文进行输出"},
        {'role': 'user', "content": '用户输入的内容为:/n' + state["llm_answer"]}
    ]

    llm = ChatOpenAI(api_key=api_key, base_url=base_url, temperature=0, model='glm-4')
    response = llm.invoke(messages) 
    return {"answer": response.content}

# 明确指定它的输入和输出数据的结构或模式
builder = StateGraph(OverallState, input=InputState, output=OutputState)

# 添加节点
builder.add_node("first_answer_node", first_answer_node)
builder.add_node("transform_node", transform_node)

# 添加边
builder.add_edge(START, "first_answer_node")
builder.add_edge("first_answer_node", "transform_node")
builder.add_edge("transform_node", END)

# 编译图
graph = builder.compile()

# 查看图结构
image_bytes = graph.get_graph(xray=True).draw_mermaid_png()
from PIL import Image
from io import BytesIO
image = Image.open(BytesIO(image_bytes))
image.save("output.png")

final_answer = graph.invoke({"question":"你好,请你详细的介绍一下你自己"})
print(final_answer["answer"])

router路由代理

根据不同的条件,路由到不同的节点,效果:

from langgraph.graph import StateGraph, END
from langgraph.graph import StateGraph

def node_start(state):
    return {"x": state["x"] + 1}

def node_b(state):
    return {"x": state["x"] - 2}

def node_c(state):
    return {"x": state["x"] + 1}

def routing_function(state):
    if state["x"] == 10:
        return True
    else:
        return False

# 简单的将输入输出定义为一个dict
builder = StateGraph(dict)

builder.add_node("node_start", node_start)
builder.add_node("node_b", node_b)
builder.add_node("node_c", node_c)

builder.set_entry_point("node_start")

# b、c都可能是end
builder.add_edge("node_b", END)
builder.add_edge("node_c", END)

# 构建节点之间的边-路由节点
builder.add_conditional_edges("node_start", routing_function, {True: "node_b", False: "node_c"})

graph = builder.compile()

image_bytes = graph.get_graph(xray=True).draw_mermaid_png()

from PIL import Image
from io import BytesIO
image = Image.open(BytesIO(image_bytes))
image.save("output.png")

工具代理

大模型判断需要的工具,填充tool_calls信息,传递给toolNode

from langchain.tools import tool

@tool
def query_weather(city):
    """Call to get the current weather."""
    if city.lower() in ["beijing", '北京']:
        return city + "的温度是16度,天气晴朗。"
    elif city.lower() in ["shanghai", '上海']:
        return city + "的温度是20度,小雨转晴。"
    elif city.lower() in ["Hangzhou", '杭州']:
        return city + "的温度是10度,部分多云。"
    else:
        return "不好意思,并未查询到具体的天气信息。"

@tool
def fetch_real_time_info(query):
    """Get real-time Internet information"""
    return query + '''有限公司成立于2021年9月1日,企业地址位于北京市北京经济技术开发区,
        是一家以从事汽车制造业为主的企业。雷军担任法定代表人、执行董事、经理。'''


from langgraph.prebuilt import ToolNode
tools = [query_weather, fetch_real_time_info]
tool_node = ToolNode(tools)

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv('ZHIPU_API_KEY')
base_url = os.getenv('ZHIPU_BASE_URL')
llm = ChatOpenAI(api_key=api_key, base_url=base_url, model='glm-4')

model_with_tools = llm.bind_tools(tools)

# LLM判断需要的工具,填充tool_calls信息,传递给toolNode
res = tool_node.invoke({"messages": [model_with_tools.invoke("小米汽车的最新消息")]})
print(res)
res = tool_node.invoke({"messages": [model_with_tools.invoke("beijing的天气")]})
print(res)

agent代理-react

效果图

import random
from langchain.tools import tool

@tool
def query_weather(city):
    """
    调用天气 API 查询指定位置的天气信息
    :param city: 要查询天气的城市,城市名称需要是英文,如London、Beijing
    :return: 天气信息字符串信息
    """
    res = city + "的温度是" + str(random.randint(0, 35)) +  "度,天气晴朗,东南风" + str(random.randint(0, 12)) + "级。"
    print("query_weather-----------" + res)
    return res

from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv('ZHIPU_API_KEY')
base_url = os.getenv('ZHIPU_BASE_URL')
llm = ChatOpenAI(api_key=api_key, base_url=base_url, model='glm-4')

from langgraph.prebuilt import create_react_agent
tools = [query_weather]

graph = create_react_agent(llm, tools=tools)

from PIL import Image
from io import BytesIO
image_bytes = graph.get_graph(xray=True).draw_mermaid_png()
image = Image.open(BytesIO(image_bytes))
image.save("output.png")

finan_response = graph.invoke({"messages":["你好"]})
print(finan_response['messages'][-1].content)
finan_response = graph.invoke({"messages":["北京和上海的温度相差多少"]})
print(finan_response['messages'][-1].content)

多代理

待补充

人机交互

待补充

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐