多模态提示词设计指南

面向视觉、音频、视频的多模态提示词工程实践


多模态 LLM 的能力边界

多模态大模型可以同时处理文本、图像、音频甚至视频输入。但每种模态的处理能力存在显著差异:

多模态能力矩阵(截至 2026 年初):

模型              文本  图像理解  图像生成  音频理解  音频生成  视频理解  视频生成
───────────────   ────  ────────  ────────  ────────  ────────  ────────  ────────
Claude Opus 4.6   +++   +++       --        --        --        --        --
GPT-4o            +++   +++       --        +++       +++       --        --
Gemini 2.5 Pro    +++   +++       +++       +++       +++       +++       --
Gemini 2.5 Flash  ++    ++        ++        ++        ++        ++        --

+++ = 领先  ++ = 良好  + = 基础  -- = 不支持

多模态处理的本质

图像输入的处理流程:
  原始图像 ──→ 视觉编码器 ──→ 视觉 Token ──→ LLM 推理
  (PNG/JPG)    (ViT/CLIP)    (与文本Token   (统一处理)
                              混合排列)

关键认知:
  - 图像被转化为一系列"视觉 Token",与文本 Token 混合处理
  - 图像的 Token 消耗取决于分辨率,通常一张图 = 数百到数千 Token
  - LLM 的视觉理解是"语义级"的,不是"像素级"的

一、图像提示词设计

基础模式:图像 + 文本指令

# Claude Vision API 调用
response = client.messages.create(
    model="claude-opus-4-6",
    max_tokens=1024,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/png",
                    "data": image_base64
                }
            },
            {
                "type": "text",
                "text": "分析这张图表中的关键数据趋势。"
            }
        ]
    }]
)

图像提示词模板

<task>
分析以下{image_type},并提取关键信息。
</task>

<image_context>
图像类型:{image_type}
来源:{image_source}
背景说明:{background}
</image_context>

<analysis_requirements>
1. 描述图像中的主要元素和布局
2. 提取关键数据点或信息
3. 识别趋势、异常或值得注意的模式
4. 如果是图表,提取具体的数值
</analysis_requirements>

<output_format>
{
  "description": "图像整体描述",
  "key_elements": ["元素1", "元素2"],
  "data_points": [{"label": "...", "value": "..."}],
  "insights": ["洞察1", "洞察2"],
  "confidence": 0.0-1.0
}
</output_format>

场景化图像提示词

场景一:UI 截图分析

<task>
分析以下 UI 截图,评估其设计质量。
</task>

<ui_analysis_criteria>
<criterion name="layout">
- 对齐是否一致
- 间距是否均匀
- 视觉层级是否清晰
</criterion>

<criterion name="typography">
- 字体层级是否合理
- 字号对比是否充分
- 可读性评估
</criterion>

<criterion name="color">
- 配色是否协调
- 对比度是否足够(WCAG AA 标准)
- 重点元素是否突出
</criterion>

<criterion name="interaction">
- 可点击元素是否明显
- 主操作是否突出
- 反馈状态是否清晰
</criterion>
</ui_analysis_criteria>

<output_format>
对每个维度给出 1-5 分评分和具体改进建议。
</output_format>

场景二:文档 OCR + 结构化提取

<task>
从以下文档图像中提取结构化信息。
</task>

<document_type>{document_type}</document_type>

<extraction_schema>
{
  "document_title": "string",
  "date": "YYYY-MM-DD",
  "parties": [{"name": "string", "role": "string"}],
  "key_terms": [{"term": "string", "value": "string"}],
  "amounts": [{"description": "string", "amount": "number", "currency": "string"}],
  "signatures": [{"name": "string", "present": "boolean"}]
}
</extraction_schema>

<instructions>
- 如果某字段不可见或无法确定,标记为 null
- 金额需要包含币种
- 日期统一为 YYYY-MM-DD 格式
- 对不确定的提取结果,在 confidence 字段标注置信度
</instructions>

场景三:多图对比分析

# 多图输入的 API 调用
response = client.messages.create(
    model="claude-opus-4-6",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "比较以下两张 UI 设计稿的差异:"},
            {"type": "text", "text": "设计稿 A(当前版本):"},
            {"type": "image", "source": {"type": "base64", ...}},
            {"type": "text", "text": "设计稿 B(新版本):"},
            {"type": "image", "source": {"type": "base64", ...}},
            {"type": "text", "text": (
                "请列出所有视觉差异,包括:\n"
                "1. 布局变化\n"
                "2. 颜色变化\n"
                "3. 组件增删\n"
                "4. 文字内容变化\n"
                "输出 JSON 格式。"
            )}
        ]
    }]
)

二、图像分辨率与 Token 优化

Token 消耗估算

图像 Token 消耗(近似值,因模型而异):

分辨率           估算 Token    约等于
──────────────   ──────────   ────────
256 x 256        ~85          一段短文本
512 x 512        ~340         一页文档
1024 x 1024      ~1360        一篇中等文章
2048 x 2048      ~5440        一篇长文章
4096 x 4096      ~21760       一本小册子

优化策略

class ImageOptimizer:
    """图像输入优化器"""

    def optimize_for_llm(self, image: Image,
                          task: str) -> Image:
        """根据任务类型优化图像"""

        if task == "general_understanding":
            # 一般理解:中等分辨率即可
            return self._resize(image, max_size=1024)

        elif task == "text_extraction":
            # 文字提取:需要较高分辨率
            return self._resize(image, max_size=2048)

        elif task == "layout_analysis":
            # 布局分析:中等分辨率 + 保持宽高比
            return self._resize(image, max_size=1536)

        elif task == "detail_inspection":
            # 细节检查:裁剪感兴趣区域,保持高分辨率
            return self._crop_roi(image, roi)

    def _resize(self, image: Image, max_size: int) -> Image:
        """等比缩放到指定最大尺寸"""
        w, h = image.size
        if max(w, h) <= max_size:
            return image
        scale = max_size / max(w, h)
        return image.resize(
            (int(w * scale), int(h * scale)),
            Image.LANCZOS
        )

    def estimate_tokens(self, image: Image) -> int:
        """估算图像的 Token 消耗"""
        w, h = image.size
        # 基于 tile 的估算(Claude 模型的近似算法)
        tiles_w = math.ceil(w / 512)
        tiles_h = math.ceil(h / 512)
        return tiles_w * tiles_h * 85 + 85  # 每个 tile ~85 token + 基础开销

三、音频提示词设计

语音输入处理

# Gemini 音频处理
import google.generativeai as genai

model = genai.GenerativeModel("gemini-2.5-pro")

# 方法 1:直接上传音频
audio_file = genai.upload_file("meeting_recording.mp3")
response = model.generate_content([
    "转录以下会议录音,并提取关键决策和行动项。",
    audio_file
])

# 方法 2:音频 + 结构化提示
response = model.generate_content([
    """<task>
分析以下会议录音。
</task>

<requirements>
1. 完整转录(标注说话人)
2. 提取关键决策
3. 提取行动项(负责人 + 截止时间)
4. 标注有争议的讨论点
</requirements>

<output_format>
{
  "transcript": [
    {"speaker": "Person A", "text": "...", "timestamp": "00:01:23"}
  ],
  "decisions": ["decision 1", "decision 2"],
  "action_items": [
    {"task": "...", "owner": "Person A", "deadline": "2026-03-01"}
  ],
  "open_questions": ["question 1"]
}
</output_format>""",
    audio_file
])

音频分析模板

<task>
分析以下{audio_type}。
</task>

<audio_context>
音频类型:{audio_type}(会议录音/客服通话/播客/语音笔记)
时长:{duration}
参与者:{participants}
语言:{language}
</audio_context>

<analysis_dimensions>
<dimension name="content">
- 主要话题和讨论内容
- 关键观点和论述
- 达成的共识和结论
</dimension>

<dimension name="sentiment">
- 整体情绪基调
- 情绪变化点
- 潜在的冲突或不满
</dimension>

<dimension name="quality">
- 音频清晰度
- 背景噪音水平
- 无法识别的片段
</dimension>
</analysis_dimensions>

四、视频提示词设计

视频分析策略

视频分析的三种策略:

策略 1:关键帧提取
  视频 ──→ 每 N 秒提取一帧 ──→ 多图分析
  优点:简单,Token 消耗可控
  缺点:可能遗漏关键动作

策略 2:原生视频输入(Gemini)
  视频 ──→ 直接送入模型 ──→ 时序理解
  优点:保留时序信息
  缺点:Token 消耗大,支持模型少

策略 3:音视频分离
  视频 ──→ 音频转录 + 关键帧 ──→ 多模态组合分析
  优点:信息完整,Token 可控
  缺点:需要预处理流水线

Gemini 视频分析

# Gemini 原生视频理解
video_file = genai.upload_file("product_demo.mp4")

response = model.generate_content([
    """<task>
分析以下产品演示视频。
</task>

<analysis_requirements>
1. 时间线标注:列出视频中的关键时间点和对应内容
2. 功能识别:识别演示中展示的所有产品功能
3. 用户交互:记录所有用户交互操作(点击、输入、滑动等)
4. UI 评估:评估界面设计的可用性
5. 改进建议:提出具体的改进建议
</analysis_requirements>

<output_format>
{
  "timeline": [
    {"timestamp": "MM:SS", "description": "...", "category": "..."}
  ],
  "features_shown": ["feature 1", "feature 2"],
  "interactions": [
    {"timestamp": "MM:SS", "type": "click/input/scroll", "target": "..."}
  ],
  "usability_score": 1-10,
  "improvements": ["suggestion 1", "suggestion 2"]
}
</output_format>""",
    video_file
])

关键帧提取方案

import cv2

class VideoFrameExtractor:
    """视频关键帧提取器"""

    def extract_frames(self, video_path: str,
                       strategy: str = "uniform",
                       max_frames: int = 10) -> list[Image]:
        """提取关键帧"""
        cap = cv2.VideoCapture(video_path)
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        fps = cap.get(cv2.CAP_PROP_FPS)

        if strategy == "uniform":
            # 均匀采样
            indices = [
                int(i * total_frames / max_frames)
                for i in range(max_frames)
            ]

        elif strategy == "scene_change":
            # 基于场景变化
            indices = self._detect_scene_changes(
                cap, total_frames, max_frames
            )

        elif strategy == "content_diverse":
            # 基于内容多样性
            indices = self._select_diverse_frames(
                cap, total_frames, max_frames
            )

        frames = []
        for idx in indices:
            cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
            ret, frame = cap.read()
            if ret:
                # OpenCV BGR -> RGB -> PIL Image
                rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                img = Image.fromarray(rgb)
                frames.append({
                    "image": img,
                    "frame_index": idx,
                    "timestamp": idx / fps
                })

        cap.release()
        return frames

    def build_prompt_with_frames(self, frames: list[dict],
                                  task: str) -> list:
        """将关键帧组装为多模态提示词"""
        content = [{"type": "text", "text": task}]

        for frame in frames:
            timestamp = frame["timestamp"]
            minutes = int(timestamp // 60)
            seconds = int(timestamp % 60)

            content.append({
                "type": "text",
                "text": f"\n--- Frame at {minutes:02d}:{seconds:02d} ---"
            })
            content.append({
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": self._image_to_base64(frame["image"])
                }
            })

        return content

五、多模态组合策略

文本 + 图像 + 音频的组合

def multimodal_analysis(text: str, images: list,
                         audio=None) -> str:
    """多模态组合分析"""
    content = []

    # 文本上下文
    content.append({
        "type": "text",
        "text": f"""<task>
综合分析以下多模态输入。
文本内容提供背景信息,图像展示视觉证据,
音频(如有)提供补充说明。
请交叉验证不同模态的信息,指出一致性和矛盾之处。
</task>

<text_content>
{text}
</text_content>"""
    })

    # 图像证据
    for i, img in enumerate(images):
        content.append({
            "type": "text",
            "text": f"\n<image_{i+1} description='{img['description']}'>"
        })
        content.append({
            "type": "image",
            "source": img["source"]
        })

    # 音频转录(如果有)
    if audio:
        content.append({
            "type": "text",
            "text": f"\n<audio_transcript>\n{audio['transcript']}\n</audio_transcript>"
        })

    content.append({
        "type": "text",
        "text": """
<output_requirements>
1. 各模态信息的独立分析
2. 跨模态的一致性检查
3. 综合结论
4. 置信度评估
</output_requirements>"""
    })

    return content

Token 预算管理

class MultimodalTokenBudget:
    """多模态 Token 预算管理"""

    def __init__(self, total_budget: int = 100000):
        self.total = total_budget
        self.allocations = {
            "system_prompt": 2000,
            "text_context": 5000,
            "images": 0,          # 动态计算
            "audio_transcript": 0, # 动态计算
            "output_reserve": 4000,
        }

    def plan(self, images: list[Image],
             text_length: int,
             audio_duration_s: int = 0) -> dict:
        """规划 Token 分配"""
        # 计算图像 Token
        image_tokens = sum(
            self._estimate_image_tokens(img) for img in images
        )

        # 计算音频转录 Token(约 150 words/min)
        audio_tokens = int(audio_duration_s / 60 * 150 * 1.3)

        # 计算文本 Token
        text_tokens = text_length // 4

        total_needed = (
            self.allocations["system_prompt"] +
            text_tokens +
            image_tokens +
            audio_tokens +
            self.allocations["output_reserve"]
        )

        if total_needed > self.total:
            return self._optimize(images, text_length,
                                  audio_duration_s)

        return {
            "text_tokens": text_tokens,
            "image_tokens": image_tokens,
            "audio_tokens": audio_tokens,
            "total": total_needed,
            "remaining": self.total - total_needed,
            "optimization_needed": False
        }

    def _optimize(self, images, text_length, audio_duration):
        """超预算时的优化策略"""
        recommendations = []

        # 策略 1:降低图像分辨率
        recommendations.append("resize images to max 1024px")

        # 策略 2:减少图像数量
        if len(images) > 5:
            recommendations.append(
                f"reduce images from {len(images)} to 5"
            )

        # 策略 3:截断文本
        if text_length > 10000:
            recommendations.append("truncate text to 10000 chars")

        # 策略 4:摘要音频而非完整转录
        if audio_duration > 300:
            recommendations.append(
                "use audio summary instead of full transcript"
            )

        return {
            "optimization_needed": True,
            "recommendations": recommendations
        }

多模态提示词设计清单

多模态提示词设计清单:
- [ ] 明确每个模态的作用(主信息源 vs 补充证据)
- [ ] 图像分辨率已优化(避免不必要的高分辨率)
- [ ] Token 预算已规划(各模态分配合理)
- [ ] 图像有文字标注(告诉模型关注什么)
- [ ] 多图输入有顺序说明
- [ ] 跨模态一致性检查已包含在提示词中
- [ ] 输出格式支持多模态引用(引用具体图像/时间戳)
- [ ] 考虑了模态缺失的降级策略
- [ ] 敏感内容过滤已考虑(图像中的个人信息)

参考资料

  • Anthropic Vision 文档:Claude 的图像理解能力说明
  • Google Gemini 多模态文档:支持图像/音频/视频
  • OpenAI GPT-4o 多模态指南
  • LLaVA / Qwen-VL:开源多模态模型

Maurice | maurice_wen@proton.me