LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations
LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations
- 本篇摘要
- 14. LangChain组件Tools/Toolkits详解
-
- 14.6 特殊类型注解Annotations
-
- 14.6.1 特殊类型注解分类
- 14.6.1 InjectedToolArg构建运行时绑定值工具
- 14.6.3 查看并传入参数
- 14.6.4 在运行时注入参数
- 14.6.5 其它特殊类型注解
- 参考文献
本章目录如下:
- 《LangChain组件Tools/Toolkits详解(1)——Tools接口与创建工具概述》
- 《LangChain组件Tools/Toolkits详解(2)——装饰器@tool》
- 《LangChain组件Tools/Toolkits详解(3)——结构化工具StructuredTool》
- 《LangChain组件Tools/Toolkits详解(4)——处理Error》
- 《LangChain组件Tools/Toolkits详解(5)——返回产物artifact》
- 《LangChain组件Tools/Toolkits详解(6)——特殊类型注解Annotations》
- 《LangChain组件Tools/Toolkits详解(7)——工具调用与Toolkits》
本篇摘要
本章介绍LangChain组件Tools/Toolkits。
14. LangChain组件Tools/Toolkits详解
工具(Tools)是一种封装函数及其模式schema的方法,可以传递给聊天模型,使模型能够请求执行带有特定输入的工具函数,例如从数据库获取数据、发出API请求或运行自定义代码。LangChain中的tool抽象类将Python函数与定义函数名称、描述和预期参数的模式schema关联起来,以明确创建工具的作用及调用方式。本节将从Tools接口与创建工具概述、装饰器@tool、结构化工具StructuredTool、处理Error、返回产物artifact、特殊类型注解、工具调用和Toolkits等方面详细介绍工具。
14.6 特殊类型注解Annotations
在工具的函数签名中,可以使用一些特殊的类型注解(Special Type Annotations)来配置工具的运行时行为。本节将讲述其分类及使用方法。
14.6.1 特殊类型注解分类
常用的特殊类型注解有以下几种,下面注解将从工具的模式schema中移除相应的参数,这对于不应暴露给模型且模型不应控制的参数非常有用:
- InjectedToolArg:值应在运行时使用.invoke或.ainvoke手动注入;
- RunnableConfig:将RunnableConfig对象传递给工具;
- InjectedState:将LangGraph图的整体状态传递给工具;
- InjectedStore:将LangGraph存储对象传递给工具。
我们还可以使用Annotated类型与上面参数的字符串字面量(string literal)结合,为工具模式中暴露的相关参数提供描述,其调用格式为:
- Annotated[type, “string literal”]:为参数添加描述,该描述将暴露在工具的模式中。
14.6.1 InjectedToolArg构建运行时绑定值工具
运行时绑定值:我们有时可能需要将仅在运行时已知的值绑定到工具,例如工具逻辑可能需要使用发起请求的用户ID。在大多数情况下,这些值不应由LLM(大语言模型)控制,因为允许LLM控制用户ID可能会导致安全风险,它们应由应用程序逻辑固定。为此我们使用InjectedToolArg注解来标记工具的某些参数,它允许从工具的模式中隐藏某些参数。下面将展示如何防止模型生成某些工具参数,并在运行时直接注入这些参数。
关于兼容性,本部分代码需要langchain-core >= 0.2.21,请确保已安装正确版本的包。另外对于LangGraph,请参考How to pass runtime values to tools,它讲述如何创建一个代理来跟踪给定用户最喜欢的宠物。
例如当工具需要在运行时动态注入user_id,首先以Anthropic为例创建LLM:
# !pip install -qU "langchain[anthropic]"
import getpass
import os
if not os.environ.get("ANTHROPIC_API_KEY"):
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("Enter API key for Anthropic: ")
from langchain.chat_models import init_chat_model
llm = init_chat_model("claude-3-5-sonnet-latest", model_provider="anthropic")
然后通过使用InjectedToolArg注解user_id参数,告诉LangChain该参数不应作为工具模式的一部分暴露:
from typing import List
from langchain_core.tools import InjectedToolArg, tool
from typing_extensions import Annotated
user_to_pets = {
}
@tool(parse_docstring=True)
def update_favorite_pets(
pets: List[str], user_id: Annotated[str, InjectedToolArg]
) -> None:
"""Add the