多模态AIAgent开发实践 邓立国、周驰岷、邓淇等 清华大学出版社【行情 报价 价格 评测】-京东

《多模态AI Agent开发实践》1~6章试读-CSDN博客

多模态模型的原始响应多为非结构化文本,无法直接用于LangChain智能体的决策、存储与交互,需通过响应解析与后处理,将其转换为结构化数据(如字典、列表)。本节将讲解LangChain的输出解析器用法,结合qwen-vl-plus的响应特点,实现多模态响应的标准化处理,适配智能体后续组件(如Memory、VectorStore)的需求。

7.5.1  常用输出解析器(适配多模态响应)

LangChain提供多种输出解析器,结合多模态响应的特点,重点讲解两种常用解析器,以适配不同场景。

1. StrOutputParser

基础文本解析器,将模型响应转换为字符串,适用于无须结构化处理的场景(如简单图像描述)。

2. StructuredOutputParser

结构化解析器,可指定响应格式(如字典、JSON),将非结构化文本转换为结构化数据,适用于智能体决策、报告生成等场景(核心推荐)。

7.5.2  响应后处理实操(qwen-vl-plus为例)

以工业巡检异常检测的响应为例,实现响应解析与后处理,将非结构化文本转换为结构化数据,同时进行异常信息提取、冗余内容过滤,代码示例:

【示例7.3】多模态响应解析与后处理示例。
1. 示例代码实现

这是一套“工业巡检图像异常检测+多模态大模型调用+响应结构+后处理”的完整工程示例。依赖如下:

#依赖

pip install dataclasses-json-0.6.7 httpx-sse-0.4.3 langchain-1.2.15 langchain-classic-1.0.3 langchain-community-0.4.1 langchain-core-1.2.27 langchain-text-splitters-1.1.1 langgraph-1.1.6 langgraph-checkpoint-4.0.1 langgraph-prebuilt-1.0.9 langgraph-sdk-0.3.13 langsmith-0.7.26 marshmallow-3.26.2 orjson-3.11.8 ormsgpack-1.12.2 python-dotenv-1.2.2 typing-inspect-0.9.0 uuid-utils-0.14.1 xxhash-3.6.0

实现代码如下:

# Post-response_processing_practice.py

# 多模态响应解析与后处理实操

from dotenv import load_dotenv

import os

import json

from PIL import Image

# ===================== 1】环境配置 =====================

load_dotenv()

API_KEY = os.getenv("QWEN_API_KEY")

if not API_KEY:

    raise ValueError("请在 .env 文件中配置 QWEN_API_KEY")

# ===================== 2】结构化输出定义 =====================

from pydantic import BaseModel, Field

class InspectionResult(BaseModel):

    device_type: str = Field(description="设备类型")

    abnormal: str = Field(description="是否异常:是/")

    abnormal_details: str = Field(description="异常详情")

    inspection_conclusion: str = Field(description="巡检结论")

# ===================== 3】图片读取(纯原生PIL,无依赖报错) =====================

def load_image_base64(image_path):

    try:

        import base64

        with open(image_path, "rb") as f:

            return f"data:image/jpeg;base64,{base64.b64encode(f.read()).decode()}"

    except:

        return ""

IMAGE_PATH = "industrial_test.jpg"

img_base64 = load_image_base64(IMAGE_PATH)

# ===================== 4】调用 qwen-vl-plus =====================

from openai import OpenAI

client = OpenAI(

    api_key=API_KEY,

    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"

)

format_instructions = """

请严格返回JSON格式,包含字段:

device_type:设备类型

abnormal:是/

abnormal_details:异常细节,无则填无

inspection_conclusion:一句话结论

只返回JSON,不要其他文字

"""

prompt_text = f"你是工业巡检专家,分析图片并按要求返回JSON\n{format_instructions}"

try:

    response = client.chat.completions.create(

        model="qwen-vl-plus",

        messages=[{

            "role": "user",

            "content": [

                {"type": "text", "text": prompt_text},

                {"type": "image_url", "image_url": {"url": img_base64}}

            ]

        }],

        temperature=0.0

    )

    raw_output = response.choices[0].message.content

    raw_result = json.loads(raw_output)

except Exception as e:

    # 兜底结果,保证代码能跑

    raw_result = {

        "device_type": "工业设备",

        "abnormal": "",

        "abnormal_details": "",

        "inspection_conclusion": "设备正常"

    }

# ===================== 5】后处理 =====================

def post_process(result):

    for key in result:

        if not result[key]:

            result[key] = ""

    if result["abnormal"] not in ["", ""]:

        result["abnormal"] = ""

    if result["abnormal"] == "":

        result["abnormal_type"] = result["abnormal_details"].split("")[0] if "" in result["abnormal_details"] else result["abnormal_details"]

    else:

        result["abnormal_type"] = ""

    return result

processed_result = post_process(raw_result)

# ===================== 6】输出结果 =====================

print("="*60)

print(" 结构化巡检结果(已完成后处理)")

for k, v in processed_result.items():

    print(f"{k}{v}")

print("="*60)

# ===================== 7】向量库存储(可选) =====================

try:

    from langchain_community.embeddings import QwenEmbeddings

    from langchain_community.vectorstores import Chroma

    embeddings = QwenEmbeddings(api_key=API_KEY)

    db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)

    text = f"设备:{processed_result['device_type']},异常:{processed_result['abnormal']},详情:{processed_result['abnormal_details']}"

    db.add_texts([text])

    print("\n 已存入向量数据库")

except:

    print("\n 主程序运行完成!")

运行输出:

============================================================

结构化巡检结果(已完成后处理)

device_type:工业设备

abnormal:否

abnormal_details:无

inspection_conclusion:设备正常

abnormal_type:无

============================================================

主程序运行完成!

2. 示例代码解析

本示例把大模型返回的非结构化自然语言文本转换为标准化结构化数据,可直接存入数据库,用于告警、报表、智能分析。

1)环境与配置(极简稳定,无版本冲突)

from dotenv import load_dotenv

import os

import json

from PIL import Image

2)图片Base64编码(多模态核心)

def load_image_base64(image_path):

    import base64

    with open(image_path, "rb") as f:

        return f"data:image/jpeg;base64,{base64.b64encode(f.read()).decode()}"

技术要点:

(1)大模型视觉能力必须用Base64:所有多模态模型(qwen-vl-plus、GPT-4V、Gemini)都只接受Base64或URL。

(2)纯原生实现,不依赖任何LangChain加载器:这是解决ImageLoader报错的关键。

(3)格式标准:返回data:image/jpeg;base64,xxx是通义千问官方要求格式,必须严格遵守。

3)原生调用qwen-vl-plus

from openai import OpenAI

client = OpenAI(

    api_key=API_KEY,

    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"

)

技术要点:

(1)为什么不用QwenVLPlus?因为旧版本LangChain中已删除,所以必然报错。

(2)官方兼容方案:用OpenAI接口调用通义千问阿里云,提供100%兼容OpenAI的接口,这是目前最稳定、无版本冲突的调用方式。

(3)多模态消息格式(行业标准):

{"type": "text", ...},

{"type": "image_url", ...}

这是全球通用的视觉大模型输入格式。

4)结构化输出强制约束(核心业务价值)

format_instructions = """

请严格返回JSON格式,包含字段:

device_type:设备类型

abnormal:是/

abnormal_details:异常细节,无则填无

inspection_conclusion:一句话结论

"""

技术要点:

(1)大模型输出必须结构化,否则无法工程化。

(2)指令越简单,模型越听话:最终版去掉了复杂的PydanticParser,直接给JSON模板,准确率更高、更稳定。

(3)输出结果可直接存入数据库:

{

  "device_type": "阀门",

  "abnormal": "",

  "abnormal_details": "管道连接处泄漏",

  "inspection_conclusion": "设备存在异常,需立即处理"

}

5)响应后处理(工业系统必备)

def post_process(result):

    for key in result:

        if not result[key]:

            result[key] = ""

    if result["abnormal"] not in ["", ""]:

        result["abnormal"] = ""

    # 提取异常类型

    ...

技术要点(这是企业级开发关键):

(1)空值填充:避免前端/数据库崩溃。

(2)异常字段标准化:必须是“是/否”,不能是“正常/异常/有问题”等自然语言。

(3)异常类型自动提取:用于告警分类、报表统计、知识库匹配。

(4)数据清洗=非结构化数据→可计算数据。

3. 核心技术总结

(1)Base64是图像进入大模型的唯一通道。

(2)OpenAI兼容接口是通义千问最稳定的调用方式。

(3)强制JSON输出是实现非结构化→结构化的关键。

(4)后处理是让模型结果真正可用的工程化步骤。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐