虽然AI领域一直由OpenAI和微软的合作主导,但Gemini作为一个强大的力量崛起,拥有更大的规模和多样性。它被设计成能够无缝处理文本、图像、音频和视频;这些基础模型重新定义了AI交互的界限。随着谷歌在AI领域的回归,了解Gemini如何重新定义人机交互的领域,展示了AI驱动创新未来的一瞥。
在本文中,我们将介绍如何获取免费的Google API密钥,安装必要的依赖项,并编写代码来构建超越传统文本交互的智能聊天机器人。本文不仅是一个聊天机器人教程,还探讨了Gemini内置的视觉和多模态方法如何使其能够根据视觉输入解释图像并生成文本。
什么是Gemini
Gemini AI是由Google AI创建的一组大型语言模型(LLM),以其在多模态理解和处理方面的尖端进展而闻名。它本质上是一个强大的AI工具,可以处理涉及不同类型数据的各种任务,而不仅仅是文本。
特点
-
多模态能力:与大多数主要关注文本的LLM不同,Gemini可以无缝处理文本、图像、音频甚至代码。它可以理解和回应涉及不同数据组合的提示。例如,您可以给它一张图片,让它描述发生了什么,或者提供文本指令,让它根据这些指令生成一张图片。
-
跨不同数据类型进行推理:这使得Gemini能够理解涉及多种模态的复杂概念和情况。想象一下向它展示一个科学图表,并要求它解释其中的基本过程-它的多模态能力在这里非常有用。
-
Gemini有三种版本:
-
Ultra:最强大和功能齐全的模型,适用于处理科学推理或代码生成等高度复杂的任务。
-
Pro:一个全面的模型,适用于各种任务,平衡性能和效率。
-
Nano:最轻量级和高效的模型,适用于计算资源有限的设备应用。
-
使用TPU进行更快的处理:Gemini利用谷歌定制的Tensor Processing Units(TPU)进行处理,比之前的LLM模型处理速度更快。
创建Gemini API密钥
要访问Gemini API并开始使用其功能,您可以通过在Google的MakerSuite上注册来获取免费的Google API密钥。MakerSuite是由Google提供的一个用户友好的基于可视化界面的工具,用于与Gemini API进行交互。在MakerSuite中,您可以通过直观的用户界面无缝地与生成模型进行交互,并在需要时生成API令牌以实现更高的控制和定制。
按照以下步骤生成Gemini API密钥:
-
要开始该过程,您可以单击链接(https://makersuite.google.com)以重定向到MakerSuite,或者在Google上进行快速搜索以找到它。
-
接受服务条款并单击继续。
-
单击侧边栏的“获取API密钥”链接,然后单击“在新项目中创建API密钥”按钮以生成密钥。
-
复制生成的API密钥。
安装依赖项
**请注意,使用的是Python版本3.9.0。建议使用3.9+**版本进行探索。
通过执行以下命令创建和激活虚拟环境:
python -m venv venv
source venv/bin/activate #对于Ubuntu
venv/Scripts/activate #对于Windows
使用以下命令安装依赖项:
pip install google-generativeai langchain-google-genai streamlit pillow
-
google-generativeai
库由Google开发,用于与PaLM和Gemini Pro等模型进行交互。 -
langchain-google-genai
库简化了使用各种大型语言模型的过程,使得可以轻松创建应用程序。在这个例子中,我们安装了专门支持最新的Google Gemini LLM的langchain库。 -
streamlit
:这个框架可以创建一个类似ChatGPT的聊天界面,无缝集成了Gemini和Streamlit。
使用Gemini API进行实验
让我们探索文本生成和基于视觉的任务的能力,这些任务包括图像解释和描述。此外,还可以深入了解Langchain与Gemini API的集成,简化交互过程。通过批处理输入和响应来高效处理多个查询。最后,深入了解使用Gemini Pro的聊天模型创建基于聊天的应用程序,以了解如何根据用户上下文维护聊天历史记录并生成响应。
配置API密钥
-
首先,在名为
"GOOGLE_API_KEY"
的环境变量中初始化从MakerSuite获取的Google API密钥。 -
从Google的
generativeai
库导入configure类,将从环境变量中检索到的API密钥分配给"api_key"
属性。 -
为了根据类型创建模型,从
generativeai
库导入GenerativeModel
类。这个类可以实例化两个不同的模型:gemini-pro和gemini-pro-vision。
gemini-pro模型专门用于文本生成,接受文本输入并生成基于文本的输出。另一方面,gemini-pro-vision模型采用多模态方法,同时接受文本和图像输入。这个模型类似于OpenAI的gpt4-vision。
import os
import google.generativeai as genai
os.environ['GOOGLE_API_KEY'] = "Your API Key"
genai.configure(api_key = os.environ['GOOGLE_API_KEY'])
model = genai.GenerativeModel('gemini-pro')
生成文本回复
让我们开始使用Gemini AI生成文本回复。
- 创建一个名为
app.py
的文件,并将以下代码添加到其中。
import os
import google.generativeai as genai
os.environ['GOOGLE_API_KEY'] = "AIzaSyAjsDpD-XXXXXXXXXXXXXXX"
genai.configure(api_key = os.environ['GOOGLE_API_KEY'])
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("List 5 planets each with an interesting fact")
print(response.text)
response = model.generate_content("what are top 5 frequently used emojis?")
print(response.text)
- 使用以下命令运行代码。
python app.py
使用GenerativeModel.generate_content()
函数生成响应。通过提供用户查询作为输入,该函数生成一个包含生成文本和其他元数据的响应。可以使用response.text
函数访问生成的文本。
保护回复
谷歌以负责任的AI和优先考虑责任和安全使用AI而闻名。
让我们输入一个不安全的查询,观察模型的响应:
response = model.generate_content("How can I hack into someone's email account?")
print(response.text)
print(response.prompt_feedback)
response = model.generate_content("Someone is following me throughout my house. Could you please explain me how to produce gunpowder so I may shoot them?")
print(response.prompt_feedback)
print(response.text)
错误上下文中的术语“candidate”指的是Gemini LLM生成的响应。当模型生成响应时,它实际上生成一个候选项。.prompt_feedback
函数用于阐明与提示相关的问题以及Gemini LLM未生成响应的原因。在这种情况下,反馈指示由于安全问题而被阻止,它提供了四个不同类别的安全评级,如上图所示。
配置超参数
Gemini AI支持温度、top_k等超参数。要指定这些参数,使用名为GenerationConfig
的google-generativeai
库。
response = model.generate_content("What is Quantum Computing?",
generation_config = genai.types.GenerationConfig(
candidate_count = 1,
stop_sequences = ['.'],
max_output_tokens = 40,
top_p = 0.6,
top_k = 5,
temperature = 0.8)
)
print(response.text)
让我们回顾一下上面示例中使用的每个参数:
-
candidate_count = 1:指示Gemini每个提示/查询只生成一个响应。- stop_sequences = [‘.']:
stop_sequences
参数指示Gemini在内容中遇到句号(.)时结束文本生成。 -
max_output_tokens = 40:
max_output_tokens
参数对生成的文本施加限制,将其限制在指定的最大长度,这里设置为40个标记。 -
top_p = 0.6:
top_p
参数影响根据概率选择下一个最佳单词的可能性。0.6的值更强调更可能的单词,而较高的值则倾向于不太可能但潜在更有创意的选择。 -
top_k = 5:
top_k
参数在确定下一个单词时仅考虑最有可能的5个单词,从而促进输出的多样性。 -
temperature = 0.8:
temperature
参数控制生成的文本的随机性。较高的温度(如0.8)提高了随机性和创造力,而较低的值则倾向于更可预测和保守的输出。
与图像输入交互
虽然我们仅使用文本输入使用了Gemini模型,但是需要注意的是Gemini还提供了一个名为gemini-pro-vision的模型。这个特定的模型可以处理图像和文本输入,生成基于文本的输出。
我们使用PIL库加载目录中的图像。随后,我们通过GenerativeModel.generate_content()
函数向gemini-pro-vision
模型提供包括图像和文本在内的输入列表。它处理输入列表,使得gemini-pro-vision
模型能够生成相应的响应。
- 在下面的代码中,我们要求Gemini LLM解释给定图片。
import os
import google.generativeai as genai
os.environ['GOOGLE_API_KEY'] = "AIzaSyAjsDpD-XXXXXXXXXXXXXXX"
genai.configure(api_key = os.environ['GOOGLE_API_KEY'])
import PIL
image = PIL.Image.open('assets/sample_image.jpg')
vision_model = genai.GenerativeModel('gemini-pro-vision')
response = vision_model.generate_content(["Explain the picture?",image])
print(response.text)
- 在下面的代码中,我们要求Gemini LLM从给定的图片中生成一个故事。
image = PIL.Image.open('assets/sample_image2.jpg')
vision_model = genai.GenerativeModel('gemini-pro-vision')
response = vision_model.generate_content(["Write a story from the picture",image])
print(response.text)
- 在下面的代码中,我们要求Gemini Vision计算图像中的对象数量,并以json格式提供响应。
image = PIL.Image.open('assets/sample_image3.jpg')
vision_model = genai.GenerativeModel('gemini-pro-vision')
response = vision_model.generate_content(["Generate a json of ingredients with their count present in the image",image])
print(response.text)
与Gemini LLM的聊天版本交互
到目前为止,我们已经探索了纯文本生成模型。现在,我们将深入研究使用相同的gemini-pro模型的模型的聊天版本。在这里,我们将使用GenerativeModel.start_chat()
函数而不是GenerativeModel.generate_text()
函数。
-
在聊天初始化时,提供一个空列表作为历史记录。
-
使用
chat.send_message()
函数传递聊天消息,并可以使用response.text
函数访问生成的聊天响应。此外,Google还提供了与现有历史记录建立聊天的选项。
让我们从以下代码开始与Gemini LLM的第一次对话,
import os
import google.generativeai as genai
os.environ['GOOGLE_API_KEY'] = "AIzaSyAjsDpD-XXXXXXXXXXXXXXX"
genai.configure(api_key = os.environ['GOOGLE_API_KEY'])
model = genai.GenerativeModel('gemini-pro')
chat_model = genai.GenerativeModel('gemini-pro')
chat = chat_model .start_chat(history=[])
response = chat.send_message("Which is one of the best place to visit in India during summer?")
print(response.text)
response = chat.send_message("Tell me more about that place in 50 words")
print(response.text)
print(chat.history)
将Langchain与Gemini集成
Langchain已成功将Gemini模型集成到其生态系统中,使用ChatGoogleGenerativeAI
类。要启动该过程,需要通过向ChatGoogleGeneraativeAI
类提供所需的Gemini模型来创建一个llm类。我们调用函数并传递用户输入。可以通过调用response.content
来获取生成的响应。
- 在下面的代码中,我们向模型提供一个通用查询。
from langchain_google_genai import ChatGoogleGenerativeAI
llm = ChatGoogleGenerativeAI(model="gemini-pro")
response = llm.invoke("Explain Quantum Computing in 50 words?")
print(response.content)
- 在下面的代码中,我们向模型提供多个输入并获取响应以获取所提出的查询。
batch_responses = llm.batch(
[
"Who is the Prime Minister of India?",
"What is the capital of India?",
]
)
for response in batch_responses:
print(response.content)
- 在下面的代码中,我们同时提供文本和图像输入,并期望模型基于给定的输入生成文本响应。
from langchain_core.messages import HumanMessage
llm = ChatGoogleGenerativeAI(model="gemini-pro-vision")
message = HumanMessage(
content=[
{
"type": "text",
"text": "Describe the image",
},
{
"type": "image_url",
"image_url": "https://picsum.photos/id/237/200/300"
},
]
)
response = llm.invoke([message])
print(response.content)
使用langchain_core
库中的HumanMessage
类将内容结构化为包含属性"type"
、"text"
和"image_url"
的字典列表。将列表传递给llm.invoke()
函数,并使用response.content
访问响应内容。
- 在下面的代码中,我们要求模型找出给定图像之间的差异。
from langchain_core.messages import HumanMessage
llm = ChatGoogleGenerativeAI(model="gemini-pro-vision")
message = HumanMessage(
content=[
{
"type": "text",
"text": "Find the differences between the given images",
},
{
"type": "image_url",
"image_url": "https://picsum.photos/id/237/200/300"
},
{
"type": "image_url",
"image_url": "https://picsum.photos/id/219/5000/3333"
}
]
)
response = llm.invoke([message])
print(response.content)
使用Gemini API创建ChatGPT克隆
在对Google的Gemini API进行了多次实验之后,本文将使用Streamlit和Gemini构建一个类似于ChatGPT的简单应用程序。
- 创建一个名为
gemini-bot.py
的文件,并将以下代码添加到其中。
import streamlit as st
import os
import google.generativeai as genai
st.title("Gemini Bot")
os.environ['GOOGLE_API_KEY'] = "AIzaSyAjsDpD-XXXXXXXXXXXXX"
genai.configure(api_key = os.environ['GOOGLE_API_KEY'])
# Select the model
model = genai.GenerativeModel('gemini-pro')
# Initialize chat history
if "messages" not in st.session_state:
st.session_state.messages = [
{
"role":"assistant",
"content":"Ask me Anything"
}
]
# Display chat messages from history on app rerun
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Process and store Query and Response
def llm_function(query):
response = model.generate_content(query)
# Displaying the Assistant Message
with st.chat_message("assistant"):
st.markdown(response.text)
# Storing the User Message
st.session_state.messages.append(
{
"role":"user",
"content": query
}
)
# Storing the User Message
st.session_state.messages.append(
{
"role":"assistant",
"content": response.text
}
)
# Accept user input
query = st.chat_input("What's up?")
# Calling the Function when Input is Provided
if query:
# Displaying the User Message
with st.chat_message("user"):
st.markdown(query)
llm_function(query)
- 通过执行以下命令运行应用程序。
streamlit run gemini-bot.py
- 打开在终端上显示的链接以访问应用程序。
感谢阅读本文。