📘 **TELUS Agriculture & Consumer Goods** 如何通过 **Haystack Agents** 转变促销交易

Haystack 2.15.0

在 Github 上查看

发布说明

⭐️ Highlights

并行工具调用,实现更快的代理

  • ToolInvoker 现在使用内部的 ThreadPoolExecutor 以并行方式处理传递给 runrun_async 的所有工具调用。这通过减少顺序调用工具所花费的时间来提高性能。
  • 此并行执行功能使 ToolInvoker 能够批处理和并发处理多个工具调用,从而使代理能够高效地运行复杂管道,同时减少延迟。
  • 您不再需要传递 async_executorToolInvoker 管理自己的执行器,可以通过 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 传递给 OpenAIChatGeneratorAzureOpenAIChatGeneratorHuggingFaceAPIChatGeneratorHuggingFaceGeneratorHugginFaceLocalGeneratorHuggingFaceLocalChatGenerator 中的 StreamingChunk

  • ToolInvokerinitrunrun_async 方法中添加了 enable_streaming_callback_passthrough。如果设置为 TrueToolInvoker 将尝试将 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"] 中设置值来保持向后兼容性。

  • OpenAIDocumentEmbedderAzureOpenAIDocumentEmbedder 添加了一个 raise_on_failure 布尔参数。如果设置为 True,则当 API 请求出现错误时,组件将引发异常。默认值为 False,因此先前记录异常并继续执行的行为仍然是默认行为。

  • HuggingFaceLocalChatGenerator 添加 AsyncHFTokenStreamingHandler 以支持异步流式传输

  • 对于 HuggingFaceAPIGeneratorHuggingFaceAPIChatGenerator,现在会将 api_params 中传递的所有其他键值对传递给底层推理客户端的初始化。这允许将其他参数(如 timeoutheadersprovider 等)传递给客户端。这意味着我们现在可以通过在 api_params 中传递 provider 键来轻松指定不同的推理提供程序。

  • 已更新 StreamingChunk 以添加 tool_callstool_call_resultindexstart 字段,以便在流式回调中更轻松地格式化流。

    • StreamingChunk.tool_calls 字段添加了新的数据类 ToolCallDelta,以反映参数可以是字符串增量。
    • 已更新 print_streaming_chunk_convert_streaming_chunks_to_chat_message 实用方法以使用这些新字段。这特别改进了在使用 print_streaming_chunk 与 Agent 配合使用时的格式。
    • 已更新 OpenAIGeneratorOpenAIChatGeneratorHuggingFaceAPIChatGeneratorHuggingFaceGeneratorHuggingFaceLocalGeneratorHuggingFaceLocalChatGenerator 以遵循新的数据类。
    • 已更新 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 修复

  • 修复了 ToolInvokerto_dictfrom_dict 以正确序列化 streaming_callback init 参数。
  • 修复了一个错误:如果 raise_on_failure=False 且批处理过程中发生错误,则后续的嵌入将与错误的文档配对。
  • 修复了 ComponentTool 使用的 component_invoker,使其在将 ChatMessage 等数据类直接传递给 component_tool.invoke(...) 时能够正常工作。以前这要么会导致错误,要么会悄无声息地跳过您的输入。
  • 修复了 LLMMetadataExtractor 在处理 Document 对象且内容为 None 或空字符串时发生的错误。该组件现在可以优雅地处理这些情况,将这些文档标记为失败并在其元数据中提供相应的错误消息,而无需尝试 LLM 调用。
  • RecursiveDocumentSplitter 现在为每个块生成一个唯一的 Document.id。元字段(split_idparent_id 等)在 Document 创建之前填充,因此用于 id 生成的哈希值始终是唯一的。
  • ConditionalRouter 中,修复了 to_dictfrom_dict 方法以正确处理 output_type 是类型列表或字符串列表的情况。当用户在 ConditionalRouter 中指定一个具有多个输出的路由时,就会发生这种情况。
  • 修复了 GeneratedAnswerChatMessage 对象嵌套在 meta 中时的序列化。
  • 修复了 ComponentToolTool 在指定 outputs_to_string 时的序列化。以前,在序列化后立即反序列化时会发生错误,如果 outputs_to_string 不为 None。
  • 调用 set_output_types 时,我们现在还会检查 @component.output_types 装饰器是否不在 Componentrun_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 类总是假定底层管道是同步的。
  • 修复了 OpenAIDocumentEmbedderAzureOpenAIDocumentEmbedder 中的一个错误:如果在批处理过程中发生 OpenAI API 错误,那么后续的嵌入将与错误的文档配对。

💙 非常感谢所有为本次发布做出贡献的人!

  • @Amnah199 @Seth-Peters @anakin87 @atopx @davidsbatista @denisw @gulbaki @julian-risch @lan666as @mdrazak2001 @mpangrazzi @sjrl @srini047 @vblagoje