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

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

相关文章:

  • 国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)
  • Vue 把 Echarts 图传给后端:文件流信息方式传递
  • BFS专项练习 —— 蓝桥杯刷题
  • Java基础 3.26
  • uniapp主题切换功能,适配H5、小程序
  • PyCharm操作基础指南
  • 智能科技与美学融合,赵伟辰荣膺 2025 iF 设计大奖
  • Redis Stack 基础知识-构建现代实时数据平台
  • 从零开始学习PX4源码16(姿态控制器中的参数)
  • redis 缓存穿透
  • 关于pywebview项目打包成apk(笔记版)
  • 定制表单排序,react, sort
  • “慢SQL“治理的几点思考
  • LangChain开发(五)消息管理与聊天历史存储
  • 【前端】超链接标签(a标签)之href属性、target属性
  • ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli
  • 项目-苍穹外卖(十五) WebSocket+语音播报功能实现(来订单+催单)
  • 使用 PyCharm 创建 Python 项目时,默认生成的 .venv 文件夹是属于什么类型的虚拟环境
  • leetcode每日一题——k-avoiding 数组的最小总和
  • 主流软件工程模型全景剖析
  • 商务部召开全国离境退税工作推进会:提高退税商店覆盖面,扩大入境消费
  • 上海市税务局:收到对刘某某存在涉税问题的举报,正依法依规办理
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 把中国声音带向世界,DG和Blue Note落户中国
  • Offer触手可及,2025上海社会组织联合招聘专场活动正寻找发光的你
  • 党建评:对违规宴饮等问题要坚决露头就打