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

Haystack 2.17.0

在 Github 上查看

⭐️ Highlights

🖼️ 为多个模型提供商提供图像支持

继 Haystack 2.16.0 引入图像支持后,我们在 Haystack 和 Haystack Core 集成中将其扩展到了更多的模型提供商。

现已支持:Amazon Bedrock、Anthropic、Azure、Google、Hugging Face API、Meta Llama API、Mistral、Nvidia、Ollama、OpenAI、OpenRouter、STACKIT。

🧩 扩展组件

我们改进了几个组件,使其更具灵活性

  • MetadataRouter 用于根据元数据路由 Documents,现已扩展为支持路由 ByteStream 对象。
  • SentenceWindowRetriever 可检索相关 Documents 周围的句子以提供完整上下文,现在更加灵活。以前,其 source_id_meta_field 参数只能接受一个包含原始文档 ID 的字段。现在它还可以接受字段列表,因此只能检索到匹配所有指定元字段的文档。

⬆️ 升级说明

  • MultiFileConverter 在结果字典中输出一个新键 failed,其中包含无法转换的文件列表。documents 输出仅在至少一个文件成功转换时包含。以前,如果提供了具有支持的 MIME 类型但实际上不存在的文件,documents 仍然可能存在但为空。

  • HuggingFaceAPIChatGenerator 中的 finish_reason 字段行为已更新。以前,新的 finish_reason 映射(在 Haystack 2.15.0 版本中引入)仅在启用流式传输时应用。禁用流式传输时,仍然会返回旧的 finish_reason。此更改确保无论流式传输模式如何,都能一致地返回更新的 finish_reason 值。

    如何知道您是否受影响:如果您依赖于 HuggingFaceAPIChatGenerator 在禁用流式传输时的响应中的 finish_reason,在本次升级后您可能会看到不同的值。

    操作方法:查看更新的映射

    • lengthlength
    • eos_tokenstop
    • stop_sequencestop
    • 如果存在工具调用 → tool_calls

🚀 新功能

  • 在 MetadataRouter 中添加了对 ByteStream 对象的支持。现在可以使用它来根据元数据路由 list[Documents]list[ByteStream]
  • serialize_typePipeline.connect() 中添加了对 ByteStream 对象(Python 3.10 中添加)的支持。为了向后兼容,这些函数支持 typing.Union| 运算符以及它们的混合。
  • ReasoningContent 添加为 ChatMessage 数据类的一个新内容部分。这允许在助手消息中存储模型推理文本和其他元数据。助手消息现在可以使用 ChatMessage.from_assistant() 中的 reasoning 参数包含推理内容。我们将逐步更新支持推理的 LLM 的 Chat Generators 实现,以使用此新内容部分。
  • 更新了 SentenceWindowRetriever 的 source_id_meta_field 参数,使其也接受字符串列表。如果提供了字段列表,则仅检索匹配所有字段的文档。

⚡️ 增强说明

  • HuggingFaceAPIChatGenerator 添加了多模态支持,以实现使用图像和文本进行视觉语言模型 (VLM) 的使用。用户现在可以通过 Hugging Face API 将文本和图像发送到 VLM 模型。该实现遵循 HF VLM API 格式规范,并保持与纯文本消息的完全向后兼容。
  • ChatMessageTextContentImageContent 部分添加了序列化/反序列化方法。
  • 使惰性导入错误消息更清晰,解释了缺少可选依赖项。
  • 在整个代码库中采用了 PEP 585 的现代类型提示语法。这提高了可读性,并消除了对 typing 模块不必要的导入。
  • 支持 Agent 状态模式验证中的 ChatMessage 子类。验证现在会检查 issubclass(args[0], ChatMessage),而不是要求精确的类型相等,从而允许在 messages 字段中使用自定义的 ChatMessage 子类。
  • ToolInvokerrun 方法现在接受一个工具列表。提供此列表时,它会覆盖构造函数中设置的工具,从而允许您在以前构建的管道中在运行时切换工具。

🐛 Bug 修复

  • SentenceSplitter 使用的英文和德文缩写文件现在包含在发行版中。由于 .gitignore 文件中的配置,它们之前缺失了。

  • 在创建嵌入时,为 OpenAI 客户端添加了 encoding format 关键字参数。

  • 解决了 ChatMessage 类中存在的不正确假设,这些假设在有效使用场景中引发了错误。

    1. ChatMessage.from_user 配合 content_parts:以前,至少需要一个文本部分,尽管有些模型提供商支持仅包含图像部分的消息。此限制已被移除。如果提供商有此类限制,现在应在提供商的实现中强制执行。

    2. ChatMessage.to_openai_dict_format:消息包含多个文本部分时不受支持,尽管 OpenAI API 允许这样做。现在已纠正此问题。

  • 改进了 ChatMessage.from_user 类方法的验证。如果未提供 textcontent_parts,该方法现在将引发错误。如果 text 是空字符串,则不会引发错误。

  • 确保 SentenceTransformersSimilarityRanker 中的 score 字段作为 Python float 返回,而不是 numpy.float32。这可以防止下游集成中的潜在序列化问题。

  • 当从异步上下文调用 AsyncPipeline.run 时,引发 RuntimeError,指示应使用 run_async

  • 通过在处理前使用 dataclasses.replace 创建副本,防止在所有 ExtractorClassifier 组件中对输入 Document 对象进行原地修改。

  • 通过在处理前使用 dataclasses.replace 创建副本,防止在所有 DocumentEmbedder 组件中对输入 Document 对象进行原地修改。

  • FileTypeRouter 有一个新参数 raise_on_failure,其默认值为 False。当设置为 True 时,对于不存在的文件始终会引发 FileNotFoundError。以前,仅当处理不存在的文件并向 run() 提供了 meta 参数时,才会引发此异常。

  • 在尝试连接两个组件且发送方组件未定义任何 OutputSockets 时,返回更具信息量的错误消息。

  • 修复了通过 ToolInvoker.run_async 运行工具时,跟踪上下文未传播到工具的问题

  • 确保 SentenceTransformersDiversityRanker 的行为一致。与其他 Ranker 一样,当 top_k 超过可用文档数量时,它现在返回所有文档,而不是引发错误。

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

@abdokaseb @Amnah199 @anakin87 @bilgeyucel @ChinmayBansal @datbth @davidsbatista @dfokina @LastRemote @mpangrazzi @RafaelJohn9 @rolshoven @SaraCalla @SaurabhLingam @sjrl