Toolkits (工具集)
将多个工具分组到一个单元中。
| 必需的初始化变量 | "tools": 工具列表 |
| API 参考 | Toolkits (工具集) |
| GitHub 链接 | https://github.com/deepset-ai/haystack/blob/main/haystack/tools/toolset.py |
概述
一个工具集 将多个 Tool 实例分组到一个可管理的单元中。它简化了将工具传递给 Chat Generators、ToolInvoker 或 Agent 等组件的过程,并支持过滤、序列化和重用。
此外,通过继承工具集,您可以创建从 OpenAPI URL、MCP 服务器或其他资源动态加载工具的实现。
初始化 Toolset
以下是如何初始化工具集 以及 Tool。或者,您可以在工具集 中使用 ComponentTool 或 MCPTool 作为 Tool 实例。
from haystack.tools import Tool, Toolset
# Define math functions
def add_numbers(a: int, b: int) -> int:
return a + b
def subtract_numbers(a: int, b: int) -> int:
return a - b
# Create tools with proper schemas
add_tool = Tool(
name="add",
description="Add two numbers",
parameters={
"type": "object",
"properties": {
"a": {"type": "integer"},
"b": {"type": "integer"}
},
"required": ["a", "b"]
},
function=add_numbers
)
subtract_tool = Tool(
name="subtract",
description="Subtract b from a",
parameters={
"type": "object",
"properties": {
"a": {"type": "integer"},
"b": {"type": "integer"}
},
"required": ["a", "b"]
},
function=subtract_numbers
)
# Create a toolset with the math tools
math_toolset = Toolset([add_tool, subtract_tool])
向 Toolset 添加新工具
def multiply_numbers(a: int, b: int) -> int:
return a * b
multiply_tool = Tool(
name="multiply",
description="Multiply two numbers",
parameters={
"type": "object",
"properties": {
"a": {"type": "integer"},
"b": {"type": "integer"}
},
"required": ["a", "b"]
},
function=multiply_numbers
)
math_toolset.add(multiply_tool)
# or, you can merge toolsets together
math_toolset.add(another_toolset)
用法
您可以使用在 Haystack 中任何可以使用 Tools 的地方使用 工具集。
与 ChatGenerator 和 ToolInvoker 一起使用
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.tools import ToolInvoker
from haystack.dataclasses import ChatMessage
# Create a toolset with the math tools
math_toolset = Toolset([add_tool, subtract_tool])
chat_generator = OpenAIChatGenerator(model="gpt-4o-mini", tools=math_toolset)
# Initialize the Tool Invoker with the weather tool
tool_invoker = ToolInvoker(tools=math_toolset)
user_message = ChatMessage.from_user("What is 10 minus 5?")
replies = chat_generator.run(messages=[user_message])["replies"]
print(f"assistant message: {replies}")
# If the assistant message contains a tool call, run the tool invoker
if replies[0].tool_calls:
tool_messages = tool_invoker.run(messages=replies)["tool_messages"]
print(f"tool result: {tool_messages[0].tool_call_result.result}")
输出
assistant message: [ChatMessage(_role=<ChatRole.ASSISTANT: 'assistant'>, _content=[ToolCall(tool_name='subtract', arguments={'a': 10, 'b': 5}, id='call_awGa5q7KtQ9BrMGPTj6IgEH1')], _name=None, _meta={'model': 'gpt-4o-mini-2024-07-18', 'index': 0, 'finish_reason': 'tool_calls', 'usage': {'completion_tokens': 18, 'prompt_tokens': 75, 'total_tokens': 93, 'completion_tokens_details': CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), 'prompt_tokens_details': PromptTokensDetails(audio_tokens=0, cached_tokens=0)}})]
tool result: 5
在 Pipeline 中
from haystack import Pipeline
from haystack.components.converters import OutputAdapter
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.tools import ToolInvoker
from haystack.dataclasses import ChatMessage
math_toolset = Toolset([add_tool, subtract_tool])
pipeline = Pipeline()
pipeline.add_component("llm", OpenAIChatGenerator(model="gpt-4o-mini", tools=math_toolset))
pipeline.add_component("tool_invoker", ToolInvoker(tools=math_toolset))
pipeline.add_component(
"adapter",
OutputAdapter(
template="{{ initial_msg + initial_tool_messages + tool_messages }}",
output_type=list[ChatMessage],
unsafe=True,
),
)
pipeline.add_component("response_llm", OpenAIChatGenerator(model="gpt-4o-mini"))
pipeline.connect("llm.replies", "tool_invoker.messages")
pipeline.connect("llm.replies", "adapter.initial_tool_messages")
pipeline.connect("tool_invoker.tool_messages", "adapter.tool_messages")
pipeline.connect("adapter.output", "response_llm.messages")
user_input = "What is 2+2?"
user_input_msg = ChatMessage.from_user(text=user_input)
result = pipeline.run({"llm": {"messages": [user_input_msg]}, "adapter": {"initial_msg": [user_input_msg]}})
print(result["response_llm"]["replies"][0].text)
输出
2 + 2 equals 4.
与 Agent 一起使用
from haystack.components.agents import Agent
from haystack.dataclasses import ChatMessage
from haystack.components.generators.chat import OpenAIChatGenerator
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
tools=math_toolset
)
agent.warm_up()
response = agent.run(messages=[ChatMessage.from_user("What is 4 + 2?")])
print(response["messages"][-1].text)
输出
4 + 2 equals 6.
更新于 6 个月前
