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

LangChain开发(六)多模态输入与自定义输出

文章目录

  • 多模态数据输入
    • url传入图片地址
    • base64编码传入图片
    • 传入多个url
  • 工具调用
  • 源码地址
  • 参考资料

多模态数据输入

这里演示如何将多模态输入直接传递给模型。我们目前期望所有输入都与OpnAI期望的格式相同。对于支持多模态输入的其他模型提供这,我们在类中添加了逻辑以转换为期望格式。

url传入图片地址

传入一个url,让大模型描述图片里面有什么

from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI

image_url = "https://avatars.githubusercontent.com/u/64422807?v=4"
model = ChatOpenAI(model="gpt-4o")
message = HumanMessage(
    content=[
        {"type": "text", "text": "用中文描述描述这张图片"},
        {"type": "image_url", "image_url": {"url": image_url}}
    ],
)

response = model.invoke([message])
print(response.content)

输出示例:

这是一幅黑白风格的图像,背景为单色。主体人物的头发较为卷曲,呈现自然的纹理效果。在人物头发的左侧,有一些花朵的图案,与头部融合在一起,增添了艺术的感觉。人物穿着简单的白色上衣,整体呈现出一种简洁而富有艺术感的风格。

只有一部分大模型支持该能力

base64编码传入图片

在本地将url对应的图片base64编码后传给大模型

# 获取图片后base64发送给大模型
import base64
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
# 用httpx,获取图片的base64编码
import httpx

image_url = "https://avatars.githubusercontent.com/u/64422807?v=4"
# 将图片二进制数据转换为base64编码
image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
model = ChatOpenAI(model="gpt-4o")
message = HumanMessage(
    content=[
        {"type": "text", "text": "用中文描述描述这张图片"},
        {
            "type": "image_url",
            "image_url": {"url": f"data:image/png;base64,{image_data}"},
        }
    ],
)

response = model.invoke([message])
print(response.content)
这张图片的背景是简单的灰色,给人一种简洁和宁静的感觉。画面中人物的头发呈深色卷发,线条柔和,增添了些许艺术感。发间融入了一些灰色的花瓣图案,仿佛花瓣从头发中生长出来,让整体效果显得富有创意和美感。人物穿着一件白色上衣,与整个色调的搭配和谐,看起来干净而柔和。整个图像呈现出一种朦胧且充满梦幻的风格。

适用于大部分支持多模态的模型

传入多个url

一次性传入多个图片url,让大模型比较分析

# 传入多个图片url并比较图片
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI

image_url1 = "https://avatars.githubusercontent.com/u/64422807?v=4"
image_url2 = "https://i-avatar.csdnimg.cn/a565ae7306de49babdb4ac8d52f50c19_weixin_43811294.jpg!1"
model = ChatOpenAI(model="gpt-4o")
message = HumanMessage(
    content=[
        {"type": "text", "text": "这两张图片有啥区别"},
        {"type": "image_url", "image_url": {"url": image_url1}},
        {"type": "image_url", "image_url": {"url": image_url2}}
    ],
)

response = model.invoke([message])
print(response.content)

输出示例:

两张图片在风格和背景上有所不同。第一张图片是人物肖像艺术作品,整体风格比较抽象,使用了花朵的元素,并且背景颜色较为淡雅。第二张图片则是一位坐在电脑前的人,背景呈现出一种科技感和夜晚的氛围,充满了蓝色和紫色的光影,营造出一种现代化、数字化的环境。

工具调用

一些多模态模型也支持调用功能。要使用此类调用工具,只需以通常的方式将工具绑定到它们,然后使用所需类型的内容块(例如,包含图像数据)调用模型。

# 图片识别+工具调用
from typing import Literal
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool


@tool
def color_tool(color: Literal["黑色的", "白色的", "绿色的", "灰色的", "蓝色的"]) -> None:
    """Describe the color"""
    pass


model = ChatOpenAI(model="gpt-4o")
model_with_tool = model.bind_tools([color_tool])
image_url1 = "https://avatars.githubusercontent.com/u/64422807?v=4"
image_url2 = "https://i-avatar.csdnimg.cn/a565ae7306de49babdb4ac8d52f50c19_weixin_43811294.jpg!1"
message = HumanMessage(
    content=[
        {"type": "text", "text": "用中文描述这两张图片的主题颜色"},
        {"type": "image_url", "image_url": {"url": image_url1}},
        {"type": "image_url", "image_url": {"url": image_url2}}
    ],
)

response = model_with_tool.invoke([message])
print(response.tool_calls)

输出示例

[{'name': 'color_tool', 'args': {'color': '灰色的'}, 'id': 'call_kovBTsMEYBp0nJhiGeunGvO2', 'type': 'tool_call'}, {'name': 'color_tool', 'args': {'color': '蓝色的'}, 'id': 'call_1tNCe6TPAbvjts9bmhc3STvT', 'type': 'tool_call'}]

源码地址

https://github.com/lys1313013/langchain-example/tree/main/07-multimodal

参考资料

B站:2025吃透LangChain大模型全套教程(LLM+RAG+OpenAI+Agent)第6集

LangChain官网: Multimodal


http://www.kler.cn/a/610288.html

相关文章:

  • leetcode238.除自身意外数组的乘积
  • 解决GLIBC不兼容问题
  • 查看linux系统文件描述符限制
  • abp vnext框架重写volo.abp.openiddict的tokenController登录验证
  • 【MySQL】用户账户、角色、口令、PAM
  • 一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
  • vue 封装 Axios菜鸟教程
  • C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤
  • P1464 Function —— 洛谷
  • C++:重载操作符
  • django入门教程之cookie和session【六】
  • Pyecharts入门之绘制地图数据
  • 云端存储新纪元:SAN架构驱动的智能网盘解决方案
  • 高维小样本数据的在线流特征选择
  • LangChain开发(二)LangChain提示词模板Template使用
  • LeetCode Hot 100 - 矩阵 | 73.矩阵置零、54.螺旋矩阵、48.旋转图像、240.搜索二维矩阵II
  • STM32F103_LL库+寄存器学习笔记03 - GPIO设置输入模式,并轮询GPIO的电平状态
  • Day15 -实例 端口扫描工具 WAF识别工具的使用
  • 推荐一个可以自定义github主页的网站
  • WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)