Generative AI đã và đang là một chủ đề nóng trong giới công nghệ những năm vừa qua. Các gã Công nghệ đều tham gia vào cuộc đua xây dựng những dự án thú vị bằng cách sử dụng nó. Google cũng không nằm ngoài cuộc chơi với Generative AI của riêng mình, được gọi là Gemini.

Gần đây, Google đã ra mắt API dành cho các lập trình viên Gemini. Việc này đi kèm với một số thư viện và framework mà các bạn có thể sử dụng để tích hợp vào ứng dụng. Trong bài viết này, chúng ta sẽ xây dựng một ứng dụng Node.js đơn giản và tích hợp Google Gemini SDK vào đó. 

Trước khi đi vào chi tiết, hãy cùng VietnamWorks inTECH tìm hiểu về AI Gemini này là gì nhé!

Google Gemini là gì?

Google Gemini là một mô hình AI mạnh mẽ và đa dạng được phát triển bởi Google AI. Gemini không chỉ xử lý văn bản; mà nó có thể hiểu và hoạt động trên nhiều định dạng khác nhau như mã, âm thanh, hình ảnh và video. Điều này sẽ mang lại rất nhiều điều thú vị cho các dự án Node.js của bạn.

Thiết lập dự án

1. Tạo dự án Node.js

Để bắt đầu dự án, chúng ta cần thiết lập môi trường Node.js. Bạn có thể tạo bằng cách chạy lệnh sau:

npm init

2. Cài đặt Dependencies

Bây giờ, chúng ta sẽ thêm các dependency cần thiết cho dự án bằng cách chạy lệnh:

npm install express body-parser @google/generative-ai dotenv

Lệnh này sẽ cài đặt các package sau:

  • express: một framework web phổ biến cho Node.js

  • body-parser: phần mềm trung gian để phân tích nội dung yêu cầu

  • @google/generative-ai: gói truy cập mô hình Gemini

  • dotenv: tải các biến môi trường từ tệp .env

3. Cài đặt môi trường

Tiếp theo chúng ta sẽ tạo folder .env để lưu trữ và bảo mật những thông tin nhạy cảm, chẳng hạn như thông tin xác thực API.

//.env
API_KEY=YOUR_API_KEY
PORT=3000

4. Nhận khóa API

Trước khi sử dụng Gemini, chúng ta cần thiết lập thông tin xác thực API từ Google Developers Console. Để làm được điều đó, bạn cần đăng ký trên tài khoản Google của mình và tạo khóa API.

Sau khi đăng nhập, hãy truy cập https://makersuite.google.com/app/apikey. Bạn sẽ nhận được một thông tin như thế này:

Image of Google AI Studio Console

Sau đó, nhấp vào nút “Create API Key”. Thao tác này sẽ tạo một khóa API duy nhất mà bạn sẽ sử dụng để xác thực các yêu cầu tới API Generative AI của Google.

Để kiểm tra API, bạn có thể chạy Lệnh Curl sau:

curl \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"Write a story about a magic backpack"}]}]}' \
  -X POST https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=YOUR_API_KEY

Thay thế YOUR_API_KEY bằng khóa API thực tế mà bạn có trước đó.

Tiếp theo hãy cập nhật lại file .env bằng khóa API của bạn

5. Tạo Express Server

Bây giờ, chúng ta sẽ tạo một tệp index.js trong thư mục gốc và thiết lập một express server cơ bản. Tham khảo đoạn code sau đây:

const express = require("express");
const dotenv = require("dotenv");

dotenv.config();

const app = express();
const port = process.env.PORT;

app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

Đầu dự án, chúng ta đang tải các biến môi trường bằng cách sử dụng dotenv.config() để có thể truy cập được toàn bộ tệp.

Ở đây, chúng ta đang sử dụng gói "dotenv" để truy cập số PORT từ tệp .env.

6. Chạy dự án

Trong bước này, chúng ta sẽ thêm tập lệnh khởi đầu vào tệp package.json để dễ dàng chạy dự án.

"scripts": {
  "start": "node index.js"
}

Tệp pack.json sẽ trông như thế này:

package.json File

Để kiểm tra xem mọi thứ có hoạt động hay không, hãy chạy lệnh sau:

npm run start

Lệnh này sẽ khởi động Express Server. Bây giờ nếu truy cập URL này http://localhost:3000/ bạn sẽ nhận được thông tin như hình dưới:

Image of http://localhost:3000/

Như vậy quá trình thiết lập dự án đã hoàn tất. Tiếp theo, chúng ta sẽ thêm Gemini vào dự án.

Thêm Googel Gemini

1. Thiết lập Route và Middleware

Để thêm Gemini vào dự án, chúng ta sẽ tạo một route /generate để “giao tiếp” với Gemini AI.

Để làm điều đó, hãy thêm đoạn mã sau vào tệp index.js.

const bodyParser = require("body-parser");
const { generateResponse } = require("./controllers/index.js");

//middleware to parse the body content to JSON
app.use(bodyParser.json());

app.post("/generate", generateResponse);

Ở đây, chúng ta đang sử dụng middleware body-parser để phân tích nội dung thành định dạng JSON.

2. Định cấu hình Generative AI của Google

Bây giờ, ta sẽ tạo một thư mục điều khiển và bên trong đó sẽ là một tệp index.js. Ở đây, chúng ta sẽ tạo một hàm điều khiển mới để xử lý route đã được khai báo trong đoạn mã trên.

const { GoogleGenerativeAI } = require("@google/generative-ai");
const dotenv = require("dotenv");

dotenv.config();

// GoogleGenerativeAI required config
const configuration = new GoogleGenerativeAI(process.env.API_KEY);

// Model initialization
const modelId = "gemini-pro";
const model = configuration.getGenerativeModel({ model: modelId });

Sau đó, khởi tạo mô hình bằng cách cung cấp ID mô hình ("gemini-pro") cho phương thức getGenerativeModel của đối tượng cấu hình.

Chúng ta cũng có thể cấu hình các tham số mô hình theo ý muốn của mình. Các giá trị tham số này kiểm soát cách mô hình tạo ra phản hồi. Ví dụ:

const generationConfig = {
  stopSequences: ["red"],
  maxOutputTokens: 200,
  temperature: 0.9,
  topP: 0.1,
  topK: 16,
};

const model = configuration.getGenerativeModel({ model: modelId, generationConfig });

Ngoài ra, bạn có thể sử dụng “safety settings” để tránh nhận được phản hồi có hại. Theo mặc định, tính năng này được định cấu hình để chặn nội dung có xác suất không an toàn từ trung bình đến cao dựa trên nhiều nguyên tắc khác nhau. Để rõ hơn bạn có thể tham khảo ví dụ dưới đây:

const { HarmBlockThreshold, HarmCategory } = require("@google/generative-ai");

const safetySettings = [
  {
    category: HarmCategory.HARM_CATEGORY_HARASSMENT,
    threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH,
  },
  {
    category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
    threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE,
  },
];  const model = genAI.getGenerativeModel({ model: "MODEL_NAME", safetySettings });

Với các cài đặt này, chúng ta có thể tăng cường bảo mật bằng cách giảm thiểu khả năng tạo ra nội dung có hại.

3. Quản lý lịch sử hội thoại

Để theo dõi lịch sử cuộc trò chuyện, hãy tạo một mảng history và xuất nó từ tệp điều khiển:

export const history = [];

4. Thực hiện chức năng điều khiển

Bây giờ, chúng ta sẽ viết một hàm điều khiển generateResponse để xử lý route (/generate) và tạo phản hồi cho các yêu cầu của user.

/**
 * Generates a response based on the given prompt.
 * @param {Object} req - The request object.
 * @param {Object} res - The response object.
 * @returns {Promise} - A promise that resolves when the response is sent.
 */
export const generateResponse = async (req, res) => {
  try {
    const { prompt } = req.body;

    const result = await model.generateContent(prompt);
    const response = await result.response;
    const text = response.text();
    console.log(text);

    history.push(text);
    console.log(history);

    res.send({ response: text });
  } catch (err) {
    console.error(err);
    res.status(500).json({ message: "Internal server error" });
  }
};

Ở đây, chúng ta đang lấy prompt từ nội dung yêu cầu và tạo phản hồi dựa trên lời nhắc bằng phương thức model.generateContent.

Và để theo dõi các phản hồi, chúng ta đẩy các phản hồi vào mảng history.

5. Kiểm tra lịch sử phản hồi

Chúng ta sẽ tạo một route để kiểm tra lịch sử phản hồi. Điểm cuối này trả về mảng history. Hãy thêm mã sau vào thư mục ./index.js.

app.get("/generate", (req, res) => {
  res.send(history);
});

6. Chạy dự án

Bây giờ, để kiểm tra ứng dụng có chạy tốt hay không, bạn có thể chạy lệnh sau:

npm run start
Terminal output

7. Kiểm tra chức năng

Tiếp theo, chúng ta sẽ thực hiện request Post bằng Postman để xác thực chức năng bộ điều khiển.

Chúng ta sẽ gửi yêu cầu POST tới http://localhost:3000/generate với payload JSON sau:

{
  "prompt": "Write 3 Javascript Tips for Beginners"
}

Postman Console Output

Và chúng ta sẽ nhận được phản hồi:

{
    "response": "1. **Use console.log() for Debugging:**\n   - console.log() is a useful tool for debugging your JavaScript code. It allows you to inspect the values of variables and expressions, and to see how your code is executing. This can be especially helpful when you encounter errors or unexpected behavior in your program.\n\n2. **Learn the Basics of Data Types:**\n   - JavaScript has several built-in data types, including strings, numbers, booleans, and objects. Understanding the properties and behaviors of each data type is crucial for writing effective code. For instance, strings can be manipulated using string methods, while numbers can be used in mathematical operations.\n\n3. **Use Strict Mode:**\n   - Strict mode is a way to opt-in to a restricted and secure subset of JavaScript. It helps you to write more secure and reliable code, as it throws errors for common mistakes that would otherwise go unnoticed in regular JavaScript mode. To enable strict mode, simply add \"use strict;\" at the beginning of your JavaScript file or module."
}
Postman Console Output

Lời kết

Như vậy, chúng ta đã vừa tìm hiểu cách tích hợp Google Gemini vào trong dự án của mình. Nếu thấy bài viết này hữu ích, hãy chia sẻ bài viết cho bạn bè mình cùng biết nhé!

VietnamWorks inTECH