- Published on
Firebase Genkit - ứng dụng AI bằng Javascript/Typescript
Viblo: Firebase Genkit - ứng dụng AI bằng Javascript/Typescript
Vừa qua, thông qua sự kiện Google IO tại Mĩ (15.05.2024) thì Google vừa ra mắt Firebase Genkit là một open source framework hỗ trợ build, deploy, and monitor các ứng dụng AI.
Nhìn chung việc các ông lớn liên tục ra mắt công nghệ liên quan tới AI mình thấy nó cũng giống như cuộc đua vũ trang, ai cũng muốn sản phẩm của mình không được thua kém thằng khác từ OpenAI với GTP-4o vừa được ra mắt gần đây, và Google với Gemini song song đó với chuỗi sự kiện Build with AI để tìm hiểu các công nghệ với Vertex AI, ...
Quay lại nội dung chính của bài viết này thì Genkit được sử dụng để tạo các ứng dụng tạo nội dung tùy chỉnh, tìm kiếm ngữ nghĩa, xử lý dữ liệu đầu vào, và trả lời câu hỏi dựa trên dữ liệu mà bạn thiết lập, tự động đưa ra quyết định, điều phối lệnh và nhiều tính năng khác nữa bạn có thể tìm hiểu thêm tại trang chủ của Firebase về Genkit mình đính kèm tại đây.
Genkit hiện đang hỗ trợ phát triển bằng JavaScript/TypeScript (Node.js).
Những tính năng chính
Từ trang thông tin của Firebase Genkit có highlight 10 tính năng được xem là key features nên trong bài viết này cùng mình tìm hiểu xem 10 tính năng đó là gì ha!
1. Many models, one interface (Nhiều mô hình, một giao diện)
Nghĩa là bạn có thể sử dụng tính năng này để tích hợp mô hình nhận dạng hình ảnh, mô hình dịch văn bản và mô hình tạo văn bản vào cùng một ứng dụng.
2. Structured output (Kết quả có cấu trúc)
Nghĩa là dữ liệu trả về từ Genkit sẽ là 1 output có cấu trúc (object), việc trả về dữ liệu như vậy sẽ giúp bạn dễ dàng xử lý dữ liệu hơn. Ví dụ khi sử dụng mô hình nhận dạng hình ảnh, thì kết quả bạn có thể nhận được là thông tin về các đối tượng được phát hiện trong ảnh, bao gồm vị trí, kích thước,...
import { generate } from "@genkit-ai/ai";
import { geminiPro } from "@genkit-ai/vertexai";
import { z } from "zod";
const LocationSchema = z.object({
name: z.string().describe('Ten cua dia diem'),
address: z.string().describe('Dia chi'),
reviews: z.array(z.object({
name: z.string(),
goodReview: z.number().describe('So luong review tich cuc'),
badReview: z.number().describe('So luong review tieu cuc'),
})).describe('3 thuoc tinh ma mo hinh co the tra ve!')
});
const createLocation = defineFlow({
name: "createLocation",
inputSchema: z.string(),
outputSchema: LocationSchema,
},
(habitat) => {
const result = await generate({
model: geminiPro,
prompt: `Ban da tao thong tin chi tiet cho dia diem: ${habitat}.`,
output: {schema: LocationSchema}
});
// strongly typed and ready to go
return result.output();
}
)
console.log(await createCreature("a developer conference"));
3. Multimodal, multimedia (Đa phương thức, đa phương tiện)
Genkit hỗ trợ làm việc với nhiều loại dữ liệu đầu vào và đầu ra khác nhau, chẳng hạn như văn bản, hình ảnh, âm thanh và video. Hiểu đơn giản là có thể ứng dụng tính năng này để tạo một ứng dụng nhận dạng đối tượng trong ảnh, dịch văn bản thành lời nói và tạo nhạc dựa trên văn bản.
import { imagen2, geminiProVision } from '@genkit-ai/vertexai';
import { generate } from '@genkit-ai/ai';
const imageResult = await generate({
model: imagen2,
prompt: 'Tao hinh anh bao gom thoi gian, dia diem va thong tin ve lich su cua dia diem do',
});
const generatedImage = imageResult.media();
const descriptionResult = await generate({
model: geminiProVision,
prompt: [
{
text: 'Thoi gian, dia diem va thong tin lich su duoc the hien trong hinh anh nay la gi?',
},
{ media: generatedImage },
],
});
console.log(descriptionResult.text());
4. Cung cấp công cụ cho mô hình ngôn ngữ lớn - LLM
Genkit cung cấp các công cụ đặc biệt cho LLM, như khả năng truy cập vào bộ nhớ và ngữ cảnh để tạo ra kết quả tốt hơn. Ví dụ khi build chatbot bạn có thể ứng dụng tính năng này để cải thiện độ chính xác và tính lưu loát cho output dựa trên LLM bạn cung cấp trong ứng dụng.
import { generate, defineTool } from "@genkit-ai/ai";
import { geminiPro } from "@genkit-ai/vertexai";
import { z } from "zod";
const createReminder = defineTool({
name: "createReminder",
description: "Dung tinh nang nay de tao Reminder",
inputSchema: z.object({
time: z.string().describe('ISO timestamp string, e.g. 2024-04-03T12:23:00Z'),
reminder: z.string().describe('Noi dung reminder'),
}),
outputSchema: z.number().describe('ID khoi tao reminder'),
(reminder) => db.reminders.create(reminder)
});
const searchNotes = defineTool({
name: "searchNotes",
description: "Dung tinh nang nay de tim kiem nguoi hoac cum tu trong ghi chu cua nguoi dung",
inputSchema: z.string().describe('the search query'),
outputSchema: z.object({notes: z.array(NoteSchema)}),
(query) => db.notes.search(query)
});
const result = await generate({
model: geminiPro,
tools: [createReminder, searchNotes],
prompt: `
Bạn là một trợ lý ghi chú. Sử dụng các công cụ có sẵn, cố gắng trả lời câu hỏi.
Nếu bạn tạo lời nhắc, hãy mô tả bằng văn bản lời nhắc của bạn dưới dạng phản hồi.
Câu hỏi: Tôi đã ghi lại cuộc hẹn với bạn tôi - bạn có thể đặt lời nhắc về thời gian không?
`
});
console.log(result.text());
5. Quản lý Prompt với Dotprompt
Dotprompt là một công cụ tích hợp trong Genkit có thể dễ dàng tạo, quản lý và thử nghiệm các prompt cho các mô hình học máy. Trong tài liệu trên trang Firebase giải thích Dotprompt là một định dạng tệp nhắc nhở cho phép bạn đặt tất cả vào một tệp duy nhất để tổ chức và kiểm tra dễ dàng hơn.
Note: Prompt là một đoạn văn bản được sử dụng để hướng dẫn mô hình về tác vụ bạn muốn nó thực hiện.
Nôm na là dùng Dotprompt để tạo các prompt khác nhau cho mô hình tạo văn bản ví dụ như "Hãy viết một câu trạng thái khi đi du lịch biển để đăng ảnh trên Facebook" hoặc "Hãy viết một bài viết để quảng bá sự kiện Google IO 2024 tại Ho Chi Minh vao ngày 16 tháng 6 năm 2024 sắp tới".
---
model: vertexai/gemini-1.0-pro
config:
temperature: 0.9
input:
schema:
properties:
location: {type: string}
time: {type: string}
name: {type: string}
required: [location]
default:
location: Ho Chi Minh city
---
Google IO 2024 la su kien noi bat cua Google sap toi se den {{location}}.
Voi khach moi dac biet la {{#if name}} name {{name}}{{/if}}{{#if time}} duoc dien ra vao {{time}}{{/if}}.
6. Run flows locally
Genkit cho phép bạn chạy các luồng (flow) của ứng dụng cục bộ trên máy tính của mình mà không cần triển khai ứng dụng lên Cloud, giúp bạn dễ dàng hơn để kiểm tra và fix bug trong quá trình phát triển.
7. Inspect traces (Kiểm tra các dấu vết)
Việc Debugging các quy trình làm việc phức tạp, nhiều bước bằng AI có thể gặp khó khăn do tính ngẫu nhiên và các quy trình ẩn. Genkit cung cấp các công cụ để kiểm tra các dấu vết của ứng dụng của bạn. Dấu vết là bản ghi chi tiết về cách ứng dụng của bạn tương tác với các dịch vụ của Firebase và các mô hình học máy. Điều này giúp bạn gỡ lỗi ứng dụng của mình và cải thiện hiệu suất.
Nếu bạn đang xây dựng chatbot thì bạn có thể xem được chatbot của bạn đang xử lý các yêu cầu của người dùng và xác định bất kỳ vấn đề nào về độ chính xác hoặc hiệu suất.
Note: Diễn giải bằng lời mình cũng khó hình dung được nên để dễ hiểu hơn thì bạn có thể xem cách nó hoạt động dựa theo hình ảnh mô tả tại đây
8. Open & extensible (Khả năng mở rộng)
Đơn giản là Genkit nó thiết kế theo hướng cho phép mở rộng và tùy chỉnh nên có thể thêm các chức năng mới và tích hợp các dịch vụ của bên thứ ba. Ví dụ như là có thể sử dụng dịch vụ nhận dạng giọng nói từ bên thứ ba để phát triển ứng dụng.
Hoặc là có thể sử dụng Genkit sau đó phát triển thành một plugin riêng rồi đưa lên npm.
9. Built for production
Dễ dàng phát triển các luồng của bạn tới bất kỳ nền tảng nào, Genkit được trang bị đầy đủ OpenTelemetry và tùy chỉnh metadata để giám sát production.
Ngoài ra, còn có các plugin chính thức dành cho Google Cloud và Firebase giúp bạn xuất dữ liệu hoạt động của Google Cloud và tích hợp các dịch vụ Firebase như Cloud cho Firebase, Xác thực Firebase, Kiểm tra ứng dụng và Firestore.
Để minh họa cho tính năng này, hãy tưởng tượng bạn đang phát triển một ứng dụng như Google Trans. Ứng dụng này sẽ cần phải xử lý khối lượng lớn yêu cầu dịch thuật và về lâu về dài ựng dụng này nổi lên và có lượng khổng lồ người dùng sử dụng bạn cần phải đáp ứng làm sao để ựng dụng của bạn hoạt động ổn định với khối lượng lớn người dùng như vậy thì thay vì suy nghĩ và giải quyết các vấn đề như thế thì Genkit sẽ lo việc này.
10. Authorization & security handling
Khi xây dựng bất kỳ ứng dụng công khai nào, điều quan trọng là phải bảo vệ dữ liệu được lưu trữ trong hệ thống của bạn. Khi nói đến LLM, cần phải có sự chuyên sâu hơn nữa để đảm bảo rằng mô hình chỉ truy cập dữ liệu cần thiết, các lệnh gọi công cụ được xác định phạm vi phù hợp đối với người dùng đang gọi LLM và luồng chỉ được gọi bởi các ứng dụng khách đã được xác minh.
Genkit hỗ trợ nhiều phương thức xác thực khác nhau, chẳng hạn như xác thực Firebase và xác thực OAuth kết hợp với cơ chế quản lý các authorization policies và contexts.
Ứng dụng Genkit tạo một ứng dụng mà người dùng cần đăng nhập để sử dụng và phân quyền những nội dung có thể sử dụng theo user đó.
import { defineFlow, runFlow } from '@genkit-ai/flow';
export const selfSummaryFlow = defineFlow(
{
name: 'selfSummaryFlow',
inputSchema: z.object({uid: z.string()}),
outputSchema: z.string(),
authPolicy: (auth, input) => {
if (!auth) {
throw new Error('Authorization required.');
}
if (input.uid !== auth.uid) {
throw new Error('You may only summarize your own profile data.');
}
}
},
async (input) => { ... });
Review
Genkit là công nghệ mới được giới thiệu gần đây, nên bài viết trên dựa vào những thông tin chính tại trang Firebase documents và được chỉnh sửa theo cách hiểu của mình, nên nếu có phần nào chưa chính xác, mọi người hoan hỉ đóng góp bên dưới phần bình luận cho mình ha 😎
Mình cũng chưa có thời gian để tìm hiểu sâu về Genkit lắm, ai có bài viết hay thông tin nào hay về Firebase Genkit thì cũng đừng ngần ngại chia sẻ bên dưới luôn nhé!
References: firebase.google.com/docs/genkit
I am always looking for feedback on my writing, so please let me know what you think. ❤️