当前位置: 首页 > article >正文

LangChain content_blocks:统一处理多模态与跨模型厂商消息内容

目录前言一、什么是 content_blocks补充content 与 content_blocks 的关系二、为什么需要 content_blocks三、如何使用 content_blocks3.1 读取标准化内容3.2 创建消息时使用标准化块3.3 让模型直接返回标准化格式四、支持的内容块类型五、典型应用场景场景1统一处理来自不同模型的推理内容场景2构建包含多模态内容的用户消息场景3统一提取工具调用六、何时使用 content何时使用 content_blocks前言在开发基于大语言模型的应用时我们经常需要处理来自不同提供商OpenAI、阿里云百炼、本地模型等的消息内容。这些模型在消息格式上各有差异有的将推理步骤放在专用字段有的以不同结构表示多模态数据。如果直接使用原始的 content 字段我们得写大量针对特定模型的适配代码。说白了就是每个模型厂商都有自己的一套消息规范content我们调用模型厂商时需要按照每个厂商的规范定义content接收模型消息后也得根据这个规范解析内容LangChain 在 v1 版本引入的 content_blocks 正是为了解决这一问题。它提供了一套标准化的、类型安全的消息内容表示方式我们能够用同一套代码轻松处理文本、推理、图片、音频、工具调用等各类内容无缝兼容不同的模型提供商。一、什么是 content_blocks每个 LangChain 消息对象如 HumanMessage、AIMessage都有一个 content 属性它直接存储模型提供商原生格式的内容可能是字符串或字典列表。而 content_blocks 是这样发挥其作用的输入时你只需要用 LangChain 的标准内容块构造消息如 HumanMessage(content_blocks[…])LangChain 会根据目标模型自动将 content_blocks 转换为该模型厂商所需的原始 content 格式可能是字符串、特定字典列表等并填充到消息的 content 属性中。输出时模型返回的消息其 content 属性存储的是厂商原生格式如 OpenAI 的字典列表、Anthropic 的混合结构。当你访问消息的 content_blocks 属性时LangChain 会惰性解析这个原生 content将其转换为统一的标准内容块列表供你使用。fromlangchain.messagesimportAIMessage# 假设这是从 Anthropic 模型返回的消息messageAIMessage(content[{type:thinking,thinking:用户询问天气...,signature:...},{type:text,text:今天天气晴朗。}],response_metadata{model_provider:anthropic})# 通过 content_blocks 获取标准化内容forblockinmessage.content_blocks:ifblock[type]reasoning:print(block[reasoning])# 输出: 用户询问天气...elifblock[type]text:print(block[text])# 输出: 今天天气晴朗。可以看到无论原始 content 如何content_blocks 都能将推理内容统一表示为 {“type”: “reasoning”, “reasoning”: …}将文本统一表示为 {“type”: “text”, “text”: …}补充content 与 content_blocks 的关系那有人就会问既然有了 content_blocks为什么还要保留 content我平时只用 content 传字符串也能正常工作难道所有模型都接受纯字符串吗实际上LangChain 的 content 参数非常灵活它可以接受三种形式纯字符串如 “你好”厂商原生格式的列表如 OpenAI 的 [{“type”: “text”, “text”: “你好”}]标准内容块列表如 [{“type”: “text”, “text”: “你好”}]当我们传入一个字符串时LangChain 会根据目标模型的要求自动将其转换为该模型需要的格式。例如Anthropic 要求 content 必须是数组LangChain 就会将 “你好” 转换成 [{“type”: “text”, “text”: “你好”}] 再发送。所以你感觉“直接传字符串就行”其实是 LangChain 在底层帮你做了格式适配。而content_blocks 参数是专门为标准块设计的它强制要求传入符合标准块定义的列表提供了更好的类型安全和代码可读性。在构造消息时content 和 content_blocks 只需要传其中一个如果同时传入LangChain 通常会以 content_blocks 为准因为它更明确。为了代码清晰建议纯文本场景用 content“…”最简单。需要多模态、推理等复杂场景用 content_blocks[…]意图一目了然。另外你也可能会看到这样的代码original_blocksrequest.system_message.content_blocks new_blocksoriginal_blocks[{type:text,text:addendum}]new_system_messageSystemMessage(contentnew_blocks)# 把标准块传给了 content这段代码虽然能工作但混用了两种概念用 content_blocks 读取却用 content 写入。更好的写法是保持统一new_system_messageSystemMessage(content_blocksnew_blocks)这样无论是读还是写都通过 content_blocks 属性/参数代码自文档化避免歧义。二、为什么需要 content_blocks跨模型兼容性不同模型对相同类型内容的表达方式截然不同。例如OpenAI 可能将推理内容放在 content 的一个专用块中也可能通过 response_metadata 返回。Anthropic 使用 thinking 块。本地模型 可能有完全自定义的格式。使用 content_blocks你可以统一提取推理、工具调用等关键信息无需关心底层模型是谁。简化多模态输入当你需要向模型发送图片、音频、文件等时不同模型对多模态内容的字段要求各异。例如 OpenAI 要求{type: image_url, image_url: {...}}而某些模型可能使用{type: image, url: ...}。content_blocks 让你用一套标准描述多模态内容LangChain 会自动转换为目标模型所需的格式。三、如何使用 content_blocks3.1 读取标准化内容直接访问消息对象的 content_blocks 属性即可。forblockinai_message.content_blocks:ifblock[type]reasoning:reasoning_textblock[reasoning]elifblock[type]tool_call:tool_nameblock[name]tool_argsblock[args]3.2 创建消息时使用标准化块在创建HumanMessage、SystemMessage等消息对象时可以直接传入content_blocks参数。LangChain 会自动填充 content 字段为模型可接受的格式。fromlangchain.messagesimportHumanMessage messageHumanMessage(content_blocks[{type:text,text:描述这张图片},{type:image,url:https://example.com/photo.jpg}])# message.content 会被自动转换成对应模型需要的格式3.3 让模型直接返回标准化格式通过设置 output_version“v1”模型输出的 AIMessage 的 content 字段本身就是标准内容块列表方便序列化或后续处理。fromlangchain.chat_modelsimportinit_chat_model modelinit_chat_model(gpt-5-nano,output_versionv1)responsemodel.invoke(你好)# response.content 现在是一个标准内容块列表而不是原始提供商格式四、支持的内容块类型类型用途关键字段text普通文本text, annotationsreasoning模型推理过程reasoning, extrasimage图片数据url / base64, mime_typeaudio音频数据url / base64, mime_typevideo视频数据url / base64, mime_typefile通用文件如 PDFurl / base64, mime_typetool_call模型请求调用工具name, args, idtool_result工具执行结果content, tool_call_idtool_call_chunk流式工具调用片段name, args, id, indexserver_tool_call服务端工具调用id, name, args五、典型应用场景场景1统一处理来自不同模型的推理内容假设你的应用同时使用了 OpenAI 和 Anthropic 的模型并需要将模型的思考过程记录到日志中。deflog_reasoning(ai_message:AIMessage):forblockinai_message.content_blocks:ifblock[type]reasoning:print(f推理:{block[reasoning]})# 如果模型提供了额外元数据如签名ifsignatureinblock.get(extras,{}):print(f签名:{block[extras][signature]})场景2构建包含多模态内容的用户消息向模型发送一张本地图片和一段文本描述。importbase64withopen(photo.jpg,rb)asf:base64_imagebase64.b64encode(f.read()).decode()user_msgHumanMessage(content_blocks[{type:text,text:这张照片里有什么},{type:image,base64:base64_image,mime_type:image/jpeg}])responsemodel.invoke([user_msg])场景3统一提取工具调用当模型请求调用工具时content_blocks 会将工具调用统一为 tool_call 类型。# 假设模型返回了工具调用responsemodel_with_tools.invoke(巴黎天气怎么样)forblockinresponse.content_blocks:ifblock[type]tool_call:print(f调用工具:{block[name]})print(f参数:{block[args]})# 执行工具并返回结果...六、何时使用 content何时使用 content_blocks场景推荐使用只有纯文本且只使用一个模型直接用 content 字符串即可最简单。需要多模态输入图片、音频等推荐使用 content_blocks 构建免去记忆不同模型格式的烦恼。需要跨模型处理推理、工具调用等内容必须使用 content_blocks否则要写大量条件判断。对返回的消息进行结构化处理使用 content_blocks 获得统一表示。希望代码具备更好的可维护性和类型提示推荐使用 content_blocks。

相关文章:

LangChain content_blocks:统一处理多模态与跨模型厂商消息内容

目录前言一、什么是 content_blocks?补充:content 与 content_blocks 的关系二、为什么需要 content_blocks?三、如何使用 content_blocks?3.1 读取标准化内容3.2 创建消息时使用标准化块3.3 让模型直接返回标准化格式四、支持的内…...

MacBook Pro M1芯片编译hping3全记录:解决Tcl依赖与Homebrew失效问题

MacBook Pro M1芯片编译hping3实战指南:从环境配置到Tcl依赖完美解决 在网络安全研究和渗透测试领域,hping3一直被誉为"瑞士军刀"级的网络工具。然而随着macOS生态的演进,特别是Apple Silicon芯片的普及,许多传统工具的…...

Android 14开发必看:HWASAN内存检测实战指南(附Demo源码)

Android 14开发必看:HWASAN内存检测实战指南(附Demo源码) 在移动应用开发领域,内存安全问题一直是困扰开发者的顽疾。随着Android系统不断演进,Google在Android 14中进一步强化了HWASAN(Hardware-assisted …...

Firecrawl本地部署避坑指南:从Docker版本选择到Dify调用的完整流程

Firecrawl本地部署实战:从Docker选型到Dify集成的深度解析 在开源工具生态中,Firecrawl作为一款高效的网页内容提取引擎,正逐渐成为开发者处理网络数据抓取任务的首选方案。不同于简单的爬虫工具,Firecrawl提供了结构化数据输出、…...

从零开始用Firecracker构建轻量级安全容器:绕过KVM性能损耗的5个技巧

从零开始用Firecracker构建轻量级安全容器:绕过KVM性能损耗的5个技巧 在边缘计算和物联网领域,资源效率与安全隔离的平衡一直是开发者面临的难题。传统容器技术虽然轻量,但共享内核的设计难以满足高安全需求;而全功能虚拟机虽然隔…...

vue+python基于ai技术的学习资料分享平台

目录技术栈选择前端实现后端实现AI 功能集成部署与优化项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 Vue.js 作为前端框架,提供响应式界面和组件化开发。 Python 作为后端语言,搭配 Flask …...

#潮流算法# 对含分布式光伏的网络进行潮流迭代计算,确定节点电压和线损,分析电压越限原因。 此...

#潮流算法# 对含分布式光伏的网络进行潮流迭代计算,确定节点电压和线损,分析电压越限原因。 此算法纯,纯,自己一点点敲出来的呜呜呜 重要的事情说三遍,不包含原始数据,不包含原始数据…...

静态模型的边界与动态建模的突破:仓储空间认知能力重构路径—— 融合镜像视界“像素即坐标”、无感定位与行为认知的空间计算框架

静态模型的边界与动态建模的突破:仓储空间认知能力重构路径—— 融合镜像视界“像素即坐标”、无感定位与行为认知的空间计算框架一、问题界定:静态模型的能力边界已全面显现在传统仓储信息化体系中,空间建模主要依赖静态模型,其核…...

阿里云OSS直传避坑指南:Vue3中如何安全处理临时凭证(Browser.js最佳实践)

Vue3阿里云OSS直传安全实践:从临时凭证管理到防抓包设计 引言 在当今企业级应用开发中,文件上传功能几乎是标配需求。阿里云OSS作为国内领先的对象存储服务,其Browser.js直传方案能有效减轻服务器负担,但同时也带来了前端安全管理…...

OmenSuperHub:重构暗影精灵硬件控制体系的开源解决方案

OmenSuperHub:重构暗影精灵硬件控制体系的开源解决方案 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 在游戏本硬件控制领域,长期存在着厂商官方工具功能冗余与用户实际需求之间的矛盾。OmenSuperHu…...

Caffeine缓存库进阶指南:动态过期时间的3种实现方式对比

Caffeine缓存库进阶指南:动态过期时间的3种实现方式对比 在Java应用性能优化领域,缓存技术扮演着至关重要的角色。作为Guava Cache的现代替代品,Caffeine凭借其卓越的性能和灵活的API设计,已成为众多中高级Java开发者的首选缓存解…...

Windows 11终极优化指南:用Win11Debloat让你的电脑飞起来!

Windows 11终极优化指南:用Win11Debloat让你的电脑飞起来! 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其…...

Android 12 SurfaceFlinger 事务处理全流程拆解:从 queueTransaction 到 commitTransaction 到底发生了什么?

Android 12 SurfaceFlinger事务处理全流程深度解析 在Android显示系统中,SurfaceFlinger作为核心合成引擎,其事务处理机制直接决定了UI更新的流畅度与响应速度。本文将深入剖析从应用提交变更到最终合成渲染的完整事务生命周期,揭示Android 1…...

Swagger+LangChain实战:5步搞定AI自动生成接口测试脚本(附完整代码)

SwaggerLangChain实战:5步构建AI驱动的接口测试自动化流水线 在当今快速迭代的软件开发环境中,接口测试自动化已成为保障产品质量的关键环节。传统手工编写测试脚本的方式不仅效率低下,还难以应对频繁变更的接口需求。本文将介绍如何利用Swag…...

K3s国内镜像加速实战:从安装到部署Nginx的完整避坑指南

K3s国内镜像加速实战:从安装到部署Nginx的完整避坑指南 对于国内开发者而言,Kubernetes的学习和使用常常面临一个现实问题——镜像拉取缓慢甚至失败。而轻量级Kubernetes发行版K3s凭借其精简设计和低资源消耗,正成为本地开发和边缘计算的热门…...

Splunk实战:5分钟搞定Windows安全日志分析(附常见错误排查)

Splunk实战:5分钟定位Windows服务器安全威胁的黄金法则 当凌晨三点服务器告警铃声响起时,大多数运维人员的第一反应往往是手足无措。去年某金融公司遭遇的APT攻击事件中,攻击者正是利用管理员对安全日志的迟钝响应,在48小时内横向…...

django基于Python的膳食营养健康系统 基于机器学习的个人健康饮食推荐系统

目录技术选型与框架搭建数据准备与模型设计核心功能模块系统集成与部署测试与迭代示例代码片段(推荐模型训练)关键注意事项项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与框架搭建 后端框架&…...

解决pytorch_quantization安装难题:从错误到成功的完整指南

1. 为什么你的pytorch_quantization安装总是失败? 最近在折腾模型量化时,发现很多同行都在pytorch_quantization这个工具包的安装上栽了跟头。我自己也反复折腾了好几次,总结下来主要有三大坑:源配置冲突、依赖缺失和环境不兼容。…...

【技术解读】NeuroLM:当EEG成为LLM的“第二语言”,多任务脑电分析的统一范式

1. 当脑电波遇上大语言模型:NeuroLM的技术革命 想象一下,如果你的脑电波能像外语一样被AI翻译和理解,会是怎样的场景?这正是NeuroLM带来的颠覆性突破。这个将EEG(脑电图)信号视为"第二语言"的通用…...

Mapbox-GL 2.x 收费了?别慌,手把手教你无缝迁移到免费开源的 Maplibre-GL

Mapbox-GL 2.x 收费迁移指南:零成本切换至Maplibre-GL的实战手册 当Mapbox-GL-JS在2.x版本转向闭源收费模式时,许多依赖其开源特性的开发者陷入了两难。本文将带你深入剖析迁移到Maplibre-GL的技术路径,从API兼容性测试到样式文件转换&#x…...

(-aaa-) Multipass 1.17.x 打通了:虚拟机与宿主机的双向访问历史难点,不再需要设置麻烦的网桥、iptables、nftables 了? (***)

Multipass 解决了&#xff1a;虚拟机与宿主机的双向访问历史难点?mpqemubr0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.59.27.1 netmask 255.255.255.0 broadcast 10.59.27.255这个难点难道是通过在宿主机中设置了网关 mpqemubr0: 的缘故吗&#…...

零信任组网新玩法:用天翼云AccessOne和朋友共享本地K8s集群(避坑指南)

零信任组网新玩法&#xff1a;用天翼云AccessOne和朋友共享本地K8s集群&#xff08;避坑指南&#xff09; 在数字化协作日益普及的今天&#xff0c;如何安全地共享本地资源成为技术爱好者们关注的焦点。传统VPN方案虽然能实现远程访问&#xff0c;但存在权限控制粗放、内网暴露…...

# 蒙特卡罗 #Monte Carlo #风电功率预测 #Kmeans 1 采用蒙特卡洛法仿真

# 蒙特卡罗 #Monte Carlo #风电功率预测 #Kmeans1 采用蒙特卡洛法仿真&#xff0c;生成n组随机风功率出力场景&#xff1b; 2 利用Kmeans算法对n个场景进行聚类&#xff0c;缩减场景&#xff1b; 3 求出缩减后的场景对应的出力概率&#xff1b;并求出不确定出力曲线。 &#xf…...

Vue Flow实战:5分钟搞定工业设备流程图(附完整代码)

Vue Flow工业流程图实战&#xff1a;5分钟构建产线可视化系统 在工业自动化领域&#xff0c;设备连接流程的可视化一直是工程师们的痛点。传统绘图工具难以满足动态调整需求&#xff0c;而专业工业软件又过于笨重。Vue Flow作为基于Vue.js的轻量级流程图库&#xff0c;恰好填补…...

基于A*算法的往返式全覆盖路径规划的改进算法及MATLAB实现代码

基于A*算法的往返式全覆盖路径规划的改进算法 matlab实现代码 算法一 &#xff05;&#xff05;往返式全覆盖路径规划 &#xff05;通过建立二维栅格地图&#xff0c;设置障碍物&#xff0c;以及起始点 &#xff05;根据定义往返式路径规划的定义的优先级运动规则从起始点开始进…...

ABAQUS纤维复合材料热固化仿真:子粘弹性模型与内附CAE文件

ABAQUS纤维复合材料热固化仿真子粘弹性模型&#xff0c;内附CAE文件搞纤维复合材料热固化仿真的兄弟应该都懂&#xff0c;固化过程那个应力变化简直玄学。ABAQUS自带的粘弹性模型有时候跟实际曲线对不上号&#xff0c;自己写子程序又容易掉头发。最近折腾了个基于广义Maxwell模…...

基于华为eNSP的园区网防火墙高可靠与安全策略实战

1. 华为eNSP与园区网防火墙入门指南 第一次接触华为eNSP模拟器时&#xff0c;我被它强大的网络设备仿真能力震撼到了。这个免费的模拟器不仅能完整还原华为路由交换设备的功能&#xff0c;还能模拟防火墙、AC等安全设备&#xff0c;特别适合我们这些需要实践但又缺乏真实设备的…...

Matlab遗传优化算法求解生鲜配送问题的路径优化与时间窗管理:考虑新鲜度与货损成本的解决方案...

Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 货损成本 等约束 程序算法参考文献半夜盯着冷库监控屏的时候&#xff0c;突然想到生鲜配送这活儿真是比炒菜还讲究火候。既要卡着菜市场凌晨三点半的到货时间&#xff0c;又要保证超市货架上的绿叶菜在早…...

三电平逆变器实战:从SVPWM调制到中点平衡的硬核玩法

三电平逆变器 仿真 SVPWM调制 中点电位平衡控制 可选svpwm or spwm T型 I型NPC和ANPC&#xff08;拓扑都有可以选&#xff09; 包含三相逆变器参数设计&#xff0c;SVPWM&#xff0c;直流均压控制&#xff0c;双闭环控制说明文档 直流电压750V&#xff0c;输出交流电压220V&…...

光伏锂电池储能功率协调控制系统仿真探索

光伏锂电池储能功率协调控制系统仿真 [1]左侧光伏Boost控制部分&#xff1a;采用扰动观察法来进行MPPT最大功率跟踪&#xff0c;其中可以改变光照和温度模拟环境工况阶跃&#xff1a; [2]锂电池双向Buck_Boost&#xff1a;采用双闭环控制策略&#xff0c;给定负载电压外环&…...