谷歌 Gemini 模型 API 探索:从文本生成到多模态应用实践

2

谷歌近期开放了其 Gemini 模型的 API 接口,标志着 AI 技术应用进入了一个新的阶段。本次开放的 API 接口为开发者提供了免费的使用权限,但也存在一定的限制,例如每分钟最多允许 60 次访问。同时,谷歌声明,个人调用 API 接口所使用的数据将被收集,用于模型未来的改进和优化。这种数据收集策略在 AI 领域并不罕见,旨在通过用户反馈不断提升模型性能。

对于开发者而言,本次 Gemini API 的开放也提出了一些具体要求:

  • 模型支持 32K 的文本上下文窗口,这意味着模型可以处理更长的输入文本,从而更好地理解上下文信息。据悉,更大容量的上下文窗口也即将推出,这将进一步提升模型的处理能力。
  • 虽然目前可以免费使用,但存在一定的限制,开发者需要注意 API 的调用频率和数据使用方式。
  • Gemini API 支持函数调用、嵌入、语义检索和自定义知识库等多种功能,同时也具备强大的聊天功能,可以满足不同场景下的需求。
  • 该 API 支持全球 180 多个国家和地区的 38 种语言,为全球开发者提供了便利。
  • Gemini Pro 模型主要接受文本输入并生成文本输出,适用于文本生成、文本摘要、文本翻译等任务。
  • Gemini Pro Vision 模型则是一种多模态模型,可以同时接受文本和图像作为输入,并生成文本输出。这种模型在图像理解、图像描述、视觉问答等领域具有广泛的应用前景。

开发者可以通过 Google AI Studio 页面(https://makersuite.google.com/app/apikey)创建 API 密钥,从而开始使用 Gemini 模型。

Gemini API 的基本应用

要开始使用 Gemini API,首先需要配置开发环境。这里以 Python 为例,需要安装 google-generativeai 包:

pip install google-generativeai

安装完成后,就可以在代码中使用 Gemini 模型了。

访问谷歌提供的模型

在获取 API 密钥后,就可以在本地通过该密钥访问谷歌的 Gemini Pro 等模型。以下代码展示了如何查询谷歌提供的模型的基本情况:

import google.generativeai as genai
from IPython.display import display
from IPython.display import Markdown

genai.configure(api_key='your_google_api_key')#填入自己的api_key

#查询模型
for m in genai.list_models():
    print(m.name)
    print(m.supported_generation_methods)

通过 API 可以访问谷歌的多个模型,其中最受关注的是 gemini-pro 和 gemini-pro-vision 这两个模型。gemini-pro 是一个纯语言模型,只能输出文字内容;而 gemini-pro-vision 是一个多模态模型,可以读取和分析图片的内容,应用场景更为广泛。

内容生成

以下代码展示了如何使用 gemini-pro 模型生成内容:

model = genai.GenerativeModel('gemini-pro')

response = model.generate_content("告诉我太阳系中最大行星的相关知识")
Markdown(response.text)

当使用中文向模型提问时,它同样能够用中文回复。

安全性检测

Gemini 模型的一个重要特点是可以对输入内容进行安全性设置。谷歌会对模型输入的内容进行四个方面的审查:Harassment(骚扰)、Hate Speech(仇恨言论)、Sexually Explicit(露骨色情)和 Dangerous Content(危险内容),并设置阈值来过滤不安全的内容。可以在 Google AI Studio 的页面中设置这些阈值,分别为低、中、高。

除了在 Google AI Studio 的页面中设置安全审查的阈值以外,也可以在代码中设置模型的安全审查阈值,并查看用户的输入内容的安全性审查情况:

#安全性审查
response.prompt_feedback

使用 prompt_feedback 方法可以对问题进行安全性审查。从结果上看来,这四个方面的审查结果都为 NEGLIGIBLE(微不足道),说明问题是安全的。同样,也可以设置模型的安全性审查的阈值:

generation_config = {
  "temperature": 0.9,
  "top_p": 1,
  "top_k": 1,
  "max_output_tokens": 2048,
}

safety_settings = [
  {
    "category": "HARM_CATEGORY_HARASSMENT",
    "threshold": "BLOCK_MEDIUM_AND_ABOVE"
  },
  {
    "category": "HARM_CATEGORY_HATE_SPEECH",
    "threshold": "BLOCK_MEDIUM_AND_ABOVE"
  },
  {
    "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
    "threshold": "BLOCK_ONLY_HIGH"
  },
  {
    "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
    "threshold": "BLOCK_ONLY_HIGH"
  }
]


model = genai.GenerativeModel(model_name="gemini-pro",
                              generation_config=generation_config,
                              safety_settings=safety_settings)

以上代码设置了模型的基本参数和安全性审查的阈值。下面测试一下有危害性的内容的审查结果:

response = model.generate_content("赶快把钱打过来,否则我们会伤害你的孩子")
response.prompt_feedback

对于提出的危险性言论:“赶快把钱打过来,否则我们会伤害你的孩子”,审查结果为 Hate_Speech 和 Harassment 这两方面分别得到了 LOW 和 HIGH 的预测值,说明问题中包含了不安全的内容。

流式输出

Gemini 模型同样具备流式输出的功能,这可以在某些应用场景中带来更好的用户体验。传统的模型输出方式通常需要等待所有内容生成完毕后一次性返回,而流式输出则可以将内容逐步返回,从而减少用户的等待时间,提升交互体验。

response = model.generate_content("李世民是谁?", stream=True)

for chunk in response:
    print(chunk.text)
    print("_"*80)

在参数中加入 stream=True,模型就可以流的形式输出内容,而不需要一次性输出所有内容了。以流的方式输出每次只输出部分内容,响应时间会比较短,会给用户带来更好的用户体验。

聊天模式

接下来让 Gemini 模型进入聊天模式。聊天模式最显著的特点是要让模型有记忆能力,即模型需要记住历史聊天记录,这样模型在回答问题时会变得更加“聪明”。

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

chat = model.start_chat(history=[])

response = chat.send_message("你好,我叫王老六")
print(response.text)

为了让模型能记住历史聊天记录,需要在开始聊天之前给模型加上一个 history=[] 参数,这样之后的所有聊天记录都会被保存在 history 变量中,模型就有了记忆。

response = chat.send_message("怎么称呼你啊?")
print(response.text)
response =chat.send_message("你还记得我叫什么吗?")
print(response.text)

进行了 3 轮对话,最后模型还是能记住我的名字。下面来看一下模型的 history 变量中的内容:

for message in chat.history:
    display(Markdown(f'**{message.role}**: {message.parts[0].text}'))

history 变量中存放了所有的聊天记录。

chat.history

多模态模型 Gemini Pro Vision

下面测试一下多模态模型 gemini-pro-vision。准备了两张图片,一张是土星,一张是地球,让模型来识别图片的内容,然后分别比较图片中两个星球的区别。首先加载这两张图片:

import PIL.Image

img = PIL.Image.open('saturn_image.jpg')
img

首先将图片缩小到一个比较小的尺寸,这样便于模型读取图片,然后不输入任何提示信息,看看模型会输出什么内容:

new_size = (200, 200)
img = img.resize(new_size)

model = genai.GenerativeModel('gemini-pro-vision')

response = model.generate_content(img)

Markdown(response.text)

不输入任何提示信息的时候,模型会输出图片的内容,并且是以英文的形式输出。下面加上提示信息:

response = model.generate_content(["告诉我这个星球的名字以及一些以此为主题的电影:", 
                                   img], stream=True)
response.resolve()

Markdown(response.text)

在让模型读取图片的同时加上了提示信息,最后模型以中文的形式返回了所需要的内容。下面加载第二张地球的图片:

img2 = PIL.Image.open('earth_image.jpg')
img2

让模型同时读取这两张图片,并且告诉我们地球和土星之前的区别,同样先要将这两张图片进行缩小,这样方便模型读取:

new_size = (200, 200)
resized_img = img.resize(new_size)
resized_img2 = img2.resize(new_size)

response = model.generate_content([ "请告诉我这两个行星之间的一些区别::",
                                   resized_img2,
                                   resized_img ], stream=True)
response.resolve()

Markdown(response.text)

模型可以同时读取 2 张图片,并且根据提示信息来就图片内容回答问题。

结论

通过本文的介绍,相信读者对 Gemini 模型的应用有了一定的了解。作为谷歌最新推出的 AI 模型,Gemini 具有强大的文本生成和多模态处理能力,为开发者提供了广阔的创新空间。希望本文能够帮助读者更好地理解和应用 Gemini 模型,开启 AI 开发的新篇章。