多模态提示词设计指南
原创
灵阙教研团队
A 推荐 入门 |
约 10 分钟阅读
更新于 2026-02-28 AI 导读
多模态提示词设计指南 面向视觉、音频、视频的多模态提示词工程实践 多模态 LLM 的能力边界 多模态大模型可以同时处理文本、图像、音频甚至视频输入。但每种模态的处理能力存在显著差异: 多模态能力矩阵(截至 2026 年初): 模型 文本 图像理解 图像生成 音频理解 音频生成 视频理解 视频生成 ─────────────── ──── ──────── ──────── ────────...
多模态提示词设计指南
面向视觉、音频、视频的多模态提示词工程实践
多模态 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