LangChain-LangGraph框架 应用实例

发布于:2025-05-31 ⋅ 阅读:(29) ⋅ 点赞:(0)

LangGraph是LangChain的高级库,为大型语言模型(LLM)带来循环计算能力。

LangGraph建立在LCEL之上,允许高效地协调应用程序组件,同时保持简洁和可读的代码。它包括内置持久性、对循环的支持,并优先考虑可控性。 如果LCEL对于更大或更复杂的链变得笨重,它们可能会受益于LangGraph的实现。

状态(State) 状态是一个共享的数据结构,通常是一个TypedDict或者Pydantic的BaseModel类型。

节点(Nodes) 节点是一个Python函数,接受一个State作为输入,经过内部计算后,返回更新后的State。

边(Edges) 边也是一个Python函数,基于当前State,决定下一步执行哪个/哪一些节点。

案例1

以下是 是机器人对话,使用LangGraph框架构建State、Nodes、Edges,创建一个流程图

先安装包:langgraph

步骤如下:

1.定义一个状态类型:MyState

messages 代表状态中保存数据的key list代表数据类型        
add_messages函数用于更新列表数据
class MyState(TypedDict):
    messages:Annotated[list,add_messages]

2.创建一个流程图

graph = StateGraph(MyState)

3.准备一个node节点,大模型节点

llm = ChatOpenAI(
    temperature=1,
    model='deepseek-r1',
    api_key='sk-*****',
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

4.创建一个机器人节点函数,以当前state作为输入,并返回一个包含更新后的messages

然后使用add_node方法,将机器人节点加入到流程图中,该方法的

第一个参数是唯一节点的名称

第二个参数是当前节点被使用时将调用的函数或对象

def chatbot(state:MyState):
    return {'messages':[llm.invoke(state['messages'])]}

graph.add_node('chatbot',chatbot)

5.设置边,构建一张图

graph.add_edge(START,'chatbot') #表示流程从 START--->chatbot
graph.add_edge('chatbot',END) #表示流程从 chatbot--->END

graph = graph.compile()

6.最后,为了让机器人可以一直和用户对话,循环调用这个流程图,需要创建方法loop_graph_invoke

def loop_graph_invoke(user_input:str):
    for chunk in graph.stream({'messages':[('user',user_input)]}):
        for value in chunk.values():
            print('AI机器人:',value['messages'][-1].content)

while True:
    try:
        user_input = input('用户:')
        if(user_input.lower() in ['q','exit','quit']):
            print('对话结束,欢迎下次使用!')
            break
        else:
            loop_graph_invoke(user_input)
    except Exception as e:
        print(e)

完整代码:


from typing import Annotated
from langchain_openai import ChatOpenAI
from langgraph.constants import START, END
from langgraph.graph import add_messages, StateGraph
from typing_extensions import TypedDict



class MyState(TypedDict):
    #messages 代表状态中保存数据的key list代表数据类型,add_messages函数用于更新列表数据
    messages:Annotated[list,add_messages]

graph = StateGraph(MyState)

llm = ChatOpenAI(
    temperature=1,
    model='deepseek-r1',
    api_key='sk-*****',
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

def chatbot(state:MyState):
    return {'messages':[llm.invoke(state['messages'])]}


graph.add_node('chatbot',chatbot)


#设置边
graph.add_edge(START,'chatbot') #表示流程从 START--->chatbot
graph.add_edge('chatbot',END) #表示流程从 chatbot--->END

#构建一张图
graph = graph.compile()

#把graph变成一张图


def loop_graph_invoke(user_input:str):
    """循环调用这个流程图,让AI可以一直和用户对话"""
    for chunk in graph.stream({'messages':[('user',user_input)]}):
        for value in chunk.values():
            print('AI机器人:',value['messages'][-1].content)

while True:
    try:
        user_input = input('用户:')
        if(user_input.lower() in ['q','exit','quit']):
            print('对话结束,欢迎下次使用!')
            break
        else:
            loop_graph_invoke(user_input)
    except Exception as e:
        print(e)

运行结果:

案例2

基于上面的机器人案例,以下是结合工具Tavily,实现实时搜索,流程图如下

首先需要添加工具,然后和大模型进行绑定

os.environ['TAVILY_API_KEY'] = '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'
search_