发布说明
⭐️ Highlights
并行工具调用,实现更快的代理
ToolInvoker现在使用内部的ThreadPoolExecutor以并行方式处理传递给run或run_async的所有工具调用。这通过减少顺序调用工具所花费的时间来提高性能。- 此并行执行功能使
ToolInvoker能够批处理和并发处理多个工具调用,从而使代理能够高效地运行复杂管道,同时减少延迟。 - 您不再需要传递
async_executor。ToolInvoker管理自己的执行器,可以通过init中的max_workers参数进行配置。
引入 LLMMessagesRouter
新的 LLMMessagesRouter 组件,它使用生成式 LLM 对传入的 ChatMessage 对象进行分类和路由到不同的连接。此组件可与通用 LLM 以及 Llama Guard 等专用 LLM 一起使用进行审核。
用法示例
from haystack.components.generators.chat import HuggingFaceAPIChatGenerator
from haystack.components.routers.llm_messages_router import LLMMessagesRouter
from haystack.dataclasses import ChatMessage
chat_generator = HuggingFaceAPIChatGenerator(api_type="serverless_inference_api", api_params={"model": "meta-llama/Llama-Guard-4-12B", "provider": "groq"}, )
router = LLMMessagesRouter(chat_generator=chat_generator, output_names=["unsafe", "safe"], output_patterns=["unsafe", "safe"])
print(router.run([ChatMessage.from_user("How to rob a bank?")]))
新的 HuggingFaceTEIRanker 组件
HuggingFaceTEIRanker 通过文本嵌入推理 (TEI) API 实现端到端重新排序。它支持自托管的 TEI 服务和 Hugging Face 推理端点,让您可以即时获得灵活、高质量的重新排序。
🚀 新功能
-
已将
ComponentInfo数据类添加到 haystack 中,用于存储有关组件的信息。我们将其传递给StreamingChunk,以便我们可以从哪个组件流传过来。 -
将
component_info传递给OpenAIChatGenerator、AzureOpenAIChatGenerator、HuggingFaceAPIChatGenerator、HuggingFaceGenerator、HugginFaceLocalGenerator和HuggingFaceLocalChatGenerator中的StreamingChunk。 -
在
ToolInvoker的init、run和run_async方法中添加了enable_streaming_callback_passthrough。如果设置为True,ToolInvoker将尝试将streaming_callback函数传递给工具的 invoke 方法,但前提是工具的 invoke 方法在其签名中包含streaming_callback。 -
为
StreamingChunk类添加了专用的finish_reason字段,以提高类型安全并支持复杂的流式 UI 逻辑。该字段使用FinishReason类型别名,包含标准值:“stop”、“length”、“tool_calls”、“content_filter”,以及 Haystack 特有的值“tool_call_results”(由 ToolInvoker 用来指示工具执行完成)。 -
已更新
ToolInvoker组件以在流式传输工具结果时使用新的finish_reason字段。该组件现在在最终流式传输块中设置finish_reason="tool_call_results"来指示工具执行已完成,同时通过在meta["finish_reason"]中设置值来保持向后兼容性。 -
向
OpenAIDocumentEmbedder和AzureOpenAIDocumentEmbedder添加了一个raise_on_failure布尔参数。如果设置为True,则当 API 请求出现错误时,组件将引发异常。默认值为False,因此先前记录异常并继续执行的行为仍然是默认行为。 -
为
HuggingFaceLocalChatGenerator添加AsyncHFTokenStreamingHandler以支持异步流式传输 -
对于
HuggingFaceAPIGenerator和HuggingFaceAPIChatGenerator,现在会将api_params中传递的所有其他键值对传递给底层推理客户端的初始化。这允许将其他参数(如timeout、headers、provider等)传递给客户端。这意味着我们现在可以通过在api_params中传递provider键来轻松指定不同的推理提供程序。 -
已更新 StreamingChunk 以添加
tool_calls、tool_call_result、index和start字段,以便在流式回调中更轻松地格式化流。- 为
StreamingChunk.tool_calls字段添加了新的数据类ToolCallDelta,以反映参数可以是字符串增量。 - 已更新
print_streaming_chunk和_convert_streaming_chunks_to_chat_message实用方法以使用这些新字段。这特别改进了在使用print_streaming_chunk与 Agent 配合使用时的格式。 - 已更新
OpenAIGenerator、OpenAIChatGenerator、HuggingFaceAPIChatGenerator、HuggingFaceGenerator、HuggingFaceLocalGenerator和HuggingFaceLocalChatGenerator以遵循新的数据类。 - 已更新
ToolInvoker以遵循 StreamingChunk 数据类。
- 为
⚡️ 增强说明
-
添加了一个新的
deserialize_component_inplace函数来处理通用的组件反序列化,该函数可与任何组件类型一起使用。 -
将 doc-parser 设为核心依赖项,因为使用它的
ComponentTool是核心Tool组件之一。 -
将
PipelineBase().validate_input方法公开,以便用户可以使用它,并确信他们不会在没有警告的情况下收到重大更改。此方法对于检查管道中的所有必需连接都具有连接非常有用,并且在 Pipeline 的 run 方法中自动调用。它被公开出来供那些希望在运行时之前调用此方法来验证管道的用户使用。 -
对于组件 run Datadog 跟踪,将 span 资源名称设置为组件名称而不是操作名称。
-
向
SentenceTransformersSimilarityRanker组件添加了一个trust_remote_code参数。当设置为 True 时,这允许执行托管在 Hugging Face Hub 上的自定义模型和脚本。 -
向
ChatMessage.to_openai_dict_format添加了一个新参数require_tool_call_ids。默认值为True,以便与 OpenAI 的 Chat API 兼容:如果 Tool Call 中缺少id字段,则会引发错误。使用False对于不要求id字段的浅层 OpenAI 兼容 API 很有用。 -
Haystack 的核心模块现在是 “类型完整” 的,这意味着所有函数参数和返回类型都已显式注解。这增加了新添加的
py.typed标记的实用性,并避免了各种类型检查器实现之间类型推断的差异。 -
HuggingFaceAPIChatGenerator现在使用 util 方法_convert_streaming_chunks_to_chat_message。这有助于保持将StreamingChunks转换为最终ChatMessage的一致性。- 如果仅提供系统消息作为输入,则会向用户记录一条警告,表明这可能不是预期的,并且他们应该提供用户消息。
⚠️ 弃用说明
ToolInvoker中的async_executor参数已弃用,转而使用max_workers参数,并将在 Haystack 2.16.0 中移除。您可以使用max_workers参数来控制用于并行工具调用的线程数。
🐛 Bug 修复
- 修复了
ToolInvoker的to_dict和from_dict以正确序列化streaming_callbackinit 参数。 - 修复了一个错误:如果
raise_on_failure=False且批处理过程中发生错误,则后续的嵌入将与错误的文档配对。 - 修复了
ComponentTool使用的component_invoker,使其在将ChatMessage等数据类直接传递给component_tool.invoke(...)时能够正常工作。以前这要么会导致错误,要么会悄无声息地跳过您的输入。 - 修复了
LLMMetadataExtractor在处理Document对象且内容为None或空字符串时发生的错误。该组件现在可以优雅地处理这些情况,将这些文档标记为失败并在其元数据中提供相应的错误消息,而无需尝试 LLM 调用。 - RecursiveDocumentSplitter 现在为每个块生成一个唯一的
Document.id。元字段(split_id、parent_id等)在Document创建之前填充,因此用于id生成的哈希值始终是唯一的。 - 在
ConditionalRouter中,修复了to_dict和from_dict方法以正确处理output_type是类型列表或字符串列表的情况。当用户在ConditionalRouter中指定一个具有多个输出的路由时,就会发生这种情况。 - 修复了
GeneratedAnswer在ChatMessage对象嵌套在meta中时的序列化。 - 修复了
ComponentTool和Tool在指定outputs_to_string时的序列化。以前,在序列化后立即反序列化时会发生错误,如果 outputs_to_string 不为 None。 - 调用
set_output_types时,我们现在还会检查@component.output_types装饰器是否不在Component的run_async方法上。以前我们只检查 Component.run 方法是否不包含装饰器。 - 通过将类型
List[ChatMessage]的检查中的is not替换为!=来修复 schema 验证中的类型比较。这可以防止由于 Python 的is运算符比较对象标识而不是相等性而导致的错误不匹配。 - 在
__init__.py文件中重新导出符号。这确保了像from haystack.components.builders import ChatPromptBuilder这样的短导入与from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder一样工作,而不会在 mypy/Pylance 中导致错误或警告。 SuperComponent类现在可以正确地序列化和反序列化基于异步管道的SuperComponent。以前,SuperComponent类总是假定底层管道是同步的。- 修复了
OpenAIDocumentEmbedder和AzureOpenAIDocumentEmbedder中的一个错误:如果在批处理过程中发生 OpenAI API 错误,那么后续的嵌入将与错误的文档配对。
💙 非常感谢所有为本次发布做出贡献的人!
- @Amnah199 @Seth-Peters @anakin87 @atopx @davidsbatista @denisw @gulbaki @julian-risch @lan666as @mdrazak2001 @mpangrazzi @sjrl @srini047 @vblagoje
