Haystack 通过利用 Python 的原生并发工具并与外部框架集成以实现分布式工作负载,从而支持多线程和并行处理。 在其核心,Haystack 管道旨在尽可能并发地执行节点(例如检索器或分类器等组件)。 对于 CPU 密集型任务(例如文本处理或嵌入生成),Haystack 可以使用 Python 的 multiprocessing
模块来绕过全局解释器锁 (GIL) 并利用多个 CPU 核心。 对于 I/O 密集型操作(例如查询外部 API 或数据库),它采用多线程来高效地处理等待期,而不会阻塞主线程。 这种灵活性确保开发人员可以根据任务类型优化性能。
一个关键机制是 Haystack 对异步执行的支持。 例如,当运行具有多个检索器的管道(例如,密集检索器和稀疏检索器)时,这些组件可以并行处理查询。 开发人员还可以启用分片,这会将文档语料库分成更小的块并在线程或进程中同时处理它们。 此外,Haystack 还与 Ray 等分布式计算框架集成,从而允许工作负载跨集群扩展。 例如,可以使用 Ray actors 并行化大型数据集的嵌入生成,从而将工作负载分配到多台机器上,同时保持简单的 API。
实际的实现包括在 Haystack 的 Converter
类中使用 multiprocessing.Pool
以在索引期间并行预处理文档。 在检索增强管道中,诸如 EmbeddingRetriever
之类的节点可以并发处理批量的文档,从而减少延迟。 开发人员还可以将管道配置为异步运行检索器和阅读器 — 例如,从 Elasticsearch 获取文档,同时初始化用于答案提取的模型。 通过将 Python 的并发原语与分布式框架相结合,Haystack 平衡了简单性和可扩展性,让开发人员可以处理大规模数据或高吞吐量查询,而无需重写核心逻辑。