文档API 参考📓 教程🧑‍🍳 菜谱🤝 集成💜 Discord🎨 Studio
文档

PipelineTool

将 Haystack pipeline 封装起来,以便 LLM 可以将其作为工具调用。

必需的初始化变量"pipeline": 要封装的 Haystack pipeline

"name": 工具的名称

"description": 工具的描述
API 参考Tools (工具)
GitHub 链接https://github.com/deepset-ai/haystack/blob/main/haystack/tools/pipeline_tool.py

概述

PipelineTool 允许您封装整个 Haystack pipeline,并将其公开为 LLM 可以调用的工具。
它取代了以前将 pipeline 先封装在SuperComponent 中,然后再将其传递给
ComponentTool.

PipelineTool 的旧工作流程,它会根据 pipeline 的输入插槽构建工具参数模式,并使用底层组件的 docstrings 作为输入描述。您可以使用
input_mappingoutput_mapping 来选择要公开的 pipeline 输入和输出。它支持PipelineAsyncPipeline,并且可以与ToolInvoker 一起在 pipeline 中使用,或者直接与Agent 组件一起使用。

参数

  • pipeline 是必需的,并且必须是PipelineAsyncPipeline 实例。
  • name 是必需的,用于指定工具的名称。
  • description 是必需的,用于解释工具的作用。
  • input_mapping 是可选的。它将工具输入名称映射到 pipeline 输入插槽路径。如果省略,则会从所有 pipeline 输入创建默认
    映射。
  • output_mapping 是可选的。它将 pipeline 输出插槽路径映射到工具输出名称。如果省略,则会从所有 pipeline 输出创建默认
    映射。

用法

基本用法

您可以从任何现有的 Haystack pipeline 创建一个PipelineTool

from haystack import Document, Pipeline
from haystack.tools import PipelineTool
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.rankers.sentence_transformers_similarity import SentenceTransformersSimilarityRanker
from haystack.document_stores.in_memory import InMemoryDocumentStore

# Create your pipeline
document_store = InMemoryDocumentStore()
# Add some example documents
document_store.write_documents([
    Document(content="Nikola Tesla was a Serbian-American inventor and electrical engineer."),
    Document(content="Alternating current (AC) is an electric current which periodically reverses direction."),
    Document(content="Thomas Edison promoted direct current (DC) and competed with AC in the War of Currents."),
])
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component("bm25_retriever", InMemoryBM25Retriever(document_store=document_store))
retrieval_pipeline.add_component("ranker", SentenceTransformersSimilarityRanker(model="cross-encoder/ms-marco-MiniLM-L-6-v2"))
retrieval_pipeline.connect("bm25_retriever.documents", "ranker.documents")

# Wrap the pipeline as a tool
retrieval_tool = PipelineTool(
    pipeline=retrieval_pipeline,
    input_mapping={"query": ["bm25_retriever.query", "ranker.query"]},
    output_mapping={"ranker.documents": "documents"},
    name="retrieval_tool",
    description="Search short articles about Nikola Tesla, AC electricity, and related inventors",
)

在 pipeline 中

通过指定组件名称和触发断点的访问计数来创建从检索 pipeline 创建 PipelineTool,并让OpenAIChatGenerator 在 pipeline 中将其用作工具。

from haystack import Document, Pipeline
from haystack.tools import PipelineTool
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders.sentence_transformers_text_embedder import SentenceTransformersTextEmbedder
from haystack.components.embedders.sentence_transformers_document_embedder import SentenceTransformersDocumentEmbedder
from haystack.components.retrievers import InMemoryEmbeddingRetriever
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.tools.tool_invoker import ToolInvoker
from haystack.dataclasses import ChatMessage

# Initialize a document store and add some documents
document_store = InMemoryDocumentStore()
document_embedder = SentenceTransformersDocumentEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
documents = [
    Document(content="Nikola Tesla was a Serbian-American inventor and electrical engineer."),
    Document(content="He is best known for his contributions to the design of the modern alternating current (AC) electricity supply system."),
]
document_embedder.warm_up()
docs_with_embeddings = document_embedder.run(documents=documents)["documents"]
document_store.write_documents(docs_with_embeddings)

# Build a simple retrieval pipeline
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component(
    "embedder", SentenceTransformersTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
)
retrieval_pipeline.add_component("retriever", InMemoryEmbeddingRetriever(document_store=document_store))
retrieval_pipeline.connect("embedder.embedding", "retriever.query_embedding")

# Wrap the pipeline as a tool
retriever_tool = PipelineTool(
    pipeline=retrieval_pipeline,
    input_mapping={"query": ["embedder.text"]},
    output_mapping={"retriever.documents": "documents"},
    name="document_retriever",
    description="For any questions about Nikola Tesla, always use this tool",
)

# Create pipeline with OpenAIChatGenerator and ToolInvoker
pipeline = Pipeline()
pipeline.add_component("llm", OpenAIChatGenerator(model="gpt-4o-mini", tools=[retriever_tool]))
pipeline.add_component("tool_invoker", ToolInvoker(tools=[retriever_tool]))

# Connect components
pipeline.connect("llm.replies", "tool_invoker.messages")

message = ChatMessage.from_user("Use the document retriever tool to find information about Nikola Tesla")

# Run pipeline
result = pipeline.run({"llm": {"messages": [message]}})

print(result)

配合 Agent 组件使用

使用PipelineTool 可与 Agent 组件配合使用。该Agent 包括一个ToolInvoker 和您选择的 ChatGenerator,用于执行工具调用并处理工具结果。

from haystack import Document, Pipeline
from haystack.tools import PipelineTool
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders.sentence_transformers_text_embedder import SentenceTransformersTextEmbedder
from haystack.components.embedders.sentence_transformers_document_embedder import SentenceTransformersDocumentEmbedder
from haystack.components.retrievers import InMemoryEmbeddingRetriever
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.agents import Agent
from haystack.dataclasses import ChatMessage

# Initialize a document store and add some documents
document_store = InMemoryDocumentStore()
document_embedder = SentenceTransformersDocumentEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
documents = [
    Document(content="Nikola Tesla was a Serbian-American inventor and electrical engineer."),
    Document(content="He is best known for his contributions to the design of the modern alternating current (AC) electricity supply system."),
]
document_embedder.warm_up()
docs_with_embeddings = document_embedder.run(documents=documents)["documents"]
document_store.write_documents(docs_with_embeddings)

# Build a simple retrieval pipeline
retrieval_pipeline = Pipeline()
retrieval_pipeline.add_component(
    "embedder", SentenceTransformersTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2")
)
retrieval_pipeline.add_component("retriever", InMemoryEmbeddingRetriever(document_store=document_store))
retrieval_pipeline.connect("embedder.embedding", "retriever.query_embedding")

# Wrap the pipeline as a tool
retriever_tool = PipelineTool(
    pipeline=retrieval_pipeline,
    input_mapping={"query": ["embedder.text"]},
    output_mapping={"retriever.documents": "documents"},
    name="document_retriever",
    description="For any questions about Nikola Tesla, always use this tool",
)

# Create an Agent with the tool
agent = Agent(
    chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
    tools=[retriever_tool]
)

# Let the Agent handle a query
result = agent.run([ChatMessage.from_user("Who was Nikola Tesla?")])

# Print result of the tool call
print("Tool Call Result:")
print(result["messages"][2].tool_call_result.result)
print("")

# Print answer
print("Answer:")
print(result["messages"][-1].text)