⭐️ 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,在本次升级后您可能会看到不同的值。操作方法:查看更新的映射
length→lengtheos_token→stopstop_sequence→stop- 如果存在工具调用 →
tool_calls
🚀 新功能
- 在 MetadataRouter 中添加了对 ByteStream 对象的支持。现在可以使用它来根据元数据路由
list[Documents]或list[ByteStream]。 - 在
serialize_type和Pipeline.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 格式规范,并保持与纯文本消息的完全向后兼容。 - 为
ChatMessage的TextContent和ImageContent部分添加了序列化/反序列化方法。 - 使惰性导入错误消息更清晰,解释了缺少可选依赖项。
- 在整个代码库中采用了 PEP 585 的现代类型提示语法。这提高了可读性,并消除了对
typing模块不必要的导入。 - 支持 Agent 状态模式验证中的
ChatMessage子类。验证现在会检查issubclass(args[0], ChatMessage),而不是要求精确的类型相等,从而允许在 messages 字段中使用自定义的 ChatMessage 子类。 ToolInvoker的run方法现在接受一个工具列表。提供此列表时,它会覆盖构造函数中设置的工具,从而允许您在以前构建的管道中在运行时切换工具。
🐛 Bug 修复
-
SentenceSplitter使用的英文和德文缩写文件现在包含在发行版中。由于.gitignore文件中的配置,它们之前缺失了。 -
在创建嵌入时,为 OpenAI 客户端添加了 encoding format 关键字参数。
-
解决了
ChatMessage类中存在的不正确假设,这些假设在有效使用场景中引发了错误。-
ChatMessage.from_user配合content_parts:以前,至少需要一个文本部分,尽管有些模型提供商支持仅包含图像部分的消息。此限制已被移除。如果提供商有此类限制,现在应在提供商的实现中强制执行。 -
ChatMessage.to_openai_dict_format:消息包含多个文本部分时不受支持,尽管 OpenAI API 允许这样做。现在已纠正此问题。
-
-
改进了
ChatMessage.from_user类方法的验证。如果未提供text或content_parts,该方法现在将引发错误。如果text是空字符串,则不会引发错误。 -
确保
SentenceTransformersSimilarityRanker中的score字段作为 Pythonfloat返回,而不是numpy.float32。这可以防止下游集成中的潜在序列化问题。 -
当从异步上下文调用
AsyncPipeline.run时,引发RuntimeError,指示应使用run_async。 -
通过在处理前使用
dataclasses.replace创建副本,防止在所有Extractor和Classifier组件中对输入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
