参考:langgraph/examples at main · langchain-ai/langgraph · GitHub
大家好,我是雨飞。LangGraph 是在 LangChain 基础上的一个库,是 LangChain 的 LangChain Expression Language (LCEL)的扩展。能够利用有向无环图的方式,去协调多个LLM或者状态,使用起来比 LCEL 会复杂,但是逻辑会更清晰。
相当于一种高级的LCEL语言,值得一试。
安装也十分简单。注意,这个库需要自己去安装,默认的LangChain不会安装这个库。
pip install langgraph
由于,OpenAI访问不方便,我们统一使用智普AI的大模型进行下面的实践。
智普AI的接口和OpenAI的比较类似,因此也可以使用OpenAI的tools的接口,目前还没有发现第二家如此方便的接口。实际使用起来,还是比较丝滑的,虽然有一些小问题。
我们下面以ToolAgent的思想,利用LangGraph去实现一个可以调用工具的Agent。
定义工具以及LLM
工具的定义,可以参考这篇文章,写的比较详细了,比较方便的就是使用 tools 这个注解。
定义Agent的状态
LangGraph 中最基础的类型是 StatefulGraph,这种图就会在每一个Node之间传递不同的状态信息。然后每一个节点会根据自己定义的逻辑去更新这个状态信息。具体来说,可以继承 TypeDict 这个类去定义状态,下图我们就定义了有四个变量的信息。
input:这是输入字符串,代表用户的主要请求。
chat_history: 这是之前的对话信息,也作为输入信息传入.
agent_outcome: 这是来自代理的响应,可以是 AgentAction,也可以是 AgentFinish。如果是 AgentFinish,AgentExecutor 就应该结束,否则就应该调用请求的工具。
intermediate_steps: 这是代理在一段时间内采取的行动和相应观察结果的列表。每次迭代都会更新。
class AgentState(TypedDict):
# The input string
input: str
# The list of previous messages in the conversation
chat_history: list[BaseMessage]
# 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]
定义图中的节点
在LangGraph中,节点一般是一个函数或者langchain中runnable的一种类。
我们这里定义两个节点,agent和tool节点,其中agent节点就是决定执行什么样的行动,
tool节点就是当agent节点选择执行某个行动时,去调用相应的工具。
此外,还需要定义节点之间的连接,也就是边。
条件判断的边:定义图的走向,比如Agent要采取行动时,就需要接下来调用tools,如果Agent说当前的的任务已经完成了,则结束整个流程。
普通的边:调用工具后,始