LangChain系列文章
有几个新的API可以使用。
主要入口点是StateGraph
。
from langgraph.graph import StateGraph
这个类负责构建图。它提供了一个受NetworkX启发的接口。这个图由一个状态对象参数化,它传递给每个节点。
__init__
def __init__(self, schema: Type[Any]) -> None:
在构建图表时,您需要传入一个状态模式。然后,每个节点都会返回操作以更新该状态。这些操作可以是在状态上设置特定属性(例如,覆盖现有值),也可以是向现有属性添加内容。是设置还是添加是通过注释您用于构建图表的状态对象来表示的。
指定模式的推荐方法是使用类型化字典:from typing import TypedDict
然后,您可以使用 from typing import Annotated
注释不同的属性。目前,唯一支持的注释是 import operator; operator.add
。此注释将使得任何返回此属性的节点将新结果添加到现有值中。
让我们看一个例子:
from typing import TypedDict, Annotated, Union
from langchain_core.agents import AgentAction, AgentFinish
import operator
class AgentState(TypedDict):
# The input string
input: str
# The outcome of a given call to the agent
# Needs `None` as a valid type, since this is what this will start as
agent_outcome: Union[AgentAction, AgentFinish, None]
# List of actions and corresponding observations
# Here we annotate this with `operator.add` to indicate that operations to
# this state should be ADDED to the existing values (not overwrite it)
intermediate_steps: Annotated[list[tuple[AgentAction, str]], operator.add]
我们可以像这样使用:
# Initialize the StateGraph with this state
graph = StateGraph(AgentState)
# Create nodes and edges
...
# Compile the graph
app = graph.compile()
# The inputs should be a dictionary, because the state is a TypedDict
inputs = {
# Let's assume this the input
"input": "hi"
# Let's assume agent_outcome is set by the graph as some point
# It doesn't need to be provided, and it will be None by default
# Let's assume `intermediate_steps` is built up over time by the graph
# It doesn't need to provided, and it will be empty list by default
# The reason `intermediate_steps` is an empty list and not `None` is because
# it's annotated with `operator.add`
}
.add_node
def add_node(self, key: str, action: RunnableLike) -> None:
这种方法向图中添加一个节点。它接受两个参数:
key
: 一个表示节点名称的字符串。这个名称必须是唯一的。action
: 当调用该节点时要执行的操作。这应该是一个函数或可运行的。.add_conditional_edges
def add_conditional_edges(
self,
start_key: str,
condition: Callable[..., str],
conditional_edge_mapping: Dict[str, str],
) -> None:
这种方法添加了条件边缘。这意味着只会选择一个下游边缘,取决于起始节点的结果。这需要三个参数:
start_key
:表示起始节点名称的字符串。该键必须已在图表中注册过。condition
:要调用以决定接下来要做什么的函数。输入将是起始节点的输出。它应返回一个存在于conditional_edge_mapping
中并表示要采取的边缘的字符串。conditional_edge_mapping
:字符串到字符串的映射。键应该是条件可能返回的字符串。值应该是如果返回该条件则调用的下游节点。set_entry_point
def set_entry_point(self, key: str) -> None:
图的入口点。这是首先调用的节点。它只需要一个参数:
key
:应首先调用的节点的名称。.set_finish_point
def set_finish_point(self, key: str) -> None:
这是图的出口点。当调用此节点时,结果将是图的最终结果。它只有一个参数:
key
:调用时将返回其调用结果作为最终输出的节点名称注意:如果在任何时候您之前创建了通向END的边缘(条件或正常),则不需要调用此节点。
https://github.com/zgpeace/pets-name-langchain/tree/develop
https://python.langchain.com/docs/langsmith/walkthrough