工具与运行时的值

有时,您希望让工具调用LLM填充工具函数参数的子集 ,并在运行时为其他参数提供其他值。核心技术是将参数注释为 “injected”,这意味着它将由您的程序注入,并且不应由 LLM 提供

工具访问图形状态

我们希望我们的工具将图形状态作为输入,但我们不希望模型在调用工具时尝试生成此输入。我们可以使用 InjectedState 注解将参数标记为必需的图形状态(或图形状态的某个字段)。这些参数不会由模型生成。使用 ToolNode 时,图形状态将自动传递给相关工具和参数。

在此示例中,我们将创建一个返回 Documents 的工具,然后创建另一个实际引用证明声明合理的 Documents 的工具。

from typing import List, Tuple
from typing_extensions import Annotated

from langchain_core.messages import ToolMessage
from langchain_core.tools import tool
from langgraph.prebuilt import InjectedState


@tool
def get_context(question: str, state: Annotated[dict, InjectedState]):
    """Get relevant context for answering the question."""
    return "\n\n".join(doc for doc in state["docs"])

如果我们查看这些工具的输入架构,我们将看到 state 仍然列出:

from pprint import pprint

pprint(get_context.get_input_schema().model_json_schema())

但是,如果我们查看工具调用架构,即传递给模型进行工具调用的内容, 则 state 已被删除:

完整示例

png

更新状态

一个常见的用例是从工具内部更新图形状态。例如,在客户支持应用程序中,您可能希望在对话开始时查找客户账号或 ID。

在从工具更新状态后,我们将根据状态值对用户做出不同的响应。为了实现这一点,我们定义一个函数,该函数将根据图形状态动态构造系统提示符。每次调用 时都会调用它 LLM,并且函数输出将传递给 LLM:

最后更新于