【带你 langchain 双排系列教程】6.LangChain多模态输入与自定义输出实战指南

一、为什么需要多模态交互?

在真实业务场景中,数据从来都不是单一形式的。想象一个智能客服系统需要同时分析用户的文字描述、上传的产品图片和语音留言,或者一个内容审核系统需要检查文本、图像和视频的组合内容。传统单一模态的处理方式已经无法满足这些需求。

二、环境准备

pip install langchain-openai Pillow python-multipart librosa

三、多模态输入处理实战

1. 基础文本处理

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAIprompt = ChatPromptTemplate.from_template("分析这段话的情感倾向:{text}")
model = ChatOpenAI(model="gpt-4")chain = prompt | model
response = chain.invoke({"text": "虽然产品功能不错,但客服响应太慢了"})
print(response.content)

2. 图像处理进阶

from PIL import Image
import base64def image_to_base64(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')image_analysis_prompt = """
请分析这张图片:
<img src="data:image/png;base64,{image}" width=300/>
重点说明:
1. 主要视觉元素
2. 颜色搭配特点
3. 可能的商业应用场景
"""prompt = ChatPromptTemplate.from_template(image_analysis_prompt)
chain = prompt | modelresponse = chain.invoke({"image": image_to_base64("product_design.png")
})
print(response.content)

图片url方式多模态,模型可用视觉相关的模型,有些对话模型或不支持多模态。
在这里插入图片描述

import base64
import httpx
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
import osimage_url = "https://scpic.chinaz.net/files/pic/pic9/201602/apic19010.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
model = ChatOpenAI(model="deepseek-ai/deepseek-vl2",temperature=0.8,max_tokens=None,timeout=None,max_retries=2,api_key=os.getenv("silicon-key"),base_url="https://api.siliconflow.cn/v1"# organization="...",# other params...
)
message = HumanMessage(content=[{"type": "text", "text": "用中文描述这张图片中的天气"},{"type": "image_url", "image_url": {"url": image_url}},], )
response = model.invoke([message])
print(response.content)

在这里插入图片描述
多张图片的情况:

import base64
import httpx
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
import osimage_url = "https://scpic.chinaz.net/files/pic/pic9/201602/apic19010.jpg"
image_url2 = "https://pic.nximg.cn/file/20140920/18021896_181234816000_2.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
model = ChatOpenAI(model="deepseek-ai/deepseek-vl2",temperature=0.8,max_tokens=None,timeout=None,max_retries=2,api_key=os.getenv("silicon-key"),base_url="https://api.siliconflow.cn/v1"# organization="...",# other params...
)
message = HumanMessage(content=[{"type": "text", "text": "用中文描述这张2图片中的天气是不是一样的"},{"type": "image_url", "image_url": {"url": image_url}},{"type": "image_url", "image_url": {"url": image_url2}},], )
response = model.invoke([message])
print(response.content)

在这里插入图片描述
工具调用方式多模态处理:

import base64
import httpx
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
import os
from langchain_core.tools import tool
from typing import Literal@tool
def weather_tool(weather: Literal["晴朗的", "多云的", "多雨的", "下雪的"]) -> None:""" Description the weather"""passimage_url = "https://scpic.chinaz.net/files/pic/pic9/201602/apic19010.jpg"
image_url2 = "https://pic.nximg.cn/file/20140920/18021896_181234816000_2.jpg"
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
model = ChatOpenAI(model="deepseek-ai/deepseek-vl2",temperature=0.8,max_tokens=None,timeout=None,max_retries=2,api_key=os.getenv("silicon-key"),base_url="https://api.siliconflow.cn/v1"# organization="...",# other params...
)model.bind_tools([weather_tool])message = HumanMessage(content=[{"type": "text", "text": "用中文描述这张2图片中的天气是不是一样的"},{"type": "image_url", "image_url": {"url": image_url}},{"type": "image_url", "image_url": {"url": image_url2}},], )
response = model.invoke([message])
print(response.content)

在这里插入图片描述

3. 音频处理技巧

import librosa
import numpy as npdef audio_feature_extraction(file_path):y, sr = librosa.load(file_path)return {"duration": len(y)/sr,"tempo": librosa.beat.tempo(y=y, sr=sr)[0],"spectral_centroid": np.mean(librosa.feature.spectral_centroid(y=y, sr=sr))}audio_features = audio_feature_extraction("customer_feedback.wav")analysis_prompt = """
根据以下音频特征生成报告:
- 时长:{duration:.2f}秒
- 节奏:{tempo:.1f}BPM
- 频谱重心:{spectral_centroid:.1f}Hz结合语音内容:"{transcript}"
分析客户情绪状态"""

四、自定义输出深度解析

1. 结构化输出实践

from pydantic import BaseModel
from langchain_core.output_parsers import PydanticOutputParserclass MarketAnalysis(BaseModel):target_audience: strcompetitive_advantages: list[str]risk_factors: list[str]market_score: float parser = PydanticOutputParser(pydantic_object=MarketAnalysis)prompt_template = """
执行深度市场分析:
{instruction}
{format_instructions}
"""
prompt = ChatPromptTemplate.from_template(prompt_template).partial(format_instructions=parser.get_format_instructions()
)chain = prompt | model | parser
result = chain.invoke({"instruction": "分析智能手表市场现状"
})print(f"目标人群:{result.target_audience}")
print(f"风险因素:{result.risk_factors[:2]}")

2. 动态格式转换

from langchain_core.output_parsers import JsonOutputParserdynamic_prompt = """
根据用户查询生成响应:
查询内容:{query}
要求格式:{format}
"""chain = ChatPromptTemplate.from_template(dynamic_prompt) | model | JsonOutputParser()response = chain.invoke({"query": "对比Python和JavaScript的优缺点","format": """{"comparison_points": ["语法", "生态系统", "性能"],"summary": "综合建议"}"""
})print(response["summary"])

五、综合实战案例:智能内容审核系统

class ContentAuditResult(BaseModel):violation_type: Optional[str]confidence: floatproblematic_elements: list[str]recommendation: strdef multimodal_audit(text: str, image: Image, audio: bytes):# 图像处理image_analysis = chain_image.invoke(...)# 音频转录audio_text = transcribe_audio(audio)# 综合审核combined_prompt = """执行内容审核:文本内容:{text}图片分析:{image_analysis}语音转录:{audio_text}输出要求:{format_instructions}"""chain = (ChatPromptTemplate.from_template(combined_prompt).partial(format_instructions=parser.get_format_instructions())| model| parser)return chain.invoke(...)# 使用示例
result = multimodal_audit(text="敏感文本内容",image=Image.open("user_image.jpg"),audio=audio_bytes
)

六、性能优化技巧

  1. 并行处理:使用async/await实现多模态并行处理
  2. 缓存策略:对静态内容(如产品图片)实施特征缓存
  3. 分级处理:先快速筛查再深度分析的分级处理机制
async def parallel_processing(text, image, audio):image_task = chain_image.ainvoke(...)audio_task = chain_audio.ainvoke(...)results = await asyncio.gather(image_task, audio_task)return combine_results(text, *results)

七、扩展思考

  1. 视频处理:结合OpenCV进行关键帧提取
  2. 3D模型处理:使用PointNet进行三维数据分析
  3. 传感器数据集成:融合IoT设备数据流

通过本文的实践案例,我们已经掌握了构建多模态智能系统的核心方法。随着多模态大模型的快速发展,建议持续关注以下方向:

  • 跨模态注意力机制
  • 端到端的多模态训练
  • 实时流式处理优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Bluedroid】AVRCP 连接源码分析(三)

接着上一篇【Bluedroid】AVRCP 连接源码分析&#xff08;一&#xff09;-CSDN博客&#xff0c;继续AVRCP连接的源码分析。 AVRC_OpenBrowse /packages/modules/Bluetooth/system/stack/avrc/avrc_api.cc /*****************************************************************…

基于大语言模型的推荐系统(1)

推荐系统&#xff08;recommendation system&#xff09;非常重要。事实上&#xff0c;搜索引擎&#xff0c;电子商务&#xff0c;视频&#xff0c;音乐平台&#xff0c;社交网络等等&#xff0c;几乎所有互联网应用的核心就是向用户推荐内容&#xff0c;商品&#xff0c;电影&…

高性能GPU计算:释放计算潜力的加速利器

高性能GPU计算:释放计算潜力的加速利器 大家好,我是Echo_Wish,今天我们来聊一聊 高性能GPU计算。近年来,随着人工智能、深度学习、科学计算等领域的快速发展,GPU(图形处理单元)作为计算加速的核心技术,逐渐成为数据处理的“核心大脑”。尤其是在深度学习模型训练和大规…

QT闲记-状态栏,模态对话框,非模态对话框

1、创建状态栏 跟菜单栏一样,如果是继承于QMainWindow类,那么可以获取窗口的状态栏,否则就要创建一个状态栏。通过statusBar()获取窗口的状态栏。 2、添加组件 通常添加Label 来显示相关信息,当然也可以添加其他的组件。通过addWidget()添加组件 3、设置状态栏样式 …

SHELL32!SHLoadPopupMenu函数分析之添加属性菜单项

SHELL32!SHLoadPopupMenu函数分析之添加属性菜单项 第一部分&#xff1a; // // user does not support pop-up only menu. // STDAPI_(HMENU) SHLoadPopupMenu(HINSTANCE hinst, UINT id) { HMENU hmenuParent LoadMenu(hinst, MAKEINTRESOURCE(id)); if (hmenuPare…

将RocketMQ集成到了Spring Boot项目中,实现站内信功能

1. 添加依赖 首先,在pom.xml中添加RocketMQ的依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot

C语言基础要素:安装 Visual Studio 2022

安装 Visual Studio 2022 Visual Studio 是由微软开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;支持多种编程语言和开发平台。它提供了丰富的工具和功能&#xff0c;帮助开发者高效地编写、调试和部署应用程序。无论是桌面应用、Web 应用还是移动应用&#…

[ TypeScript ] “undefined extends xxx“ 总是为 true 的 bug

版本号 "typescript": "^5.7.3", "unplugin": "^2.2.0",说明 在使用 unplugin 时 , 我定义插件的参数是 必填的, 使用时却是一个可空参数, 不传参也不会报错, (options?: UserOptions) > Return &#x1f632;&#x1f632;&…

[通俗易懂C++]:指针和const

之前的文章有说过,使用指针我们可以改变指针指向的内容(通过给指针赋一个新的地址)或者改变被保存地址的值(通过给解引用指针赋一个新值): int main() {int x { 5 }; // 创建一个整数变量 x&#xff0c;初始值为 5int* ptr { &x }; // 创建一个指针 ptr&#xff0c;指向 …

华为昇腾服务器(固件版本查询、驱动版本查询、CANN版本查询)

文章目录 1. **查看固件和驱动版本**2. **查看CANN版本**3. **其他辅助方法**注意事项 在华为昇腾服务器上查看固件、驱动和CANN版本的常用方法如下&#xff1a; 1. 查看固件和驱动版本 通过命令行工具 npu-smi 执行以下命令查看当前设备的固件&#xff08;Firmware&#xff0…

设计心得——解耦的实现技术

一、说明 在前面的“设计心得——解耦”中&#xff0c;对解耦进行了高层次的抽象说明。本篇则对在实践中常用的解耦技术进行逐一分析说明&#xff0c;以期为开发者能更从理论到实践搭建一个桥梁。至于大家能够如何更好的在自己的项目中进行解耦的实践&#xff0c;就需要不断的…

Blaze RangePartitioning 算子Native实现全解析

引言&#xff1a;本文将全面且深入地解析Blaze RangePartitioning算子的Native实现过程。相较于原生Spark&#xff0c;RangePartitioning的Native实现在执行时间上达到了30%的显著下降&#xff0c;同时在资源开销方面节省了高达76%。这一改进大幅降低了运行成本&#xff0c;展现…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员&#xff0c;发现运维的公司站点被黑页&#xff0c;首页标题被篡改&#xff0c;你获得的信息如下&#xff1a; 操作系统&#xff1a;windows server 2008 R2业务&#xff1a;公司官网网站架构&#xff1a;通过phpstudy运行apache mysqlphp开放端口&…

WebXR教学 02 配置开发环境

默认操作系统为Windows 1.VS Code VS Code 是一款轻量级、功能强大的代码编辑器&#xff0c;适用于多种编程语言。 下载 步骤 1&#xff1a;访问 VS Code 官方网站 打开浏览器&#xff08;如 Chrome、Edge 等&#xff09;。 在地址栏输入以下网址&#xff1a; https://code.v…

Flask实现高效日志记录模块

目录 一. 简介&#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建&#xff08;包含日志记录的关键字段&#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…

前端框架虚拟DOM的产生

直接说结论&#xff1a;为了找出与命令式(原生实现步骤)所执行代码的最小差异化&#xff0c;从而优化代码性能。 命令式&#xff1a; 可以理解为面向过程编程&#xff0c;需要写好每个实现步骤 <div id"app"></div> const div document.querySelector…

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理&#xff08;NLP&#xff09;任务上取得了最新的最优结果&#xff08;SOTA&#xff09;。然而&#xff0c;这些模型容易受到对抗攻击的影响&#xff0c;尤其是对于表意文字语言&#xff08;如中文&#xff09;。 在本研究中&#xff0…

Jetpack Architecture系列教程之(三)——ViewModel控制器

目录 介绍 如何使用 添加依赖 构建ViewModel 分析ViewModel ViewModel生命周期 ViewModel加载原理 介绍 ViewModel 的出现是为了解决数据因Android UI控制器在生命周期活动中造成数据丢失的问题。 在一般情况下&#xff0c;页面数据丢失&#xff08;转屏、闪退等生命周期…

在低功耗MCU上实现人工智能和机器学习

作者&#xff1a;Silicon Labs 人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术不仅正在快速发展&#xff0c;还逐渐被创新性地应用于低功耗的微控制器&#xff08;MCU&#xff09;中&#xff0c;从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…