ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Haystack Sentence Transformers 集成实战:文本、文档、图像与稀疏向量嵌入及多样性重排组件详解

Haystack Sentence Transformers 集成实战:文本、文档、图像与稀疏向量嵌入及多样性重排组件详解 Haystack Sentence Transformers 集成实战文本、文档、图像与稀疏向量嵌入及多样性重排组件详解【免费下载链接】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.19 版集成 API 参考 sentence_transformers.md系统讲解sentence-transformers-haystack集成包的 7 个核心组件文本/文档/图像/稀疏向量嵌入器与两个重排器。读完你将掌握每个组件的完整参数语义、在索引与查询流水线中的接线方式、量化与后端加速选项并能结合 Haystack 核心包的协议定义与数据类源码理解其底层机制。一、集成包定位从核心包迁出到独立集成该集成的所有组件位于独立的 PyPI 包sentence-transformers-haystack中导入路径统一为haystack_integrations.components.embedders.sentence_transformersRanker 在...rankers.sentence_transformers。这一点在仓库的发布说明中有明确记录这些组件曾内置于 Haystack 核心后被标记弃用并移出核心包安装方式为pip install sentence-transformers-haystack见 deprecate-sentence-transformers-components-4cbe56d55d772f02.yaml。因此本文档中所有示例代码均使用haystack_integrations前缀的导入路径与核心包haystack的导入是并列关系。组件总览组件类型作用默认模型输出位置SentenceTransformersTextEmbedderEmbedder嵌入单条查询文本sentence-transformers/all-mpnet-base-v2输出键embeddingSentenceTransformersDocumentEmbedderEmbedder嵌入文档列表sentence-transformers/all-mpnet-base-v2写入Document.embeddingSentenceTransformersDocumentImageEmbedderEmbedder嵌入文档关联的图像/PDFsentence-transformers/clip-ViT-B-32写入Document.embeddingSentenceTransformersSparseTextEmbedderEmbedder嵌入单条查询文本稀疏prithivida/Splade_PP_en_v2输出键sparse_embeddingSentenceTransformersSparseDocumentEmbedderEmbedder嵌入文档列表稀疏prithivida/Splade_PP_en_v2写入Document.sparse_embeddingSentenceTransformersSimilarityRankerRanker基于 cross-encoder 语义相似度重排cross-encoder/ms-marco-MiniLM-L-6-v2排序后的documentsSentenceTransformersDiversityRankerRanker多样性感知重排MMR/贪心sentence-transformers/all-MiniLM-L6-v2排序后的documents从核心包源码结构看Embedder 组件的输入输出契约由 Haystack 用 Protocol 固化protocol.py 中定义了TextEmbedderrun(text: str)返回含embedding: list[float]的字典与DocumentEmbedderrun(documents: list[Document])返回含documents: list[Document]的字典两个协议。上述集成组件正是按该契约实现的这也是它们可以直接接入流水线Pipeline并与 Document Store、Retriever 等组件互操作的底层原因。所有组件都遵循统一生命周期warm_up()初始化组件加载模型到指定设备to_dict()/from_dict(data)序列化与反序列化用于流水线配置的持久化与还原run(...)执行嵌入或重排。二、SentenceTransformersTextEmbedder查询文本嵌入用于将用户查询嵌入为稠密向量送入 embedding retriever。基础用法from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersTextEmbedder text_to_embed I love pizza! text_embedder SentenceTransformersTextEmbedder() print(text_embedder.run(text_to_embed)) # {embedding: [-0.07804739475250244, 0.1498992145061493, ...]}构造签名全部为关键字参数__init__( *, model: str sentence-transformers/all-mpnet-base-v2, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), prefix: str , suffix: str , batch_size: int 32, progress_bar: bool True, normalize_embeddings: bool False, trust_remote_code: bool False, local_files_only: bool False, truncate_dim: int | None None, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, precision: Literal[float32, int8, uint8, binary, ubinary] float32, encode_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch, revision: str | None None, quantization_ranges: list[list[float]] | None None ) - None参数说明参数默认值说明modelsentence-transformers/all-mpnet-base-v2模型本地路径或 Hugging Face 模型 IDdeviceNone加载模型的设备None时自动选择默认设备见第八节token环境变量HF_API_TOKEN/HF_TOKEN下载私有模型的 HF API tokenprefix/suffix嵌入前分别拼接在文本首尾的字符串。E5、BGE 等模型要求特定前缀指令需在此配置batch_size32每批嵌入文本数progress_barTrue是否显示进度条normalize_embeddingsFalse是否做 L2 归一化使向量模长为 1trust_remote_codeFalseFalse仅允许 HF 已验证架构True允许自定义模型与脚本local_files_onlyFalseTrue时不从 HF Hub 下载仅使用本地文件truncate_dimNone将嵌入截断到指定维度。若模型未用 Matryoshka 表示学习训练截断会显著影响效果precisionfloat32嵌入精度非 float32 均为量化嵌入更小更快但精度可能下降适合压缩语料库体积encode_kwargsNone传给SentenceTransformer.encode的附加参数注意不要与已设置参数冲突或改变输出类型backendtorch推理后端torch、onnx或openvinorevisionNone指定 HF 模型版本分支、tag 或 commit idquantization_rangesNoneprecision为int8/uint8时的校准范围形状(2, embedding_dim)第一行为最小值、第二行为最大值。标量量化默认用当前批次的 min/max 校准对单条文本是退化的、结果无意义应传入由代表性样本计算的固定范围以保证量化一致性run(text: str)接收单条文本返回{embedding: list[float]}。三、SentenceTransformersDocumentEmbedder索引流水线中的文档嵌入用于索引Indexing流水线嵌入输入文档并交给 DocumentWriter 写入文档存储。嵌入结果存入每个 Document 的embedding字段且支持将文档元数据一并嵌入。from haystack import Document from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersDocumentEmbedder doc Document(contentI love pizza!) doc_embedder SentenceTransformersDocumentEmbedder() result doc_embedder.run([doc]) print(result[documents][0].embedding) # [-0.07804739475250244, 0.1498992145061493, ...]构造签名在 TextEmbedder 基础上多了两个元数据相关参数并去掉了与查询侧无关的quantization_ranges说明之外的差异__init__( *, model: str sentence-transformers/all-mpnet-base-v2, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), prefix: str , suffix: str , batch_size: int 32, progress_bar: bool True, normalize_embeddings: bool False, meta_fields_to_embed: list[str] | None None, embedding_separator: str \n, trust_remote_code: bool False, local_files_only: bool False, truncate_dim: int | None None, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, precision: Literal[float32, int8, uint8, binary, ubinary] float32, encode_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch, revision: str | None None, quantization_ranges: list[list[float]] | None None ) - None相对 TextEmbedder 的关键差异参数meta_fields_to_embed(list[str] | None)列出要随文档正文一起嵌入的元数据字段名例如把title、author参与嵌入embedding_separator(str默认\n拼接元数据字段与文档正文的分隔符。其余参数model、device、token、prefix/suffix、batch_size、progress_bar、normalize_embeddings、truncate_dim、precision、backend、revision、三个*_kwargs透传字典等语义与 TextEmbedder 完全一致其中quantization_ranges在文档嵌入场景下用于保证语料与查询两侧量化范围一致。run(documents: list[Document])返回{documents: list[Document]}每个 Document 的embedding字段已被填充。四、稀疏嵌入SentenceTransformersSparseTextEmbedder 与 SentenceTransformersSparseDocumentEmbedder稀疏嵌入如 SPLADE 类模型输出「词表索引 → 权重」的稀疏表示适合与稀疏检索器配合做可解释的关键词-语义混合检索。SparseTextEmbedder查询侧from haystack_integrations.components.embedders.sentence_transformers import SentenceTransformersSparseTextEmbedder text_to_embed I love pizza! text_embedder SentenceTransformersSparseTextEmbedder() print(text_embedder.run(text_to_embed)) # {sparse_embedding: SparseEmbedding(indices[999, 1045, ...], values[0.918, 0.867, ...])}__init__( *, model: str prithivida/Splade_PP_en_v2, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), prefix: str , suffix: str , trust_remote_code: bool False, local_files_only: bool False, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch, revision: str | None None ) - None注意查询侧没有batch_size/progress_bar单条文本无需分批也没有precision稀疏向量本身非浮点稠密向量。run(text: str)返回{sparse_embedding: SparseEmbedding}。SparseDocumentEmbedder索引侧from haystack import Document from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersSparseDocumentEmbedder, ) doc Document(contentI love pizza!) doc_embedder SentenceTransformersSparseDocumentEmbedder() result doc_embedder.run([doc]) print(result[documents][0].sparse_embedding) # SparseEmbedding(indices[999, 1045, ...], values[0.918, 0.867, ...])__init__( *, model: str prithivida/Splade_PP_en_v2, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), prefix: str , suffix: str , batch_size: int 32, progress_bar: bool True, meta_fields_to_embed: list[str] | None None, embedding_separator: str \n, trust_remote_code: bool False, local_files_only: bool False, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch, revision: str | None None ) - None除batch_size、progress_bar、meta_fields_to_embed、embedding_separator外参数语义同稠密文档嵌入器。稀疏结果写入Document.sparse_embedding字段。源码佐证SparseEmbedding 数据结构核心包用独立的 dataclass 承载稀疏向量sparse_embedding.py 中SparseEmbedding仅含indices: list[int]与values: list[float]两个字段__post_init__校验两者等长不等则抛ValueError并提供to_dict()/from_dict()序列化方法。document.py 中Document的sparse_embedding字段默认None序列化时通过SparseEmbedding.to_dict()展开、反序列化时还原保证稀疏嵌入能随文档在文档存储与流水线快照中无损流转。五、SentenceTransformersDocumentImageEmbedder图像与 PDF 嵌入将文档关联的图像或 PDF嵌入要求模型能把图像与文本映射到同一向量空间多模态。默认模型sentence-transformers/clip-ViT-B-32输出 512 维向量。from haystack import Document from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentImageEmbedder, ) embedder SentenceTransformersDocumentImageEmbedder(modelsentence-transformers/clip-ViT-B-32) documents [ Document(contentA photo of a cat, meta{file_path: cat.jpg}), Document(contentA photo of a dog, meta{file_path: dog.jpg}), ] result embedder.run(documentsdocuments) documents_with_embeddings result[documents] # Document(id..., contentA photo of a cat, # meta{file_path: cat.jpg, # embedding_source: {type: image, file_path_meta_field: file_path}}, # embeddingvector of size 512), ...__init__( *, file_path_meta_field: str file_path, root_path: str | None None, model: str sentence-transformers/clip-ViT-B-32, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), batch_size: int 32, progress_bar: bool True, normalize_embeddings: bool False, trust_remote_code: bool False, local_files_only: bool False, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, precision: Literal[float32, int8, uint8, binary, ubinary] float32, encode_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch ) - None图像场景专属参数file_path_meta_field(str默认file_path)Document 元数据中存放图像/PDF 文件路径的字段名root_path(str | None默认None)文件根目录。提供时元数据中的相对路径相对该目录解析为None时元数据路径按绝对路径处理。文档明确列出兼容模型须能把图像与文本编码到同一向量空间sentence-transformers/clip-ViT-B-32、sentence-transformers/clip-ViT-L-14、sentence-transformers/clip-ViT-B-16、sentence-transformers/clip-ViT-B-32-multilingual-v1、jinaai/jina-embeddings-v4、jinaai/jina-clip-v1、jinaai/jina-clip-v2。从输出示例可见该组件还会向 Document 的meta中写入embedding_source标记{type: image, file_path_meta_field: file_path}明确记录该嵌入来源于图像而非文本正文——从源码结构看这是一种溯源机制便于混合文本/图像嵌入的文档存储中区分嵌入语义。run(documents: list[Document])返回{documents: list[Document]}embedding已填充。六、SentenceTransformersSimilarityRankercross-encoder 语义重排使用预训练 cross-encoder 模型将 query 与每篇文档配对打分按语义相似度重排常用于对稠密检索结果做二次精排。from haystack import Document from haystack_integrations.components.rankers.sentence_transformers import SentenceTransformersSimilarityRanker ranker SentenceTransformersSimilarityRanker() docs [Document(contentParis), Document(contentBerlin)] query City in Germany result ranker.run(queryquery, documentsdocs) docs result[documents] print(docs[0].content)__init__( *, model: str | Path cross-encoder/ms-marco-MiniLM-L-6-v2, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), top_k: int 10, query_prefix: str , query_suffix: str , document_prefix: str , document_suffix: str , meta_fields_to_embed: list[str] | None None, embedding_separator: str \n, scale_score: bool True, score_threshold: float | None None, trust_remote_code: bool False, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch, batch_size: int 16 ) - None参数默认值说明modelcross-encoder/ms-marco-MiniLM-L-6-v2cross-encoder 模型本地路径或 HF 名称注意类型是str | Pathtop_k10每次查询最多返回的文档数top_k非正数时抛ValueErrorquery_prefix/suffix、document_prefix/suffix打分前拼接在查询/文档首尾的指令字符串BGE、Qwen 等重排模型有特定要求meta_fields_to_embed/embedding_separatorNone/\n与文档嵌入器相同的元数据嵌入机制scale_scoreTrueTrue时对原始 logit 输出应用 Sigmoid 缩放为 0~1 概率False禁用score_thresholdNone仅返回得分高于该阈值的文档batch_size16推理批大小显存不足时调小run支持运行时覆盖初始化参数run( *, query: str, documents: list[Document], top_k: int | None None, scale_score: bool | None None, score_threshold: float | None None ) - dict[str, list[Document]]执行前会先按 Documentid去重存在分数时仅保留分数最高的一篇返回按相似度从高到低排序的documentstop_k非正数抛ValueError。七、SentenceTransformersDiversityRanker多样性重排解决「检索结果同质化」问题在相关性之外最大化返回列表的多样性。提供两种策略greedy_diversity_order贪心多样性排序迭代地选择「相对查询的相关性高、相对已选集合的新颖性高」的文档整体最大化多样性maximum_margin_relevanceMMR按最大边距相关性分数迭代选文lambda_threshold控制相关性与多样性的权衡。两种策略都用 Sentence Transformers 模型对 query 和文档做嵌入。执行前同样按id去重保留分数最高者。from haystack import Document from haystack_integrations.components.rankers.sentence_transformers import SentenceTransformersDiversityRanker ranker SentenceTransformersDiversityRanker( modelsentence-transformers/all-MiniLM-L6-v2, similaritycosine, strategygreedy_diversity_order, ) docs [Document(contentParis), Document(contentBerlin)] query What is the capital of germany? output ranker.run(queryquery, documentsdocs) docs output[documents]__init__( *, model: str sentence-transformers/all-MiniLM-L6-v2, top_k: int 10, device: ComponentDevice | None None, token: Secret | None Secret.from_env_var([HF_API_TOKEN, HF_TOKEN], strictFalse), similarity: str | DiversityRankingSimilarity cosine, query_prefix: str , query_suffix: str , document_prefix: str , document_suffix: str , meta_fields_to_embed: list[str] | None None, embedding_separator: str \n, strategy: str | DiversityRankingStrategy greedy_diversity_order, lambda_threshold: float 0.5, model_kwargs: dict[str, Any] | None None, tokenizer_kwargs: dict[str, Any] | None None, config_kwargs: dict[str, Any] | None None, backend: Literal[torch, onnx, openvino] torch ) - None策略与度量以枚举DiversityRankingStrategy、DiversityRankingSimilarity建模均提供from_str从字符串转换参数默认值说明top_k10每次查询最多返回的文档数similaritycosine比较嵌入的相似度度量可选cosine或dot_productstrategygreedy_diversity_order可选greedy_diversity_order或maximum_margin_relevancelambda_threshold0.5仅 MMR 策略使用相关性与多样性的权衡系数query_prefix/suffix、document_prefix/suffixE5、BGE 等模型所需的前后缀指令run同样支持运行时覆盖run( query: str, documents: list[Document], top_k: int | None None, lambda_threshold: float | None None, ) - dict[str, list[Document]]top_k 0时抛ValueError。该组件的引入动机在发布说明 add-diversity-ranker-6ecee21134eda673.yaml 中有原始记载利用 sentence-transformer 模型计算 query 与文档的语义嵌入使输出文档在整体多样性上最大化。八、共享参数的底层机制device、token 与后端ComponentDevice 与默认设备选择所有组件的device参数都是核心包的ComponentDevice类型。device.py 中DeviceType枚举支持CPU、GPUcuda、MPSApple、XPUIntel与DISK仅用于 device map 卸载ComponentDevice.resolve_device(device)传入None时自动解析默认设备优先级为GPU XPU MPS CPUPyTorch 未安装则只有 CPU并可通过HAYSTACK_MPS_ENABLED、HAYSTACK_XPU_ENABLED环境变量关闭对应后端to_torch()/to_torch_str()将设备表示转换为 PyTorch 格式供 Sentence Transformers 加载模型使用单设备可转设备映射DeviceMap则用于 HuggingFace 多卡/卸载场景to_hf()输出device或device_map参数。其余共享参数速查tokenSecret类型默认从环境变量HF_API_TOKEN或HF_TOKEN读取strictFalse两者都缺省时为None用于私有模型下载model_kwargs / tokenizer_kwargs / config_kwargs分别透传给模型、分词器、配置的from_pretrained调用按具体模型文档确定可用键encode_kwargs透传给SentenceTransformer.encode文档明确警告不要与组件已设置的参数冲突、不要传入会改变输出类型的参数backendtorch默认、onnx、openvino对应 Sentence Transformers 官方支持的推理加速与量化选项选型应参考 Sentence Transformers 官方文档的 efficiency 章节本仓库不收录其外链precision quantization_ranges量化嵌入以换取更小体积与更快计算。int8/uint8需配quantization_ranges校准范围——标量量化按当前批次的 min/max 校准小批量尤其单条查询下退化且批次间不一致文档建议从代表性嵌入样本预计算范围并让查询与语料用同一套范围这正是 TextEmbedder 与 DocumentEmbedder 都暴露该参数的原因。序列化与流水线装配所有组件的to_dict()返回含类名与参数的字典from_dict(data)完成还原这使嵌入器/重排器可以像其他 Haystack 组件一样被持久化为流水线配置YAML/JSON配合warm_up()在运行时按需加载模型。典型装配关系索引侧Converter → Preprocessor →SentenceTransformersDocumentEmbedder或 Sparse/Image 变体→ DocumentWriter查询侧SentenceTransformersTextEmbedder或 Sparse 变体→ Embedding Retriever →SentenceTransformersSimilarityRanker/SentenceTransformersDiversityRanker→ Generator。九、版本适用性与注意事项文档版本边界本文依据 version-2.19 集成 API 参考参数默认值与签名以该版本文档为准仓库同时收录了 2.18 至 3.1 的各版本参考跨版本使用请先核对对应版本的同名文档。包归属这些组件不在haystack核心包中当前仓库 haystack/components/embedders 下只有 OpenAI/Azure/Mock 嵌入器需单独安装sentence-transformers-haystack包并按haystack_integrations路径导入迁移背景见 deprecate-sentence-transformers-components-4cbe56d55d772f02.yaml。模型兼容性约束图像嵌入器只接受能把图像与文本编入同一向量空间的多模态模型CLIP/Jina 系列cross-encoder 重排器要求模型是 cross-encoder 架构而非 bi-encoder 嵌入模型两者不可混用。量化与截断的隐性代价precision量化与truncate_dim截断都能省存储但前者依赖quantization_ranges保证语料/查询一致性后者要求模型具备 Matryoshka 训练背景生产环境启用前应先做召回回归验证。【免费下载链接】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),仅供参考
返回列表