DLAI-Gemini-多模态模型提示词笔记-全-

DLAI Gemini 多模态模型提示词笔记(全)

001:课程介绍与概览 🚀

在本节课中,我们将要学习大型多模态模型(LMM)的基础知识,并了解如何使用谷歌的Gemini模型来处理文本和图像等多种类型的数据。课程将涵盖从基本概念到实际应用的全过程。

想象一下,你正在设计一个客户服务应用程序。一位客户上传了一张产品的图像,例如一台微波炉旁边还有一个红薯,并询问“我该怎么处理这个?”。大型多模态模型允许你直接结合文本和图像来回答这个问题。

在LMM出现之前,一种可能的方法是使用图像字幕生成模型来编写图像的描述,然后将该描述和用户问题一同输入到大型语言模型(LLM)中。但是,一个大型多模态模型可以直接处理文本和图像的组合输入,从而减少了因字幕遗漏关键细节而导致错误的机会。

Gemini是最新一批从一开始就被训练来理解文本、图像、音频和视频混合内容的模型之一。我很高兴向大家介绍本课程的讲师欧文·惠辛加,他是谷歌云机器学习的开发者倡导者,在LLM和LMM方面拥有深厚的经验。

谢谢,安德鲁。我很高兴与你和你的团队在这方面合作。在本课程中,你将学习如何构建多模态应用。具体来说,你将学习什么是多模态,如何使用Gemini API处理不同类型的数据(如图像和视频),以及设置参数和提示工程的最佳实践。你还将学习如何在多个图像或视频上应用高级推理。

例如,你将看到的一个应用场景是:输入一份同时包含文本和图表的文档,然后让LMM回答那些需要阅读和理解文本及图表图像的问题。你将使用Python和Vertex AI上的Gemini来构建这些多模态应用。

你将探索各种多模态用例,并学习如何使用Gemini模型与图像进行交互,包括那些在视频中包含文本或表格的图像。你将学习选择模型参数,并了解这些参数如何影响模型的创造力和一致性。你将发现提示多模态内容的最佳实践,并使用大型语言模型来改进、编辑和增强内容,类似于数字营销人员在为社交媒体准备内容时所需的工作。

此外,你将学习如何通过函数调用,用实时数据集成来增强语言模型的能力。许多人致力于创建这门课程。我要感谢谷歌云团队的Paulong Lin、Lavi Nigam和Thu-Yu Qua,以及来自DeepLearning.ai的Eddie Hsu,他们也为这门课程做出了贡献。

在下一个视频中,Erwin将介绍多模态和Gemini。在你完成这门课程后,无论何时你同时拥有文本和图像数据,我都希望你能运用本课程中的想法,如此快速地开发应用程序,以至于其他人会将你视为效率的典范。让我们继续看下一个视频并开始吧。

本课程仅以视频形式呈现。你只需观看课程即可了解关于Gemini的所有信息。如果你希望自己运行代码,我们为你提供了如何访问和运行笔记本的说明。

让我向你展示这些说明在哪里。在视频播放器的左下角,你可以点击“如何设置您的GCP账户”。这会带你到一份文档。在这份文档中,你将找到如何注册谷歌云平台账户的说明。你还可以找到如何访问谷歌Colab笔记本的说明。

本节课中我们一起学习了课程的整体介绍、大型多模态模型(LMM)的基本概念及其应用潜力,并了解了后续学习将使用的工具和资源。下一节,我们将正式开始探索多模态的世界。

002:Gemini模型家族概览 🧠

在本节课中,我们将学习什么是多模态模型,探索Gemini模型家族中的不同成员,并理解如何根据你的具体应用场景选择最合适的模型。

概述

首先,让我们快速概览一下Gemini模型家族。Gemini是Google DeepMind开发的多模态模型。这意味着它不仅仅像许多纯文本语言模型那样只在文本数据上训练。Gemini还在图像、音频、视频和文本等多种模态的数据上进行了训练。这种多模态方法使得模型能够在不同模态之间进行推理。例如,模型不仅能识别图片中的猫,还能理解猫玩耍的视频、猫叫的声音,甚至能用一首诗来描述它。这就是多模态的力量。在本课程中,你将深入了解多模态,并着手解决一些非常有趣的用例。

Gemini不只是一个单一的模型,它是一个为适应不同需求而设计的模型家族。可以将其想象为选择适合工作的正确工具。家族中有不同大小的模型,每个模型都专门为满足不同的计算限制和应用要求而定制。

Gemini模型家族详解

上一节我们介绍了Gemini是一个多模态模型家族,本节中我们来看看家族中的具体成员。

以下是Gemini模型家族的主要成员:

  1. Gemini Ultra(超大型)

    • 这是最大且能力最强的模型,在包括推理和多模态任务在内的广泛复杂任务中,提供最先进的性能。然而,在现实世界中,使用最大的模型并不总是最佳策略,因为它可能在响应速度上有所权衡。
  2. Gemini Pro(专业版)

    • 这是一个性能经过优化的主力模型,在模型能力、响应速度等方面取得了良好平衡,并且泛化能力优秀。这使其非常适合需要高质量响应和高效率的广泛应用。
  3. Gemini Flash(闪速版)

    • 这是一个专门为成为最快、最具成本效益的模型而构建的版本,适用于高吞吐量任务,旨在提供更低的延迟和成本。它非常适合需要模型快速响应的用例,例如客户服务聊天机器人或实时语言翻译工具。

  1. Gemini Nano(纳米版)
    • 这是专为直接在用户设备(如Pixel手机)上运行而设计的轻量级模型。它是通过模型蒸馏过程创建的。这个过程可以类比为教学:一个大型专家模型(教师)将其知识传递给一个更小、更紧凑的模型(学生)。目标是让学生模型学会最重要的技能,而不需要教师模型那样庞大的计算资源。

为何选择设备端模型?

我们了解了Gemini Nano是设备端模型,那么选择在设备上运行模型有哪些优势呢?

以下是两个主要原因:

  • 数据隐私与安全:在本地处理数据可以避免将用户敏感数据发送到中央服务器,这对于处理敏感信息的应用程序至关重要。
  • 离线访问:用户即使在没有互联网连接的情况下也可以使用AI功能,这对于需要离线工作或网络连接不稳定的应用非常有用。

如何为你的用例选择模型?

面对如此多的模型选项,你可能会感到困惑。选择最佳模型并非一刀切,每个模型都有其优势和权衡。

以下是帮助你做出决策的关键步骤和考虑因素:

  1. 理解你的用例:首先明确你要构建什么,是聊天机器人、内容生成工具还是其他应用?不同的任务倾向于不同的模型能力。
  2. 评估关键要求:将你的用例与以下三个核心维度进行对比:
    • 模型能力:评估模型规格是否与你的用例匹配。例如,它是否需要处理图像而不仅仅是文本?公式可以表示为:所需能力 ⊆ 模型能力
    • 延迟:你的应用需要多快的响应速度?如果实时交互至关重要,你需要一个能快速生成响应的模型。
    • 成本:更大的模型通常性能更卓越,但计算成本也更高。需要在性能和预算之间取得平衡。

例如,如果你正在开发一个图像搜索工具,你可能需要优先考虑具有出色图像处理能力的模型。

深入理解多模态

我们已经多次提到“多模态”,现在让我们具体看看这意味着什么。

一个多模态模型能够理解并处理图像、视频、文本、音频、PDF甚至代码等多种形式的输入。这对你的用例意味着巨大的灵活性。例如,你可以:

  • 从图像或扫描文档中提取文本。
  • 理解图像或视频中发生的事情,识别物体、场景甚至情绪。

更酷的是,你可以以交错的方式提供这些输入。例如,在一个请求中,你可以混合提供文本、图像、代码等。输入的顺序可以变化,并且顺序很重要,我们将在后续课程中讨论这一点。

高级推理与跨模态推理

Gemini模型还具备高级推理和跨模态推理能力。这意味着模型可以分析复杂的信息,并从不同模态中提取见解,使其在科学、法律、金融等需要处理多种信息形式的领域极具价值。

设想一个场景:你是一位研究气候变化影响的研究员。Gemini可以协同分析科学论文(文本)、卫星图像(视觉数据)和温度图表(数值数据),从而帮助你识别模式和趋势,理解全局。

视觉示例
假设有一张包含学生物理问题解答的图片。我们可以向模型提供这张图片和一个文本提示:“请逐步推理这个问题,并判断学生的答案是否正确。如果错误,请解释错误并解决问题。”
模型随后能够跨文本和图像进行推理:理解图片中的文字和图示,分析学生的解答步骤,最终给出一个包含文本和数学公式(如LaTeX)的响应。

课程预告

至此,你已经了解了Gemini模型家族、多模态的含义以及跨模态推理的能力。在整个课程中,你将学习以下内容:

  • 基础:如何通过Python SDK和API开始使用这些模型。
  • 核心功能:如何将模型集成到你的工作流程或用例中。
  • 参数:参数如何影响模型的输出。
  • 提示工程:针对多模态模型的最佳提示实践。
  • 用例:大量的图像和视频应用案例,以及如何使用这些模型来解决它们。

总结

本节课中,我们一起学习了:

  1. Gemini是一个由不同规格模型组成的多模态模型家族,包括Ultra、Pro、Flash和Nano。
  2. 多模态意味着模型能理解和处理文本、图像、音频、视频等多种形式的输入。
  3. 选择模型时,需要根据用例的具体需求,权衡模型能力、响应延迟和成本。
  4. Gemini具备强大的跨模态推理能力,能够分析混合信息并提取深层见解。
  5. 本课程将引导你从基础开始,掌握使用Gemini模型解决实际问题的全套技能。

003:提示与参数控制 🎛️

在本节课中,我们将学习如何使用文本和图像来提示多模态模型Gemini。我们将探索各种模型参数,了解如何选择它们,并理解它们对模型创造性和一致性的影响。

环境设置与认证 🔧

为了运行本教程的代码,我们需要先进行一些设置。首先,我们需要导入必要的工具并进行身份认证,以便从我们的环境调用Gemini API。

以下是设置步骤:

  1. 导入工具并进行身份认证。
  2. 设置项目ID和区域(例如 us-central1)。
  3. 导入Vertex AI SDK,这是一个用于与Gemini交互的Python工具包。
  4. 初始化Vertex AI SDK,指定项目、区域和凭据。
# 示例:初始化Vertex AI
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=LOCATION)

选择并调用模型 🤖

设置好环境后,我们需要选择要使用的Gemini模型并调用它。

以下是具体步骤:

  1. 从SDK中导入生成模型。
  2. 指定模型版本,例如 gemini-1.0-pro-vision
  3. 使用辅助函数或直接调用 model.generate_content() 来获取模型响应。

# 示例:导入并指定模型
from vertexai.preview.generative_models import GenerativeModel
model = GenerativeModel(“gemini-1.0-pro-vision”)

基础文本提示 📝

让我们从一个简单的文本提示开始,了解Gemini如何响应。

我们可以问:“什么是多模态模型?”。调用API后,模型会返回一个解释多模态模型的文本响应。你可以尝试更改提示,观察模型的不同回答。

流式传输响应 ⚡

为了提升交互体验,特别是构建实时应用时,我们可以使用流式传输功能。

流式传输允许我们在模型生成完整响应之前就开始处理文本片段。这通过将 stream 参数设置为 True 来实现。

# 示例:使用流式传输
response = model.generate_content(prompt, stream=True)
for chunk in response:
    print(chunk.text)

结合图像与文本提示 🖼️➕📝

上一节我们介绍了纯文本提示,本节中我们来看看如何结合图像和文本来提示Gemini模型。

首先,需要从SDK导入处理图像所需的类。然后,我们可以加载一张本地图像,并组合图像和一个文本提示(例如“描述这张图片”)发送给模型。

以下是关键步骤:

  1. 导入 ImagePart 类。
  2. 加载本地图像文件。
  3. 将图像和文本提示组合成 content
  4. 调用模型并获取响应。

模型不仅能描述图像内容,还能根据提示进行推理。例如,询问“这个人的可能职业是什么?”,模型会根据图像中的工具(如锤子、电钻)推断出可能的职业(如木匠、建筑工人)。

处理视频输入 🎥

除了静态图像,Gemini还能处理视频输入。在这个例子中,我们将从云存储中加载一个视频,并向模型提出几个需要观看完整视频才能回答的问题。

以下是处理视频的步骤:

  1. 从云存储桶获取视频的URI(统一资源标识符)。
  2. 准备一个包含多个问题的复杂提示。
  3. 将视频URI和提示组合后发送给模型。
  4. 模型会分析视频内容并逐一回答问题。

理解模型参数 🎚️

在尝试调整模型参数之前,我们先快速了解几个关键参数,它们就像控制模型输出“风味”的旋钮。

以下是核心参数及其作用:

  • 温度 (Temperature):控制输出的随机性。公式可理解为 P(word) ∝ exp(logit / T),其中T是温度。
    • 低温度(如0.2):输出更确定、更集中。
    • 高温度(如0.8):输出更具创造性、更多样。
  • Top-k:限制模型在每个步骤中只考虑概率最高的前k个候选词。
  • Top-p(核采样):从累积概率超过阈值p的最小候选词集合中采样。
  • 最大输出标记数 (Max Output Tokens):限制响应长度的最大值。
  • 停止序列 (Stop Sequences):指定一个字符串列表,遇到即停止生成。

实践:调整参数以控制输出 🔄

现在,让我们通过代码实践,看看调整这些参数如何影响Gemini对同一张图片的描述。

首先,我们使用默认参数让模型描述一张图片。然后,我们创建 GenerationConfig 对象来定制参数。

以下是调整参数的示例:

  1. 降低随机性:将温度设为 0.0,top-k设为 1。多次运行会得到非常一致的输出。
  2. 提高创造性:将温度设为 1.0,top-k设为 40。输出会更冗长且富有创意。
  3. 使用Top-p:在高温、高top-k基础上,设置较低的top-p(如0.01),可以抵消部分随机性,使输出回归简洁。
  4. 限制输出长度:设置 max_output_tokens=10,会得到一个非常简短的响应。
  5. 使用停止序列:设置 stop_sequences=[“熊猫”],则响应会在“熊猫”一词出现前被截断。
# 示例:设置生成配置
from vertexai.preview.generative_models import GenerationConfig
generation_config = GenerationConfig(
    temperature=0.2,
    top_p=0.8,
    top_k=40,
    max_output_tokens=256,
    stop_sequences=[“熊猫”]
)
response = model.generate_content(content, generation_config=generation_config)

总结 📚

本节课中,我们一起学习了如何对Gemini多模态模型进行提示和参数控制。

我们首先完成了环境设置和基础模型调用。接着,探索了如何结合图像、文本乃至视频进行多模态提示。最后,我们深入了解了温度、Top-k、Top-p、最大输出标记数和停止序列等关键参数,并通过实践看到了它们如何显著影响模型的输出风格、创造性和一致性。

记住,为特定用例找到最佳参数组合需要反复试验。对于需要确定性的任务(如分类),建议使用较低的随机性参数;对于需要创意的任务(如故事生成),则可以适当调高这些参数。

004:最佳实践 🚀

在本节课中,我们将学习如何为包含图像的用例设计有效的提示。我们将探讨从技术规范到提示结构设计的一系列最佳实践,帮助你引导多模态模型生成更准确、更相关的输出。

技术规范与基本原则 📋

上一节我们介绍了多模态模型的基本概念,本节中我们来看看使用图像输入的具体技术要求和基本原则。

图像在输入模型前会被转换为标记。目前,每个用例最多可以使用3000张图像。支持的图像格式是PNG或JPEG。图像中的像素数量没有限制,但较大的图像会被自动缩小,且通常效果更好。每张图像会占用258个标记。

在使用多模态大型语言模型时,需要记住这是一个不断发展的领域。以下是几个关键原则:

  • 实验至关重要:对于多模态模型,没有一种放之四海而皆准的完美提示方法。不同的用例、模型甚至数据类型都需要不同的方法。你需要探索各种提示结构、措辞和格式,以找到最适合你具体用例的方法。
  • 模型行为各异:每个模型都有其自身的特点和细微差别。在一个模型上效果良好的提示,在另一个模型上可能不会产生相同的结果。要注意不同模型对你的提示如何响应,并相应地调整你的方法。
  • 最佳实践会演变:我们做的研究和实验越多,就越了解哪些方法对我们的用例和不同模型有效。大型语言模型领域正在迅速发展,新的技术和最佳实践会不断涌现。

精心设计有效的多模态提示 ✨

为了探索如何精心制作有效的多模态提示,让我们深入一个具体场景。想象你有一张图片,比如一张可爱狗狗的图片,并且你想了解图片中正在发生什么。这就是提示设计和提示工程变得至关重要的地方。通过精心设计你的指令,你可以引导模型处理图片并理解其背景,从而生成你用例所需的特定输出。

以下是一些可以帮助改进多模态提示设计的技巧和策略。

确保清晰与简洁

清晰和简洁很重要。把提示想象成给同事分配任务。如果你的指示模糊或冗长,结果可能不是你所期望的。对于这些模型也是如此。虽然多模态模型很强大,但它们不是读心者。所以要像给一个聪明但需要明确指导的人解释任务那样编写你的提示。要避免过于技术性的行话,或对模型应该知道什么做出假设。

使用角色指令

在与模型交互时,提供明确的指令至关重要。一种有效的技术是在你的提示中为模型分配一个特定的角色。可以这样想:想象你在导演一场戏。你不会只是给演员一个剧本然后说“去吧”。你要告诉他们他们的角色是什么、动机是什么,以及应该如何与他人互动。类似地,角色指令告诉模型在你的请求的上下文中应该如何行动。

以下是角色指令的重要性:

  • 提供清晰性:角色指令明确了模型的任务,减少了歧义并提高了其输出的相关性。
  • 引导聚焦:它们引导模型朝向特定的风格、语气或细节水平,使响应更符合你的需求和用例。
  • 确保一致性:通过指定一个角色,你鼓励模型在其整个输出中保持一致的声音和视角。

例如,你可以指定模型的角色是“一个进行图像理解的人工智能”。另一个例子是,如果你要总结财务文件,可以给模型指定为“财务专家”的角色。

构建提示结构

提示结构至关重要,因为你设计输入的方式直接影响多模态模型的表现。你构建提示词的方式会影响模型解析提示词中信息的能力,还有助于模型正确理解如何使用给定信息。

为了给提示词构建结构,你可以使用前缀或类似XML标签来划分提示词的不同部分。例如,一个结构良好的提示可以是:首先提供图像,接着分配一个角色,然后提出你的问题或请求,最后留出空间让模型提供答案。

没有一种结构适用于所有情况。这取决于你的用例和你使用的模型,所以也需要对此进行试验。

以下是提示词结构重要的原因:

  • 组织信息:它帮助模型轻松识别你输入中的不同类型内容,例如图像、角色和问题。
  • 引导解释:它阐明了每条信息应该如何使用以及与其他信息的关系。图像是要被总结吗?它是一个代码片段要被执行吗?提示词结构提供了这些线索。
  • 鼓励期望的输出:通过在提示词中设定明确的期望,你增加了得到你所期望的那种回应的可能性。

以下是你可以用来给提示词添加结构的一些元素:

  • 角色:帮助模型理解其目的并相应地调整其回应。
  • 目标:说明你希望模型实现的目标,例如回答问题、总结文档、生成代码或提供见解。要尽可能具体。
  • 背景:提供模型需要理解任务并生成准确回应的任何背景信息或相关数据,可能包括文本、图像、图表等。
  • 限制条件:指定你希望模型遵守的任何限制或要求,例如回应的长度、输出的格式(如指定输出为HTML格式)或对某些类型内容的限制。

注意信息呈现顺序

在多模态模型中,你呈现信息的顺序在模型输出的质量和相关性方面起着重要作用。这既适用于文本提示的结构(你构建问题、指令的方式),也适用于不同模态(如图像、文本、表格)的输入顺序。你呈现不同类型输入的顺序会影响模型的理解和连接信息的能力。

例如,考虑一个分析医疗报告的场景。通过在X光图像之前呈现患者的病史,可以帮助模型更好地解释视觉信息。

以下是顺序重要的原因:

  • 提供上下文理解:模型在处理信息时会建立更好的理解。你呈现细节的顺序可以为后续信息的解释设定基础。
  • 引导注意力与焦点:通过战略性地排序你的提示和模态,你可以引导模型的注意力到特定方面,可能提高其回应的准确性。

同样,建议你实验提示的顺序和不同模态的输入顺序。

总结 📝

本节课中,我们一起学习了为多模态模型(特别是涉及图像的用例)设计提示的最佳实践。我们首先了解了图像输入的技术规范,并确立了实验、适应模型特性和关注领域发展的基本原则。接着,我们探讨了如何通过确保提示的清晰简洁、使用角色指令、构建良好的提示结构以及注意信息呈现顺序等策略,来精心设计有效的多模态提示。这些技巧旨在帮助你引导模型,使其输出更准确、更符合你的具体需求。记住,实践和迭代是掌握提示工程的关键。

005:使用图像创建用例 🖼️

在本节课中,我们将学习如何利用多模态模型处理图像和文本提示,创建实用的应用场景。我们将通过三个具体案例,学习如何从图像中提取信息、进行跨模态推理以及构建推荐系统。

课程概述

我们将从基础设置开始,然后逐步探索三个涉及图像的用例:

  1. 从水果图像和价目表中提取信息并计算成本。
  2. 根据客厅风格,从多张椅子图像中推荐合适的家具。
  3. 分析收据图像,并根据公司政策检查费用合规性。

环境设置与初始化 🔧

在深入具体用例之前,我们需要完成基础的环境设置。这包括获取API凭证、指定服务区域以及导入必要的开发工具包。

以下是初始化步骤的核心代码:

# 导入必要的库
from google.cloud import aiplatform
from vertexai.generative_models import GenerativeModel, Image

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-gmn-mtmdl-pmt/img/7c8add2d806e43a672ac5290cd15edab_4.png)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-gmn-mtmdl-pmt/img/7c8add2d806e43a672ac5290cd15edab_5.png)

# 初始化SDK,需要提供凭证、区域和项目ID
aiplatform.init(project=“your-project-id”, location=“us-central1”)

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-gmn-mtmdl-pmt/img/7c8add2d806e43a672ac5290cd15edab_7.png)

# 导入我们将要使用的多模态模型
model = GenerativeModel(“gemini-1.0-pro-vision-001”)

完成上述设置后,我们就可以开始构建和发送包含图像的提示了。


用例一:跨模态信息提取与计算 🍎

上一节我们完成了环境配置,本节中我们来看看第一个用例:如何让模型同时理解文本指令和图像内容,并进行推理计算。

我们的目标是:根据一碗水果的图像和一份水果价目表的图像,回答一系列问题,例如计算制作水果沙拉还需要购买哪些水果及其总费用。

步骤分解

以下是实现该用例的关键步骤:

  1. 加载图像:从本地文件加载水果碗和价目表两张图片。

    fruit_image = Image.load_from_file(“fruit_bowl.jpg”)
    price_image = Image.load_from_file(“price_list.jpg”)
    
  2. 构建提示内容:将指令、图像和问题组合成一个有序的列表。清晰的指令结构有助于模型更好地理解任务。

    content = [
        “指令一:我想用三个香蕉、两个苹果、一个猕猴桃和一个橙子制作水果沙拉。这是我水果碗的图像。”,
        fruit_image,
        “指令二:根据以上指令,这是我当地超市的水果价格表。”,
        price_image,
        “问题:1. 描述我碗里有哪些水果及数量。2. 根据食谱,我缺少什么水果?3. 我还需要购买的水果的价格和总费用是多少?”
    ]
    
  3. 调用模型并获取响应:将构建好的内容列表发送给模型。

    response = model.generate_content(content)
    print(response.text)
    

执行结果分析

模型成功识别出碗中有“两个香蕉和两个苹果”。对比食谱需求,它准确地指出缺少“一个香蕉、一个猕猴桃和一个橙子”。最后,它从价目表图像中提取了对应水果的价格(香蕉0.80美元,猕猴桃1.25美元,橙子0.99美元),并正确计算出总费用为3.04美元。

这个例子展示了模型如何跨越文本和图像模态进行推理,根据视觉信息回答复杂的计算性问题。


用例二:基于图像的多模态推荐系统 🛋️

在学会了基础的信息提取后,本节我们将探索一个更贴近生活的应用:使用多模态模型作为推荐系统,为客厅挑选合适的椅子。

在这个用例中,我们将向模型提供一张客厅图片和四把不同椅子的图片,要求模型以室内设计师的身份,评估每把椅子是否与客厅风格相匹配。

步骤分解

以下是构建家具推荐系统的步骤:

  1. 加载所有图像:加载客厅图像和椅子图像列表。
    room_image = Image.load_from_file(“living_room.jpg”)
    chair_images = [Image.load_from_file(f“chair_{i}.jpg”) for i in range(1, 5)]
    

  1. 构建组合提示:这次我们将所有指令和图像一次性组合在一个变量中,这是一种更简洁的提示构建方式。
    recommendation_content = [
        “你是一名室内设计师。考虑以下椅子:”,
        *chair_images, # 解包椅子图像列表
        “以及我的房间:”,
        room_image,
        “请针对每一把椅子,解释它是否适合这个房间的风格。”
    ]
    
    注意:在构建提示时,需注意多余的空白可能会影响模型响应,因此最好打印检查一下提示的最终格式。

  1. 获取推荐结果:发送提示并解析模型的回答。
    response = model.generate_content(recommendation_content)
    print(response.text)
    

执行结果分析

模型对每把椅子都给出了详细评估。例如,对于一把由木头和金属制成的椅子,模型认为它“不适合”,因为房间是现代风格,具有简洁的线条。而对于另一把具有时尚现代设计、采用中性软面料的椅子,模型则认为它“非常适合”,能与房间的线条和颜色相得益彰。

重要的是,模型的判断不仅基于颜色,还考虑了材质、设计风格与房间整体氛围的协调性,展现了深层次的视觉理解能力。


用例三:处理复杂文档与策略检查 📄

接下来,我们将挑战一个更复杂的任务:使用功能更强大的Gemini 1.5模型来处理质量不佳的收据图像,并结合文本文档(公司政策)进行费用合规性检查。

这个用例模拟了真实的财务审核场景,模型需要整合图像中的结构化数据(收据项目)和文本中的非结构化规则(政策条款)。

步骤分解

以下是实现费用审核自动化的工作流程:

  1. 导入更强大的模型:Gemini 1.5支持更长的上下文(最多100万tokens),适合处理冗长文档。

    model = GenerativeModel(“gemini-1.5-pro-001”)
    
  2. 加载多模态输入:加载收据图像和公司政策文本文件。

    receipt_images = [Image.load_from_file(f“receipt_{i}.jpg”) for i in range(1, 4)]
    with open(“travel_policy.txt”, “r”) as f:
        company_policy = f.read()
    
  3. 构建详细提示:为模型设定角色、规则和具体任务清单。特别要求模型在信息不足时保持透明。

    audit_content = [
        “指令:请基于提供的信息如实回答。如果信息不足无法确定答案,请明确指出。”,
        “角色:你是一名人力资源专业人士和差旅费用专家。”,
        “任务:你正在审核一次商务旅行的费用报销。请根据以下收据和公司政策完成审核:”,
        “1. 逐项列出所有收据上的项目(含税)。”,
        “2. 计算总销售税。”,
        “3. 从收据中,单独提取‘员工与同事共餐’中员工本人的餐费(仅肯德基碗餐)。”,
        “4. 计算其他人的用餐金额。”,
        “5. 根据公司政策检查所有费用,并标记任何问题。”,
        “公司政策:”, company_policy,
        “收据:”, *receipt_images
    ]
    
  4. 执行审核并分析结果:模型将输出详细的审核报告。

    response = model.generate_content(audit_content)
    print(response.text)
    

执行结果分析

模型成功完成了多项任务:

  • 信息提取:从模糊的收据图像中准确逐项列出了所有费用。
  • 分类计算:区分了员工个人餐费与同事的餐费,并分别计算。
  • 策略合规性检查:根据政策文本,成功标记了问题费用。例如,它发现“绿色冰沙”属于政策中明确规定的不可报销项目,并指出了每日限额超标的问题。

这个案例展示了多模态模型在处理质量参差不齐的视觉信息,并将其与复杂文本规则相结合以做出综合判断方面的强大能力。


课程总结 🎯

本节课中,我们一起学习了使用大型多模态模型处理图像提示的核心方法。我们通过三个循序渐进的案例掌握了:

  1. 跨模态推理:让模型根据图像内容回答文本问题,并进行简单计算(水果成本计算)。
  2. 视觉风格推荐:利用模型对图像风格、颜色、材质的理解,构建简单的推荐系统(家具搭配)。
  3. 文档与策略审核:结合长文本上下文和图像处理能力,完成复杂的信息提取与规则校验(费用报销审核)。

关键收获在于,通过精心构建的提示(清晰的指令、有序的内容结构),我们可以引导模型在文本和图像之间建立联系,完成从简单信息查询到复杂逻辑判断的各种任务。在下一节课中,我们将把目光投向动态的视觉内容——视频,学习如何利用模型分析视频并解决“大海捞针”式的信息检索问题。

006:视频用例

概述

在本节课中,我们将学习如何使用Gemini模型与视频进行交互。我们将探索如何从视频中提取标题、描述和元数据,如何基于视频内容进行问答,以及如何利用模型的大上下文窗口在长视频中执行“大海捞针”式的信息检索。


准备工作:初始化环境与模型

上一节我们介绍了课程的整体目标,本节中我们来看看如何设置环境以开始使用Gemini处理视频。

首先,我们需要运行辅助函数来使用Gemini API。这包括认证和初始化SDK。

# 导入必要的库并初始化Gemini SDK
import google.generativeai as genai

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-gmn-mtmdl-pmt/img/eb8418e6f6da5b93d59d345525bbe8c7_5.png)

# 配置API密钥和区域
genai.configure(api_key='YOUR_API_KEY', transport='rest')

# 导入模型
model = genai.GenerativeModel('gemini-pro-vision')

Gemini Pro Vision 模型能够处理图像、视频和文本输入,是我们本节课将使用的主要工具。


用例一:为网站生成视频元数据

在第一个用例中,你将扮演一名数字营销人员,需要处理一个即将发布在网站上的视频。为此,我们需要从视频中提取标题、描述和用于网站后端的元数据。

加载并显示视频

首先,我们需要加载视频。这里我们使用一个关于顶点AI和LangChain的视频作为示例。

import IPython.display
video_uri = "gs://your-bucket/path/to/video.mp4"
video_url = "https://storage.googleapis.com/your-bucket/path/to/video.mp4"

# 在笔记本中显示视频
IPython.display.display(IPython.display.Video(video_url))

关键优势:与传统的计算机视觉模型不同,在使用Gemini模型前,你无需对视频进行任何预处理(如格式转换、尺寸调整)。Gemini可以处理多种流行的文件格式(如MP4、MOV、MPEG)和几乎任何尺寸的视频。

构建提示词

接下来,我们为模型编写提示词。为了提高输出的质量,我们将提示词结构化,分为角色、任务和输出格式几个部分。

以下是构建提示词的步骤:

  1. 指定角色:为模型设定上下文,例如“你是一名数字营销人员”。
  2. 明确任务:逐步列出模型需要完成的具体任务。
  3. 定义输出格式:指定我们希望答案以何种结构返回。
# 定义提示词的各个部分
role = “你是一名数字营销人员,正在处理一个需要发布到网站上的视频。”
task = “””
请执行以下任务:
1. 为视频生成一个吸引人的标题。
2. 写一段简短的视频内容描述。
3. 生成网站后端所需的元数据。
“””
format_instruction = “请将元数据以JSON格式返回,包含以下键:title, description, language, company。”

调用模型并获取结果

现在,我们将视频和组合好的提示词发送给模型。

from google.generativeai.types import Part

# 从URI加载视频内容
video_part = Part.from_uri(video_uri, mime_type="video/mp4")

# 组合所有内容
contents = [video_part, role, task, format_instruction]

# 配置生成参数
generation_config = {
    "temperature": 0.1, # 控制输出的随机性
}

# 生成响应
response = model.generate_content(contents, generation_config=generation_config, stream=False)

# 打印结果
print(response.text)

输出示例
模型会返回一个包含标题、描述和结构化JSON元数据的响应。例如:

标题:在Vertex AI上使用LangChain构建AI驱动应用
描述:本视频演示了如何利用LangChain框架在Google Cloud的Vertex AI平台上构建和部署智能应用程序...
元数据:{“title”: “在Vertex AI上使用LangChain构建AI驱动应用”, “description”: “...”, “language”: “中文”, “company”: “Google”}

提示词设计技巧:将提示词分解为角色、任务、格式等独立变量,有助于代码的复用、迭代和维护。例如,若想更改输出格式,只需修改 format_instruction 变量即可。


用例二:基于视频内容的链式问答

上一节我们学习了如何提取视频的概括性信息,本节中我们来看看如何就视频的细节内容进行深入的链式提问。

在这个例子中,我们将向模型提出三个相互关联的问题,后一个问题的解答依赖于前一个问题的答案。

加载新视频

我们使用一个讲解线性回归概念的视频。

video2_uri = "gs://your-bucket/path/to/regression_video.mp4"
video2_part = Part.from_uri(video2_uri, mime_type="video/mp4")

构建链式提示词

我们将所有问题整合在一个提示词中。

prompt = “””
请观看视频并回答以下问题:
1. 视频中解释的核心概念是什么?
2. 基于问题1的答案,请解释该概念的基本数学原理。
3. 基于上述概念,请提供一个简单的Scikit-learn代码示例来说明它。
“””

contents2 = [video2_part, prompt]

获取并验证回答

response2 = model.generate_content(contents2, stream=False)
print(response2.text)

模型输出可能包括

  1. 概念:线性回归。
  2. 数学原理:公式 y = mx + b
  3. 代码示例:一段使用 sklearn.linear_model.LinearRegression 的Python代码。

重要提示:当模型生成代码时,务必进行检查和测试,因为输出可能存在错误或不准确之处。


用例三:从视频中提取信息并制表

本节我们将练习如何从视频中提取特定信息,并要求模型以结构化的表格形式返回结果,便于查看和分析。

加载示例视频

我们使用一个包含多种信息图表的视频。

video3_uri = "gs://your-bucket/path/to/infographic_video.mp4"
video3_part = Part.from_uri(video3_uri, mime_type="video/mp4")

编写提示词以生成表格

我们要求模型以Markdown表格的形式回答问题。

prompt_table = “””
请根据视频内容回答以下问题,并将答案以Markdown表格形式呈现。
表格应有两列:‘问题’和‘答案’。

问题:
1. 视频中提到搜索量最大的运动是什么?
2. 视频中提到搜索量最大的科学家是谁?
(你可以根据视频内容添加更多问题)
“””

contents3 = [video3_part, prompt_table]
response3 = model.generate_content(contents3, stream=False)
print(response3.text)

输出示例

问题 答案
搜索量最大的运动是什么? 足球
搜索量最大的科学家是谁? 尼古拉·特斯拉

注意:多模态模型有时会产生“幻觉”,即输出视频中并不存在的信息。如果遇到这种情况,可以尝试优化提示词,例如增加“如果视频中未提及,请回答‘未找到’”等指令。


用例四:大海捞针——在长视频中检索特定信息

在最后这个用例中,我们将挑战模型的极限,学习如何利用其大上下文窗口,在总计超过50分钟的三个长视频中,精准定位一段特定的代码片段。这就是所谓的“大海捞针”测试。

加载多个长视频

我们准备三个来自深度学习课程的长视频。

# 加载三个视频部分
long_video_parts = []
uris = [“uri_video1”, “uri_video2”, “uri_video3”]
for uri in uris:
    part = Part.from_uri(uri, mime_type=“video/mp4”)
    long_video_parts.append(part)

设计复杂的检索提示词

我们采用更严谨的提示词结构:角色 -> 指令 -> 内容 -> 问题。

role_needle = “你是一个专门用于分析视频内容并执行精确信息检索的AI助手。”
instruction = “””
这里有三个视频,均是‘大语言模型运维’课程的不同章节。你的回答必须严格基于这三个视频的内容。
“””
questions = “””
请完成以下任务:
1. 为每个视频生成一个不超过100字的摘要。
2. 在哪个视频中,讲师运行并解释了以下Python代码?请提供视频编号及该代码出现的大致时间戳。
代码片段:`bigquery.Client().query(...)`
“””

执行检索并分析结果

# 组合所有内容:角色、指令、三个视频、问题
all_contents = [role_needle, instruction] + long_video_parts + [questions]

response_final = model.generate_content(all_contents, stream=True)
for chunk in response_final:
    print(chunk.text)

模型可能输出

  1. 三个视频的准确摘要。
  2. 指出目标代码出现在“第二个视频”,时间戳约为“4分19秒”。

通过跳转到指定视频的对应时间点,我们可以验证模型检索的准确性。这项能力使得从海量视频内容中快速定位特定信息成为可能,极大地提升了效率。

实验建议:你可以尝试调整提示词中各部分的顺序(例如将角色描述放在最后),观察这对模型的输出有何影响,从而更深入地理解提示词工程。


总结

本节课中,我们一起学习了使用Gemini多模态模型处理视频的多种实用技巧:

  1. 生成元数据:无需预处理,即可从视频中提取标题、描述和结构化信息。
  2. 内容问答:能够基于视频细节进行链式提问和回答。
  3. 信息提取与制表:将视频中的关键信息以结构化表格形式输出。
  4. 大海捞针式检索:利用大上下文窗口,在多个长视频中精准定位特定片段。

通过将复杂的任务分解为结构化的提示词,并充分利用模型的多模态理解能力,我们可以高效地让模型“看懂”视频,并完成各类自动化处理任务。

007:使用函数调用整合实时数据 📡

在本节课中,我们将学习如何通过“函数调用”功能,为大型语言模型(如Gemini)整合实时数据。这将解决模型知识陈旧、无法查询外部数据的问题,从而提升应用程序的准确性和自动化程度。


函数调用的必要性

上一节我们介绍了模型的基本调用。本节中我们来看看当模型知识不足时,我们如何为其赋能。

想象一下,你想知道欧元对美元的当前汇率。你可能会直接询问模型:“今天欧元对美元的汇率是多少?”。

为了测试,我们首先初始化Gemini API并调用模型:

# 初始化模型并提问
prompt = "今天欧元对美元的汇率是多少?"
response = model.generate_content(prompt)
print(response.text)

模型可能会回复:“我无法访问实时信息,包括像汇率这样的金融数据。” 这表明大型语言模型存在两个主要限制:

  1. 它们在训练后知识就被“冻结”,导致信息可能过时。
  2. 它们不能主动查询或修改外部数据源。

函数调用 正是为了解决这些缺点而设计的功能。


函数调用的工作原理

那么,函数调用具体是如何工作的呢?它允许我们定义自定义函数并将其提供给模型。

以下是其工作流程的分解:

  1. 定义函数:你创建一个函数(例如 get_weather),并详细描述它的功能、参数和返回值。
  2. 模型决策:当用户提出请求(如“波士顿的天气如何?”)时,模型会分析你提供的函数列表,判断是否需要调用某个函数来获取信息。
  3. 输出结构化请求:模型不会直接执行函数,而是输出一个结构化的请求,指明应该调用哪个函数以及需要传入什么参数(例如 {“function”: “get_weather”, “location”: “Boston”})。
  4. 执行外部调用:你的应用程序代码接收到这个结构化请求后,使用任何你喜欢的编程语言、框架或库去真正调用外部API(如天气服务API)。
  5. 反馈结果:将API返回的结果(如“波士顿当前38华氏度,局部多云”)再次交给模型。
  6. 生成最终回复:模型结合原始问题和API返回的数据,生成最终回复给用户。

这种模式的优势在于,你将模型强大的语言理解能力与你对代码、API和后端系统的完全控制权结合了起来。


实战:构建汇率查询函数

理解了原理后,让我们动手构建一个能查询实时汇率的函数。我们将使用欧洲中央银行(ECB)提供的开源汇率API。

首先,我们查看目标API的返回格式:

import requests

url = “https://api.frankfurter.app/latest”
response = requests.get(url)
print(response.json())

API返回的JSON数据类似这样,其中基础货币是欧元:

{
  “base”: “EUR”,
  “rates”: {
    “USD”: 1.0808,
    “SGD”: 1.4623,
    ...
  }
}

接下来,我们需要为模型定义函数声明。以下是关键步骤:

首先,导入必要的类并定义函数规范。函数声明需要详细描述函数的目的、参数及其类型。

from google.generativeai.types import FunctionDeclaration, Tool

![](https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dlai-gmn-mtmdl-pmt/img/187a3e88282a073c6353fd0efed7d4df_19.png)

# 1. 定义函数声明
get_exchange_rate_func = FunctionDeclaration(
    name=“get_exchange_rate”,
    description=“获取两种货币之间的汇率”,
    parameters={
        “type”: “OBJECT”,
        “properties”: {
            “date”: {“type”: “STRING”, “description”: “获取汇率的日期,格式为YYYY-MM-DD”},
            “from”: {“type”: “STRING”, “description”: “要转换的起始货币代码,如EUR、USD”},
            “to”: {“type”: “STRING”, “description”: “要转换成的目标货币代码,如SGD、SEK”}
        },
        “required”: [“date”, “from”, “to”]
    }
)

然后,将函数声明封装到一个工具(Tool)中,供模型使用。

# 2. 将函数声明封装到工具中
exchange_rate_tool = Tool(
    function_declarations=[get_exchange_rate_func]
)

现在,我们可以向模型提问,并传入我们定义的工具。

# 3. 向模型提问,并传入工具
prompt = “澳大利亚元到瑞典克朗的汇率是多少?500澳大利亚元在瑞典克朗中值多少钱?”
response = model.generate_content(prompt, tools=[exchange_rate_tool])
print(response.text)

模型会分析问题,并判断需要调用 get_exchange_rate 函数。它返回的将不是一个自然语言答案,而是一个结构化的函数调用请求:

{
  “function_call”: {
    “name”: “get_exchange_rate”,
    “args”: {
      “date”: “2024-12-07”,
      “from”: “AUD”,
      “to”: “SEK”
    }
  }
}

执行API调用并生成最终回复

模型给出了结构化请求,接下来就需要我们的代码来执行真正的API调用。

首先,我们从模型的响应中提取出函数调用参数。

# 4. 从模型响应中提取函数调用参数
response_dict = response.candidates[0].content.parts[0].function_call
func_name = response_dict.name
args = response_dict.args

# args 现在是一个包含 {‘date’: ‘2024-12-07’, ‘from’: ‘AUD’, ‘to’: ‘SEK’} 的字典

然后,使用这些参数调用真实的汇率API。

# 5. 使用参数调用真实API
api_url = f“https://api.frankfurter.app/{args[‘date’]}”
params = {“from”: args[‘from’], “to”: args[‘to’]}
api_response = requests.get(api_url, params=params).json()
# api_response 可能为 {‘rates’: {‘SEK’: 7.1513}, ‘base’: ‘AUD’, ‘date’: ‘2024-12-07’}

最后,将API返回的结果再次传递给模型,让它结合原始问题生成最终的自然语言回复。

# 6. 将API结果反馈给模型,生成最终回复
final_response = model.generate_content([
    prompt, # 用户原始问题
    response.candidates[0].content.parts[0], # 模型的函数调用请求
    api_response # 真实的API结果
])
print(final_response.text)

模型会输出类似这样的最终答案:“当前汇率是1澳元兑7.1513瑞典克朗,500澳元价值3575.65瑞典克朗。”


函数调用的优势与应用场景

通过以上步骤,我们完成了一个完整的函数调用流程。让我们总结一下函数调用的关键优势:

  • 简化用户体验:用户无需在应用和模型间手动切换或复制信息。
  • 减少错误:自动化数据传递避免了手动输入可能产生的错误。
  • 提升自动化:为更复杂的操作(如航班预订、酒店查询)提供了由自然语言直接触发的可能。

函数调用适用于任何需要为模型注入最新、特定外部信息的场景,例如:

  • 客户服务:查询企业API,获取产品库存、最新价格。
  • 旅行应用:获取实时航班信息、酒店价格并完成预订。
  • 资讯应用:获取最新新闻、天气或金融市场数据。

总结

本节课中,我们一起学习了如何使用Gemini的函数调用功能来整合实时数据。我们了解了其工作原理,并一步步实践了如何定义函数声明、处理模型的结构化请求、执行外部API调用,以及将结果反馈给模型以生成最终答案。通过这种方式,我们可以有效克服大型语言模型的知识时效性限制,构建出更强大、更智能的应用程序。

008:总结 🎯

在本节课中,我们将一起回顾整个课程的核心内容,总结关于使用Gemini大型多模态模型进行提示的关键知识与技能。

课程概述

在之前的章节中,我们学习了Gemini模型的不同类型,探索了如何使用文本、图像和视频来提示多模态模型,并研究了高效多模态提示的最佳实践。此外,我们还探讨了涉及图像和视频的各种应用场景,例如从复杂内容中提取特定信息,以及解决“大海捞针”式的难题。最后,我们学习了如何通过函数调用整合实时数据,以增强语言模型的能力。

核心内容总结

以下是我们在本课程中共同学习的主要内容要点:

  1. 模型类型:我们了解了Gemini系列中不同规模和用途的模型,例如适用于快速响应的gemini-pro和专为视觉任务设计的gemini-pro-vision

  2. 多模态提示:我们掌握了如何构建有效的提示(Prompt),使其能够同时处理文本、图像乃至视频输入。一个基础的文本提示结构如下:

    prompt = “请描述这张图片中的主要内容。”
    
  3. 最佳实践:我们研究了提升提示效果的方法,包括明确任务指令、提供上下文示例(Few-shot Learning)以及结构化输出要求。

  4. 应用用例:我们探索了多模态模型在具体场景中的应用,例如:

    • 信息提取:从一张包含文字和图表的产品图中提取价格、规格等关键数据。
    • 大海捞针”测试:在冗长的文本或复杂的图像中,定位并回答一个非常具体的问题,以检验模型的理解与检索能力。
  5. 扩展与集成:我们学习了通过函数调用(Function Calling) 将大模型与外部API或数据库连接起来。这使得模型不仅能生成回答,还能触发实际行动,例如获取实时天气数据或查询最新股价。其基本流程可以概括为:
    用户查询 -> 模型识别意图并生成函数调用请求 -> 执行外部函数获取实时数据 -> 模型整合数据生成最终回答

结束语

本节课中,我们一起回顾了使用Gemini进行大型多模态模型提示的核心知识体系。从认识模型本身,到掌握文本、图像、视频的提示方法,再到学习提示工程的最佳实践和探索丰富的应用场景,最后延伸到通过函数调用实现与实时数据的集成。希望这些内容能帮助你更好地理解并运用多模态大模型来解决实际问题。

posted @ 2026-03-26 08:11  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报