news 2026/9/15 15:33:24

Haystack 中的 Mistral 集成:OCR 文档转换、向量嵌入与对话生成全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Haystack 中的 Mistral 集成:OCR 文档转换、向量嵌入与对话生成全指南

Haystack 中的 Mistral 集成:OCR 文档转换、向量嵌入与对话生成全指南

【免费下载链接】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

Mistral 集成是 Haystack 生态中面向 Mistral AI 平台的官方组件集,覆盖"文档理解 → 语义向量化 → 检索增强生成"的完整链路。本指南以 version-2.23 的 Mistral 集成 API 参考 为骨架,结合 当前仓库组件文档 与源码实现,系统讲解MistralOCRDocumentConverterMistralDocumentEmbedderMistralTextEmbedderMistralChatGenerator四个组件的全部配置参数、调用方式与实战示例,帮助你直接用 Mistral 模型搭建可运行的索引管道、RAG 管道与智能体工作流。

集成总览:四个组件覆盖三种场景

mistral-haystack集成包把 Mistral AI 的核心能力封装为标准的 Haystack 组件,组件间通过 Haystack 的DocumentChatMessage等数据类传递数据,可直接挂载进Pipeline。四个组件的分工如下:

组件所属模块核心职责典型管道位置
MistralOCRDocumentConvertercomponents.converters.mistral调用 Mistral OCR API 从 PDF/图片提取 Markdown 文本,支持结构化标注索引管道最前端,位于预处理器之前
MistralDocumentEmbeddercomponents.embedders.mistral批量计算 Document 向量,写入embedding字段索引管道中DocumentWriter之前
MistralTextEmbeddercomponents.embedders.mistral将单条字符串(如查询)转为向量查询/RAG 管道中检索器之前
MistralChatGeneratorcomponents.generators.mistral基于ChatMessage调用 Mistral Chat Completion 接口ChatPromptBuilder之后

其中两个 Embedder 与MistralChatGenerator分别继承自 Haystack 自带的 OpenAIDocumentEmbedder、OpenAITextEmbedderOpenAIChatGenerator,因此继承了其批量编码、超时重试、流式回调等成熟机制,只是把客户端与模型切换到 Mistral API。

安装集成包:

pip install mistral-haystack

认证方式统一:默认读取MISTRAL_API_KEY环境变量,也可在初始化时通过Secret显式传入,例如api_key=Secret.from_env_var("MISTRAL_API_KEY")

MistralOCRDocumentConverter:把任意文档变成 Markdown

MistralOCRDocumentConverter是集成的"入口组件",负责调用 Mistral 的 OCR 服务从文档中提取文本。其核心能力包括:

  • 多来源输入:接受本地文件路径(str/Path)、内存字节流(ByteStream)、文档 URL(DocumentURLChunk)、图片 URL(ImageURLChunk)以及 Mistral 已上传文件的FileChunk;本地文件会被自动上传到 Mistral 存储进行识别。
  • 按页输出:每个来源生成一个 HaystackDocument,所有页面用换页符\f连接,与 Haystack 的DocumentSplitter天然兼容,可按页精确切分并正确处理重叠。
  • Markdown 内容:识别结果以 Markdown 格式返回,图片以img-id标签形式内嵌。
  • 结构化标注:通过 Pydantic schema 让 Vision LLM 生成图像区域与整篇文档的结构化注释(详见后文)。

初始化参数

__init__( api_key: Secret = Secret.from_env_var("MISTRAL_API_KEY"), model: str = "mistral-ocr-2505", include_image_base64: bool = False, pages: list[int] | None = None, image_limit: int | None = None, image_min_size: int | None = None, cleanup_uploaded_files: bool = True, ) -> None
参数默认值说明
api_keyMISTRAL_API_KEY环境变量Mistral API 密钥
model"mistral-ocr-2505"使用的 OCR 模型
include_image_base64FalseTrue时在响应中返回 Base64 编码的图片,会显著增大响应体积并拖慢处理
pagesNone指定处理的页码(从 0 开始索引);None表示处理全部页面
image_limitNone从文档中最多提取的图片数量上限
image_min_sizeNone图片被提取所需的最小宽高(像素)
cleanup_uploaded_filesTrue处理完成后自动删除上传到 Mistral 的本地文件;仅作用于本地来源(strPathByteStream),FileChunk提供的文件不会被删除

SUPPORTED_MODELS类属性列出了该组件支持的 OCR 模型:mistral-ocr-2512mistral-ocr-latestmistral-ocr-2503mistral-ocr-2505。想获取 Mistral 平台上的完整模型 ID 列表,可向https://api.mistral.ai/v1/models发送 GET 请求。

run 方法与来源类型

run( sources: list[str | Path | ByteStream | DocumentURLChunk | FileChunk | ImageURLChunk], meta: dict[str, Any] | list[dict[str, Any]] | None = None, bbox_annotation_schema: type[BaseModel] | None = None, document_annotation_schema: type[BaseModel] | None = None, ) -> dict[str, Any]

meta参数用于给生成的 Document 附加元数据:传单个字典时,其内容会合并到所有产出的 Document;传列表时,列表长度必须与sources数量一致,二者按位置 zip 配对。

返回字典包含两个键:

  • documents:每个来源对应一个Documentcontent为所有页面用\f连接、以 Markdown 表示的内容;meta为聚合后的元数据字典,结构为{"source_page_count": int, "source_total_images": int, "source_*": any}。若提供了document_annotation_schema,标注字段会以source_前缀展开(如source_languagesource_chapter_titlessource_urls)。
  • raw_mistral_response:每个来源对应的 Mistral API 原始 OCR 响应列表,包含逐页细节、图片、标注与用量(usage)信息。

结构化标注:让 OCR 结果带上语义

这是该组件区别于普通 OCR 转换器的独特能力。其工作流程是:先由 OCR 模型提取文本与版式结构,再由一个 Vision LLM 依据你定义的 Pydantic schema 分析内容并生成结构化数据。两类标注 schema 分别作用于不同粒度:

  • bbox_annotation_schema(边界框标注):对每个图片区域生成结构化数据(如image_typeshort_descriptionsummary),标注内容以内联形式插入到 Markdown 中对应图片标签之后。
  • document_annotation_schema(整篇文档标注):对整篇文档生成结构化数据(如语言、章节标题、URL 列表),标注字段以source_前缀解包进 Document 元数据。注意:文档级标注最多支持8 页,超过该上限的文档不会进行文档标注。

以下示例定义了两套 schema,并同时启用两类标注:

from typing import List from pydantic import BaseModel, Field from haystack.utils import Secret from haystack_integrations.components.converters.mistral import MistralOCRDocumentConverter from mistralai.models import DocumentURLChunk # 图像区域标注 schema class ImageAnnotation(BaseModel): image_type: str = Field(..., description="The type of image content") short_description: str = Field(..., description="Short natural-language description") summary: str = Field(..., description="Detailed summary of the image content") # 文档级标注 schema class DocumentAnnotation(BaseModel): language: str = Field(..., description="Primary language of the document") chapter_titles: List[str] = Field(..., description="Detected chapter or section titles") urls: List[str] = Field(..., description="URLs found in the text") converter = MistralOCRDocumentConverter( api_key=Secret.from_env_var("MISTRAL_API_KEY"), model="mistral-ocr-2505", ) sources = [DocumentURLChunk(document_url="https://example.com/report.pdf")] result = converter.run( sources=sources, bbox_annotation_schema=ImageAnnotation, document_annotation_schema=DocumentAnnotation, ) documents = result["documents"] # documents[0].meta 中会出现 source_language、source_chapter_titles、source_urls # documents[0].content 中会内联插入图片的描述性标注

多来源一次处理

OCR 转换器的一个实用特性是可以在单次run中混用不同类型的来源,例如同时处理本地 PDF、远程文档 URL 与远程图片 URL:

from pathlib import Path from haystack.utils import Secret from haystack_integrations.components.converters.mistral import MistralOCRDocumentConverter from mistralai.models import DocumentURLChunk, ImageURLChunk, FileChunk converter = MistralOCRDocumentConverter( api_key=Secret.from_env_var("MISTRAL_API_KEY"), model="mistral-ocr-2505", ) sources = [ Path("local_document.pdf"), # 本地文件 DocumentURLChunk(document_url="https://example.com/document.pdf"), # 远程文档 ImageURLChunk(image_url="https://example.com/receipt.jpg"), # 远程图片 FileChunk(file_id="file-abc123"), # 已上传文件 ID ] result = converter.run(sources=sources) documents = result["documents"] # 4 个 Document raw_responses = result["raw_mistral_response"] # 4 个原始响应

在索引管道中使用并注意 Markdown 清理

典型用法是把转换器接到DocumentSplitter(按页切分)与DocumentWriter上,构成"OCR 识别 → 按页切块 → 写入存储"的索引管道:

from haystack import Pipeline from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.preprocessors import DocumentSplitter from haystack.components.writers import DocumentWriter from haystack.utils import Secret from haystack_integrations.components.converters.mistral import MistralOCRDocumentConverter document_store = InMemoryDocumentStore() pipeline = Pipeline() pipeline.add_component("converter", MistralOCRDocumentConverter( api_key=Secret.from_env_var("MISTRAL_API_KEY"), model="mistral-ocr-2505", )) pipeline.add_component("splitter", DocumentSplitter(split_by="page", split_length=1)) pipeline.add_component("writer", DocumentWriter(document_store=document_store)) pipeline.connect("converter", "splitter") pipeline.connect("splitter", "writer") file_paths = ["invoice.pdf", "receipt.jpg", "contract.pdf"] pipeline.run({"converter": {"sources": file_paths}})

重要注意事项:该组件返回的是 Markdown 内容,若再经过默认配置的DocumentCleaner()(其默认开启remove_extra_whitespaces=Trueremove_empty_lines=True),会折叠换行并压平标题、表格与图片标签。因此要么让转换器直接连接DocumentSplitter以按页切分,要么在自定义清理时关闭上述两个选项。这一注意事项在 组件使用文档 中明确给出。

MistralDocumentEmbedder:批量计算文档向量

MistralDocumentEmbedder继承自OpenAIDocumentEmbedder,为一批Document批量计算嵌入向量,并将结果写入每个文档的embedding字段。它适合放在索引管道中DocumentWriter之前。

from haystack import Document from haystack.utils import Secret from haystack_integrations.components.embedders.mistral import MistralDocumentEmbedder doc = Document(content="I love pizza!") document_embedder = MistralDocumentEmbedder( api_key=Secret.from_token("<your-api-key>"), model="mistral-embed", ) result = document_embedder.run([doc]) print(result["documents"][0].embedding) # [0.017020374536514282, -0.023255806416273117, ...]

初始化参数

__init__( api_key: Secret = Secret.from_env_var("MISTRAL_API_KEY"), model: str = "mistral-embed", api_base_url: str | None = "https://api.mistral.ai/v1", prefix: str = "", suffix: str = "", batch_size: int = 32, progress_bar: bool = True, meta_fields_to_embed: list[str] | None = None, embedding_separator: str = "\n", *, timeout: float | None = None, max_retries: int | None = None, http_client_kwargs: dict[str, Any] | None = None, ) -> None
参数默认值说明
model"mistral-embed"嵌入模型名,可用值见下方SUPPORTED_MODELS
api_base_url"https://api.mistral.ai/v1"Mistral API 基础地址,用于自定义端点/代理
prefix/suffix""分别添加到每段文本开头/结尾的字符串
batch_size32每批次编码的 Document 数量
progress_barTrue是否显示进度条,生产环境建议关闭以保持日志干净
meta_fields_to_embedNone需要随文档文本一起嵌入的元数据字段列表
embedding_separator"\n"拼接元数据与文档文本时使用的分隔符
timeoutNone客户端调用超时;未设置时回退到OPENAI_TIMEOUT环境变量,默认 30 秒
max_retriesNone内部错误后的最大重试次数;未设置时回退到OPENAI_MAX_RETRIES环境变量,默认 5 次
http_client_kwargsNone用于配置自定义httpx.Client/httpx.AsyncClient的关键字参数字典

SUPPORTED_MODELS为:mistral-embed-2312mistral-embedcodestral-embedcodestral-embed-2505

在索引管道中落地

将网页抓取、HTML 转换、切块、嵌入、写入串成一条索引管道,是最常见的使用方式:

from haystack import Pipeline from haystack.components.converters import HTMLToDocument from haystack.components.fetchers import LinkContentFetcher from haystack.components.preprocessors import DocumentSplitter from haystack.components.writers import DocumentWriter from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.embedders.mistral.document_embedder import MistralDocumentEmbedder document_store = InMemoryDocumentStore() fetcher = LinkContentFetcher() converter = HTMLToDocument() chunker = DocumentSplitter() embedder = MistralDocumentEmbedder() writer = DocumentWriter(document_store=document_store) indexing = Pipeline() indexing.add_component(name="fetcher", instance=fetcher) indexing.add_component(name="converter", instance=converter) indexing.add_component(name="chunker", instance=chunker) indexing.add_component(name="embedder", instance=embedder) indexing.add_component(name="writer", instance=writer) indexing.connect("fetcher", "converter") indexing.connect("converter", "chunker") indexing.connect("chunker", "embedder") indexing.connect("embedder", "writer") indexing.run(data={"fetcher": {"urls": ["https://mistral.ai/news/la-plateforme/"]}})

MistralTextEmbedder:查询字符串向量化

MistralTextEmbedder继承自OpenAITextEmbedder,用于把单条字符串(典型场景是用户查询)编码为语义向量。它的初始化参数是MistralDocumentEmbedder的简化版——去掉批量与元数据拼接相关参数,仅保留api_keymodelapi_base_urlprefixsuffix与三个客户端控制参数(timeoutmax_retrieshttp_client_kwargs),默认模型同样是mistral-embedSUPPORTED_MODELS列表与文档嵌入器一致。

from haystack.utils import Secret from haystack_integrations.components.embedders.mistral.text_embedder import MistralTextEmbedder text_to_embed = "I love pizza!" text_embedder = MistralTextEmbedder( api_key=Secret.from_token("<your-api-key>"), model="mistral-embed", ) print(text_embedder.run(text_to_embed)) # {'embedding': [0.017020374536514282, -0.023255806416273117, ...], # 'meta': {'model': 'mistral-embed', # 'usage': {'prompt_tokens': 4, 'total_tokens': 4}}}

返回字典除embedding外,还带有meta信息,其中记录了实际使用的模型与 token 用量,便于追踪成本。

组合成端到端文档搜索管道

MistralTextEmbedderMistralDocumentEmbedder配对使用,即可构建一个完整的"索引 + 检索 + 生成"RAG 管道:

from haystack import Document, Pipeline from haystack.utils import Secret from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder from haystack.components.fetchers import LinkContentFetcher from haystack.components.converters import HTMLToDocument from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever from haystack.components.writers import DocumentWriter from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack.components.generators.chat import OpenAIChatGenerator from haystack.dataclasses import ChatMessage from haystack_integrations.components.embedders.mistral.document_embedder import MistralDocumentEmbedder from haystack_integrations.components.embedders.mistral.text_embedder import MistralTextEmbedder document_store = InMemoryDocumentStore(embedding_similarity_function="cosine") # 索引管道 fetcher = LinkContentFetcher() converter = HTMLToDocument() embedder = MistralDocumentEmbedder() writer = DocumentWriter(document_store=document_store) indexing = Pipeline() indexing.add_component(name="fetcher", instance=fetcher) indexing.add_component(name="converter", instance=converter) indexing.add_component(name="embedder", instance=embedder) indexing.add_component(name="writer", instance=writer) indexing.connect("fetcher", "converter") indexing.connect("converter", "embedder") indexing.connect("embedder", "writer") indexing.run(data={ "fetcher": { "urls": [ "https://docs.mistral.ai/self-deployment/cloudflare/", "https://docs.mistral.ai/platform/endpoints/", ], }, }) # 查询管道 text_embedder = MistralTextEmbedder() retriever = InMemoryEmbeddingRetriever(document_store=document_store) prompt_template = [ ChatMessage.from_system("You are a helpful assistant."), ChatMessage.from_user( "Given the retrieved documents, answer the question.\nDocuments:\n" "{% for document in documents %}{{ document.content }}{% endfor %}\n" "Question: {{ query }}\nAnswer:", ), ] prompt_builder = ChatPromptBuilder( template=prompt_template, required_variables={"query", "documents"}, ) llm = OpenAIChatGenerator(model="gpt-4o-mini", api_key=Secret.from_token("<your-api-key>")) doc_search = Pipeline() doc_search.add_component("text_embedder", text_embedder) doc_search.add_component("retriever", retriever) doc_search.add_component("prompt_builder", prompt_builder) doc_search.add_component("llm", llm) doc_search.connect("text_embedder.embedding", "retriever.query_embedding") doc_search.connect("retriever.documents", "prompt_builder.documents") doc_search.connect("prompt_builder.prompt", "llm.messages") query = "How can I deploy Mistral models with Cloudflare?" result = doc_search.run({ "text_embedder": {"text": query}, "retriever": {"top_k": 1}, "prompt_builder": {"query": query}, }) print(result["llm"]["replies"])

MistralChatGenerator:对话生成与工具调用

MistralChatGenerator继承自OpenAIChatGenerator,面向 Mistral Chat Completion 端点,以 Haystack 的ChatMessage数据类作为输入输出格式。核心能力包括:

  • 流式输出:支持从 Mistral Chat Completion 端点流式接收 token。
  • 完整参数透传generation_kwargs支持 Mistral API 的全部生成参数。
  • 推理内容提取:对支持推理的模型(如mistral-small配合reasoning_effort、magistral 系列),自动把推理/思考内容抽取到ChatMessageReasoningContent字段。该字段在仓库源码 chat_message.py 中定义,包含reasoning_text与可选的 provider 特有extra信息,并可通过ChatMessage.reasoning属性访问(见 chat_message.py)。
from haystack_integrations.components.generators.mistral import MistralChatGenerator from haystack.dataclasses import ChatMessage messages = [ChatMessage.from_user("What's Natural Language Processing?")] client = MistralChatGenerator() response = client.run(messages) print(response) # {'replies': [ChatMessage(_role=<ChatRole.ASSISTANT: 'assistant'>, # _content=[TextContent(text="Natural Language Processing (NLP) is a branch of artificial intelligence # that focuses on enabling computers to understand, interpret, and generate human language ...")], # _meta={'model': 'mistral-small-latest', 'index': 0, 'finish_reason': 'stop', # 'usage': {'prompt_tokens': 15, 'completion_tokens': 36, 'total_tokens': 51}})]}

初始化参数

__init__( api_key: Secret = Secret.from_env_var("MISTRAL_API_KEY"), model: str = "mistral-small-latest", streaming_callback: StreamingCallbackT | None = None, api_base_url: str | None = "https://api.mistral.ai/v1", generation_kwargs: dict[str, Any] | None = None, tools: ToolsType | None = None, *, timeout: float | None = None, max_retries: int | None = None, http_client_kwargs: dict[str, Any] | None = None, ) -> None

默认模型为mistral-small-latestSUPPORTED_MODELS类属性包含 40+ 个模型 ID,覆盖mistral-mediummistral-largecodestraldevstralmagistral(原生推理模型)、ministralpixtral(多模态)、voxtral(语音)等系列,完整列表以 API 参考文档 为准。

generation_kwargs支持的部分常用参数:

参数说明
max_tokens输出文本的最大 token 数
temperature采样温度;越高越有创造性(如 0.9),确定性任务建议 0(argmax 采样)
top_p核采样;如 0.1 表示只考虑累计概率前 10% 的 token
stream是否流式返回部分进度(data: [DONE]终止)
safe_prompt是否在对话前注入安全提示
random_seed随机采样种子
reasoning_effort控制推理 token 的投入,取值"high""none",适用于支持可调推理的模型(如mistral-small-latestmistral-medium
prompt_mode针对原生推理模型(magistral),设为"reasoning"使用默认推理系统提示
response_formatJSON schema 或 Pydantic 模型,强制输出结构;注意流式配合结构化输出时必须是 JSON schema 而非 Pydantic 模型

推理内容示例

对支持推理的模型,可通过ChatMessagereasoning属性访问思考过程,text属性读取最终答案:

from haystack_integrations.components.generators.mistral import MistralChatGenerator from haystack.dataclasses import ChatMessage messages = [ChatMessage.from_user("Solve: if x + 3 = 7, what is x?")] client = MistralChatGenerator( model="mistral-small-latest", generation_kwargs={"reasoning_effort": "high"}, ) response = client.run(messages) print(response["replies"][0].reasoning) # 访问推理内容 print(response["replies"][0].text) # 访问最终答案

工具与 Toolset 支持

tools参数接受灵活的工具配置,这是构建智能体工作流的关键:

  • 一个Tool对象列表;
  • 单个Toolset对象;
  • Toolset与独立Tool的混合列表。
from haystack.tools import Tool, Toolset from haystack_integrations.components.generators.mistral import MistralChatGenerator weather_tool = Tool( name="weather", description="Get weather info", parameters=..., function=... ) news_tool = Tool( name="news", description="Get latest news", parameters=..., function=... ) math_toolset = Toolset([add_tool, subtract_tool, multiply_tool]) generator = MistralChatGenerator( tools=[math_toolset, weather_tool, news_tool] # 混合 Toolset 与 Tool )

run方法中还可通过tools覆盖初始化时的工具配置,并通过tools_strict开启工具调用的严格 schema 遵从。

run 与 run_async

run的输入messages接受list[ChatMessage]或单个字符串(字符串会被自动包装为一条 user 角色消息);generation_kwargs按 key 与初始化时的参数合并——run中传入的 key 优先,仅在初始化时设置的 key 保留。返回字典包含replies键,值为ChatMessage列表。

run( messages: list[ChatMessage] | str, streaming_callback: StreamingCallbackT | None = None, generation_kwargs: dict[str, Any] | None = None, *, tools: ToolsType | None = None, tools_strict: bool | None = None, ) -> dict[str, list[ChatMessage]]

run_async是异步版本,签名与run一致,唯一的差异是streaming_callback必须是协程(coroutine)。

流式输出

在初始化时传入streaming_callback即可启用流式输出,回调函数接收StreamingChunk参数。可以直接复用 Haystack 自带的print_streaming_chunk工具函数把增量 token 打印到终端:

from haystack_integrations.components.generators.mistral import MistralChatGenerator from haystack.components.generators.utils import print_streaming_chunk from haystack.dataclasses import ChatMessage from haystack.utils import Secret generator = MistralChatGenerator( api_key=Secret.from_env_var("MISTRAL_API_KEY"), streaming_callback=print_streaming_chunk, ) message = ChatMessage.from_user("What's Natural Language Processing? Be brief.") print(generator.run([message]))

多模态输入

借助ChatMessage的内容部分(content parts)机制,还可以直接传入图片进行视觉问答,例如使用pixtral系列模型:

from haystack.dataclasses import ChatMessage, ImageContent from haystack_integrations.components.generators.mistral import MistralChatGenerator llm = MistralChatGenerator(model="pixtral-12b-2409") image = ImageContent.from_file_path("apple.jpg") user_message = ChatMessage.from_user( content_parts=["What does the image show? Max 5 words.", image], ) response = llm.run([user_message])["replies"][0].text print(response) # Red apple on straw.

在 RAG 管道中回答网页内容

下面的示例把LinkContentFetcherHTMLToDocumentChatPromptBuilderMistralChatGenerator串联,实现"抓取网页 → 转为文档 → 构造提示 → Mistral 生成答案":

from haystack import Pipeline from haystack.components.builders import ChatPromptBuilder from haystack.components.generators.utils import print_streaming_chunk from haystack.components.fetchers import LinkContentFetcher from haystack.components.converters import HTMLToDocument from haystack.dataclasses import ChatMessage from haystack_integrations.components.generators.mistral import MistralChatGenerator fetcher = LinkContentFetcher() converter = HTMLToDocument() prompt_builder = ChatPromptBuilder(variables=["documents"]) llm = MistralChatGenerator( streaming_callback=print_streaming_chunk, model="mistral-small", ) message_template = """Answer the following question based on the contents of the article: {{query}}\n Article: {{documents[0].content}} \n """ messages = [ChatMessage.from_user(message_template)] rag_pipeline = Pipeline() rag_pipeline.add_component(name="fetcher", instance=fetcher) rag_pipeline.add_component(name="converter", instance=converter) rag_pipeline.add_component("prompt_builder", prompt_builder) rag_pipeline.add_component("llm", llm) rag_pipeline.connect("fetcher.streams", "converter.sources") rag_pipeline.connect("converter.documents", "prompt_builder.documents") rag_pipeline.connect("prompt_builder.prompt", "llm.messages") question = "What are the capabilities of Mixtral?" result = rag_pipeline.run({ "fetcher": {"urls": ["https://mistral.ai/news/mixtral-of-experts"]}, "prompt_builder": { "template_variables": {"query": question}, "template": messages, }, "llm": {"generation_kwargs": {"max_tokens": 165}}, })

序列化支持:组件可随管道持久化

Mistral 集成的各个组件都实现了 Haystack 标准的序列化接口,可随Pipeline一起序列化/反序列化:

  • MistralOCRDocumentConverter提供to_dict()from_dict(),其中from_dict返回反序列化后的MistralOCRDocumentConverter实例。
  • 两个 Embedder 与MistralChatGenerator同样提供to_dict(),把初始化配置(modelapi_base_urlgeneration_kwargstools等)序列化为字典;API 密钥这类敏感信息通过Secret机制处理,不会以明文落入序列化结果。

此外,MistralOCRDocumentConverter还实现了warm_up()(初始化 Mistral 客户端)与close()(关闭客户端),与 Haystack 的资源生命周期管理机制对齐,适合在长运行服务中显式管理底层连接。

实践要点速查

  • 认证:优先设置MISTRAL_API_KEY环境变量,所有组件默认读取它;需要动态传入时统一使用Secret包装。
  • OCR 输出是 Markdown:不要把转换器输出直接接默认配置的DocumentCleaner,否则标题、表格与图片标签会被压平;按页切分请直连DocumentSplitter(split_by="page")
  • 结构化标注有页面上限document_annotation_schema只对最多 8 页的文档生效,超限文档将跳过文档级标注。
  • 本地文件自动上传与清理:默认处理完即删除上传文件(cleanup_uploaded_files=True);FileChunk指向的既有文件不受影响。
  • 嵌入与生成默认模型:文档/文本嵌入默认mistral-embed,对话生成默认mistral-small-latest;完整模型列表可请求https://api.mistral.ai/v1/models获取。
  • 超时与重试回退:三个基于 OpenAI 基类实现的组件,未显式设置timeout/max_retries时,会回退到OPENAI_TIMEOUT/OPENAI_MAX_RETRIES环境变量,最后分别取默认值 30 秒与 5 次重试。
  • 进一步阅读:组件的完整字段说明见 version-2.23 Mistral API 参考,配套组件使用文档可查阅 MistralOCRDocumentConverter 使用指南、MistralDocumentEmbedder 使用指南、MistralTextEmbedder 使用指南 与 MistralChatGenerator 使用指南。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 15:30:36

弹性通道与模块化混闪NAS架构解析

1. 项目概述&#xff1a;为什么“弹性通道模块化混闪NAS”不是概念炒作&#xff0c;而是存储架构演进的必然选择最近在几个硬件极客群和NAS开发者论坛里&#xff0c;反复看到“弹性通道模块化混闪NAS”这个提法被拎出来讨论。它不像“AI NAS”那样靠营销话术堆砌&#xff0c;也…

作者头像 李华