Có vẻ như có vô số khả năng đổi mới với LLM. Nếu bạn giống tôi, bạn đã sử dụng các ứng dụng và công cụ GenAI — như ChatGPT được tích hợp trong Expedia, Copilot để viết mã hoặc thậm chí DALL-E để tạo hình ảnh. Nhưng với tư cách là một nhà công nghệ, tôi muốn làm nhiều việc hơn là chỉ sử dụng các công cụ dựa trên LLM. Tôi muốn xây dựng của riêng tôi.
Với tất cả các công nghệ mới, việc trở thành người xây dựng có nghĩa là bắt đầu một cách đơn giản. Nó giống như vậy đối với bất kỳ ngôn ngữ lập trình mới nào mà tôi đang học hoặc bất kỳ khuôn khổ mới nào mà tôi đang thử nghiệm. Xây dựng với LLM cũng không khác. Vì vậy, đó là những gì tôi sẽ đi qua đây. Tôi sẽ xây dựng một API nhanh chóng và đơn giản để tương tác với Google Gemini, mang lại cho tôi một trợ lý chatbot nhỏ của riêng mình một cách hiệu quả.
Đây là những gì chúng tôi sẽ làm:
Hầu hết người tiêu dùng hàng ngày đều biết về ChatGPT, được xây dựng trên GPT-4 LLM. Nhưng khi nói đến LLM, GPT-4 không phải là trò chơi duy nhất trong thị trấn. Ngoài ra còn có Google Gemini (trước đây gọi là Bard). Trên hầu hết các điểm chuẩn hiệu suất (chẳng hạn như các bài toán lý luận cấp đại học đa ngành hoặc tạo mã Python), Gemini vượt trội hơn GPT-4.
Song Tử nói gì về bản thân?
Với tư cách là nhà phát triển, chúng tôi có thể truy cập Gemini thông qua API Gemini trong Google AI Studio . Ngoài ra còn có SDK dành cho Python , JavaScript , Swift và Android .
Được rồi. Hãy bắt tay vào xây dựng.
Ứng dụng Node.js của chúng tôi sẽ là một máy chủ Express API đơn giản có chức năng giống như một chatbot Gemini. Nó sẽ lắng nghe trên hai điểm cuối. Đầu tiên, một yêu cầu POST
tới /chat
(sẽ bao gồm tải trọng JSON có thuộc tính message
) sẽ gửi tin nhắn đến Gemini và sau đó trả về phản hồi. Ứng dụng của chúng tôi sẽ tiếp tục cuộc trò chuyện đang diễn ra với Gemini. Điều này biến chatbot của chúng tôi thành một trợ lý hữu ích có thể ghi chú cho chúng tôi.
Thứ hai, nếu chúng tôi gửi yêu cầu POST
tới /reset
, điều này sẽ đặt lại cuộc trò chuyện để bắt đầu lại từ đầu, xóa đi ký ức của Song Tử về những lần tương tác trước đó với chúng tôi.
Nếu bạn muốn bỏ qua hướng dẫn mã này, bạn có thể xem tất cả mã tại kho lưu trữ GitHub của tôi tại đây .
Để bắt đầu, chúng tôi khởi tạo ứng dụng Node.js và cài đặt các phần phụ thuộc.
~/project$ npm init -y && npm pkg set type="module" ~/project$ npm install @google/generative-ai dotenv express
Sau đó, chúng tôi thêm phần này vào scripts
trong tệp package.json
của mình:
"scripts": { "start": "node index.js" },
index.js
Ứng dụng của chúng tôi bao gồm một tệp và nó khá đơn giản. Chúng ta sẽ đi qua từng phần một.
Đầu tiên, chúng tôi nhập tất cả các gói chúng tôi sẽ sử dụng. Sau đó, chúng tôi khởi tạo SDK từ Google AI. Chúng tôi sẽ sử dụng mô hình Gemini-pro. Cuối cùng, chúng tôi gọi startChat() để tạo một phiên bản ChatSession mới cho cái mà Google gọi là cuộc trò chuyện nhiều lượt .
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();
Tiếp theo, chúng tôi khởi tạo một ứng dụng Express mới, đây là máy chủ API của chúng tôi.
const app = express(); app.use(express.json())
Sau đó, chúng tôi thiết lập trình nghe cho các yêu cầu POST
tới điểm cuối /chat
. Chúng tôi đảm bảo rằng phần nội dung tải trọng JSON có chứa message
. Chúng tôi sử dụng đối tượng chat
của mình để gửi tin nhắn đó đến Song Tử. Sau đó, chúng tôi phản hồi người gọi API bằng văn bản phản hồi từ Gemini.
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()); })
Hãy nhớ rằng, bằng cách sử dụng ChatSession
, lịch sử tương tác của chúng tôi với Gemini được lưu trữ và chạy trên tất cả các lệnh gọi API. Trao cho Song Tử một “ký ức” về cuộc trò chuyện của chúng ta sẽ rất hữu ích cho bối cảnh.
Nhưng nếu bạn muốn Song Tử bắt đầu lại hoàn toàn và quên đi mọi bối cảnh trước đó thì sao? Đối với điều này, chúng tôi có điểm cuối /reset
. Điều này chỉ đơn giản là khởi động một ChatSession
mới.
app.post('/reset', async (req, res) => { chat = model.startChat(); res.status(200).send('OK'); })
Cuối cùng, chúng tôi khởi động máy chủ của mình để bắt đầu nghe.
const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`) })
Xin lưu ý thêm, toàn bộ dự án này chỉ là một bản demo nhỏ. Nó không có nghĩa là được sử dụng trong sản xuất! Theo cách tôi đã thiết kế hiện tại (không cần xác thực), bất kỳ ai có URL đều có thể gửi yêu cầu tới /chat
tới /reset
. Trong quá trình thiết lập sản xuất, chúng tôi sẽ có sẵn phương thức xác thực phù hợp và mỗi người dùng sẽ có phiên bản riêng của cuộc trò chuyện với Gemini mà không ai khác có thể thao túng.
Tại thời điểm này, chúng tôi gần như đã sẵn sàng để đi. Điều cuối cùng chúng ta cần là khóa API để truy cập API Gemini. Để nhận khóa API, hãy bắt đầu bằng cách đăng ký tài khoản Google AI for Developers .
Sau khi bạn đăng nhập, hãy chọn Khởi chạy Google AI Studio để bắt đầu dự án Google Gemini mới.
Trong dự án, nhấp vào Nhận khóa API để điều hướng đến trang khóa API. Sau đó, nhấp vào Tạo khóa API để tạo khóa. Sao chép giá trị.
Trong dự án của bạn, hãy sao chép tệp có tên .env.template
dưới dạng tệp mới có tên .env
. Dán giá trị của khóa API Gemini của bạn. Tệp .env
của bạn sẽ trông giống như thế này:
GEMINI_API_KEY=ABCDEFGH0123456789_JJJ
Với mọi thứ đã sẵn sàng, chúng tôi có thể khởi động máy chủ của mình cục bộ để kiểm tra nó.
~/project$ npm start > [email protected] start > node index.js Server is running on port 3000
Trong một thiết bị đầu cuối khác, chúng tôi có thể gửi một số yêu cầu cuộn tròn:
$ 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.
Nó đang hoạt động. Có vẻ như chúng tôi đã sẵn sàng triển khai!
Để triển khai ứng dụng của chúng tôi, tôi đã chọn sử dụng Heroku. Thật nhanh chóng, đơn giản và chi phí thấp. Tôi có thể khiến mã của mình chạy trên đám mây chỉ bằng một vài bước đơn giản mà không bị sa lầy vào tất cả các mối lo ngại cơ bản về cơ sở hạ tầng. Bằng cách này, tôi có thể chỉ tập trung vào việc xây dựng các ứng dụng thú vị.
Sau khi đăng ký tài khoản Heroku và cài đặt CLI , đây là những gì cần thiết để triển khai.
Procfile
vào Codebase Chúng ta cần bao gồm một tệp có tên Procfile
để cho Heroku biết cách khởi động ứng dụng của chúng ta. Nội dung của Procfile
trông như thế này:
web: npm start
Chúng tôi cam kết tệp này vào kho mã cơ sở của chúng tôi.
~/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
Đó là nó? Đó là nó.
Khi ứng dụng của chúng tôi đã được triển khai, hãy gửi một số yêu cầu cuộn tới URL ứng dụng Heroku của chúng tôi.
$ 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.
Bây giờ là thời điểm tuyệt vời để xây dựng các ứng dụng dựa trên LLM. Lướt sóng!
Chúng tôi đã hướng dẫn cách xây dựng một ứng dụng dựa trên LLM đơn giản trên Google Gemini. Trợ lý chatbot đơn giản của chúng tôi là cơ bản nhưng đó là cách tuyệt vời để bạn làm quen với API Gemini và các SDK liên quan của nó. Và bằng cách sử dụng Heroku để triển khai, bạn có thể giảm bớt những mối quan tâm phụ để có thể tập trung vào việc học và xây dựng ở những nơi cần thiết.