多模态AIAgent开发实践 邓立国、周驰岷、邓淇等 清华大学出版社【行情 报价 价格 评测】-京东
《多模态AI Agent开发实践》1~6章试读-CSDN博客
加载后的多模态数据往往存在格式不统一、数据量过大、特征不明显等问题,需通过数据分割与特征提取,提炼核心信息、降低数据维度,适配后续向量存储与检索需求。本节将结合多模态场景,讲解数据分割的核心方法、特征提取的实操技巧,结合qwen-vl-plus大模型,实现多模态数据的标准化处理,为集成向量数据库奠定基础。
数据分割的核心目的是将大尺寸、大容量的多模态数据拆分为小的、可处理的单元,同时保留核心信息,适配LangChain组件与向量存储需求。针对不同类型多模态数据,采用差异化分割方法。
1. 文本数据分割
采用LangChain内置的RecursiveCharacterTextSplitter,按字符长度分割文本,避免分割破坏语义,代码示例:
#文本数据分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
#加载文本数据(承接5.1.2.4的PDF加载结果)
pdf_docs = PyPDFLoader("industrial_manual.pdf").load()
#合并所有PDF页面文本
full_text = "\n".join([doc.page_content for doc in pdf_docs])
#初始化文本分割器(设置分割长度与重叠度)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, #每个分割单元的字符长度
chunk_overlap=50, #相邻分割单元的重叠长度(确保语义连贯)
length_function=len
)
#执行分割
text_chunks = text_splitter.split_text(full_text)
print(f"文本分割完成,共分割为{len(text_chunks)}个单元")
print("第一个分割单元:", text_chunks[0])
2. 图片/视频帧数据分割
图片分割采用OpenCV的裁剪功能,按场景需求分割为子区域(如工业巡检图像的管道区域、设备区域);视频帧分割已在5.1.2.3中完成(按帧间隔提取),此处补充图片区域分割示例:
#图片区域分割(工业巡检图像为例)
import cv2
#加载图片
img = cv2.imread("industrial_test.jpg")
#定义分割区域(以管道区域为例,坐标需根据实际图片调整)
x1, y1, x2, y2 = 100, 100, 400, 300 #左上角与右下角坐标
#裁剪分割区域
img_chunk = img[y1:y2, x1:x2]
#保存分割后的子图片
cv2.imwrite("industrial_pipe_chunk.jpg", img_chunk)
print("图片区域分割完成,分割区域尺寸:", img_chunk.shape)
3. 音频数据分割
音频数据分割采用whisper的分段转写功能,按时间间隔分割音频,再转写为文本片段,代码示例:
#音频数据分割与转写
import whisper
import wave
#加载音频文件
audio_path = "industrial_voice.mp3"
model = whisper.load_model("base")
#读取音频信息,获取时长
with wave.open(audio_path, "rb") as wf:
duration = wf.getnframes() / wf.getframerate()
#按30秒为一个单元分割音频(适配转写与后续处理)
segment_duration = 30
num_segments = int(duration // segment_duration) + 1
audio_chunks = []
for i in range(num_segments):
start = i * segment_duration
end = min((i+1)*segment_duration, duration)
#分段转写
result = model.transcribe(audio_path, language="zh", fp16=False, no_speech_threshold=0.5, start=start, end=end)
audio_chunks.append(result["text"].strip())
print(f"音频分割完成,共分割为{len(audio_chunks)}个单元")
print("第一个音频分割单元转写文本:", audio_chunks[0])
特征提取是将多模态数据(文本、图片、音频)转换为可量化的特征向量,核心是保留数据的核心信息,降低数据维度,适配向量数据库的存储与检索需求。本节将结合qwen-vl-plus大模型与LangChain内置嵌入工具,实现多模态特征提取。
1. 文本特征提取
采用langchain-community的QwenEmbeddings,结合qwen-vl-plus大模型,将文本片段转换为特征向量,代码示例:
#文本特征提取
from langchain_community.embeddings import QwenEmbeddings
#初始化嵌入模型(适配qwen-vl-plus,读取.env中的API密钥)
embeddings = QwenEmbeddings(api_key=os.getenv("QWen_API_KEY"))
#承接5.2.1.1的文本分割结果,提取特征向量
text_chunks = text_splitter.split_text(full_text)
text_embeddings = embeddings.embed_documents(text_chunks)
print(f"文本特征提取完成,共{len(text_embeddings)}个特征向量,每个向量维度:{len(text_embeddings[0])}")
#查看第一个文本片段的特征向量(简化输出)
print("第一个文本片段特征向量(前10位):", text_embeddings[0][:10])
2. 图片/视频帧特征提取
结合qwen-vl-plus的图像理解能力,将图片/视频帧转换为特征向量,代码示例:
#图片特征提取(适配qwen-vl-plus)
from langchain_community.embeddings import QwenEmbeddings
from langchain.document_loaders import ImageLoader
#初始化嵌入模型
embeddings = QwenEmbeddings(api_key=os.getenv("QWen_API_KEY"))
#加载图片并提取特征
img_loader = ImageLoader("industrial_test.jpg")
img_doc = img_loader.load()[0]
#将图片Document转换为特征向量(通过图片描述间接提取特征)
#第一步:调用qwen-vl-plus生成图片描述
img_description = llm.invoke(f"请简洁描述这幅图片的核心内容,用于特征提取:{img_doc.page_content}")
#第二步:对图片描述提取特征向量
img_embedding = embeddings.embed_query(img_description)
print(f"图片特征提取完成,特征向量维度:{len(img_embedding)}")
print("图片特征向量(前10位):", img_embedding[:10])
3. 音频特征提取
先将音频转写为文本,再对文本提取特征向量(承接5.2.1节的音频分割转写结果),代码示例:
#音频特征提取(基于转写文本)
from langchain_community.embeddings import QwenEmbeddings
#初始化嵌入模型
embeddings = QwenEmbeddings(api_key=os.getenv("QWen_API_KEY"))
#承接5.2.1.3的音频分割转写结果,提取特征向量
audio_embeddings = embeddings.embed_documents(audio_chunks)
print(f"音频特征提取完成,共{len(audio_embeddings)}个特征向量,每个向量维度:{len(audio_embeddings[0])}")
(1)语义/特征保留:分割时需避免破坏数据的核心语义(文本)、核心特征(图片/音频)。例如,文本分割重叠度不宜过低,图片分割需保留关键区域。
(2)维度统一:确保所有多模态数据的特征向量维度一致(如均为768维),适配后续向量数据库存储。
(3)效率优化:大量多模态数据(如海量图片、长视频)可采用批量处理脚本,结合GPU加速(如OpenCV GPU版本),提升处理效率。
(4)特征验证:提取特征后,可通过qwen-vl-plus验证特征的有效性(如通过特征向量检索相似数据),确保特征能够准确反映数据核心信息。