ARTICLE DETAIL

资讯详情

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

Instructor 批量处理:BatchProcessor 一套代码通吃 OpenAI、Anthropic、Google 的多 Provider 结构化抽取

Instructor 批量处理:BatchProcessor 一套代码通吃 OpenAI、Anthropic、Google 的多 Provider 结构化抽取 Instructor 批量处理BatchProcessor 一套代码通吃 OpenAI、Anthropic、Google 的多 Provider 结构化抽取【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor在 Lambda 里跑结构化抽取最烦的不是模型输出而是那个 .jsonl 临时文件配额有限、清理要自己写敏感请求还落盘过夜。Instructor 批量处理的 BatchProcessor 直接给了一条 BytesIO 内存批处理的路一套代码通吃 OpenAI、Anthropic、Google 的多 Provider 结构化抽取状态轮询、结果解析、CLI 管理都替你收好了。Serverless 内存批处理别在 Lambda 里落 .jsonl 临时文件 ⚡先说结论Serverless 场景下用 BatchProcessor把 file_path 设为 None 就走内存分支BytesIO 零磁盘 I/O。传统批处理是两步先把请求序列化成 .jsonl 写到磁盘再上传给提供商。放到 Lambda 或 Cloud Functions 里每一步都别扭——函数运行时给临时目录的配额很小批一大就爆用完还得自己 os.remove忘了删敏感 prompt 就在磁盘上多活一个冷启动周期。看instructor/batch/processor.py里的create_batch_from_messages分支就一个判断buffer processor.create_batch_from_messages(messages_list, file_pathNone) # 返回 io.BytesIO 而非文件路径写完自动 seek(0) 复位读头传字符串就逐条BatchRequest追加写盘返回路径传 None写进io.BytesIO缓冲区写完buffer.seek(0)复位读头缓冲区直接返回。submit_batch对两者通吃所以上游代码一个字不用改。没有文件就没有清理也没有跑完忘了删的尴尬请求数据只在内存里活一个函数周期安全审计也好看。2 分钟跑通第一个批任务从 messages 到类型化对象 最短路径两条 messages 喂给 BatchProcessor从创建到拿到类型化对象只要 6 行。消息就是普通的list[dict]响应模型是任意 Pydantic BaseModel。最小可跑路径如下import 已省略# messages_list两组 systemuser 对话User任意 Pydantic 模型 processor BatchProcessor(openai/gpt-4o-mini, User) buffer processor.create_batch_from_messages(messages_list, file_pathNone) batch_id processor.submit_batch(buffer) status processor.get_batch_status(batch_id) # 轮询间隔 10 秒 results processor.get_results(batch_id) # completed 后再调用 print([r.result for r in results if r.success])注意这里轮询期间只碰get_batch_status别提前调get_results。默认参数是max_tokens1000、temperature0.1抽取类任务建议显式把 max_tokens 压到两三百——输出更短、更稳费用也更可控。每条结果自带 custom_idrequest-0、request-1……后面和原始消息对账全靠它。OpenAI、Anthropic、Google 统一接口请求格式到底差在哪 核心机制你只面向 BatchProcessor 写一次代码多 Provider 结构化抽取的方言差异被封在底层。model 字符串在__init__里被model.split(/, 1)拆成前缀和模型名再交给get_provider工厂实例化对应实现。BatchProcessor 像一个智能分拣台你只管把信件丢上去它看信封上是openai/还是anthropic/前缀自动转交对应快递公司——你连分拣员是谁都不用知道。路由还有一层保护instructor/batch/providers/__init__.py用importlib.util.find_spec先探 SDK 装没装没装就把 Provider 置为 None调用时才抛 OpenAI is not installed 这类明确错误不会在导入期崩溃。三家的请求格式差异由instructor/batch/request.py的to_*_format方法分发Provider请求格式结果数据位置OpenAIjson_schema strictcontent 字段 JSONAnthropicsystem 提层 tool_usetool_use 块 inputGoogleuse_inline 内联提交需 GCS 与 IAM 配置OpenAI 走 json_schema 严格模式schema 被递归补上additionalProperties: falsestrict: True一个多余字段都不收。Anthropic 最讲究——system 角色消息被抽出合并成顶层 system 参数Pydantic Schema 包装成名为extract_data的工具tool_choice钉死为{type: tool, name: extract_data}逼模型必须按 Schema 交卷。Google 在测试脚本里直接submit_batch(messages_list..., use_inlineTrue)内联提交不落文件真实跑批需要 GCS 桶与 IAM 角色未配置时进模拟模式。结果侧更统一。所有结果都是同一个联合类型也就是 Maybe/Result 结果模型BatchResult Union[BatchSuccess[T], BatchError]BatchSuccess带 custom_id 和解析好的result: TBatchError带error_type、error_message和原始raw_data。就像取快递包裹要么是完好签收的要么是附运单号的破损说明单你不用再猜。解析差异被封在_extract_from_response里OpenAI 从response.body.choices[0].message.content取 JSONAnthropic 优先取 tool_use 块的 input取不到再回退解析 text 块里的 JSON任何一步失败都落为 BatchError不中断整批。配套工具函数在instructor/batch/utils.pyfilter_successful、filter_errors、extract_results、get_results_by_custom_id。失败率高的批次一行filter_errors先把坏件挑出来看 error_type再决定是重试还是修 Schema。批任务卡住了先看这张轮询状态流转表BatchProcessor 背后的批任务轮询状态机只有 6 个状态按 create → submit → poll → fetch → validate 的时间线走一遍就不会卡。processor.create_batch_from_messages(messages_list, file_pathbatch.jsonl) batch_id processor.submit_batch(batch.jsonl) status processor.get_batch_status(batch_id) # poll间隔 10 秒查一次 results processor.get_results(batch_id) # fetchcompleted 后拉取 errors filter_errors(results) # validate坏件单独看create 的产物是请求文件或缓冲区submit 立刻返回 batch_id不等待poll 只读状态不取数据fetch 拿到的是 BatchResult 列表validate 就是拿filter_errors和extract_results分别对账成功与失败条目。测试脚本里还会按 name 排序后与预期 User 列表逐项核对姓名和年龄全中才算过。状态流转BatchStatus枚举原始状态保留在BatchJobInfo.raw_statuspending → processing → completed / failed / cancelled / expiredOpenAIvalidating→ pendingin_progress、finalizing→ processingAnthropicin_progress→ processingended→ completed终态四个completed 取结果failed / cancelled / expired 直接止损时长参考OpenAI 通常几小时、保证 24 小时内Anthropic 多数批次 1 小时内Google 有 24 小时执行上限且 GCS 桶要和任务同区域。完整权衡详见docs/concepts/batch.md。instructor batch CLI 速查 高频报错对照不写 Python 也能管批次Instructor 批量处理的 CLI 子命令覆盖从创建到删除的全流程。子命令作用list列出批次--live 实时刷新create消息文件生成批次请求create-from-file提交现成 jsonl 文件status查看指定批次状态results拉取结果到输出文件cancel取消运行中的批次delete删除已完成批次仅 Anthropicdownload-file下载原始结果文件几个实操点list默认取 10 条加--live表格实时刷新适合挂着看进度create-from-file的--completion-window只认 OpenAI默认 24hdelete目前只有 Anthropic 支持。旧的--use-anthropic标志已废弃用--model或--provider指定提供商。instructor batch list --model openai/gpt-4o-mini --live instructor batch results --batch-id batch_123 \ --output-file results.jsonl --model openai/gpt-4o-mini高频报错对照均来自examples/batch_api的测试脚本报错原因修复OPENAI_API_KEY not setKey 未设置export 对应环境变量Model must be in format缺 provider/ 前缀改 provider/model 格式Unsupported provider前缀不受支持换 openai / anthropicOpenAI is not installedSDK 未安装pip install openaiMissing GCS_BUCKET未配置 GCS 桶export GCS_BUCKET内存还是文件新增 Provider 要动哪几行 Instructor 批量处理的选型其实就两个问题环境吃不吃得下磁盘 I/O你要不要留痕。Serverless、安全敏感 → 内存。BytesIO 零磁盘 I/O敏感 prompt 不落盘清理代码一行不写函数超时了也没残留。大批量、要审计留痕 → 文件。.jsonl 可以 diff、可以重放出问题时直接打开原始请求逐行看调试和合规都省事。混合场景生产走内存排障时临时落一份文件两条路随时切。新增 Provider 的路径很短继承instructor/batch/providers/base.py的BatchProvider实现submit_batch、get_status、retrieve_results、download_results、cancel_batch、delete_batch、list_batches这 7 个抽象方法在get_provider里注册前缀再给request.py加一个to_xxx_format即可。importlib 懒加载机制不用动——没装 SDK 时它自动给出明确报错。统一接口从来不是目的少写三遍 Provider 适配代码才是。【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表