看来 LLM 的创新潜力无穷。如果你和我一样,可能已经使用过 GenAI 应用程序和工具,比如 Expedia 内置的 ChatGPT、用于编写代码的 Copilot,甚至用于生成图像的 DALL-E。但作为一名技术专家,我想做的不仅仅是使用基于 LLM 的工具。我想构建自己的工具。
对于所有新技术而言,成为一名构建者意味着从简单开始。对于我正在学习的任何新编程语言或我正在检查的任何新框架而言,情况都是如此。使用 LLM 进行构建也不例外。所以,这就是我要在这里介绍的内容。我将构建一个与 Google Gemini 交互的快速而简单的 API,从而有效地为我自己提供一个小型聊天机器人助手。
以下是我们将要做的事情:
大多数日常消费者都知道 ChatGPT,它是基于 GPT-4 LLM 构建的。但说到 LLM,GPT-4 并不是唯一的选择。还有Google Gemini (以前称为 Bard)。在大多数性能基准测试中(例如多学科大学级推理问题或 Python 代码生成),Gemini 的表现都优于 GPT-4。
双子座对自己说了什么?
作为开发人员,我们可以通过Google AI Studio中的 Gemini API 访问 Gemini。还有适用于Python 、 JavaScript 、 Swift和Android的 SDK。
好的。让我们开始建造吧。
我们的 Node.js 应用程序将是一个简单的Express API 服务器,其功能类似于 Gemini 聊天机器人。它将监听两个端点。首先,对/chat
的POST
请求(将包含具有message
属性的 JSON 负载)将向 Gemini 发送消息,然后返回响应。我们的应用程序将与 Gemini 保持聊天对话。这使我们的聊天机器人变成了一个有用的助手,可以为我们保存笔记。
其次,如果我们向/reset
发送POST
请求,这将重置聊天对话从头开始,从而有效地抹去 Gemini 与我们之前互动的记忆。
如果您想跳过此代码演练,您可以在这里的我的 GitHub 存储库中查看所有代码。
首先,我们初始化 Node.js 应用程序并安装依赖项。
~/project$ npm init -y && npm pkg set type="module" ~/project$ npm install @google/generative-ai dotenv express
然后,我们将其添加到package.json
文件中的scripts
中:
"scripts": { "start": "node index.js" },
index.js
文件我们的应用程序由一个文件组成,而且非常简单。我们将逐一介绍它。
首先,我们导入所有要使用的软件包。然后,我们从 Google AI 初始化 SDK。我们将使用 Gemini-pro 模型。最后,我们调用startChat() ,这将为 Google 所称的多轮对话创建一个新的ChatSession实例。
import 'dotenv/config'; import express from 'express'; import { GoogleGenerativeAI } from '@google/generative-ai'; const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY); const model = genAI.getGenerativeModel({ model: "gemini-pro"}); let chat = model.startChat();
接下来,我们实例化一个新的 Express 应用程序,它是我们的 API 服务器。
const app = express(); app.use(express.json())
然后,我们设置监听器以监听对/chat
端点的POST
请求。我们确保 JSON 负载主体包含一条message
。我们使用chat
对象将该消息发送给 Gemini。然后,我们使用来自 Gemini 的响应文本来响应 API 调用者。
app.post('/chat', async (req, res) => { if ((typeof req.body.message) === 'undefined' || !req.body.message.length) { res.status(400).send('"message" missing in request body'); return; } const result = await chat.sendMessage(req.body.message); const response = await result.response; res.status(200).send(response.text()); })
请记住,通过使用ChatSession
,我们与 Gemini 的所有 API 调用的互动历史记录都会被保存下来。让 Gemini 拥有我们对话的“记忆”有助于了解背景。
但是,如果你想让 Gemini 完全重新开始并忘记所有以前的上下文,该怎么办?为此,我们有/reset
端点。这只是启动一个新的ChatSession
。
app.post('/reset', async (req, res) => { chat = model.startChat(); res.status(200).send('OK'); })
最后,我们启动服务器并开始监听。
const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`) })
顺便说一句,整个项目只是一个小型演示。它不打算用于生产!我目前设计的方式(无需身份验证),任何拥有 URL 的人都可以向/chat
发送请求到/reset
。在生产设置中,我们将进行适当的身份验证,并且每个用户都会有自己的与 Gemini 的对话实例,其他人无法操纵。
至此,我们几乎可以开始了。我们最后需要的是 API 密钥来访问 Gemini API。要获取 API 密钥,请先注册一个Google AI for Developers 帐户。
登录后,选择启动 Google AI Studio来启动新的 Google Gemini 项目。
在项目中,单击获取 API 密钥以导航到 API 密钥页面。然后,单击创建 API 密钥以生成密钥。复制该值。
在您的项目中,将名为.env.template
的文件复制为名为.env
的新文件。粘贴您的 Gemini API 密钥的值。您的.env
文件应类似于以下内容:
GEMINI_API_KEY=ABCDEFGH0123456789_JJJ
一切就绪后,我们可以在本地启动服务器来测试它。
~/project$ npm start > [email protected] start > node index.js Server is running on port 3000
在不同的终端中,我们可以发送一些 curl 请求:
$ curl -X POST -H 'content-type:application/json' \ --data '{"message":"I would like to bake a shepherds pie to feed 8 \ people. As you come up with a recipe, please keep a grocery \ list for me with all of the ingredients that I would need to \ purchase."}' \ http://localhost:3000/chat **Shepherd's Pie Recipe for 8** **Ingredients:** **For the Filling:** * 1 pound ground beef * 1/2 pound ground lamb * 2 medium onions, diced … **For the Mashed Potatoes:** * 3 pounds potatoes, peeled and quartered * 1/2 cup milk … **Instructions:** **For the Filling:** 1. Heat a large skillet over medium heat. Add the ground beef and lamb and cook until browned. … $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"I also need to buy fresh basil, for a different dish (not the shepherds pie). Add that to my grocery list \ too."}' \ http://localhost:3000/chat **Updated Grocery List for Shepherd's Pie for 8, and Fresh Basil:** * 1 pound ground beef * 1/2 pound ground lamb * 2 medium onions * 2 carrots * 2 celery stalks * 1 bag frozen peas * 1 bag frozen corn * 1 tablespoon Worcestershire sauce * 1 teaspoon dried thyme * 1 cup beef broth * 1/4 cup tomato paste * 3 pounds potatoes * 1/2 cup milk * 1/4 cup butter * **Fresh basil** $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What items on my grocery list can I find in the \ produce section?"}' \ http://localhost:3000/chat The following items on your grocery list can be found in the produce section: * Onions * Carrots * Celery * Potatoes * Fresh basil $ curl -X POST http://localhost:3000/reset OK $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What items are on my grocery list?"}' \ http://localhost:3000/chat I do not have access to your grocery list, so I cannot give you the items on it.
一切正常。看来我们已准备好部署了!
为了部署我们的应用程序,我选择使用 Heroku。它快速、简单且成本低廉。只需几个简单的步骤,我就可以让我的代码在云中运行,而不必陷入所有繁琐的基础设施问题中。这样,我就可以专注于构建酷炫的应用程序。
注册 Heroku 账户并安装 CLI后,部署需要完成以下操作。
Procfile
添加到代码库我们需要包含一个名为Procfile
的文件,它告诉 Heroku 如何启动我们的应用程序。Procfile Procfile
内容如下:
web: npm start
我们将此文件提交给我们的代码库仓库。
~/project$ heroku login
~/project$ heroku create gemini-chatbot Creating ⬢ gemini-chatbot... done https://gemini-chatbot-1933c7b1f717.herokuapp.com/ | https://git.heroku.com/gemini-chatbot.git
~/project$ heroku config:add \ --app gemini-chatbot \ GEMINI_API_KEY=ABCDEFGH0123456789_JJJ Setting GEMINI_API_KEY and restarting ⬢ gemini-chatbot... done, v3 GEMINI_API_KEY: ABCDEFGH0123456789_JJJ
~/project$ git push heroku main ... remote: -----> Building on the Heroku-22 stack remote: -----> Determining which buildpack to use for this app remote: -----> Node.js app detected ... remote: -----> Build succeeded! remote: -----> Discovering process types remote: Procfile declares types -> web remote: remote: -----> Compressing... remote: Done: 45.4M remote: -----> Launching... remote: Released v4 remote: https://gemini-chatbot-1933c7b1f717.herokuapp.com/ deployed to Heroku
就这样?就这样。
部署我们的应用程序后,让我们向 Heroku 应用程序 URL 发送一些 curl 请求。
$ curl -X POST -H 'content-type:application/json' \ --data '{"message":"If I ask you later for my PIN, remind me that it \ is 12345."}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Sure, if you ask me for your PIN later, I will remind you that it is 12345. **Please note that it is not a good idea to share your PIN with anyone, including me.** Your PIN is a secret code that should only be known to you. If someone else knows your PIN, they could access your account and withdraw your money. $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What is my PIN?"}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Your PIN is 12345. $ curl -X POST https://gemini-chatbot-1933c7b1f717.herokuapp.com/reset OK $ curl -X POST -H 'content-type:application/json' \ --data '{"message":"What is my PIN?"}' \ https://gemini-chatbot-1933c7b1f717.herokuapp.com/chat Unfortunately, I am unable to provide your personal PIN as I do not have access to your private information. If you can't remember it, I suggest you visit the bank or organization that issued the PIN to retrieve or reset it.
现在是构建 LLM 应用程序的好时机。乘风破浪吧!
我们已经介绍了如何在 Google Gemini 上构建一个简单的基于 LLM 的应用程序。我们的简单聊天机器人助手很基础,但它是熟悉 Gemini API 及其相关 SDK 的好方法。通过使用 Heroku 进行部署,您可以减轻次要的负担,从而专注于学习和构建重要的东西。