使用Google Gemini API构建您自己的ChatGPT
虽然AI领域一直由OpenAI和微软的合作主导,但Gemini作为一股强大的力量崛起,拥有更大的规模和多样性。它被设计成无缝处理文本、图像、音频和视频,这些基础模型重新定义了AI交互的边界。随着谷歌在AI领域取得重大进展,了解Gemini如何重新定义人机交互的领域,展示了人工智能驱动创新的未来。
在本文中,我们将介绍获取免费的Google API密钥、安装必要的依赖项以及编写代码来构建智能聊天机器人的过程,这些机器人超越了传统的文本交互。本文不仅是一个聊天机器人教程,还探讨了Gemini内置的视觉和多模态方法如何能够解释图像并基于视觉输入生成文本。
入门指南
目录
- 什么是Gemini
- 创建一个Gemini API密钥
- 安装依赖
- 通过实验 Gemini API
- 配置API密钥
- 生成文本回复
- 保护回复
- 配置超参数
- 与图像输入进行交互
- 与Gemini LLM的聊天版本进行互动
- 将Langchain与Gemini整合
- 使用Gemini API创建ChatGPT克隆
什么是双子座
Gemini AI是由Google AI创建的一组大型语言模型(LLMs),以其在多模态理解和处理方面的前沿进展而闻名。它本质上是一个强大的人工智能工具,可以处理涉及不同类型数据而不仅限于文本的各种任务。
特点
- 多模态能力:与主要关注文本的大多数LLMs不同,Gemini能够无缝处理文本、图像、音频甚至代码。它能够理解并回应涉及不同数据组合的提示。例如,你可以给它一张图像,并要求它描述正在发生的事情,或者提供文本指示,并让它基于这些指示生成一张图像。
- 不同数据类型之间的关联: 这使得 Gemini 能够把握涉及多种方式的复杂概念和情境。想象一下向其展示一个科学图表,并要求它解释其中的底层过程 —— 在这里,它的多模态能力非常实用。
- Gemini有三种款式:
- Ultra:最强大和功能强大的型号,非常适合处理高度复杂的任务,如科学推理或代码生成。
- 专业:一个全面的模型,适用于各种任务,平衡性能和效率。
- 纳米:最轻量级和高效的模型,非常适合计算资源有限的设备应用。
- 使用TPUs进行更快处理:Gemini利用谷歌定制的张量处理器单元(TPUs)进行处理速度比早期LLM模型显著更快。
创建一个 Gemini API 密钥
为了访问Gemini API并开始使用其功能,您可以通过在Google上注册MakerSuite来获取免费的Google API密钥。由Google提供的MakerSuite提供了一个用户友好的、基于可视化的界面,用于与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 #for ubuntu
venv/Scripts/activate #for windows
pip install google-generativeai langchain-google-genai streamlit
使用Gemini API进行实验
让我们探索文本生成和以视觉为基础的任务的功能,这包括图像解释和描述。此外,深入了解 Langchain 与 Gemini API 的集成,简化交互过程。通过批处理输入和响应来发现处理多个查询的高效方法。最后,深入探讨使用 Gemini Pro 的聊天模型创建基于聊天的应用程序,以获取有关如何维护聊天记录和根据用户上下文生成响应的一些见解。
配置API密钥
- 首先,将从MakerSuite获取的Google API密钥初始化为名为“GOOGLE_API_KEY”的环境变量。
- 从Google的generativeai库导入配置类,将从环境变量中检索到的API密钥分配给“api_key”属性。
- 要根据类型进行模型创建,从generativeai库中引入GenerativeModel类。这个类方便了两种不同模型的实例化: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 函数访问生成的文本。
保护回应
Google被认可为为负责任的人工智能奠定了基础,优先考虑人工智能的责任和安全使用。
让我们输入一个不安全的查询来观察模型的响应:
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)
术语“候选人”在错误上下文中指的是由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)
让我们回顾一下上面示例中使用的每个参数:
- 候选人数量 = 1: 指导Gemini仅根据提示/查询生成单个回应。
- stop_sequences = ['。']:指示 Gemini 在内容中遇到句号(。)时停止生成文本。
- max_output_tokens = 40:对生成的文本施加限制,将其限制在指定的最大长度内,此处设置为40个标记。
- top_p = 0.6:根据其概率影响选择下一个最佳单词的可能性。值为0.6强调更可能的单词,而较高的值则偏向于较不可能但潜在更具创意的选择。
- top_k = 5:在确定下一个词时,只考虑了最有可能的前5个词,从而促进输出的多样性。
- 温度 = 0.8:控制生成文本的随机性。较高的温度(例如0.8)会增加随机性和创造力,而较低的值则更趋向于可预测和保守的输出。
与图像输入交互
虽然我们一直使用纯文本输入的 Gemini 模型,但是有必要注意到 Gemini 提供了一个名为 gemini-pro-vision 的模型。这个特殊的模型可以处理图像和文本输入,生成基于文本的输出。
我们使用PIL库加载存储在目录中的图像。随后,我们使用gemini-pro-vision模型通过GenerativeModel.generate_content()函数提供输入列表,包括图像和文本。它处理输入列表,使得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
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)
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)
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-pro模型的聊天版本。在这里,我们将使用GenerativeModel.start_chat()函数,而不是使用GenerativeModel.generate_text()函数。
- 在聊天开始时,提供一个空列表作为聊天历史。
- chat.send_message()函数用于传递聊天消息,并可以通过response.text函数来访问生成的聊天响应。此外,Google提供了与现有聊天记录建立聊天的选项。
让我们从以下内容开始与双子座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类。为了启动这个过程,我们通过向ChatGoogleGenerativeAI类提供所需的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)
HumanMessage类来自langchain_core库,用于将内容结构化为一个字典列表,其中包含属性“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
感谢阅读本文。
谢谢Gowri M Bhatt对内容的审查。
感谢Lija Alex对于Python版本和库方面提供的宝贵建议。
如果你喜欢这篇文章,请点击掌声按钮👏并分享,以帮助其他人发现它!
本教程的完整源代码可以在这里找到。
该文章也可以在Dev上找到。