购买域名网站好,dede网站地图修改,个人网站备案名称大全,wordpress建站教程第六节该example来源于官方#xff0c;主要用于快速了解LG 的基本使用#xff0c;本文并没有对 LG 的详细说明#xff0c;如果想要对他有深入认识可参考文章 该example构建可视化出来的结果图如下#xff1a; 从图中可以发现除了特殊节点Start和End#xff0c;还有一个agent和t… 该example来源于官方主要用于快速了解LG 的基本使用本文并没有对 LG 的详细说明如果想要对他有深入认识可参考文章 该example构建可视化出来的结果图如下 从图中可以发现除了特殊节点Start和End还有一个agent和tools节点在该graph中执行流程如下 用户输入节点名为agent首先响应然后调用节点名toolstools节点返回给agentagent判断tools结果是否符合预期不符合继续调用tools符合则走向End节点End节点则认为graph结束 上述流程在代码中有详细介绍让我们跟着这个流程清晰认识 LG 的构建流程 1. Graph整体流程定义
图配置 此处可以定义图的参数信息例如 LLM 等信息 # Define the config
class GraphConfig(TypedDict):model_name: Literal[anthropic, openai]图定义
# 定义一个图StateGraph是我们主要使用图定义的类此处参数传入
# 整个图的状态以及图配置信息
workflow StateGraph(AgentState, config_schemaGraphConfig)# 在该图中可以体现cycle为此处即大模型与工具的交互
# 严谨一些讲应该是大模型参与的角色就可能有交互这也是LG的最大意义
# 为了可以实现更好的应用效果我们需要通过大模型的加入但是大模型的加入
# 又会存在一些不确定性如果只是传统的方法程序输入输出是一种固定式的那就不太需要 LG 的存在了我们自己代码就可以去实现
# LLM 对问题的理解构建调用工具的提示词对工具结果的判断理解等等
# 因此 Agent十分依赖大模型的能力
workflow.add_node(agent, llm_node)
workflow.add_node(action, tool_node)# set_entry_point定义了首先响应的节点是agent
workflow.set_entry_point(agent)# 图中除了节点节点之间的边也至关重要这影响到节点之间的逻辑关系
# 边我们已经讲到过存在普通边和条件边对于条件边定义方法为add_conditional_edges
workflow.add_conditional_edges(# agent节点为该边的起始节点也说明该边的执行是在agent节点执行后agent,# 定义映射条件should_continue,# 定义映射关系key为字符串自己定义即可value为其他节点# should_continue的输出将匹配映射关系从而控制了该边的走向即在agent之后执行哪个节点{# 如果should_continue输出是continue则调用action节点continue: action,# 如果should_continue输出是end则调用END节点end: END,},
)# 刚才我们定义了条件边控制了agent节点走向 action或者 end的逻辑关系
# 现在我们定义从action响应之后将其直接返回给agent这也意味着action响应之后会直接走向agent节点
workflow.add_edge(action, agent)
图编译
# 编译图意味着他会编译成LangChain可运行程序
graph workflow.compile()条件边
def should_continue(state):messages state[messages]last_message messages[-1]# If there are no tool calls, then we finishif not last_message.tool_calls:return end# Otherwise if there is, we continueelse:return continue2. 节点定义
agent节点
lru_cache(maxsize4)
def _get_model(model_name: str):
# model_name定义内容在GraphConfig有定义if model_name openai:model ChatOpenAI(temperature0, model_namegpt-4o)elif model_name anthropic:model ChatAnthropic(temperature0, model_nameclaude-3-sonnet-20240229)else:raise ValueError(fUnsupported model type: {model_name})# 表示模型在执行过程中必要地方可以调用该工具model model.bind_tools(tools)return modelsystem_prompt Be a helpful assistant# Define the function that calls the model
def llm_node(state, config):
# 获取输入信息messages state[messages]messages [{role: system, content: system_prompt}] messagesmodel_name config.get(configurable, {}).get(model_name, anthropic)model _get_model(model_name)response model.invoke(messages)# We return a list, because this will get added to the existing listreturn {messages: [response]}工具节点
from langchain_community.tools.tavily_search import TavilySearchResults# 用于执行与 Tavily 搜索相关的任务
# max_results限制了最大返回结果数量
tools [TavilySearchResults(max_results1)]# Define the function to execute tools
tool_node ToolNode(tools)状态定义
from langgraph.graph import add_messages
from langchain_core.messages import BaseMessage
from typing import TypedDict, Annotated, Sequenceclass AgentState(TypedDict):
# 描述了一个包含 messages 字段的字典其中 messages 是一个消息列表
# 类型为 BaseMessage并且有额外的注释 add_messagesmessages: Annotated[Sequence[BaseMessage], add_messages]这次已经完成了一个example的学习