langgraph 三个元素:状态、节点、边
- 状态:对话历史记录、上下文数据、内部变量
- 节点:输入一个状态,输出另一个状态
- 边:基于当前状态,决定下一步
状态
python
from typing_extensions import TypedDict
from typing import Annotated
from langgraph.graph import add_messages
class MyState(TypedDict):
messages: Annotated[list, add_messages]
定义一个键值对,类型为列表,作用是add_messages(保存历史记录)
流程图
python
from langgraph.graph import StateGraph
graph = StateGraph(MyState)
节点
python
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model='gpt-4o',
api_key="sk",
base_url="https://xiaoai.plus/v1")
def chatbot(state: MyState):
return {'messages': [llm.invoke(state['messages'])]}
python
graph.add_node('chatbot', chatbot)
add_node添加节点,(名称,函数)
边
python
from langgraph.constants import START, END
# 表示: 流程从start----> chatbot
graph.add_edge(START, 'chatbot')
# 表示: 流程从chatbot----> END
graph.add_edge('chatbot', END)
构建图
python
graph = graph.compile()
执行
python
def loop_graph_invoke(user_input: str):
"""循环调用这个流程图,让AI可以一直和用户对话"""
result = graph.invoke({'messages': [('user', user_input)]})
print('AI机器人: ', result['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)
工具节点
python
from langgraph.prebuilt import ToolNode
tool_node = ToolNode(tools=tools)
graph.add_node('tools', tool_node)
条件边
python
from langgraph.prebuilt import tools_condition
# 根据智能体自动决策是否需要调用工具,
graph.add_conditional_edges('agent', tools_condition)
入口节点
python
# 设置入口节点
graph.set_entry_point('agent')
langgraph 记忆能力
持久性检查点,checkpointer、thread_id
python
from langgraph.checkpoint.memory import MemorySaver
memory_checkpointer = MemorySaver()
graph = graph.compile(checkpointer=memory_checkpointer)
python
thread_id = input('请输入一个sessionId:')
config = {"configurable": {"thread_id": thread_id}}
# 执行这个工作流
while True:
try:
user_input = input('用户: ')
if user_input.lower() in ['q', 'exit', 'quit']:
print('对话结束,拜拜!')
break
else:
loop_graph_invoke(graph, user_input, config)
except Exception as e:
print(e)
调用工具前中断
python
graph = graph.compile(
checkpointer=memory_checkpointer,
interrupt_before=['tools']
)
python
interrupt_after=["tools"]
查看状态
python
now_state = graph.get_state(config)
print(now_state)
更新状态
python
graph.update_state(
config=config,
values={'messages': new_message}
)