LangChain实战(二十):构建多模态应用 - 结合视觉与文本

本文是《LangChain实战课》系列的第二十篇,将深入探讨如何将GPT-4-Vision等多模态模型与LangChain结合,处理图像和文本混合的任务。通过学习本文,您将掌握构建能够理解和处理视觉信息的智能应用的核心技术。

前言

随着GPT-4-Vision等多模态模型的出现,AI系统不再局限于处理文本信息,而是能够理解和分析图像、视频等视觉内容。这种能力的结合为AI应用开辟了全新的可能性。本文将指导您如何将多模态能力集成到LangChain框架中,构建真正能够"看"和"理解"的智能应用。

多模态AI的核心价值与应用场景

为什么需要多模态AI?

  1. 信息互补:图像和文本提供互补信息,结合后能产生更深入的理解

  2. 场景丰富:现实世界中的问题往往涉及多种类型的信息

  3. 用户体验:支持更自然的交互方式(如拍照提问)

  4. 应用扩展:开启全新的应用场景和能力边界

典型应用场景

  1. 图像描述与问答:分析图像内容并回答相关问题

  2. 文档理解:处理包含文字和图像的复杂文档

  3. 视觉搜索:基于图像内容进行信息检索

  4. 内容审核:同时分析文本和图像内容进行安全审核

  5. 教育辅助:解析图表、示意图等教育材料

环境准备与安装

首先安装必要的依赖包:

# 安装核心库
pip install langchain openai python-dotenv

# 安装图像处理库
pip install pillow opencv-python

# 安装多模态支持库
pip install base64 requests

# 安装可选的可视化库
pip install matplotlib

# 安装文档处理库(用于处理PDF等包含图像的文档)
pip install pymupdf python-pptx

设置必要的环境变量:

export OPENAI_API_KEY="your-openai-api-key"

多模态模型基础:GPT-4-Vision入门

1. 直接调用GPT-4-Vision API

首先,让我们了解如何直接使用GPT-4-Vision API:

import base64
import requests
from PIL import Image
import io
import os

class GPT4VisionClient:
    def __init__(self):
        self.api_key = os.getenv("OPENAI_API_KEY")
        self.api_url = "https://api.openai.com/v1/chat/completions"
        self.headers = {
   
   
            "Content-Type": "application/json",
            "Authorization": f"Bearer {
     
     self.api_key}"
        }
    
    def encode_image(self, image_path):
        """将图像编码为base64"""
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode('utf-8')
    
    def analyze_image(self, image_path, prompt):
        """使用GPT-4-Vision分析图像"""
        # 编码图像
        base64_image = self.encode_image(image_path)
        
        # 构建请求载荷
        payload = {
   
   
            "model": "gpt-4-vision-preview",
            "messages": [
                {
   
   
                    "role": "user",
                    "content": [
                        {
   
   
                            "type": "text",
                            "text": prompt
                        },
                        {
   
   
                            "type": "image_url",
                            "image_url": {
   
   
                                "url": f"data:image/jpeg;base64,{
     
     base64_image}"
                            }
                        }
                    ]
                }
            ],
            "max_tokens": 1000
        }
        
        # 发送请求
        response = requests.post(self.api_url, headers=self.headers, json=payload)
        response_data = response.json()
        
        return response_data["choices"][0]["message"]["content"]
    
    def analyze_multiple_images(self, image_paths, prompt):
        """分析多张图像"""
        content = [{
   
   "type": "text", "text": prompt}]
        
        for image_path in image_paths:
            base64_image = self.encode_image(image_path)
            content.append({
   
   
                "type": "image_url",
                "image_url": {
   
   
                    "url": f"data:image/jpeg;base64,{
     
     base64_image}"
                }
            })
        
        payload = {
   
   
            "model": "gpt-4-vision-preview",
            "messages": [
                {
   
   
                    "role": "user",
                    "content": content
                }
            ],
            "max_tokens": 2000
        }
        
        response = requests.post(self.api_url, headers=self.headers, json=payload)
        response_data = response.json()
        
        return response_data["choices"][0]["message"]["content"]

# 使用示例
vision_client = GPT4VisionClient()

# 分析单张图像
result = vision_client.analyze_image("path/to/image.jpg", "描述这张图片的内容")
print(result)

# 分析多张图像
results = vision_client.analyze_multiple_images(
    ["image1.jpg", "image2.jpg"], 
    "比较这两张图片的异同"
)
print(results)

2. 图像预处理工具

在处理图像之前,通常需要进行一些预处理:

from PIL import Image, ImageEnhance, ImageFilter
import cv2
import numpy as np

class ImagePreprocessor:
    def __init__(self):
        pass
    
    def resize_image(self, image_path, max_size=1024):
        """调整图像大小,保持宽高比"""
        img = Image.open(image_path)
        
        # 计算新的尺寸
        width, height = img.size
        if max(width, height) > max_size:
            if width > height:
                new_width = max_size
                new_height = int(height * (max_size / width))
            else:
                new_height = max_size
                new_width = int(width * (max_size / height))
            
            img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
        
        # 保存调整后的图像
        output_path = image_path.replace(".", "_resized.")
        img.save(output_path)
        return output_path
    
    def enhance_image(self, image_path, contrast=1.2, sharpness=1.1):
        """增强图像质量"""
        img = Image.open(image_path)
        
        # 增强对比度
        enhancer = ImageEnhance.Contrast(img)
        img = enhancer.enhance(contrast)
        
        # 增强锐度
        enhancer = ImageEnhance.Sharpness(img)
        img = enhancer.enhance(sharpness)
        
        output_path = image_path.replace(".", "_enhanced.")
        img.save(output_path)
        return output_path
    
    def extract_text_from_image(self, image_path):
        """从图像中提取文本(使用OCR)"""
        try:
            import pytesseract
            img = Image.open(image_path)
            text = pytesseract.image_to_string(img, lang='chi_sim+eng')
            return text
        except ImportError:
            return "请安装pytesseract以使用OCR功能"
    
    def detect_objects(self, image_path):
        """物体检测(示例实现)"""
        # 这里使用OpenCV进行简单的物体检测
        image = cv2.imread(image_path)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        
        # 使用边缘检测
        edges = cv2.Canny(gray, 100, 200)
        
        # 寻找轮廓
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        
        return f"检测到 {
     
     len(contours)} 个物体轮廓"

# 使用示例
preprocessor = ImagePreprocessor()
resized_image = preprocessor.resize_image("path/to/image.jpg")
enhanced_image = preprocessor.enhance_image(resized_image)
text_content = preprocessor.extract_text_from_image(enhanced_image)
object_info = preprocessor.detect_objects(enhanced_image)

将多模态能力集成到LangChain

1. 创建多模态工具

首先,我们创建一些处理图像和多模态内容的工具:

from langchain.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type, Optional, List
import os

class ImageAnalysisInput(BaseModel):
    image_path: str = Field(description="图像文件路径")
    question: str = Field(description="关于图像的问题或指令")

class MultiImageAnalysisInput
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样统计,通过模拟系统元件的故障修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongche_shi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值