首页/新闻资讯/正文详情

深入 LangChain:掌握结构化输出与流式传输两大利器----《Hello LangChain LangGraph!》(4)

发布时间:2026/11/3 2:17:22 来源:云帆数科 栏目:资讯中心
深入 LangChain:掌握结构化输出与流式传输两大利器----《Hello LangChain LangGraph!》(4)
文章目录结构化输出结构化输出流式传输自定义流式输出解析器结构化输出结构化输出聊天模型的with_structured_output方法允许我们预先定义一个期望的数据结构并要求大模型必须按照这个结构返回信息。–LangChain输出解析器则是依赖模型的文本去生成所以有时模型会输出格式错误的内容因为优先使用上面这种模型原生结构化输出的方法该输出结构可以指定为 TypedDict 类、JSON Schema 或 Pydantic 类。如果使用 TypedDict 或 JSON Schema则 Runnable 将返回一个字典 eg:{name: 张三, age: 25}如果使用 Pydantic 类则将返回一个 Pydantic 对象 eg:name张三 age25modelChatOpenAI(modelgpt-4o-mini)# 这里列举三种写法#第一种 Pydantic 对象classJoke(BaseModel):给用户讲的一个笑话setup:strField(description这个笑话的开头)punchline:strField(description这个笑话的妙语)rating:Optional[int]Field(defaultNone,description从1-10分给这个笑话评分)classData(BaseModel):获取关于笑话的数据列表jokes:List[Joke]# 第二种 TypedDictclassJoke(TypedDict):给用户讲的一个笑话setup:Annotated[str,...,这个笑话的开头]punchline:Annotated[str,...,这个笑话的妙语]rating:Annotated[Optional[int],None,从1-10分给这个笑话评分]model_with_structuredmodel.with_structured_output(Joke,include_rawTrue)# 加上inclue_raw True这个参数的话会返回一个更大的字典(含parsed和raw)print(model_with_structured.invoke(讲一个关于跳舞的笑话))#第三种 JSON Schemajson_schema{title:joke,description:给用户讲一个笑话。,type:object,properties:{setup:{type:string,description:这个笑话的开头,},punchline:{type:string,description:这个笑话的妙语,},rating:{type:integer,description:从1到10分给这个笑话评分,default:None,},},required:[setup,punchline],}model_with_structuredmodel.with_structured_output(json_schema)#绑定schemaprint(model_with_structured.invoke(你是谁))# 执行关于输出格式的选择:用户每次的输入是不一样的最好是定义好几个不同的格式然后用Union把他们打包在一起交给大模型这样大模型就可以从中自主选择格式了举例:modelChatOpenAI(modelgpt-4o-mini)classJoke(BaseModel):给用户讲的一个笑话setup:strField(description这个笑话的开头)punchline:strField(description这个笑话的妙语)rating:Optional[int]Field(defaultNone,description从1-10分给这个笑话评分)classResponse(BaseModel):用以对话的方式回应。content:strField(description用于对用户查询的会话响应)classFinalResponse(BaseModel):最终回复选择合适的输出结构final_output:Union[Joke,Response]model_with_structuredmodel.with_structured_output(FinalResponse)print(model_with_structured.invoke(讲一个关于跳舞的笑话))print(model_with_structured.invoke(你是谁))结构化输出的使用场景:1.作为信息提取器 2.使用少样本提示来增强信息提取能力流式传输之前使用invoke的调用方式属于是非流式传输–就是聊天模型直接返回全量内容LLM支持SSE协议,这是一种基于HTTP的单项通信机制。客户端建立连接之后服务器可以源源不断的向客户端推送数据(且不需要客户端反复轮询)–LangChain的流式传输也是用的这个LangChain流式传输的完整流程和底层协议:angchain-openai 包通过集成 OpenAI Python SDK提供了一个 HTTP 客户端。因此支持 LangChain 向 OpenAI 的 API 发起调用请求。若希望发起流式传输请求则需在请求中加入streamTrue向 OpenAI 说明以 SSE 协议进行流式返回。LangChain 接收 OpenAI 的 SSE 格式的响应并将其转换为 LangChain 自封装的消息格式如AIMessageChunk消息。这样就可以以统一的方式处理来自不同模型提供商OpenAI, Anthropic 等的流式响应。stream()同步传输:在 LangChain 聊天模型中可以使用其.stream()方法来同步生成流式响应的效果聊天模型的.stream()方法返回一个迭代器该迭代器在生成输出时同步产生输出消息块。可以使用for循环实时处理每个块chunks[]forchunkinmodel.stream(写一段关于春天的作文1000字):chunks.append(chunk)# chunk是AIMessageChunk类型的,是AIMessage的一小块内容(也就是消息块)print(chunk.content,end|,flushTrue)astream异步传输:–采用这种方法的话可以在程序等待下一个chunk的过程中让服务器去处理其他哟弄个胡的请求等数据包到了再继续打印# 异步流式输出asyncdefasync_stream():#成协程函数了print(异步调用)asyncforchunkinmodel.astream(写一段关于春天的作文1000字):print(chunk.content,end|,flushTrue)asyncio.run(async_stream())# model.ainvoke() 这个是拿完整结果关于协程、线程、进程:协程是一个线程内实现的–比线程切换的消耗小协程是协作式调度同一时间一个线程里只有一个协程在运行举例:# 协程asyncdefboil_water_async():print(开始烧水...)awaitasyncio.sleep(5)# await表示等待这个操作完成但期间可以做别的事print(烧水完成...)# 协程asyncdefsend_message_async():print(开始发消息...)awaitasyncio.sleep(2)# 模拟烧水2sprint(发消息完成...)# 协程调度# 事件循环asyncdefmain():# 1、烧水任务task1asyncio.create_task(boil_water_async())# 2、发消息任务task2asyncio.create_task(send_message_async())awaittask1awaittask2# run 会创建一个事件循环asyncio.run(main())自定义流式输出解析器如果想要把输出改成其他格式的输出(比如一句话一句话的输出)并且保留流式处理功能就需要在链中使用生成器函数就能完成自定义流式输出的功能# 组件1聊天模型modelChatOpenAI(modelgpt-4o-mini)# 组件2输出解析器strparserStrOutputParser()# 自定义生成器defsplit_into_list(input:Iterator[str])-Iterator[List[str]]:bufferforchunkininput:bufferchunk# 遇到 。 需要刷新while。inbuffer:# 找到 。的位置stop_indexbuffer.index(。)# yield 用于创造生成器yield[buffer[:stop_index].strip()]bufferbuffer[stop_index1:]# 处理buffer最后几个字yield[buffer.strip()]# 定义链chainmodel|parser|split_into_listforchunkinchain.stream(写一段关于爱情的歌词需要5句话每句话用中文句号隔开。):# 使用 parser结果就是 strprint(chunk,end|,flushTrue)

相关推荐

Mac 菜单栏电池状态监控:SketchyBar 电量插件实用上手
Mac 菜单栏电池状态监控:SketchyBar 电量插件实用上手

Mac 菜单栏电池状态监控:SketchyBar 电量插件实用上手 【免费下载链接】SketchyBar A highly customizable macOS status bar replacement 项目地址: https://gitcode.com/gh_mirrors/sk/SketchyBar 打开 MacBook 的盖子,视线扫到右上角的菜单栏&… · 2026/11/3 2:17:22

解决问题的思维方式 —— 第一性原理
解决问题的思维方式 —— 第一性原理

前言:今天我们不聊编程技术,给大家介绍一个解决问题的思维方式 —— 第一性原理!一、什么是第一性原理它是一种解决问题的思维方式,它强调的是通过问题的表象看到那个最基本的事实,这样,我们就能够找到问题… · 2026/11/3 2:17:22

超详细!Pycharm的激活安装与使用教程
超详细!Pycharm的激活安装与使用教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 2:16:22

仓库越大越乱?一家郑州五金批发商的“仓库翻身仗“
仓库越大越乱?一家郑州五金批发商的“仓库翻身仗“

一、凌晨一点,老板还在仓库里找一颗螺丝郑州某五金行业的老板,曾经有个外号叫"仓库里的夜猫子"。仓库两千平,货架一排接一排,五金工具、机电配件、紧固件加起来三万多个品项。客户一个电话要某个型号的轴承,… · 2026/11/3 2:47:27

html+css基础:30、伸缩盒模型(伸缩项目--伸/缩,flex复合属性,项目排序与单独对齐,案例)
html+css基础:30、伸缩盒模型(伸缩项目--伸/缩,flex复合属性,项目排序与单独对齐,案例)

伸缩盒模型的伸缩项目--伸/缩,flex复合属性,项目排序与单独对齐,案例等:Ⅰ、伸缩盒模型的伸缩项目--伸:flex-grow: 0;其一、代码为:其二、结果为:Ⅱ、伸缩盒模型的伸缩项目--缩:flex… · 2026/11/3 2:47:27

内网安全第一道闸:为什么你的网络总被 “陌生人“ 混进来?
内网安全第一道闸:为什么你的网络总被 “陌生人“ 混进来?

引言 做过网络 / 安全的都知道,内网失守往往不是防火墙没配好,而是门没看住—— 员工把个人手机、无线路由、不知名摄像头偷偷插进交换机,一台带病毒的工作站随意接入,双网卡电脑绕过隔离直连互联网…… 等你发现时,数… · 2026/11/3 2:47:27

FA_CNN卷积神经网络十九---模型选择、欠拟合与过拟合
FA_CNN卷积神经网络十九---模型选择、欠拟合与过拟合

FA:Formular and Algorithm,CNN:Convoluation Neural Network 1. 写在前面:为什么用多项式讲模型选择 在深度学习中,"模型选择"听起来抽象,但它的本质问题非常朴素:给定一份数据&… · 2026/11/3 2:47:27

经验丰富的汽车安装车载手机互联苹果Carplay和华为Hicar哪家专业
经验丰富的汽车安装车载手机互联苹果Carplay和华为Hicar哪家专业

最近好几个朋友都问我,车子上想装个CarPlay或者HiCar,到底去哪里弄靠谱。说真的,我太懂这种纠结了。我自己那台车,当初就是冲着车机互联去的,结果在路边店装完,先是连不上,后来好不容易连上了&a… · 2026/11/3 2:47:27

GitLab 私有化部署太吃内存:只留仓库和合并请求
GitLab 私有化部署太吃内存:只留仓库和合并请求

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 2:46:27

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码