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