langgraph的使用

文章目录

  • 简介
  • 构建基础ChatBot
  • 使用Tools强化Chatbot
  • ChatBot添加记忆
  • 人工介入工作流

简介

  • 若langgraph无法直接访问, 则从langchain架构进入;
  • 使用LLM构建健壮且有状态的多参与者应用程序;
  • workflows工作流围绕大模型调用,内置了预定义代码路径的脚手架,通过预定义的代码路径,可以引导控制流;
  • 也可以拆除这些脚手架,通过工具调用(tool calls),构建可以计划、采取行动的自主代理系统,并且可以直接回应它自己行动的反馈;
  • workflows vs agent:
    langgraph的使用_第1张图片
  • 三大核心好处:
    • 持久化,支持应用程序状态的任何方面的持久化;状态(state)就是检查点(checkpoint),允许为了决策、验证、纠正,通过人类输入来中断、恢复程序执行;
    • 流处理,支持在执行过程中,将工作流/代理状态流式传给用户;支持工具调用反馈的事件流和LLM calls的token流;
  • 调用&部署,通过 langgraph platform实现简单的测试、调试、部署应用;
     

构建基础ChatBot

使用langgraph构建一个基础的聊天机器人。

  • langgraph.graph.StateGraph,将聊天机器人的架构定义为状态机
  • StateGraph.add_node(name, llm/func),添加节点(工作单元),节点可以是调用的大模型或者函数;
  • StateGraph.add_edge(start_key, end_key),添加边,表示控制流的走向;
  • 基础Chatbot的知识受限于它的训练数据;
from typing import Annotated  # 类型注解  python3.10+ 使用typing导入
from typing_extensions import TypedDict  # python3.9及之前的版本
from langgraph.graph import StateGraph, START, END  # 图的开始节点、结束节点
from langgraph.graph.message import add_messages  # 图中的消息


# 定义状态类
class State(TypedDict):
    # messages是一个列表类型,add_messages函数表示应该追加更新列表,将最新的输入消息存入列表的末尾
    messages: Annotated[list, add_messages]  # Annotated[类型,元数据,元数据...],仅类型注解,不影响代码的运行,若没有add_messages函数,则覆盖重写列表内容


# 实例化,并传入State类
graph_builder = StateGraph(State)
# 图中的每个节点接收当前State作为输入,输出的信息更新到该State中
# 更新的message会追加到messages列表中(add_messages函数实现)


# 定义函数节点
def node1(state: State):  # 接收State对象作为输入
	# 这里面从state对象获取输入的message,调用LLM
	msg = state["messages"][-1]  # 获取最新的消息
	llm = QianfanChatEndpoint(
                model="ERNIE-3.5-8K",
                temperature=0.2, # 越大越随机回答
                timeout=30,  # 有时网络不好,可能会超时,可以指定长些
                # api_key="...",
                # secret_key="...",
                # top_p="...",
                # other params...
            )
    res = llm.invoke([msg])  # 传入消息列表
    return {
   "messages": [res]}  # 返回一个字典,包含messages key 列表,列表中的消息会被更新到State对象中的messages列表中
	
# 添加节点
graph_builder.add_node("node1", node1)
# 添加切入点
graph_builder.add_edge(START, "node1")  # 每次运行图时,从node1节点开始执行
# 添加结束点
graph_builder.add_edge("node1", END)  # 执行node1节点后,退出
# 也可以使用
#graph_builder.set_entry_point("chatbot")
#graph_builder.set_finish_point("chatbot")

# 编译图
graph = graph_builder.compile()  # 编译后得到一个CompiledGraph 对象,可以基于状态调用

# 可视化图(需要依赖)
from IPython.display import Image, display
try:
	g = graph.get_graph().draw_png() # 依赖pygraphviz库(https://graphviz.org/download/)
    display(Image(g))
except Exception:
    # This requires some extra dependencies and is optional
    pass



# 流式调用
def stream_graph_updates(user_input: str):
    # graph.stream 传入状态字典
    for event in graph.stream({
   "messages": [("user", user_input)]}):
        print("所有节点的响应:", event)
        for res_dict in event.values():
            print("Assistant:", res_dict["messages"][-1].content)  # 获取AIMessage的内容


while True:
    try:
        user_input = input("User: ")
        if user_input.lower() in ["quit", "exit", "q"]:
            print("Goodbye!")
            break

        stream_graph_updates(user_input)
    except:
        # fallback if input() is not available
        user_input = "What do you know about LangGraph?"
        stream_graph_updates(user_input)
        break

langgraph的使用_第2张图片
chatbot节点就是程序中的node1节点;

 

使用Tools强化Chatbot

  • 使用网络搜索工具强化聊天机器人,获得更好的回答;
  • 依赖 pip install -U tavily-python langchain_community;
  • 注册Tavily搜索引擎并登录获取tavily api key ,python客户端调用案例:
from tavily import TavilyClient
client = TavilyClient(

你可能感兴趣的:(python,AI,tools,langgraph,图,状态机,agent)