Skip to content
LangChain 文档版本 跟随上游 源快照 d290ed74 更新于 2026-10-08

多模态输入与输出

当你的模型支持多模态输入和工具结果时,可在 Deep Agents 中使用图像、音频、视频和文档

当你使用接受多模态输入和工具结果或返回多模态输出的 大型语言模型 时,Deep Agents 支持多模态工作流。你可以将图像和其他媒体附加到用户消息中,使用内置的 read_file 工具读取非文本文件,并从自定义工具返回多模态内容。

内置的 上下文压缩 主要面向文本。请相应地规划多模态工作负载:将大型媒体存储在某个后端中,并尽可能传递引用。

多模态用户输入

在发送给智能体的 messages 中传入多模态内容,使用与 LangChain 聊天模型相同的 标准内容块:

python
result = agent.invoke({
    "messages": [{
        "role": "user",
        "content": [
            {"type": "text", "text": "What is in this screenshot?"},
            {"type": "image", "url": "https://example.com/screenshot.png"},
        ],
    }],
})

有关块类型、服务商特定的要求以及更多示例(PDF、音频、视频),请参阅 多模态消息。

内置的 read_file 工具

harness 的 read_file 工具会为受支持的多模态文件返回 标准内容块,而不是纯文本。当所选模型支持相应模态时,智能体可以检查存储在其 文件系统 中的图像、文档和媒体。请查看服务商的文档,了解你的模型支持的 MIME 类型。

支持的多模态文件扩展名
类型扩展名
图像.png, .jpg, .jpeg, .gif, .webp, .heic, .heif
视频.mp4, .mpeg, .mov, .avi, .flv, .mpg, .webm, .wmv, .3gpp
音频.wav, .mp3, .aiff, .aac, .ogg, .flac
文件.pdf, .ppt, .pptx

自定义工具输出

自定义工具 可以包含多模态文件,例如图像:

python
from langchain.tools import tool

@tool
def capture_screenshot() -> list[dict]:
    """Capture a screenshot of the current page."""
    return [
        {"type": "text", "text": "Screenshot of the current page:"},
        {"type": "image", "url": "https://example.com/page.png"},
    ]

返回值会被转换为一条 ToolMessage,模型会在下一轮读取它。可通过结果消息上的 content_blocks 访问规范化后的表示。

有关返回类型选项、序列化行为以及 MCP 示例,请参阅 多模态内容。

TIP

当工具生成图像或其他大型二进制数据时,请将产物保存到 后端,并返回简洁的文本描述以及路径或 URL。这样可以减小消息历史,并更好地配合 上下文压缩。

上下文压缩与多模态内容

内置的卸载和摘要功能针对文本和消息历史进行了优化:

  • 卸载 只计量文本 token。非文本块(包括图像)会在替换消息中被保留,而不是被压缩。仅包含一张图像的消息不会仅根据图像大小就被卸载。

  • 摘要 会将较旧的消息压缩为仅含文本的摘要。该范围内的图像、音频、视频和文件块不会被继续保留——模型只能看到摘要器对它们的描述。低于保留阈值的近期消息保持不变。

    当摘要运行时,较旧轮次中的媒体块会从活跃上下文中移除:

    python
    # Before — model receives image blocks in older turns
    [
        HumanMessage(
            content=[
                {"type": "text", "text": "What trends do you see in this chart?"},
                {"type": "image", "base64": IMG, "mime_type": "image/png"},
            ]
        ),
        ToolMessage(
            content=[
                {"type": "text", "text": "Updated chart:"},
                {"type": "image", "base64": IMG, "mime_type": "image/png"},
            ],
            tool_call_id="call_chart_1",
        ),
        AIMessage(content="Revenue rose in Q3 based on the chart trend."),
        HumanMessage(content="Reply with one sentence summarizing our analysis."),
    ]
    
    # After — those turns collapse to text; image blocks are gone
    {"content": (
        "User asked about trends in a chart screenshot. "
        "Tool returned an updated chart. Agent identified Q3 revenue growth."
    )}

    原始对话仍会以文本形式写入文件系统。有关触发条件、保留阈值和完整流程,请参阅 摘要。

对于多模态密集型工作负载:

  • 将图像、截图和图表存储在文件系统后端或外部对象存储中,然后通过消息传递文件路径或 URL。
  • 在长时间运行的对话中,优先使用引用而不是 base64 编码的图像块。
  • 对于图像密集型的检查,请使用 子智能体,以便主智能体收到简洁的文本结果。
  • 当你的服务商对图像收取大量 token 时,请调整摘要阈值或提供一个自定义的 token 计数器。

有关卸载阈值、摘要触发条件和自定义选项,请参阅 上下文压缩。


BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。