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

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录

玩转大语言模型——ollama导入huggingface下载的模型
玩转大语言模型——langchain调用ollama视觉多模态语言模型


langchain调用ollama视觉多模态语言模型

  • 系列文章目录
  • 前言
  • 使用Ollama下载模型
    • 查找模型
    • 下载模型
  • 测试模型
    • ollama测试
    • langchain测试
      • 加载图片
      • 加载模型
    • 模型回复


前言

视觉多模态语言模型由预训练的多模态编码器、预训练的 LLM 以及连接两者的多模态接口等主要组件构成。将图像信息转换为可被语言模型处理的特征表示。拥有强大的视觉理解能力,能够准确理解图像内容,进行图像描述、视觉问答、图像定位等任务。可以与用户进行多轮交互,根据用户的文本和图像输入生成连贯、准确且有针对性的回答。本篇文章将介绍使用langchain调用ollama视觉多模态语音模型。


使用Ollama下载模型

查找模型

Ollama官网:https://ollama.com/
在这里插入图片描述
在Ollama官网上点击左上角的Models
在这里插入图片描述
选择Vision后就可以看到所有的支持视觉的模型了,在本篇文章中我们将使用llava模型进行演示,笔者也可以选择其他模型进行测试。LLaVA(Large Language and Vision Assistant)是一种多模态模型,它结合了视觉编码器和 Vicuna 以实现通用视觉和语言理解,在科学问答、数据分析和学术任务导向的视觉问答中表现出色,为研究人员提供了强大的工具。
在这里插入图片描述
左侧可以选择模型大小,模型越大一般来说效果越好,但针对测试来说7b的模型是够用的,为了兼容更多人的硬件设备,我们选用7b模型即可。右侧的就使用ollama下载模型的命令。

下载模型

打开命令行窗口,输入ollama下载模型的命令:ollama run llava,该命令会下载模型并直接执行,在初次下载成功后再执行命令不会重复下载。
执行命令后会先下载llava模型然后运行。如果想仅下载不运行,可以使用ollama pull llava
使用ollama run llava下载模型,可以直接与模型对话验证下载是否成功,如果使用的是ollama pull llava可以通过ollama list查看模型有没有被添加到列表,如果添加到列表,说明下载成功。
在这里插入图片描述


测试模型

ollama测试

下面我们用这样一张图片测试一下模型的性能。图片的路径在:D:/test_llava.png
在这里插入图片描述
打开命令行输入:ollama run llava,可以直接在提问时提出图片路径使用模型。
在这里插入图片描述
但是llava模型默认会使用英文回答,所以最好在询问的时候让模型用中文回答。从中文的回答上来看,回复内容是比较宽泛的描述,并且有可能会出错(羊驼被当作了斑羊)。这可能和模型或者模型大小有关,可以尝试其他模型测试一下,后期笔者也会写一篇相关的测试文章,请关注我的专栏。

langchain测试

加载图片

在langchain中使用视觉多模态语言模型时,图片应该是Base64编码的格式,下面介绍两种图片转Base64编码的方式。

从网络获取图片

import base64
import httpximage_url = "图片的网络链接"
image_base64 = base64.b64encode(httpx.get(image_url).content).decode("utf-8")

从本地获取图片
从本地获取图片并不能直接读取并转换Base64编码格式,在这里我们可以编写一个函数来解决。

import base64
from PIL import Image
import iodef image_to_base64(image_path):with Image.open(image_path) as img:buffer = io.BytesIO()img.save(buffer, format="PNG")img_bytes = buffer.getvalue()img_base64 = base64.b64encode(img_bytes).decode("utf-8")return img_base64local_image_path = "D:/test_llava.png"
image_base64 = image_to_base64(local_image_path)

在函数image_to_base64中,这里使用Image.open函数打开指定路径的图片文件。ImagePIL库中的类,open方法用于打开图片文件。with语句用于确保在使用完图片资源后,自动关闭文件,释放资源,避免资源泄漏。io.BytesIO是 Python 标准库io中的类,用于在内存中创建一个二进制流缓冲区。这个缓冲区将用于存储图片数据。将打开的图片img保存到之前创建的缓冲区buffer中后,使用getvalue方法用于获取缓冲区中的所有数据然后通过base64.b64encode函数用于对二进制数据img_bytes进行 Base64 编码,返回一个字节对象。然后使用decode("utf-8")方法将字节对象转换为 UTF-8 编码的字符串,得到最终的 Base64 编码的图片字符串。

加载模型

这里使用langchain中OpenAI接口和Ollama接口分别加载模型
首先下载langchain-openailangchain-ollama包,打开命令行,分别输入:

pip install -U langchain-openai
pip install -U langchain-ollama

OpenAI模型加载

from langchain_openai import ChatOpenAImodel = ChatOpenAI(temperature=0,model="llava:latest",openai_api_base="http://localhost:11434/v1/",openai_api_key="any key"
)

因为我们在本地使用ollama下载了llava模型了,所以openai_api_baseollama提供的URL:http://localhost:11434/v1/openai_api_key可以为任何值,但不能不传这个参数或者为空并且不能是中文。
Ollama模型加载

from langchain_ollama.chat_models import ChatOllamamodel = ChatOllama(model="llava:latest", temperature=0)

使用Ollama方式加载就更简单了,不过这种方式仍然可以访问远程的URL。下面给出例子

model = ChatOllama(model="llava:latest", base_url="http://localhost:11434/v1/", stream=True, temperature=0.6)

如果要访问其他地址的ollama的URL,修改base_url参数即可。

模型回复

from langchain_core.messages import HumanMessagemessage = HumanMessage(content=[{"type": "text", "text": "描述一下这幅图,用中文回答"},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{image_base64}"},},],
)
response = model.invoke([message])
print(response.content)

运行结果:
在这里插入图片描述

相关文章:

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...

Github 2025-01-11 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10C项目1Swift项目1Yazi - 快速终端文件管理器 创建周期:210 天开发语言:Rust协议类型:MIT LicenseStar数量:5668 个Fork数量:122…...

【学习】【记录】【分享】微型响应系统

前言 本篇博客源于对Vue和React框架中响应式系统的好奇与探索。若文中存在任何错误或有更优的解决方案,欢迎各位读者不吝指正,让我们一起学习,共同进步。 1. 什么是响应式系统 响应式系统是一种编程范式,它允许数据的变化自动地…...

vue城市道路交通流量预测可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站、收藏、不迷路! 项目亮点 编号:R09 🚇 网站大屏管理三大前端、vuespringbootmysql、前后端分离架构 🚇 流量预测道路查询…...

Windows7 Emacs设置及中文乱码解决

个人博客地址:Windows7 Emacs设置及中文乱码解决 | 一张假钞的真实世界 环境说明 Windows7GNU Emacs 25.1.1安装路径:D:/apps/emacs/ 配置Emacs 在Windows7下安装完Emacs后,默认情况下Emacs不会在一启动的时候就生成.emacs配置文件和.ema…...

Python AI教程之十五:监督学习之决策树(6)高级算法C5.0决策树算法介绍

C5.0决策树算法 C5 算法由 J. Ross Quinlan 创建,是 ID3 决策树方法的扩展。它通过根据信息增益(衡量通过按特定属性进行划分而实现的熵减少量)递归地划分数据来构建决策树。 对于分类问题,C5.0 方法是一种决策树算法。它构建规则集或决策树,这是对 C4.5 方法的改进。根…...

MOS管为什么会有夹断,夹断后为什么会有电流?该电流为什么是恒定的?

以下是对MOS管MOS管为什么会有夹断,夹断后为什么还会有电流?该电流为什么是恒定的?的一些心得体会。 1. MOS管为什么会有夹断? 可以认为D极加压使得D极的耗尽层增大(原因是N极接正极,P极接负极,电子被吸引…...

网络安全-RSA非对称加密算法、数字签名

数字签名非常普遍: 了解数字签名前先了解一下SHA-1摘要,RSA非对称加密算法。然后再了解数字签名。 SHA-1 SHA-1(secure hash Algorithm )是一种 数据加密算法。该算法的思想是接收一段明文,然后以一种不可逆的方式将…...

【AI日记】25.01.13

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales 读书 书名:罗素论幸福 律己 AI: 8 小时,良作息:1:00-9:00, 良短视频&…...

Mysql--运维篇--空间管理(表空间,索引空间,临时表空间,二进制日志,数据归档等)

MySQL的空间管理是指对数据库存储资源的管理和优化。确保数据库能够高效地使用磁盘空间、内存和其他系统资源。良好的空间管理不仅有助于提高数据库的性能,还能减少存储成本并防止因磁盘空间不足导致的服务中断。MySQL的空间管理涉及多个方面,包括表空间…...

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区? 直接内存相关 类加载器 什么是类加载器,类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…...

【leetcode 13】哈希表 242.有效的字母异位词

原题链接 题解链接 一般哈希表都是用来快速判断一个元素是否出现集合里。 当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组 set (集合) map(映射) 如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景…...

Blazor开发复杂信息管理系统的优势

随着现代企业信息管理需求的不断提升,开发高效、易维护、可扩展的系统变得尤为重要。在这个过程中,Blazor作为一种新兴的Web开发框架,因其独特的优势,逐渐成为开发复杂信息管理系统的首选技术之一。本文将结合Blazor在开发复杂信息…...

ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点

新建文件夹 创建一个蒙太奇MA_Melee 找到c_slow 调节一下速度 把D_slow拖上去 中间加一个片段 哎呀呀,写错了,我想写2 把这个标记拖过来,点击默认default 弄第二个片段 就会自己变成这个样子 把2这个标记拖到中间 鼠标左键&a…...

2025,AI走向何方?暴雨技术专家为您展望

过去一年中,人工智能技术飞速发展,在各行各业都收获了巨大进展。面对即将到来的2025年,暴雨技术研发团队的专家对AI领域的发展趋势进行了展望,让我们来看看未来一年,有哪些重要趋势值得关注。 迈向关键转折的一步 20…...

Threejs实现 区块链网络效应

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | A…...

宁德时代C++后端开发面试题及参考答案

请阐述面向对象的三大特性。 面向对象编程有三大特性,分别是封装、继承和多态。 封装是指将数据和操作数据的方法绑定在一起,对数据的访问和操作进行限制。这样做的好处是可以隐藏对象的内部细节,只暴露必要的接口给外部。例如,我们可以把一个汽车类的内部引擎状态、速度等…...

【三维数域】三维数据调度-负载均衡和资源优化

在处理大规模三维数据时,负载均衡和资源优化是确保系统高效运行、提供流畅用户体验的关键。这两者不仅影响到系统的性能和稳定性,还直接决定了用户交互的质量。以下是关于如何在三维数据调度中实现有效的负载均衡和资源优化的详细探讨。 一、负载均衡 负…...

Linux服务器网络丢包场景及解决办法

一、Linux网络丢包概述 在数字化浪潮席卷的当下,网络已然成为我们生活、工作与娱乐不可或缺的基础设施,如同空气般,无孔不入地渗透到各个角落。对于 Linux 系统的用户而言,网络丢包问题却宛如挥之不去的 “噩梦”,频繁…...

【信息系统项目管理师】高分论文:论信息系统项目的采购管理(数据中台项目)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 1、规划采购管理。2、实施采购3、控制采购2022年3月,我以项目经理的身份参加了xx银行xx省分行的数据中台项目。该项目历时10个月,项目经费500万。通过该项目,我们搭建了数据中台,实现了实时的、灵活可配的数…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...