Tools #
工具(Tools)是为模型调用而设计的实用程序:其输入由模型生成,输出则传回模型。当你希望模型控制部分代码或调用外部 API 时,就需要使用工具。
一个工具包含以下部分:
- 工具的名称
name
。 - 工具的功能描述
description
。 - 定义工具输入的
JSON schema
。 - 一个函数
function
(可选地,还可以有该函数的async版本)。
当一个工具绑定到模型时,其name
、description
和JSON schema
会作为上下文提供给模型。给定一组工具和一组指令,模型可以请求调用一个或多个工具并传递特定输入。典型的用法可能如下所示:
1tools = [...] # Define a list of tools
2llm_with_tools = llm.bind_tools(tools)
3ai_msg = llm_with_tools.invoke("do xyz...")
4# -> AIMessage(tool_calls=[ToolCall(...), ...], ...)
模型返回的 AIMessage
可能 会包含与之关联的工具调用(tool_calls
)。请阅读此指南以获取关于响应类型的更多信息。
一旦调用了选定的工具,结果可以传回模型,以便模型完成其执行的任务。通常有两种不同的方式来调用工具并将响应传回模型:
仅使用参数调用 #
当你仅使用参数调用一个工具时,你会得到工具的原始输出(通常是一个字符串)。通常表现如下:
1# You will want to previously check that the LLM returned tool calls
2tool_call = ai_msg.tool_calls[0]
3# ToolCall(args={...}, id=..., ...)
4tool_output = tool.invoke(tool_call["args"])
5tool_message = ToolMessage(
6 content=tool_output,
7 tool_call_id=tool_call["id"],
8 name=tool_call["name"]
9)
请注意,content
字段通常会传回模型。如果你不希望将工具的原始响应传递给模型,但仍希望保留它,你可以对工具输出进行转换,并将其作为一个artifact传递(更多关于 ToolMessage.artifact
的信息,请参阅此处)。
1... # Same code as above
2response_for_llm = transform(response)
3tool_message = ToolMessage(
4 content=response_for_llm,
5 tool_call_id=tool_call["id"],
6 name=tool_call["name"],
7 artifact=tool_output
8)
使用 ToolCall
调用
#
另一种调用工具的方法是使用模型生成的完整 ToolCall
进行调用。当你这样做时,工具将返回一个 ToolMessage
。这样做的好处是,你不必自己编写逻辑将工具输出转换为 ToolMessage
。通常表现如下:
1tool_call = ai_msg.tool_calls[0]
2# -> ToolCall(args={...}, id=..., ...)
3tool_message = tool.invoke(tool_call)
4# -> ToolMessage(
5# content="tool result foobar...",
6# tool_call_id=...,
7# name="tool_name"
8# )
如果你以这种方式调用工具,并且希望为 ToolMessage
包含一个artifact,你需要让工具返回两个内容。更多关于定义返回artifact的工具的信息,请参阅此处。
最佳实践 #
设计供模型使用的工具时,需牢记以下几点:
- 明确支持tool calling API的聊天模型在调用工具方面会比未经微调的模型表现更好。
- 如果工具的名称、描述和 JSON Schema经过精心选择,模型的表现会更好。这也是提示工程的一种形式。
- 简单、范围明确的工具比复杂的工具更容易被模型使用。
相关内容 #
有关如何使用工具的具体细节,请参阅工具使用指南。
要使用预构建的工具,请查看工具集成文档。