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

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述

随着人工智能技术的迅猛发展,多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型,融合了视觉与语言处理能力,旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域的实践应用:发票数据提取、视频聊天以及基于 PDF 文档的多模态检索增强生成(RAG, Retrieval-Augmented Generation)。

多模态 RAG 的重要性

传统的生成模型主要依赖于文本数据,而多模态 RAG 则通过结合视觉信息,实现对复杂数据的更深入理解和处理。这一方法不仅提高了生成内容的相关性和准确性,还扩展了模型在实际应用中的适用范围。Qwen2-VL 通过整合图像、视频和文本数据,能够在多种场景下提供智能化的解决方案,满足企业和个人用户日益增长的需求。

发票数据提取

在财务和会计领域,发票作为重要的交易凭证,其数据的准确提取和处理对于企业的运营至关重要。传统的方法往往依赖人工录入,效率低下且易出错。Qwen2-VL 利用其强大的视觉识别和自然语言理解能力,能够自动识别发票中的关键信息,如金额、日期和供应商信息,实现高效、准确的数据提取,大幅提升工作效率并降低人为错误的风险。

视频聊天

随着远程办公和在线交流的普及,视频聊天已成为日常工作和社交的重要工具。Qwen2-VL 在视频聊天应用中,通过结合视觉和语言模型,实现智能化的实时翻译、情感分析和内容摘要等功能。此举不仅提升了沟通的便捷性和效果,还为用户提供了更加个性化和高效的交流体验。

基于 PDF 的多模态 RAG

PDF 作为一种广泛使用的文档格式,涵盖了文本、图表和图像等多种信息形式。Qwen2-VL 通过解析和理解 PDF 文档中的多模态内容,能够实现智能检索和生成。例如,在科研、法律和教育等领域,用户可以通过自然语言查询,快速获取相关信息,并生成简洁明了的总结报告。这不仅提高了信息获取的效率,还促进了知识的传播和应用。

Qwen2-VL 架构

下面这张图就是Qwen2-VL的架构图。

到目前为止,已知的是 Qwen2-VL 使用带有 Vision Transformer 的 Qwen2-LM — 能够处理图像和视频。此外,Qwen2-VL 还推出了新颖的多模态旋转位置嵌入 s( M-ROPE )。这是 ROPE 嵌入的一种变体,它将位置嵌入分解为多个部分 。

Qwen2-VL 支持多种语言,包括大多数欧洲语言、日语、韩语、中文和阿拉伯语。更多细节参考官方文档。

项目 1:将发票数据提取为 JSON 格式

在这个小型项目中,我们将从下面的发票中提取财务和个人信息 — JSON 格式:

首先,安装必要的库:

pip install git+https://github.com/huggingface/transformers accelerate
pip install qwen-vl-utils

接下来,我们下载我们的文件:

import urllib.request# 发票图片地址
url = "<http://cwb.stdusfc.edu.cn/images/2015/cw112701.png>"
# 下载发票
file_name = url.split('/')[-1]
urllib.request.urlretrieve(url, file_name)
print(f"Downloaded file name: {file_name}")
# Downloaded file name: cw112701.png

然后,我们将安装 Qwen2-VL-7B-Instruct

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import jsonmodel_name = "Qwen/Qwen2-VL-7B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(model_name,torch_dtype="auto",device_map="auto"
)
processor = AutoProcessor.from_pretrained(model_name
)

在模型下载并放入内存后,我们可以发送我们的请求。一些额外提示:

  1. 至少使用原始图像尺寸 :确保至少使用图像的原始尺寸以获得最佳效果(resized_height & resized_width arguments参数)
  2. 较大的尺寸 : 在质量较差的图像中,尺寸稍大可以提高准确性,但会增加 VRAM 的使用量。相应地调整:

我们将使用 Qwen2-VL 的聊天模板,并提示如下:


"检索项目内容,金额,付款单位,时间,发票代码,发票号码。响应必须是 JSON 格式"
messages = [{"role": "user","content": [{"type": "image","image": file_name,"resized_height": 696,"resized_width": 943,},{"type": "text","text": "检索项目内容,金额,付款单位,时间,发票代码,发票号码。响应必须是 JSON 格式"}]}
]text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",
)
inputs = inputs.to("cuda")
generated_ids = model.generate(**inputs, max_new_tokens=512)
generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=True)
output_text

我们得到以下输出:

['```json\\n{\\n  "项目内容": [\\n    "钢尺 30 x11.5",\\n    "美工刀 60 x2",\\n    "腊线 30 x14"\\n  ],\\n  "金额": [\\n    "345.00",\\n    "200.00",\\n    "420.00"\\n  ],\\n  "付款单位": "石家庄铁道大学四方学院",\\n  "时间": "2015年5月11日",\\n  "发票代码": "113001464131",\\n  "发票号码": "09404611"\\n}\\n```']

你可以使用以下代码来修复潜在错误并设置模型的 JSON 输出格式:

json_string = output_text[0]
json_string = json_string.strip("[]'")
json_string = json_string.replace("```json\\n", "").replace("\\n```", "")
json_string = json_string.replace("'", "")
try:formatted_json = json.loads(json_string)print(json.dumps(formatted_json, indent=3, ensure_ascii=False))
except json.JSONDecodeError as e:print("Not valid JSON format:", e)

通过将结果与上述发票进行比较,我们注意到:

  • 该模型的输出准确率非常高 — 它准确地提取了所有相关信息!
  • 尽管图像质量很差并且表格中嵌入了数据!
  • 较小的 Qwen2-VL 在这里表现良好,但对于更复杂的图像或手写文本,你可能需要更大的模型,例如 Qwen2-VL-72B .

项目 2:通过视频聊天

Qwen2-VL 还可以提取信息并与视频交互。

在这个项目中,我们将使用一个简短的 B站 视频 —《这一段毫无表演痕迹 堪称经典》 :

## 下载B站视频
pip install yt-dlp

按如下方式下载:

import yt_dlp
import osdef download_bilibili_video(url, download_path='downloads', fmt='100047+30280', cookiefile=None):# 创建下载目录(如果不存在)if not os.path.exists(download_path):os.makedirs(download_path)ydl_opts = {'outtmpl': os.path.join(download_path, '%(title)s.%(ext)s'),'format': fmt,  # 指定视频和音频的格式ID'noplaylist': True,'merge_output_format': 'mp4',  # 合并为mp4格式}if cookiefile:ydl_opts['cookiefile'] = cookiefilewith yt_dlp.YoutubeDL(ydl_opts) as ydl:ydl.download([url])video_url = '<https://www.bilibili.com/video/BV1us41eBERp>'  # 替换为你要下载的视频URL
download_directory = './downloads'  # 替换为你希望保存视频的目录# 如果需要使用Cookies进行认证,取消下行注释并提供Cookies文件路径# cookies_path = 'path_to_cookies.txt'# download_bilibili_video(video_url, download_directory, fmt='100047+30280', cookiefile=cookies_path)# 如果不需要认证,使用以下行
download_bilibili_video(video_url, download_directory, fmt='100046+30280')file_name = './downloads/这一段毫无表演痕迹  堪称经典.mp4'

我们将再次使用Qwen2-VL-7B,因为它的资源密集度较低。

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessormodel_name = "Qwen/Qwen2-VL-7B-Instruct"model = Qwen2VLForConditionalGeneration.from_pretrained(model_name,torch_dtype="auto",##attn_implementation="flash_attention_2", #use flash-attention2 if your gpu card supports it (Free Colab's T4 does not support it)device_map="auto",
)
processor = AutoProcessor.from_pretrained(model_name
)

我们定义函数 chat_with_video ,它接受调整后的视频尺寸、每秒帧数和我们将向 Qwen 询问的文本消息:

def chat_with_video(file_name, query, video_width, video_height, fps=1.0):messages = [{"role": "user","content": [{"type": "video","video": file_name,"max_pixels": video_width * video_height,"fps": 1.0,},{"type": "text", "text": query},],}]text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = processor(text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",)inputs = inputs.to("cuda")generated_ids = model.generate(**inputs, max_new_tokens=150)generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)return output_text

让我们问一下模型:


output_text = chat_with_video(file_name, "这个视频展示了什么?", 360, 360,fps=0.5)
>>['这个视频展示了两个人在餐馆里吃饭的场景。其中一个人穿着蓝色衣服,戴着帽子,另一个人穿着棕色外套。他们用筷子夹着食物,喝着汤,看起来非常享受。']

还有另一个问题:

output_text = chat_with_video(file_name, "谁付的钱?", 360, 360,fps=0.5)
>>['根据视频内容,最后是穿棕色大衣的男子付了钱。']

耗费gpu资源情况:

令人惊讶的是,该模型准确地回答了这两个问题!

一些额外的说明:

  • 增加视频的高度、宽度和帧速率 (fps) 通常会提高准确性,但需要更多的 GPU VRAM。
  • Qwen2-VL 可以处理超过 20 分钟的视频,但是GPU资源需求很大。
  • 从我的实验来看,Qwen2-VL-7B 在准确性和资源需求 (GPU VRAM) 之间提供了最佳平衡。

项目 3:多模态 RAG

在本项目中,我们将 Qwen2-VL 与另一个模型 ColPali 相结合,以对 PDF 执行 RAG。ColPali 是一个文档检索模型,包含一个 PaliGemma-3B 模型(也是 VLM)和一个 Gemma-2B。ColPali 的作用是执行文档检索部分并创建一个多向量文档存储:

  • 在我们的例子中,流程如下:
  • 将每个 PDF 页面转换为图像。
  • 将图像推送到 ColPali 中,以存储每个页面的多向量表示。
  • 向 ColPali 提交文本查询以检索相关图像。
  • 将文本查询和相关图像提交给 Qwen2-VL 以获取答案。

我们将使用 Byaldi 库创建图像向量存储。Byaldi 加载 ColPali(以及使用 API 的类似模型)。我们还将使用 pdf2image 将 PDF 转换为图像:

让我们从安装必要的库开始:

#pip install --upgrade byaldi
pip install byaldi==0.0.5
pip install -q git+https://github.com/huggingface/transformers.git qwen-vl-utils pdf2image
## pdf2image 必要的工具
!sudo apt-get install -y poppler-utils

我们将为此项目下载一个 1 页的 PDF — 一个用于节省 VRAM 的小文件。

import urllib.request# We will use this pdf:
url = "<http://ep.ycwb.com/epaper/ycwb/resfile/2020-01-28/A08/ycwb20200128A08.pdf>"
# Download the file
pdf_filepath = url.split('/')[-1]
urllib.request.urlretrieve(url, pdf_filepath)
print(f"Downloaded file name: {pdf_filepath}")

由于模型处理的是图像,而不是 PDF 文件,因此我们将每个页面转换为图像。如果要在 Jupyter/Colab 中可视化图像,请运行以下代码:

from PIL import Image as PILImage
from pdf2image import convert_from_path
from IPython.display import displayimages = convert_from_path(pdf_filepath)
for page_number, page in enumerate(images):resized_image = page.resize((600, 800), PILImage.Resampling.LANCZOS)print(f"Page {page_number + 1}:")display(resized_image)

以下是我们 PDF 中的一张图片:

接下来,我们加载 ColPali 并构建我们的索引存储:

from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import torchvlm_name = "Qwen/Qwen2-VL-7B-Instruct"
model = Qwen2VLForConditionalGeneration.from_pretrained(vlm_name,torch_dtype="auto",device_map="auto")
processor = AutoProcessor.from_pretrained(vlm_name)

该函数extract_answer_from_pdf执行以下操作:

  1. 给定一个文本查询,我们要求 Colpali 检索最相关的图像 (k=1)。该图像表示一个 PDF 页面。
  2. 给定文本查询和相关图像,我们要求 Qwen-VL-7B 执行图像识别并提供文本查询的答案:
  3. 该函数返回答案 (output_text)、包含答案的页码以及相关的图像/页面
def extract_answer_from_pdf(text_query):results = RAG.search(text_query, k=1)print(results)image_index = results[0]["page_num"] - 1messages = [{"role": "user","content": [{"type": "image","image": images[image_index], ## 包含检索到的 pdf 页面作为图像"resized_height": 527,"resized_width": 522,},{"type": "text", "text": text_query},],}]text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = processor(text=[text],images=image_inputs,videos=video_inputs,padding=True,return_tensors="pt",)inputs = inputs.to(device)generated_ids = model.generate(**inputs, max_new_tokens=50)## 从答案中删除提示generated_ids_trimmed = [out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)]output_text = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)return output_text, results[0].page_num , images[image_index]

让我们问问我们的模型:

text_query = "这篇报道的时间是什么?"
output_text, page_number, image =  extract_answer_from_pdf(text_query)print("\\n\\n")
print(output_text)>>> 
['2020-01-28']

模型是正确的!报道的时间是2020-01-28。让我们再问一个问题:

text_query = "科比的直升机坠机地点在哪?"
output_text, page_number, image =  extract_answer_from_pdf(text_query)print("\\n\\n")
print(output_text)>>>
['T事故发生在美国加利福尼亚州卡拉巴萨斯市,在洛杉矶以西大约 30 公里.']
  1. 我们可以使用多个 PDF 吗?

是的!只需将多个 PDF 放在访问的RAG.index()文件夹中即可。

  1. 我们可以检索多张图像吗?

是的。在这种情况下,我们只检索了最相关的图像 (k=1)。你可以通过设置 k=2 来检索更多图像,然后将两张图像都传递给 Qwen 进行处理。

chat_template = [{"role": "user","content": [{"type": "image","image": image[0],},{"type": "image","image": image[1],}{"type": "text", "text": text_query},],}
]

但是,添加更多 PDF 或检索多个页面需要更多的资源。

结束语

本文探讨了 Qwen2-VL 在图像、视频和文档检索任务中的应用。

对于更复杂的情况,你可以选择模型的更大版本或量化版本——这些版本的大小更小,质量损失最小。

相关文章:

Qwen2-VL:发票数据提取、视频聊天和使用 PDF 的多模态 RAG 的实践指南

概述 随着人工智能技术的迅猛发展&#xff0c;多模态模型在各类应用场景中展现出强大的潜力和广泛的适用性。Qwen2-VL 作为最新一代的多模态大模型&#xff0c;融合了视觉与语言处理能力&#xff0c;旨在提升复杂任务的执行效率和准确性。本指南聚焦于 Qwen2-VL 在三个关键领域…...

【安全科普】NUMA防火墙诞生记

一、我为啥姓“NUMA” 随着网络流量和数据包处理需求的指数增长&#xff0c;曾经的我面对“高性能、高吞吐、低延迟”的要求&#xff0c;逐渐变得心有余而力不足。 多CPU技术应运而生&#xff0c;SMP&#xff08;对称多处理&#xff09;和NUMA&#xff08;非一致性内存访问&a…...

机器学习day2-特征工程

四.特征工程 1.概念 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 将任意数据&#xff08;文本或图像等&#xff09;转换为数字特征&#xff0c;对特征进行相关的处理 步骤&#xff1a;1.特征提取&#xff1b;2.无量纲化&#xff08;预处理&#xf…...

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式&#xff0c;例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的&#xff0c;也就是说&#xff0c;数据点根据某些规则定期出现&#xff0c;例如每 1…...

Python 小高考篇(6)常见错误及排查

目录 TypeError拼接字符串和数字错误示范正确示范 数字、字符串当成函数错误示范 给函数传入未被定义过的参数错误示范 传入的参数个数不正确错误示范 字符串相乘错误示范正确示范 量取整数的长度错误示范正确示范 格式化字符串时占位符个数不正确错误示范 给复数比较大小错误示…...

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…...

C++的类和对象

在C中&#xff0c;类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心概念。以下是它们的详细介绍&#xff1a; 1. 类&#xff08;Class&#xff09; 定义&#xff1a; 类是用来定义一个新的数据类型&…...

自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

机器学习(1)

一、机器学习 机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能&#xff08;Artificial Intelligence, AI&#xff09;的一个分支&#xff0c;它致力于开发能够从数据中学习并改进性能的算法和模型。机器学习的核心思想是通过数据和经验自动优化算法&#xff…...

深入理解 Redis跳跃表 Skip List 原理|图解查询、插入

1. 简介 跳跃表 ( skip list ) 是一种有序数据结构&#xff0c;通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。 在 Redis 中&#xff0c;跳跃表是有序集合键的底层实现之一&#xff0c;那么这篇文章我们就来讲讲跳跃表的实现原理。 2. …...

Halcon HImage 与 Qt QImage 的相互转换(修订版)

很久以前&#xff0c;我写过一遍文章来介绍 HImage 和 QImage 之间的转换方法。&#xff08;https://blog.csdn.net/liyuanbhu/article/details/91356988&#xff09; 这个代码其实是有些问题的。因为我们知道 QImage 中的图像数据不一定是连续的&#xff0c;尤其是图像的宽度…...

【Golang】——Gin 框架中的模板渲染详解

Gin 框架支持动态网页开发&#xff0c;能够通过模板渲染结合数据生成动态页面。在这篇文章中&#xff0c;我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据&#xff0c;并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染&#xff1f;1.1 概…...

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…...

onlyoffice Command service(命令服务)使用示例

一、说明 文档在这里&#xff1a;https://api.onlyoffice.com/docs/docs-api/additional-api/command-service/ 命令服务提供有几个简单的接口封装。也提供了前端和后端同时操作文档的可能。 二、正文 命令服务地址&#xff1a;https://documentserver/coauthoring/Com…...

QSS 设置bug

问题描述&#xff1a; 在QWidget上add 一个QLabel&#xff0c;但是死活不生效 原因&#xff1a; c 主程序如下&#xff1a; QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…...

交换排序——快速排序

交换排序——快速排序 7.7 交换排序——快速排序快速排序概念c语言的库函数qsort快速排序框架quickSort 7.7 交换排序——快速排序 快速排序概念 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff08;下文简称快排&#xff09;&#xff0c;其基本思想为&a…...

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的&#xff0c;当然&#xff0c;我肯定是很多年的计算机基础的&#xff0c;万变不离其宗。 现在web网站都流行所谓的前后端结构&#xff0c;不知不觉我也开始受到这个影响&#xff0c;以前都是前端直接操作…...

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因&#xff0c;我的东西最终需要跑在amd64上&#xff0c;但是因为mac的架构师arm64&#xff0c;所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构&#xff1a; docker inspect 8135f475e221 | grep Arc…...

gorm框架

连接 需要下载mysql的驱动 go get gorm.io/driver/mysql go get gorm.io/gorm 约定 主键&#xff1a;GORM 使用一个名为ID 的字段作为每个模型的默认主键。表名&#xff1a;默认情况下&#xff0c;GORM 将结构体名称转换为 snake_case 并为表名加上复数形式。 例如&#xf…...

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…...

从游戏报错到完美运行 DirectX修复工具实际应用案例展示

评价一款工具软件的优劣&#xff0c;最具有说服力的方式莫过于通过真实的实际案例来直观展示其效果和价值。 对于系统修复类工具来说&#xff0c;更是如此&#xff0c;因为用户最关心的就是它能否真正解决自己的问题。 DirectX相关问题一直是Windows游戏玩家最常遇到的技术难题…...

Python开发环境快速搭建:Miniconda-Python3.9镜像实战体验

Python开发环境快速搭建&#xff1a;Miniconda-Python3.9镜像实战体验 1. 为什么选择Miniconda-Python3.9 Python作为当今最流行的编程语言之一&#xff0c;在数据科学、机器学习、Web开发等领域有着广泛应用。然而&#xff0c;Python环境管理一直是开发者面临的挑战之一。Mi…...

Element-UI Loading动画实战:如何优雅处理路由跳转与请求拦截(附自定义图标技巧)

Element-UI Loading动画深度优化&#xff1a;从路由拦截到视觉定制的完整方案 在Vue技术栈项目中&#xff0c;Element-UI的Loading服务是提升用户体验的关键组件之一。当页面需要等待数据加载或路由跳转时&#xff0c;一个流畅的加载动画能有效缓解用户的焦虑情绪。本文将深入探…...

Hypervisor环境下高效进程间通信技术解析

1. Hypervisor环境下的进程通信挑战 在虚拟化技术大行其道的今天&#xff0c;Hypervisor环境下的进程间通信&#xff08;IPC&#xff09;已经成为系统性能的关键瓶颈。想象一下&#xff0c;你住在小区同一栋楼的两个单元里&#xff0c;明明直线距离只有10米&#xff0c;却要绕到…...

终极指南:如何解决Cobalt Instagram下载失败问题 - 完整排查方案

终极指南&#xff1a;如何解决Cobalt Instagram下载失败问题 - 完整排查方案 Cobalt是一款强大的开源媒体下载工具&#xff0c;专为保存Instagram、YouTube、Twitter等平台的视频和图片而设计。然而&#xff0c;许多用户在使用Cobalt下载Instagram内容时经常遇到各种失败问题&…...

Qwen2.5-72B-GPTQ开源大模型:农业病虫害识别与防治方案生成

Qwen2.5-72B-GPTQ开源大模型&#xff1a;农业病虫害识别与防治方案生成 1. 模型介绍 Qwen2.5-72B-Instruct-GPTQ-Int4是通义千问大模型系列的最新版本&#xff0c;专为复杂任务优化设计。这个72亿参数的模型经过指令调优和4-bit量化处理&#xff0c;在保持高性能的同时大幅降…...

利用快马平台快速生成javascript交互原型:以动态待办列表为例

利用快马平台快速生成JavaScript交互原型&#xff1a;以动态待办列表为例 最近在尝试快速验证一个待办事项应用的交互设计&#xff0c;发现用传统方式从零开始写代码太耗时了。正好试用了InsCode(快马)平台&#xff0c;只需要描述功能需求&#xff0c;就能自动生成可运行的Jav…...

CLIP Prompt Tuning实战指南:如何用少量样本优化多模态模型性能

最近在做一个多模态内容理解的项目&#xff0c;用到了CLIP模型。大家都知道CLIP很强大&#xff0c;但真到了要让它适应我们自己的业务数据时&#xff0c;传统全量微调&#xff08;Full Fine-tuning&#xff09;那套方法就有点让人头疼了——动辄几十GB的显存需求&#xff0c;还…...

OpenClaw自动化邮件分类:GLM-4.7-Flash智能收件箱管理

OpenClaw自动化邮件分类&#xff1a;GLM-4.7-Flash智能收件箱管理 1. 为什么需要智能邮件管理 每天早晨打开邮箱&#xff0c;看到堆积如山的未读邮件总是让人头疼。重要客户的需求可能被埋没在促销广告中&#xff0c;团队协作的紧急邮件可能混在订阅通知里。作为一名长期被邮…...

Zrlog面试问答及问题解决方案

面试问答 结合 ZrLog 部署&#xff08;Maven 构建 环境配置 服务部署&#xff09;的全流程&#xff0c;整理排查 / 运维 / 开发三类高频问题&#xff0c;覆盖场景、原因、解答思路&#xff0c;可直接用于沟通或故障定位&#xff1a; 一、环境准备阶段高频问题 1. 执行 jav…...