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

创建自定义组件

创建您自己的组件,并将其独立使用或在管道中使用。

通过 Haystack,您可以轻松创建用于各种任务的任何自定义组件,从过滤结果到与外部软件集成。然后,您可以将这些组件插入、重用和共享到 Haystack 中,甚至通过将其打包并提交到Haystack 集成与外部受众共享!

要求

以下是所有自定义组件的要求

  • @component:此装饰器将一个类标记为组件,允许它在管道中使用。
  • run():这是每个组件中必需的方法。它接受输入参数并返回一个dict。输入可以来自管道执行时,也可以来自另一个组件通过connect()连接时的输出。run()方法应与为组件声明的输入/输出定义兼容。请参阅下面的扩展示例以了解其工作原理。run() 方法应与为组件声明的输入/输出定义兼容。请参阅下面的扩展示例以了解其工作原理。

输入和输出

接下来,定义组件的输入和输出。

输入

您可以选择三种输入选项

  • set_input_type:此方法为组件实例定义或更新单个输入插槽。它非常适合在运行时添加或修改特定输入而不影响其他输入。当您需要根据特定条件动态设置或修改单个输入时,请使用此方法。
  • set_input_types:此方法允许您一次定义多个输入插槽,替换任何现有输入。当您知道组件将需要的所有输入并希望批量配置它们时,此方法很有用。当您希望在初始化期间定义多个输入时,请使用此方法。
  • 直接在run() 方法中声明参数。当组件的输入是静态的并且在类定义时已知时,请使用此方法。

输出

您可以选择两种输出选项

  • @component.output_types:此装饰器在类定义时定义输出类型和名称。输出名称和类型必须与dict 返回的run() 方法匹配。当输出类型是静态且已知时,请使用此方法。此装饰器对于静态组件更简洁易读。
  • set_output_types:此方法在运行时定义或更新组件实例的多个输出插槽。当您需要灵活地动态配置输出时,此方法很有用。当需要为更大的灵活性在运行时设置输出类型时,请使用此方法。

简短示例

以下是一个简单最小组件设置的示例

from haystack import component

@component
class WelcomeTextGenerator:
  """
  A component generating personal welcome message and making it upper case
  """
  @component.output_types(welcome_text=str, note=str)
  def run(self, name:str):
    return {"welcome_text": f'Hello {name}, welcome to Haystack!'.upper(), "note": "welcome message is ready"}

在这里,自定义组件WelcomeTextGenerator 接受一个输入name 字符串并返回两个输出welcome_text注意.

扩展示例

点击下面的食谱,查看如何在 Haystack 管道中创建并连接两个自定义组件。

扩展现有组件

要扩展 Haystack 中已有的组件,请子类化现有组件并使用@component 装饰器进行标记。重写或扩展run() 方法以处理输入和输出。从派生类的 init 中调用带有派生类名称的super() 以避免初始化问题。

class DerivedComponent(BaseComponent):
    def __init__(self):
        super(DerivedComponent, self).__init__()

# ...

dc = DerivedComponent()  # ok

一个扩展组件的示例是 Haystack 的 FaithfulnessEvaluator,它派生自 LLMEvaluator。

其他参考资料

🧑‍🍳食谱