Haystack 数据类完全指南:掌握 Document、ChatMessage 与 ByteStream 等核心数据结构
2026/9/15 12:34:18 网站建设 项目流程

Haystack 数据类完全指南:掌握 Document、ChatMessage 与 ByteStream 等核心数据结构

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

导读

本文以 Haystack 2.23 的官方数据类 API 参考(data_classes_api.md)为骨架,系统讲解驱动整个框架运转的核心数据结构:DocumentChatMessageByteStreamExtractedAnswer/GeneratedAnswerSparseEmbeddingStreamingChunk以及 Pipeline 断点调试相关的Breakpoint/PipelineSnapshot系列。这些数据类贯穿检索、生成、多模态、Agent 工具调用与流式输出等全部核心场景,是"数据如何流过系统"的答案。读完本文,你将掌握每个数据类的字段语义、工厂方法、序列化契约(to_dict/from_dict)以及与 OpenAI API 的互操作细节,并能直接在 RAG、对话式 Agent 与多模态管线中正确使用它们。

本文所有实现细节均以当前仓库源码(haystack/dataclasses)为准,与 2.23 版本文档对照说明。


一、数据类全景:Haystack 系统中流动的数据单元

在 Haystack 中,Pipeline 的每个组件通过"输入/输出 Socket"交换数据。这些 Socket 传输的绝大多数对象都来自 haystack/dataclasses 包。从 dataclasses/__init__.py 的导出结构可以看到,该包统一对外暴露了以下模块与类型:

模块导出类型核心用途
answerAnswerExtractedAnswerGeneratedAnswer承载抽取式/生成式答案
breakpointsBreakpointPipelineSnapshotPipelineState管线断点调试与快照恢复
byte_streamByteStream通用二进制对象
chat_messageChatMessageChatRoleTextContentToolCallToolCallResultReasoningContentLLM 对话消息及内容部件
documentDocument可被检索的基本数据单元
image_contentImageContent聊天气象中的图片内容
file_contentFileContent聊天消息中的文件内容
sparse_embeddingSparseEmbedding稀疏向量表示
streaming_chunkStreamingChunkToolCallDeltaComponentInfoFinishReason、回调类型与select_streaming_callback流式输出分块

几乎所有数据类都遵循同一设计约定:@dataclass定义、提供to_dict()序列化与from_dict()反序列化,并统一通过haystack.utils.dataclasses._warn_on_inplace_mutation装饰器在可变字段被原地修改时发出警告,帮助开发者规避数据在管线中被意外篡改的隐患。下面逐模块深入。


二、answer 模块:答案如何被封装

2.1 Answer:答案的统一协议

Answer在源码中是一个 运行时可检查的 Protocol,定义了任何答案类型必须具备的三个字段与两个方法:

  • data: Any—— 答案的实际内容(文本或结构化数据);
  • query: str—— 触发该答案的查询;
  • meta: dict[str, Any]—— 附加元数据;
  • to_dict()/from_dict()—— 序列化契约。

它是ExtractedAnswerGeneratedAnswer的公共抽象,任何实现该协议的对象都可作为答案在组件间流动。

2.2 ExtractedAnswer:抽取式 Reader 的答案

ExtractedAnswer(answer.py)保存抽取式 Reader(如 ExtractiveReader)从文档中"摘取"出的答案,字段包括:

字段类型含义
querystr原始查询
scorefloat抽取答案的置信度分数
datastr \| None抽取出的答案文本
documentDocument \| None答案来源文档
contextstr \| None答案所在上下文片段
document_offsetSpan \| None答案在文档中的起止偏移(Span(start, end)
context_offsetSpan \| None答案在上下文中的起止偏移
metadict[str, Any]附加元数据

值得注意的源码细节:

  • 内嵌的Span是一个独立的@dataclassstart/end两个整数),用于精确定位答案位置;
  • to_dict()中,document会被递归序列化为字典(调用document.to_dict(flatten=False)),document_offset/context_offset通过asdict()展开;
  • from_dict()兼容旧格式:如果字典中存在init_parameters键,会自动解包,从而兼容 1.x 时代的序列化结构(answer.py#L77-L79)。

2.3 GeneratedAnswer:生成式 Generator 的答案

GeneratedAnswer(answer.py)保存生成式 Generator(如 LLM 生成器)的输出:

字段类型含义
datastr生成的答案文本
querystr触发生成的查询
documentslist[Document]生成答案时引用的文档(供溯源)
metadict[str, Any]附加元数据

序列化细节:若meta["all_messages"]中存放的是ChatMessage对象列表,to_dict()会先将其逐个转为字典再序列化;from_dict()则反向把字典还原为ChatMessage对象(answer.py#L124-L157)。这保证了"生成上下文"这类复杂对象也能安全地走 JSON 序列化链路。


三、ByteStream:二进制数据的通用载体

ByteStream(byte_stream.py)是 Haystack 中表示任意二进制对象的基类,三个字段为:

  • data: bytes—— 二进制数据本体;
  • meta: dict[str, Any]—— 附加元数据(默认空字典,且不参与哈希);
  • mime_type: str | None—— 二进制数据的 MIME 类型。

3.1 常用方法速查

方法签名要点说明
to_fileto_file(destination_path: Path) -> None将二进制数据写入文件,元数据会丢失(源码直接open(path, "wb").write(self.data)
from_file_pathfrom_file_path(filepath, mime_type=None, meta=None, guess_mime_type=False)从文件路径读取;当guess_mime_type=True且未指定mime_type时,会调用haystack.utils.misc._guess_mime_type自动猜测
from_stringfrom_string(text, encoding="utf-8", mime_type=None, meta=None)把字符串按指定编码(默认 utf-8)编码为字节流
to_stringto_string(encoding="utf-8") -> str解码回字符串;解码失败会抛出UnicodeDecodeError
__repr__截断展示,超过 100 字节的数据以...省略
to_dictto_dict() -> dict[str, Any]注意data被转换为整数列表list(self.data),因为 JSON 不直接支持 bytes 类型
from_dictfrom_dict(data) -> "ByteStream"通过bytes(data["data"])还原二进制

3.2 源码级细节

  • 类装饰器为@dataclass(repr=False),因此自定义的__repr__生效;
  • 序列化契约键固定为'data''meta''mime_type'三个;
  • 还存在一个_to_trace_dict()方法,将二进制数据替换为"Binary data (N bytes)"占位符,避免向 Tracing 后端发送超大 payload(byte_stream.py#L104-L113)。

ByteStream 广泛用于文档转换器(PDF、DOCX、图片等)、网络抓取组件与多模态管线,是Document.blob的底层数据类型。


四、chat_message 模块:对话与工具调用的核心

这是数据类中最重要的模块,也是 Agent 与 Chat Generator 之间传递消息的标准载体。

4.1 ChatRole:消息角色枚举

ChatRole(chat_message.py#L19-L46)继承自str, Enum,包含四个角色:

枚举值字符串值语义
USER"user"用户消息,仅包含文本
SYSTEM"system"系统消息,仅包含文本
ASSISTANT"assistant"助手消息,可包含文本、Tool 调用,也可携带元数据
TOOL"tool"工具消息,包含一次工具调用的结果

静态方法from_str(string)负责字符串到枚举的转换,遇到未知角色会抛出ValueError并列出受支持的角色列表。

4.2 内容部件(Content Parts):消息的积木

现代 LLM 消息是"多模态内容"的组合。2.23 将每条消息拆分为若干内容部件,序列化时以类型为键包裹:

类型序列化键字段
TextContenttexttext: str
ToolCalltool_callidtool_nameargumentsextra
ToolCallResulttool_call_resultresultoriginerror
ImageContentimagebase64_imagemime_typedetailmeta
ReasoningContentreasoningreasoning_textextra
FileContentfilebase64_datamime_typefilenameextra

源码中的映射表_CONTENT_PART_CLASSES_TO_SERIALIZATION_KEYS(chat_message.py#L206-L213)正是序列化/反序列化分派的核心依据:

  • ToolCall:模型准备好的工具调用,arguments为调用参数字典,extra可存 provider 特有信息(须 JSON 可序列化);
  • ToolCallResult:工具调用结果,origin指向产生该结果的ToolCallerror: bool标记是否出错;其result类型别名ToolCallResultContentT定义为str | Sequence[TextContent | ImageContent | FileContent],即文本或多模态部件序列;
  • ReasoningContent:模型输出的推理过程文本(如 OpenAI o 系列推理模型),reasoning_text为推理文本。

_deserialize_content_part还兼容 Pydanticmodel_dump()产生的扁平字典(直接含tool_namebase64_image等键),并内置一段针对 LLM 的友好错误提示(chat_message.py#L247-L257)。

4.3 ChatMessage:对话消息主类

ChatMessage(chat_message.py#L282-L840)是对话消息的统一封装,内部字段为_role_content(内容部件序列)、_name(可选参与者名,仅 OpenAI 支持)、_meta。文档明确建议:from_assistantfrom_userfrom_systemfrom_tool四个类方法创建消息,而非直接实例化。

4.3.1 四个工厂方法
工厂方法签名要点关键约束
from_usertext=None, meta=None, name=None, *, content_parts=Nonetextcontent_parts必须二选一,否则抛ValueErrorcontent_parts支持str/TextContent/ImageContent/FileContent,且不能为空列表
from_systemtext, meta=None, name=None只接受文本
from_assistanttext=None, meta=None, name=None, tool_calls=None, *, reasoning=Nonereasoning可为strReasoningContent,否则抛TypeError;可同时携带文本、工具调用与推理内容
from_tooltool_result, origin, error=False, meta=Noneorigin必须是产生该结果的ToolCall
4.3.2 属性访问器

通过只读属性安全访问各类内容(内部按类型过滤_content):

  • role/meta/name—— 角色、元数据、参与者名;
  • texts/text—— 全部文本列表 / 第一条文本(无则None);
  • tool_calls/tool_call—— 全部工具调用 / 第一个;
  • tool_call_results/tool_call_result—— 全部工具结果 / 第一个;
  • images/image—— 全部图片 / 第一张;
  • files/file—— 全部文件 / 第一个;
  • reasonings/reasoning—— 全部推理内容 / 第一个;
  • is_from(role)—— 判断消息是否来自某角色(接受ChatRole或字符串);
  • __len__—— 返回内容部件数量。

注:2.23 文档与源码中还保留了__new__/__getattribute__的重实现说明,前者用于让 dataclass 变更更可见,后者用于让content属性移除更可见。content字段已由_content内容部件序列取代,访问旧 API 时会得到明确提示。

4.4 与 OpenAI Chat Completions API 的互操作

这是 2.23 数据类中最值得掌握的实战能力,涉及四个方法(chat_message.py#L633-L839):

to_openai_dict_format

ChatMessage转为 OpenAI Chat Completions API 要求的字典格式,核心规则:

  • meta会被丢弃(OpenAI API 不支持);
  • 空消息仅允许出现在 assistant 角色,否则抛ValueError
  • ToolCallResult的消息不能混入其他内容;
  • 用户消息若含图片,会构造{"type": "image_url", "image_url": {"url": f"data:{mime_type};base64,{...}"}},未指定 MIME 时默认image/jpeg;文件则构造{"type": "file", ...}
  • 系统/助手消息的ToolCall会转换为{"type": "function", "function": {"name": ..., "arguments": json.dumps(...)}},其中json.dumps显式设置了ensure_ascii=False以保留 emoji 等特殊字符;
  • 参数require_tool_call_ids=True(默认)强制每个ToolCall必须有非空id,否则抛ValueError;设为False可兼容部分浅层 OpenAI 兼容服务;
  • 工具结果消息要求origin.id非空,且只支持字符串或纯文本部件列表(多模态工具结果请改用 Responses API)。
from_openai_dict_format

反向解析。内部先调用_validate_openai_message做格式校验(支持assistant/user/system/developer/tool五种角色)。兼容性细节:

  • OpenAI 兼容服务器可能把零参数工具调用的arguments发成空串、null或直接省略,源码统一按{}处理;
  • 官方 OpenAI 要求 tool 消息带tool_call_id,但此方法允许缺失(以支持浅层兼容 API);若后续要发往 OpenAI,必须补上tool_call_id,否则会收到校验错误;
  • 工具消息的origin会用ToolCall(id=tool_call_id, tool_name="", arguments={})占位还原。

五、document 模块:可检索数据的核心单元

Document(document.py)是 Haystack 检索体系的基本数据单元。

5.1 字段一览

字段类型说明
idstr唯一标识;未显式设置时基于字段内容自动生成
contentstr \| None文档文本
blobByteStream \| None关联的二进制数据
metadict[str, Any]自定义元数据,必须 JSON 可序列化
scorefloat \| None排序分数,通常由 Retriever 赋值
embeddinglist[float] \| None稠密向量
sparse_embeddingSparseEmbedding \| None稀疏向量

5.2 ID 自动生成:内容哈希

__post_init__中若未显式传入id,会调用_create_id()(document.py#L103-L116)生成:将contentblob数据、blob的 MIME 类型、metajson.dumps(..., sort_keys=True)排序后,保证元数据顺序不影响 ID)、稠密/稀疏向量拼成字符串,再取SHA-256 哈希。这意味着内容相同但meta键顺序不同的文档会得到相同 ID——这是文档去重与稳定寻址的基础。

同时,__post_init__还做了两件兼容性工作:

  • content非字符串且非None,直接抛ValueError
  • embedding是 NumPyndarray(1.x 时代的存储方式),自动转为list[float]

5.3 序列化与 meta 展平

to_dict(flatten=True)(document.py#L118-L151)的flatten参数语义值得重点掌握:

  • blobsparse_embedding分别调用各自的to_dict()转为 JSON 可序列化结构;
  • flatten=True(默认):把meta键平铺到字典顶层,与文档字段同名的键会保留在嵌套meta中避免冲突——此默认值是为了与 Haystack 1.x 的序列化格式保持向后兼容;
  • flatten=False:保持meta嵌套,不展开。

from_dict则反向操作:非字段键自动归入metablobByteStream.from_dict还原,sparse_embeddingSparseEmbedding.from_dict还原,旧版meta与展平键合并(meta={**nested_meta, **flattened_meta},嵌套的优先)。

5.4 向后兼容机制

Document使用元类_RemoveLegacyFields(document.py#L19-L27),在__init__前自动剔除content_typeid_hash_keysdataframe三个 1.x 遗留字段,避免旧代码崩溃。content_type属性仍保留:当文档含文本时返回"text",否则抛ValueError

此外__eq__定义了两个文档"字典表示完全相同"即为相等(to_dict(flatten=False)比较),__repr__会按内容长度截断展示并标注向量维度。


六、image_content 与 sparse_embedding:多模态与稀疏检索

6.1 ImageContent:聊天消息中的图片

ImageContent(image_content.py#L60-L259)用于把图片作为聊天消息内容传递给多模态模型,字段:

字段类型说明
base64_imagestr图片的 base64 字符串
mime_typestr \| NoneMIME 类型(如image/pngimage/jpeg),推荐显式提供,大多数 LLM provider 依赖它;缺省时从 base64 内容猜测,可能较慢且不一定可靠
detailLiteral["auto","high","low"] \| None图片细节级别,仅 OpenAI 支持
metadict[str, Any]附加元数据
validationbool默认True:校验 base64 合法性 → 猜测 MIME → 校验是否为合法图片 MIME;设为False可跳过校验加速初始化

三个创建入口:

  • from_file_path(file_path, *, size=None, detail=None, meta=None):从本地图片文件创建,内部复用ImageFileToImageContent转换器(haystack.components.converters.image)。size=(width, height)会按比例缩放图片,降低传输与显存开销;PDF 不支持(请改用PDFToImageContent组件);
  • from_url(url, *, retry_attempts=2, timeout=10, size=None, detail=None, meta=None):通过LinkContentFetcher下载(默认重试 2 次、超时 10 秒),非图片 MIME 或 PDF 会抛ValueError
  • 直接构造 +show()show()依赖 Pillow(pip install pillow),在 Jupyter 中用IPython.display展示,否则调用系统图片查看器。

源码中还维护了FORMAT_TO_MIME/MIME_TO_FORMAT映射与IMAGE_MIME_TYPES集合(含image/jpg别名),用于 MIME 校验。_to_trace_dict()会把 base64 内容替换为占位符,避免 Tracing 后端收到超大 payload。

6.2 SparseEmbedding:稀疏向量

SparseEmbedding(sparse_embedding.py)用两个等长列表表示稀疏向量:

  • indices: list[int]—— 非零元素的下标;
  • values: list[float]—— 非零元素的值。

__post_init__强制校验两者长度一致,否则抛ValueError(sparse_embedding.py#L24-L31)。to_dict()返回{"indices": ..., "values": ...}from_dict()直接还原。它支撑 BM25 / SPLADE 等稀疏检索场景,可搭配Document.sparse_embedding字段使用。


七、streaming_chunk 模块:流式输出的分块协议

流式生成是 Agent 与对话应用的关键体验。StreamingChunk及相关类型定义了每个流式分块的统一格式。

7.1 StreamingChunk

StreamingChunk(streaming_chunk.py#L108-L196)封装一段流式内容及其元数据:

字段类型说明
contentstr分块文本内容
metadict[str, Any]分块元数据(默认空字典,不参与哈希)
component_infoComponentInfo \| None产生该分块的组件信息
indexint \| None该分块所属内容块的序号
tool_callslist[ToolCallDelta] \| None与分块关联的工具调用增量
tool_call_resultToolCallResult \| None工具调用结果
startbool是否标记内容块的开始
finish_reasonFinishReason \| None生成结束原因
reasoningReasoningContent \| None推理内容

FinishReason类型别名定义在 streaming_chunk.py#L19:"stop" | "length" | "tool_calls" | "content_filter" | "tool_call_results",前四个遵循 OpenAI 约定,最后一个"tool_call_results"是 Haystack 特有值。

__post_init__的校验规则(streaming_chunk.py#L142-L153)非常实用:

  • contenttool_callstool_call_resultreasoning四者至多设置一个,否则抛ValueError
  • 若设置了tool_calls/tool_call_result/reasoning,则index必填。

7.2 ToolCallDelta 与 ComponentInfo

  • ToolCallDelta:流式场景下模型"逐步吐出"的工具调用,字段index(工具调用在列表中的序号)、tool_namearguments完整 JSON 或增量片段)、idextra
  • ComponentInfotype(组件类的完整模块路径 + 类名)与name(加入 Pipeline 时分配的实例名)。from_component(component)类方法可从任意组件实例提取这两项信息(streaming_chunk.py#L75-L87)。

7.3 select_streaming_callback:回调选择器

select_streaming_callback(init_callback, runtime_callback, requires_async)(streaming_chunk.py#L229-L268)用于在"初始化时设置的回调"与"运行时传入的回调"之间选择,runtime 回调优先级更高。同时做同步/异步兼容性检查:

  • 异步上下文(requires_async=True)中使用同步回调:发出警告(会阻塞事件循环);
  • 同步上下文(requires_async=False)中使用异步回调(协程):直接抛ValueError,因为无处 await。

回调类型别名StreamingCallbackT = SyncStreamingCallbackT | AsyncStreamingCallbackT,分别对应Callable[[StreamingChunk], None]Callable[[StreamingChunk], Awaitable[None]]。配套的_invoke_streaming_callback会检测返回值是否为 awaitable 并自动 await,实现同步/异步回调的统一调用。


八、breakpoints 模块:Pipeline 断点调试与快照恢复

Pipeline 调试是 2.23 数据类中的另一大主题。断点机制让你能在组件执行到指定次数时暂停管线、检查状态,甚至从快照恢复执行。

8.1 Breakpoint

Breakpoint(源码中的frozen=Truedataclass)用于声明"在哪个组件、第几次访问时触发断点":

字段类型说明
component_namestr设置断点的组件名
visit_countint组件被访问多少次后才触发断点(默认 0)
snapshot_file_pathstr \| None可选:触发时把管线快照写入该路径,便于事后检查并从该点恢复执行

to_dict()返回{component_name, visit_count, snapshot_file_path}from_dict()直接还原。

8.2 ToolBreakpoint 与 AgentBreakpoint(2.23 版本 API)

2.23 文档还包含面向 Agent 的两个专用断点:

  • ToolBreakpoint:继承自Breakpoint,额外增加tool_name字段,用于定位 Agent 组件内的具体工具。tool_name=None时断点作用于 Agent 内所有工具
  • AgentBreakpointagent_name(Pipeline 中 Agent 组件名)+break_pointBreakpointToolBreakpoint实例)。它对component_name有强约束,非法组合抛ValueError
    • 普通Breakpointcomponent_name必须是"chat_generator"
    • ToolBreakpointcomponent_name必须是"tool_invoker"

版本迁移提示:根据仓库中的升级说明(remove-agent-breakpoints-9c7086d1a1ed3da1.yaml),后续版本已移除AgentBreakpointToolBreakpointAgentSnapshotAgent.run/Agent.run_async上的break_pointsnapshotsnapshot_callback参数。Pipeline 级别的BreakpointPipelineSnapshot断点能力继续保留,但"在 Agent 内部(chat generator 或 tool invoker 处)暂停并恢复"已不再支持。使用 2.23 时需留意这一演进方向。

8.3 PipelineState:管线瞬时状态

PipelineState记录断点时刻的管线状态:

  • component_visits: dict[str, int]—— 各组件访问次数;
  • inputs: dict[str, Any]—— 快照时刻管线处理中的输入;
  • pipeline_outputs: dict[str, Any]—— 截至断点的最终输出;
  • inputs_format: str | None—— 输入存储格式标记。"internal"表示每个输入记录了发送方组件与到达顺序({component: {socket: [{"sender": ..., "value": ...}]}}),可精确恢复;None表示旧快照(每个 socket 一个扁平值{component: {socket: value}}),只能在组件首次访问时恢复。

8.4 PipelineSnapshot:可恢复的管线快照

PipelineSnapshot聚合一次断点所需的全部信息:

字段类型说明
original_input_datadict[str, Any]提供给管线的原始输入
ordered_component_nameslist[str]组件被访问的顺序
pipeline_statePipelineState断点时刻的管线状态
break_pointBreakpoint触发本次快照的断点
timestampdatetime \| None快照时间(ISO 8601 序列化)
include_outputs_fromset[str]需要包含在管线结果中的组件输出集合

__post_init__会校验PipelineState.component_visits的键集合与ordered_component_names集合一致,不一致即抛ValueError,防止生成损坏的快照(breakpoints.py#L113-L122)。to_dict/from_dict完整往返支持timestamp的 ISO 格式化与include_outputs_from的 set/list 互转。

实战用法:在Pipeline.run(..., break_point=Breakpoint(component_name="retriever", visit_count=1), snapshot_callback=...)中注册回调;或设置snapshot_file_path将快照落盘。命中断点后可检查PipelineSnapshot,需要时从该状态恢复执行。


九、统一模式总结:序列化契约与实用建议

纵观 2.23 全部数据类,可提炼出四个贯穿性设计模式:

  1. 成对序列化方法:所有类都实现to_dict()/from_dict(),且键名稳定(如 ByteStream 的data/meta/mime_type、ToolCall 的tool_name/arguments/id/extra)。这让 Pipeline 的 YAML 配置(见 marshal/yaml.py)与断点快照都能安全落盘。
  2. 内容部件分派:ChatMessage 的多模态内容按类型映射键序列化,反序列化时按键分派,且兼容 Pydantic 扁平字典与 2.9 之前的字符串格式(chat_message.py#L612-L631)。
  3. 向后兼容优先Document自动剔除 1.x 遗留字段、ExtractedAnswer/GeneratedAnswer自动解包init_parametersDocument.to_dict默认flatten=True,都是为平滑迁移设计的。
  4. 防御式校验SparseEmbedding的等长校验、StreamingChunk的单内容约束、AgentBreakpoint的组件名约束,都把错误前置到构造阶段而非运行阶段。

在实际编码中,建议优先使用ChatMessage.from_*工厂方法而非直接实例化;向 OpenAI 系模型发送消息前使用to_openai_dict_format预检;Document涉及去重时依赖内容哈希 ID 而不要手动分配;处理流式输出时用select_streaming_callback统一管理同步/异步回调。


十、延伸阅读

  • 数据类源码目录:haystack/dataclasses(含answer.pybreakpoints.pybyte_stream.pychat_message.pydocument.pyimage_content.pyfile_content.pysparse_embedding.pystreaming_chunk.py
  • 版本 2.23 API 参考原文:data_classes_api.md
  • Pipeline 断点概念文档:pipeline-breakpoints.mdx
  • Agent 断点 API 演进说明:remove-agent-breakpoints-9c7086d1a1ed3da1.yaml
  • 流式分块相关发布说明:add-streaming-chunk-67897d7cb2c0d7c0.yaml、add-finish-reason-field-streaming-chunk-89828ec09c6e6385.yaml

掌握这些数据类,你就掌握了 Haystack 中"数据如何流动"的完整图景——无论是构建 RAG、对话式 Agent,还是多模态应用,它们都是绕不开的基石。

【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询