ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Pydantic AI 流式输出实战:一个字是如何从模型跑到屏幕上的

Pydantic AI 流式输出实战:一个字是如何从模型跑到屏幕上的 Pydantic AI 流式输出实战一个字是如何从模型跑到屏幕上的【免费下载链接】pydantic-aiHow Python does AI. Agents, realtime voice, image generation, embeddings. Every model, every interface, typed end to end.项目地址: https://gitcode.com/GitHub_Trending/py/pydantic-ai聊天界面上用户发完消息页面干等 5 秒才蹦出第一个字——大多数人这时候已经划走了。Pydantic AI 的流式输出就是冲着这件事来的模型一边生成应用一边消费首字延迟从整段等完变成几个 token 的事。这也是聊天产品里最常见的体验事故。一个字是怎么到你屏幕上的整条通路拆成五步一步都不复杂调agent.run_stream(prompt)模型按 token 小批量回传不再憋出整段才给框架按时间窗把零碎小批发成一组debounce_by默认 0.1 秒即每 0.1 秒合并一次避免每个 token 都触发校验和重绘结构化输出时每组先走宽松校验allow_partial模式只要求 JSON 语法上还能解析字段没填齐、字符串没写完都先放行校验不过的组直接丢掉流结束后补一次严格校验allow_partialFalse所以最后一个 yield 出来的值是完整通过校验的最终结果可以放心直接落库界面层只做一件事把每次 yield 的值画上去。所谓快照就是到这一刻为止模型说过的全部内容。async with agent.run_stream(prompt) as result: async for output in result.stream_output(debounce_by0.1): ui.update(output) # 每次都是一份已校验的当前快照分组合并和 yield 的实现在 pydantic_ai_slim/pydantic_ai/result.py宽松校验与严格校验的切换在 pydantic_ai_slim/pydantic_ai/_output.py。拿两个典型场景走一遍纯文本用 stream_text() 逐块刷新界面聊天回复是最常见的诉求。stream_text()默认每次返回到目前为止的全量文本而不是增量所以你不用自己拼增量整块重绘就行确实想要增量时传deltaTrue即可agent Agent(openai:gpt-5-mini) async def main(): async with agent.run_stream(写一段使用 pydantic 的示例代码) as result: async for text in result.stream_text(): print(text, end, flushTrue)结构化用 stream_output() 边走边校验输出TypedDict或 Pydantic 模型时换成stream_output()它 yield 的是校验过的中间结果。配合更小的debounce_by表格里 5 行数据可以逐行长出来比憋 8 秒一次性刷好体感强得多class Whale(TypedDict): name: str length: float ocean: NotRequired[str] agent Agent(openai:gpt-5.2, output_typelist[Whale]) async with agent.run_stream(Generate details of 5 whale species.) as result: async for whales in result.stream_output(debounce_by0.01): print(whales) # 已校验的中间结果缺字段也能通过仓库里 examples/pydantic_ai_examples/stream_whales.py 把这套模式做成了可运行的 Rich 动态表格。最容易踩的 3 个坑⚠️坑一结构化流中途抛 ValidationError。这是预期行为不是 bug——中间分组本来就可能是不完整的 JSON宽松校验失败会被静默跳过继续等下一组。只有最终那次严格校验失败才需要处理。坑二配了 retries流式场景却没生效。run_stream()里输出校验失败时框架会直接报 retries are not supported自动重试只覆盖工具调用等环节。断流兜底要自己在应用层做记下本轮上下文从断点重发兜不住就降级回非流式的run()。坑三流式任务越跑越吃内存。stream_output()每次 yield 的是全量快照而非增量把每份都存进列表就是无界增长留最后一份就够了。另外async with必须走完包括异常分支连接池和事件流才会被释放。判断断流发生在哪一步时挂上 logfire 或 OTeltrace 里每一轮模型请求、工具调用的边界都看得清上线前自查清单debounce_by按输出长度调过短文本默认 0.1 就够长结构化输出调大省掉一半以上的校验开销分清了中间分组校验失败正常和最终校验失败要处理知道retries管不了流式输出校验断流有应用层兜底模型实例与 HTTP 客户端跨轮次复用不每轮新建连接async with agent.run_stream(...)有干净的退出路径含异常分支确认目标模型支持流式以及所需输出形态挂了 logfire/OTel出问题时能看到断在第几轮流式输出的本质是把一次性交付拆成按批交付。Pydantic AI 把分块、宽松校验、最终兜底都内建好了你要做的只是调参和写兜底。想再往深走顺着run_stream_events()的事件级接口看每一轮请求、工具调用和 usage 的时机examples/ 里的 stream_whales 和 weather_agent 是现成的入口。【免费下载链接】pydantic-aiHow Python does AI. Agents, realtime voice, image generation, embeddings. Every model, every interface, typed end to end.项目地址: https://gitcode.com/GitHub_Trending/py/pydantic-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表