
Instructor 集成 Mistral 完整指南借助函数调用与 JSON Schema 生成类型安全的结构化输出【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor本文基于docs/integrations/mistral.md整理并结合当前仓库源码深入讲解。你将学会如何在本项目Instructor面向 LLM 的结构化输出库中接入 Mistral 模型安装依赖、配置 API Key、选择 TOOLS / JSON_SCHEMA 模式完成同步、异步、嵌套模型与流式Partial / Iterable输出并掌握从 PDF 文档中直接提取结构化信息的实战技巧。前置准备安装依赖并配置 API Key使用 Mistral 需要安装instructor的 Mistral 扩展包pip install instructor[mistral]⚠️重要使用前必须在客户端上显式设置你的 Mistral API Key。Mistral 官方 SDK 的导入路径随版本略有差异建议采用兼容写法同时兼容mistralai1.x 与 2.xtry: from mistralai.client import Mistral # mistralai 2.x except ImportError: from mistralai import Mistral # mistralai 1.x client Mistral(api_keyyour-api-key-here)仓库中的示例 examples/mistral/mistral.py 同样采用了这一兼容写法并从环境变量MISTRAL_API_KEY读取密钥import os from mistralai.client import Mistral client Mistral(api_keyos.environ.get(MISTRAL_API_KEY))Instructor 针对 Mistral 的 API 结构做了专门适配见 instructor/v2/providers/mistral/client.py 的文档注释使用单一的Mistral客户端类同时提供同步与异步方法补全调用走chat.complete()/chat.complete_async()流式调用走chat.stream()/chat.stream_async()由use_async参数决定具体使用哪一组方法。两种工作模式TOOLS 与 JSON_SCHEMAInstructor 为 Mistral 提供两种模式instructor.Mode.TOOLS使用 Mistral 的函数调用function callingAPI 返回结构化输出是默认模式instructor.Mode.JSON_SCHEMA使用 Mistral 原生的结构化输出structured outputs能力。设置模式非常简单直接通过from_provider指定即可import instructor # Initialize with API key instructor_client instructor.from_provider( mistral/mistral-large-latest, modeinstructor.Mode.TOOLS, )从源码看两种模式分别对应两个处理器handler。在 instructor/v2/providers/mistral/handlers.py 中MistralToolsHandlerMode.TOOLS将 Pydantic 模型转成工具定义并强制设置tool_choiceany确保模型必须调用工具而不是用散文回复MistralJSONSchemaHandlerMode.JSON_SCHEMA借助 mistralai SDK 的response_format_from_pydantic_model()辅助函数生成response_format并把tools/tool_choice参数从请求中移除。此外该文件中还实现了第三个MistralMDJSONHandlerMode.MD_JSON它把 JSON Schema 作为系统提示注入消息并追加一条在 json 代码块中返回 JSON的指令最后从 markdown 代码块中提取 JSON——这为不依赖工具调用、原生结构化输出的场景提供了补充方案。值得注意的是from_mistral工厂函数默认modeMode.TOOLS且会通过 mode 注册表校验模式是否对 Mistral 生效传入未注册的模式会抛出ModeError。历史版本中的专属模式Mode.MISTRAL_TOOLS与Mode.MISTRAL_STRUCTURED_OUTPUTS在 instructor/v2/core/mode.py 中仍作为兼容别名保留并映射到通用的TOOLS与JSON_SCHEMA使用时会给出弃用警告。同步示例提取单个用户下面是最基础的用法定义一个 Pydantic 模型作为response_modelInstructor 会自动把模型 schema 注入请求并在返回前完成类型校验与反序列化。from pydantic import BaseModel import instructor from instructor import Mode class UserDetails(BaseModel): name: str age: int # Initialize the client instructor_client instructor.from_provider( mistral/mistral-large-latest, modeMode.TOOLS, ) # Extract a single user user instructor_client.create( response_modelUserDetails, messages[{role: user, content: Jason is 25 years old}], temperature0, ) print(user) # Output: UserDetails(nameJason, age25)要点说明response_model即最终返回的 Pydantic 实例类型它是 Instructor 一切能力的核心入口temperature0用于在抽取任务中尽量降低输出的随机性调用返回的是UserDetails对象而非 JSON 字符串可以直接用点号访问字段获得完整的 IDE 提示与静态类型检查支持。异步示例对于异步场景在from_provider()中传入async_clientTrue即可获得异步客户端并使用await instructor_client.create(...)import asyncio from pydantic import BaseModel import instructor from instructor import Mode class User(BaseModel): name: str age: int # Initialize the async client instructor_client instructor.from_provider( mistral/mistral-large-latest, async_clientTrue, modeMode.TOOLS, ) async def extract_user(): user await instructor_client.create( response_modelUser, messages[{role: user, content: Jack is 28 years old.}], temperature0, ) return user # Run async function user asyncio.run(extract_user()) print(user) # Output: User(nameJack, age28)从源码角度理解from_provider会把async_clientTrue透传给 Mistral 的from_mistral工厂见 instructor/v2/auto_client.py此时工厂内部使用chat.complete_async/chat.stream_async包装调用并返回AsyncInstructor实例。嵌套模型复杂对象的结构化提取实际业务中经常需要提取用户 多个地址这类嵌套结构。Instructor 支持任意深度的 Pydantic 嵌套模型无需额外配置from pydantic import BaseModel from typing import List import instructor from instructor import Mode class Address(BaseModel): street: str city: str country: str class User(BaseModel): name: str age: int addresses: List[Address] # Initialize the client instructor_client instructor.from_provider( mistral/mistral-large-latest, modeMode.TOOLS, ) # Create structured output with nested objects user instructor_client.create( response_modelUser, messages[ { role: user, content: Extract: Jason is 25 years old. He lives at 123 Main St, New York, USA and has a summer house at 456 Beach Rd, Miami, USA , } ], temperature0, ) print(user) # Output: # User( # nameJason, # age25, # addresses[ # Address(street123 Main St, cityNew York, countryUSA), # Address(street456 Beach Rd, cityMiami, countryUSA) # ] # )嵌套列表List[Address]会被完整地建模为 Mistral 工具调用的参数 schema模型只需按 JSON Schema 结构返回即可Instructor 会自动完成层层校验与对象构建。流式输出Partial 与 IterableInstructor 对 Mistral 提供了完整的流式支持包括create_partial本文以Partial[...]配合streamTrue演示增量构建模型实例create_iterable流式返回对象集合。增量构建 Partial 响应from pydantic import BaseModel import instructor from instructor.dsl.partial import Partial class UserExtract(BaseModel): name: str age: int # Create an Instructor client for Mistral instructor_client instructor.from_provider(mistral/mistral-small-latest) # Stream partial responses model instructor_client.create( response_modelPartial[UserExtract], streamTrue, messages[ {role: user, content: Jason Liu is 25 years old}, ], ) for partial_user in model: print(fReceived update: {partial_user}) # Output might show: # Received update: UserExtract(nameJason, ageNone) # Received update: UserExtract(nameJason Liu, ageNone) # Received update: UserExtract(nameJason Liu, age25)Partial[...]会把所有字段包装为可空字段随着 token 不断到达字段逐步被填充非常适合需要边生成边渲染的交互式场景如聊天式 UI。流式集合 create_iterablefrom pydantic import BaseModel import instructor class UserExtract(BaseModel): name: str age: int # Create an Instructor client for Mistral instructor_client instructor.from_provider(mistral/mistral-small-latest) # Stream iterable responses users instructor_client.create_iterable( response_modelUserExtract, messages[ {role: user, content: Make up two people}, ], ) for user in users: print(fGenerated user: {user}) # Output: # Generated user: UserExtract(nameEmily Johnson, age32) # Generated user: UserExtract(nameMichael Chen, age28)create_iterable要求模型在流中一次性输出多个对象Instructor 会把整个流解析成数组并逐个产出UserExtract实例。异步流式两种流式方式都有异步版本且支持与async_clientTrue组合使用import asyncio from pydantic import BaseModel import instructor from instructor.dsl.partial import Partial class UserExtract(BaseModel): name: str age: int instructor_client instructor.from_provider( mistral/mistral-small-latest, async_clientTrue, ) async def stream_partial(): model await instructor_client.create( response_modelPartial[UserExtract], streamTrue, messages[ {role: user, content: Jason Liu is 25 years old}, ], ) async for partial_user in model: print(fReceived update: {partial_user}) async def stream_iterable(): users instructor_client.create_iterable( response_modelUserExtract, messages[ {role: user, content: Make up two people}, ], ) async for user in users: print(fGenerated user: {user}) # Run async functions asyncio.run(stream_partial()) asyncio.run(stream_iterable())从源码看handlers.py中的extract_streaming_json/extract_streaming_json_async在TOOLS模式下流式 JSON 来自chunk.data.choices[0].delta.tool_calls[0].function.arguments在非工具模式下则来自chunk.data.choices[0].delta.content若为MD_JSON模式还需经过extract_json_from_stream从 markdown 流中剥离代码块解析完成后Partial/IterableBase等 DSL 类型会调用from_streaming_response把连续 JSON 片段拼接成完整对象。源码视角Mistral 适配层是如何工作的客户端工厂与调用链Mistral 的入口在 instructor/v2/providers/mistral/client.py 的from_mistral()校验mistralai是否已安装否则抛出ClientError并提示pip install mistralai通过normalize_mode把供应商专属模式归一化为通用模式校验mode_registry中是否注册了该模式未注册则抛出ModeError并列出可用模式校验传入的client必须是mistralai.Mistral实例根据use_async选择包装chat.complete_async/chat.stream_async或chat.complete/chat.streamstream参数会从 kwargs 中弹出以决定走流式还是补全接口将包装后的函数交给 v2 注册表patch_v2打补丁最终构造Instructor或AsyncInstructor。历史接口 instructor/providers/mistral/client.py 目前只是一个兼容门面facade直接转发到上述 v2 实现保证旧代码平滑迁移。两种模式在底层做了什么模式底层机制关键参数Mode.TOOLS函数调用注入tools由generate_openai_schema生成的函数 schema并设置tool_choiceanyMode.JSON_SCHEMA原生结构化输出调用response_format_from_pydantic_model(response_model)生成response_format移除tools/tool_choicehandle_reask是另一个重要机制当 Pydantic 校验失败时Instructor 会把校验错误反馈回对话TOOLS模式通过role: tool消息携带tool_call_idJSON_SCHEMA/MD_JSON模式则通过assistantuser消息对让模型重新调用函数修正输出。若模型没有发起工具调用例如不支持tool_choiceany的网关或模型拒答会抛出可重试的ResponseParsingError由重试机制重新提问而不是直接崩溃。针对 Mistral 的兼容性细节可参见 tests/v2/test_mistral_handlers.py该测试用 mock 响应验证各 handler 行为特别覆盖了Mistral 返回的function.arguments既可能是字符串也可能是 dict两种情况——适配层会在解析前统一通过json.dumps转成字符串。多模态从 PDF 提取结构化信息Instructor 支持直接对 PDF 进行语义分析与信息抽取无需预处理文本。下面的例子使用PDF.from_url()加载测试资产 tests/assets/invoice.pdf提取发票总金额与商品条目。⚠️注意目前 Mistral 仅支持文档 URL即网络可访问的 PDF 地址不支持本地路径或 Base64 方式。from instructor.processing.multimodal import PDF from pydantic import BaseModel import instructor class Receipt(BaseModel): total: int items: list[str] client instructor.from_provider(mistral/mistral-small-latest) url https://raw.githubusercontent.com/instructor-ai/instructor/main/tests/assets/invoice.pdf response client.create( response_modelReceipt, max_tokens1000, messages[ { role: user, content: [ Extract out the total and line items from the invoice, PDF.from_url( url ), # Also supports PDF.from_path() and PDF.from_base64() ], }, ], ) print(response) # Receipt(total220, items[English Tea, Tofu])从源码看多模态消息会被编码为 Mistral 兼容的document_url结构见 instructor/v2/providers/mistral/multimodal.py 的pdf_to_mistral()当PDF.source是以http://或https://开头的字符串时编码为{type: document_url, document_url: pdf.source}其他情况本地路径、Base64 数据会直接抛出ValueError(Mistral only supports document URLs for now)。因此使用PDF.from_path()或PDF.from_base64()时需自行确认对应供应商的支持范围。相关资源核心概念总览docs/concepts/index.md类型校验与重试机制docs/concepts/validation.md进阶实战示例docs/examples/index.md可直接运行的 Mistral 示例examples/mistral/mistral.pyMistral 处理器单元测试tests/v2/test_mistral_handlers.py版本更新记录CHANGELOG.md兼容性说明Instructor 持续跟进 Mistral API 与模型的最新版本保持对mistralai1.x / 2.x 两代 SDK 的兼容通过 instructor/v2/providers/mistral/client.py 中的动态导入自动探测。涉及 Mistral 集成的新特性与变更请以当前仓库 CHANGELOG.md 为准。【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考