跳转到内容

谷歌Gemini多模态提示词培训课——Part1

本系列课程是Deeplearning联合谷歌Gemini团队开发的免费在线课程,课程中使用了Gemini模型作为教学模型,教授大家如何使用多模态提示词与模型交互。由于课程内容中有很多在国内无法应用的部分,在其之中也缺乏了某些概念。有鉴于此,我截取了部分教程内容,并适当混合了一些入门概念。将其进行重新整理和刊发,以增强其普世价值。(如有需要,请访问原版在线课程


在这个系列中你可以学到:

  1. 了解什么是多模态大模型
  2. 了解Gemini系列模型
  3. 使用 Gemini API 进行多模态提示词最佳实践(其提示词理念也同样也适用于完整AI产品的交互,0代码读者不必过多担心)

一、什么是多模态大模型(MLLM)

多模态大模型(MLLM)是一种在统一的框架下,集成了多种不同类型数据处理能力的深度学习模型,这些数据可以包括文本、图像、音频和视频等,通过整合这些多样化的数据,MLLM 能够更全面地理解和解释现实世界中的复杂信息。

这种多元化的数据处理能力使得 MLLM 在面对复杂任务时表现出更高的准确性和鲁棒性。通过综合分析不同类型的信息,这些模型能够得出更加全面和准确的结论,从而在各种应用场景中发挥重要作用。

下方是一个典型 MLLM 架构的示意图。它包括一个编码器、一个连接器和一个 LLM。可以选择性地在 LLM 上附加一个生成器,以生成除文本之外的更多模态。编码器接收图像、音频或视频并输出特征,这些特征经由连接器处理,使 LLM 能更好地理解。连接器大致可分为三类:基于投影的、基于查询的和基于融合的连接器。前两种类型采用词元级融合,将特征处理成词元,与文本词元一起发送,而最后一种类型则在 LLM 内部实现特征级融合。

注:词元=Token

二、 为什么要学习多模态大模型

多模态技术可以从图像中提取文本,使从表情包或文档扫描中提取文本成为可能。它还能理解图像或视频中发生的事情,识别物体、场景,甚至情绪。

假设有人想为一只猫买新衣服,他可以给模型提供两张猫的图片。同时,他可以提供一个文本提示,询问什么样的衣服适合这只猫。图像和文本将作为模型的输入。模型随后会给出响应,建议最适合这只猫的衣服。基于这两张图片,输入可以是交错的,意味着它可以是文本、图像、音频的混合。在这个例子中,有一个图像,然后是文本提示,接着是另一个图像。这个顺序可以改变,而且顺序很重要。课程稍后会详细讨论这一点。

这是一个关于学生解决物理问题答案的例子。有一个包含问题和学生答案的图像,以及一个文本提示。模型被要求逐步推理这个问题,然后判断学生是否给出了正确答案。如果解决方案是错误的,模型需要解释错误之处并解决问题。在这个例子中,提供了一个文本提示和一个图像。在输出部分,可以看到模型的答案。值得注意的是,模型能够跨文本和图像进行推理。图像中包含文字和绘图,而模型的响应既包含文本,又包含一些 LaTeX 公式。

三、认识Gemini模型

Gemini 不仅是单一模型,而是一个模型系列,旨在满足不同需求。可以将其比作为不同工作选择合适工具。这个系列包含不同大小的模型,每种大小都针对特定的计算限制和应用需求而定制。

首先是 Gemini Ultra,这是系列中最大和最强大的模型。它在广泛的高度复杂任务中提供最先进的性能,包括推理和多模态任务。然而,使用最大的模型并不总是最佳策略。这可以比作用卡车去快速购物,有些过度了。在大型语言模型的世界里也存在类似的权衡。最大的模型虽然非常强大,但有时响应速度可能稍慢。

Gemini Pro 被设计为多功能的主力模型。它是一个经过性能优化的模型,平衡了模型性能和速度。这个模型具有很强的泛化能力。这些特点使它非常适合需要模型既能力强、提供高质量响应,又能非常高效地提供响应的广泛应用。

还有 Gemini Flash,这是一个专门为高容量任务设计的最快、最具成本效益的模型,提供更低的延迟和成本。它非常适合需要模型快速提供响应的用例。例如,如果有人正在构建一个需要即时回答常见问题的客户服务聊天机器人,或者开发一个需要跟上快节奏对话的实时语言翻译工具,Gemini Flash 对速度和效率的强调使其非常适合这些类型的高要求用例。

最后是 Gemini Nano。它是 Gemini 家族中的轻量级成员,专门设计用于直接在用户设备上运行,例如 Pixel 手机。

关于 Nano,它是通过一个叫做模型蒸馏的过程来实现的。模型蒸馏可以比作教学过程。一个大型专家模型(老师)将其知识传递给一个更小、更紧凑的模型(学生)。目标是让学生模型学习最重要的技能,而不需要与老师相同的庞大资源。在 Nano 的情况下,开发者从更大的 Gemini 模型中提炼知识,创建一个可以舒适地在智能手机和其他设备上运行的模型。

至于在设备上运行模型,有几个原因。首先,可能需要本地处理敏感数据,在本地处理数据可以避免将用户数据发送到中央服务器,这对于处理敏感数据的应用可能很重要。其次,它支持离线访问。用户即使在没有互联网连接的情况下也可以访问 AI 功能。这对需要离线工作或在网络连接不稳定的情况下工作的应用很有用。

四、如何挑选合适的模型

面对如此多不同的模型,人们可能会感到困惑。除了 Gemini 模型系列,还有像 llama 这样的其他模型。而且在这些模型系列中,还有不同的版本。

这种情况可能会让人感到非常困惑,不知道如何为特定用例选择正确的模型。选择最佳模型并不是一刀切的情况。正如前面所看到的,每个模型都有自己的优势和权衡。

选择模型时,首先要明确想要构建什么,比如聊天机器人或内容生成工具。不同的任务和用例可能更适合不同的模型和能力。一旦理解了用例,可以将其对照下面这个三个轴来评估需求。

  1. 模型能力:仔细评估模型规格,确认它是否符合特定用例。例如,需要考虑模型是否能处理文本,或者是否也能处理图像。
  2. 延迟:考虑模型应用需要多快响应。如果实时交互很重要,就需要一个能快速生成响应的模型。
  3. 成本:较大的模型通常提供更优越的性能,但计算成本也更高。需要在性能和成本之间权衡。

为了选择合适的模型,可以根据这些要求评估特定用例。例如,如果正在开发一个图像搜索工具,可能需要优先考虑具有出色图像处理能力的模型。

五、第一次与Gemini模型交互

请注意,这里的部分操作需要搭配Google云服务或自备API才可以正常练习,具体内容请移步这里

(友情提示,从这一部分及以后内容,多数都会是配合代码完成的,如果你是0代码学习者,尝试看懂提示词,并在一些AI产品上尝试使用)

5.1 初始设置

接下来,课程将深入探讨代码部分。为了运行这个笔记本,需要执行一些设置代码。首先,需要导入 utils 并进行身份验证,这意味着需要设置一些凭证和项目 ID,以便能够从笔记本环境调用云端的 Gemini API。项目包含在云中使用的资源和 Gemini API。这个设置过程确保了笔记本能够正确连接和使用 Gemini 模型。

对于本课程,还需要指定一个区域,即代码将在哪里执行。在这种情况下,使用的是 us-central1。

接下来,课程将导入 Vertex AI SDK。Vertex AI SDK 可以看作是一个 Python 工具包,帮助用户与 Gemini 交互。通过这个 SDK,可以使用 Python 调用 Gemini API 并获得响应。

在笔记本中,需要初始化 Vertex SDK。这意味着需要告诉 SDK 以下信息:

  1. 使用的项目
  2. 想要使用 Gemini 模型的区域
  3. 用户凭证

通过提供这些信息,Gemini API 就能识别用户身份,并确认用户有权使用 API。

为了使用 Gemini API,需要从 SDK 中导入 generative_model。设置完成后,需要指定具体的模型。这可以通过设置 model 变量来完成,使用刚刚导入的 generative_model,并选择特定的 Gemini 模型。

在这个案例中,课程将使用 Gemini 1.0 Pro 版本。这个选择反映了对于当前任务,Gemini Pro 可能是最合适的平衡点,提供了良好的性能和效率。

5.2 基于文本交互

我们先从一个简单的提示开始,问问 "什么是多模态模型?"。我们用刚刚设置的模型来试试。运行这个代码后,你就能看到 API 的输出了。别客气,随意改改提示,跟 Gemini Pro 玩玩,看看它会给出什么有趣的回答。

你可能在想,这个辅助函数(即:gemini("提示词",model))里到底发生了什么。让我给你解释一下我们是怎么用 SDK 调用 API 的。首先,我们需要一个提示。有了提示后,我们就用 model.generate_content 来调用 API。就是这么简单。

所以,让我们直接尝试一下使用刚才声明好的model对象来与模型交互。首先声明一个名称为prompt_1的变量,并将提示词字符串赋值给它。

这里有个很酷的功能 —— 流式传输。你知道,通常使用大型语言模型时,你得等整个响应完成才能看到结果。但是,如果我们启用流式传输,就不用等那么久了。你可以在响应生成的过程中就开始看到内容。想象一下,如果你在做一个实时聊天机器人,你肯定不想让用户等太久。有了流式传输,你就能在响应生成的同时就开始展示给用户了。

5.3 基于图像交互

现在我想给大家展示如何用 Gemini 处理图像和文本,然后得到文本响应。首先,我们需要从 Vertex AI SDK 导入一些额外的类。你已经知道 generative_model 了,对吧?我们还要添加 image 这个类。有了它,我们就能处理图像并把它们发送到 Gemini API。另外,我们还要导入 Part。这个很有用,特别是当我们想组合不同类型的内容时。比如说,我们想把文本和图像放在一起发送给 Gemini API,Part 就派上用场了。

这样一来,我们就为处理更复杂的输入做好了准备。你觉得怎么样?这样解释是不是更容易理解了?

接下来,我们可以导入我们的多模态模型。在这种情况下,我们使用的是 Gemini 1.0 Pro Vision,它可以用于图像或视频等数据。

接下来,我们需要准备一个提示和一张图片。我这里有一张吴恩达的很酷的照片,我们要让模型描述一下这张图里有什么。

首先,我们要加载这张本地图片。然后,我们准备好提示。有意思的是,我发现把图片放在前面,提示放在后面,能得到更好的回答。所以我会把图片和提示组合在一起,按这个顺序发送给 Gemini API。你知道吗?这个顺序其实挺重要的。我试过不同的组合,发现这样做效果最好。这就是为什么我们要把图片放在前面,然后才是文字提示。

这样一来,我们就准备好让 Gemini 分析这张图片了。

让我们看看图像和提示。所以这里你可以看到我们有一个 吴恩达拿着锤子和电钻的图片(看到这我要笑死🤣)。

我们要求 Gemini 描述这个图像中有什么。让我们调用 API,看看它的响应。我把图像和提示都发送给 Gemini,Gemini 给我们一个响应,说图像显示一个男人拿着锤子和电钻。是的,它还注意到 吴恩达在微笑。

让我们问个更有趣的问题:这个人可能的职业是什么?你可以再次运行 content_image,打印图像和提示,但也可以跳过。然后用 Gemini Vision,用新提示但同一张图来获取输出。结果显示这个人可能是修理工、木匠或建筑工人。通过这个提示,我们不只是描述图像,还让模型推理这人的职业。它注意到人拿着锤子和电钻,这些是这些职业常用的工具。

以前,我们需要先用图像模型描述,然后把输出发送给大型语言模型来推理或得出结论。现在,我们直接把图像和提示一起发给 Gemini 模型来推理图像。这是一步完成的。

这就是如何用文本提示和图像一起发送给 Gemini 的例子。

5.4 基于视频的交互

现在我们来做点不同的。我们要用一个视频和一个提示,让模型描述视频内容。首先,我们需要一个视频。这次我想换种方式。我们不用本地视频,而是从云环境加载一个。

我这么做是因为在实际应用中,图像或视频可能不总是本地可用的。如果你用 Gemini 构建应用,你可能会在云中存储图像或视频。所以你得学会从其他地方加载它们。这样,我们就能模拟更真实的使用场景了。

在这个例子中,我们用的是云存储桶。你可以把它想象成云中的一个存储环境,我可以在那里存我的图像或视频。我们这里用的是一个 URI,它告诉我们视频在哪里。现在我们有了一个 URI 和一个 URL。你可能想知道它们有什么区别。

URI 是一个唯一的字符串。就像我们这里看到的,它像个数字地址,可以精确定位任何类型的资源,不管是在线的还是离线的。在我们这个例子里,它指向的是 Google Cloud 里的一个存储环境,我们的视频就存在那里。

有了视频之后,我们还需要一个提示。这次的提示比之前的要复杂一些。我设计了几个问题,这些问题需要看完整个视频才能回答。

我们要问的问题包括:这个人的主要职业是什么?视频中突出显示的手机有什么主要特点?还有,这段视频是在哪个城市录制的?这样的提示设计可以测试模型对视频内容的全面理解能力。它需要模型不仅要识别视频中的人物和物品,还要理解上下文,甚至推断一些可能没有直接展示的信息。

现在我们有了提示,也有了视频。我们已经准备好,让 Gemini 来分析这段视频了。

现在我们要加载视频,然后再次组合内容。我们把视频和提示组合在一起,准备一起发送给 Gemini API。

就像我们之前做的那样,我们用 generate_content 这个函数。我们把视频和提示都发送过去,同时把 streaming 设置为 true。

这样做可以让我们实时看到 Gemini 的分析结果,而不是等待整个处理过程完成。使用流式传输对于处理视频这样的大型内容特别有用,因为它可以让我们更快地得到初步结果。

现在让我们看看模型是如何回答我们关于视频的问题的。模型告诉我们,视频中的人是一个摄影师。它还指出手机的特点是 Night Sight 和 Video Boost。至于录制地点,模型认为是在东京。

你可以自己看看视频,检查一下模型的回答是否准确。我鼓励你也看看代码,试试看能不能改变模型的行为。比如,你可以稍微修改一下提示,看看会得到什么不同的结果。这是一个很好的机会,可以亲自体验一下模型的能力,也可以看看它在处理视频内容时的表现如何。

以上为part1中的所有内容,后面会坚持更完整个教程,希望大家看完以后都能学的懂,学的会。获取最新教程请扫码关注我,谢谢。