在创建新的Component时,我必须用 @component
装饰器来装饰它。
到目前为止,这个装饰器接受一个单一的 bool
参数,如这里定义的。
那个 is_greedy
参数反过来临时设置了这里的内部类dunder字段。注解说这是暂时的,但正如我们在下一段中所看到的,实际上是错误的。当我们开始实现它时,我们假设这会是暂时的,因为Component的“贪婪”程度也取决于它接收的输入类型,而在执行的这一点上,我们还无法可靠地知道Component的输入类型。
然后在这里,在 ComponentMeta
元类中,我们可以实际可靠地检查Component接收的实际输入类型,如果用户将 is_greedy
设置为 True
并且没有具有 Variadic
类型的输入,我们会发出警告。
这是必要的,因为具有 Variadic
输入并且将 is_greedy
作为 True
的Component与具有 Variadic
作为输入并且将 is_greedy
作为 False
的Component在调用 Pipeline.run()
时表现不同。在这里,我们确切地检查Component是否具有 Variadic
作为输入类型并且已将 is_greedy
设置为 True
。
具有 Variadic
输入和具有 is_greedy
作为 True
的Component与具有 is_greedy
作为 False
的Component之间的核心区别在于,后者将在尽可能长的时间内等待尝试执行具有 is_greedy
作为 False
的Component。而具有 is_greedy
作为 True
的Component将在收到与其连接的所有发送组件的第一个输入时立即添加到准备好运行的Component列表中。
由于这种做法容易出错,且Component的“贪婪”程度与其输入类型有关,因此我们实际上应该删除 is_greedy
参数。而不是依赖于 @component
装饰器参数来设置这些信息,我们应该创建一个 VariadicGreedy
类型,就像我们有一个 Variadic
类型一样。
这将更清楚地表明哪个Component实际上是“贪婪”的,并明确显示“贪婪”与 Variadic
输入类型有关。
1条答案
按热度按时间zphenhs41#
这也与 #7873 有关,因为它讨论了将
Variadic
和is_greedy
设置为True
的组件的执行。在
Pipeline.run()
执行过程中,组件的“贪婪”程度也在其他地方被引用。在这里我们检查
is_greedy
字段,这实际上可能是一个错误,因为is_greedy
字段从未被设置,而是使用了__haystack_is_greedy__
。此外,这里、这里和这里还使用了
__haystack_is_greedy__
。