Tạo nội dung bằng các mô hình AI

Trung tâm của AI tạo sinh là mô hình AI. Hiện tại, hai ví dụ nổi bật nhất về mô hình tạo sinh là mô hình ngôn ngữ lớn (LLM) và mô hình tạo hình ảnh. Các mô hình này nhận dữ liệu đầu vào, được gọi là lệnh gọi (thường là văn bản, hình ảnh hoặc kết hợp cả hai), và từ đó tạo ra văn bản đầu ra, hình ảnh hoặc thậm chí là âm thanh hoặc video.

Kết quả của các mô hình này có thể thuyết phục đến mức đáng ngạc nhiên: LLM tạo ra văn bản trông giống như do con người viết và các mô hình tạo hình ảnh có thể tạo ra hình ảnh rất giống với ảnh chụp thực tế hoặc tác phẩm nghệ thuật do con người tạo ra.

Ngoài ra, LLM đã chứng minh khả năng thực hiện các nhiệm vụ ngoài việc tạo văn bản đơn giản:

  • Viết chương trình máy tính
  • Lập kế hoạch cho các nhiệm vụ phụ cần thiết để hoàn thành một nhiệm vụ lớn hơn
  • Sắp xếp dữ liệu không có tổ chức
  • Hiểu và trích xuất dữ liệu thông tin từ một tập hợp văn bản
  • Theo dõi và thực hiện các hoạt động tự động dựa trên nội dung mô tả bằng văn bản của hoạt động

Bạn có thể sử dụng nhiều mẫu từ một số nhà cung cấp. Mỗi mô hình có những điểm mạnh và điểm yếu riêng, một mô hình có thể xuất sắc ở một nhiệm vụ nhưng lại hoạt động kém ở các nhiệm vụ khác. Các ứng dụng sử dụng AI tạo sinh thường có thể hưởng lợi từ việc sử dụng nhiều mô hình khác nhau, tuỳ thuộc vào nhiệm vụ hiện tại.

Là nhà phát triển ứng dụng, bạn thường không tương tác trực tiếp với các mô hình AI tạo sinh, mà thông qua các dịch vụ có sẵn dưới dạng API web. Mặc dù các dịch vụ này thường có chức năng tương tự nhau, nhưng tất cả đều cung cấp các chức năng đó thông qua các API khác nhau và không tương thích. Nếu muốn sử dụng nhiều dịch vụ mô hình, bạn phải sử dụng từng SDK độc quyền của các dịch vụ đó, có thể không tương thích với nhau. Và nếu muốn nâng cấp từ một mô hình lên mô hình mới nhất và có nhiều tính năng nhất, bạn có thể phải xây dựng lại toàn bộ quá trình tích hợp đó.

Genkit giải quyết thách thức này bằng cách cung cấp một giao diện duy nhất tóm tắt thông tin chi tiết về việc truy cập vào bất kỳ dịch vụ mô hình AI tạo sinh nào, với một số phương thức triển khai tạo sẵn. Việc xây dựng ứng dụng dựa trên AI xung quanh Genkit giúp đơn giản hoá quy trình thực hiện lệnh gọi AI tạo sinh đầu tiên và giúp bạn dễ dàng kết hợp nhiều mô hình hoặc hoán đổi mô hình này cho mô hình khác khi các mô hình mới xuất hiện.

Trước khi bắt đầu

Nếu bạn muốn chạy các ví dụ về mã trên trang này, trước tiên, hãy hoàn tất các bước trong hướng dẫn Bắt đầu. Tất cả các ví dụ đều giả định rằng bạn đã cài đặt Genkit làm phần phụ thuộc trong dự án.

Các mô hình được Genkit hỗ trợ

Genkit được thiết kế đủ linh hoạt để có thể sử dụng mọi dịch vụ mô hình AI tạo sinh. Các thư viện cốt lõi của thư viện này xác định giao diện chung để làm việc với các mô hình, còn trình bổ trợ mô hình xác định thông tin triển khai chi tiết để làm việc với một mô hình cụ thể và API của mô hình đó.

Nhóm Genkit duy trì các trình bổ trợ để xử lý các mô hình do Vertex AI, AI tạo sinh của Google và Ollama cung cấp:

  • Tập hợp mô hình ngôn ngữ lớn (LLM) Gemini, thông qua trình bổ trợ Google Cloud Vertex AI
  • Tập hợp LLM của Gemini thông qua trình bổ trợ AI của Google
  • Mô hình tạo hình ảnh Imagen2 và Imagen3 thông qua Google Cloud Vertex AI
  • Tập hợp các mô hình ngôn ngữ lớn (LLM) Claude 3 của Anthropic, thông qua vườn mô hình của Google Cloud Vertex AI
  • Gemma 2, Llama 3 và nhiều mô hình mở khác thông qua trình bổ trợ Ollama (bạn phải tự lưu trữ máy chủ Ollama)

Ngoài ra, còn có một số trình bổ trợ do cộng đồng hỗ trợ cung cấp giao diện cho các mô hình này:

Bạn có thể khám phá thêm bằng cách tìm kiếm các gói được gắn thẻ genkit-model trên npm.org.

Tải và định cấu hình trình bổ trợ mô hình

Trước khi có thể sử dụng Genkit để bắt đầu tạo nội dung, bạn cần tải và định cấu hình trình bổ trợ mô hình. Nếu đang đọc hướng dẫn Bắt đầu, bạn đã thực hiện việc này. Nếu không, hãy xem hướng dẫn Bắt đầu hoặc tài liệu của từng trình bổ trợ và làm theo các bước trong đó trước khi tiếp tục.

Phương thức generate()

Trong Genkit, giao diện chính mà bạn tương tác với các mô hình AI tạo sinh là phương thức generate().

Lệnh gọi generate() đơn giản nhất chỉ định mô hình bạn muốn sử dụng và một lời nhắc văn bản:

import { gemini15Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit';

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

(async () => {
  const { text } = await ai.generate(
    'Invent a menu item for a pirate themed restaurant.'
  );
  console.log(text);
})();

Khi bạn chạy ví dụ ngắn này, ví dụ này sẽ in một số thông tin gỡ lỗi, theo sau là kết quả của lệnh gọi generate(), thường là văn bản Markdown như trong ví dụ sau:

## The Blackheart's Bounty

**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**

**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.

Chạy lại tập lệnh và bạn sẽ nhận được kết quả khác.

Mã mẫu trước đó đã gửi yêu cầu tạo đến mô hình mặc định mà bạn đã chỉ định khi định cấu hình thực thể Genkit.

Bạn cũng có thể chỉ định một mô hình cho một lệnh gọi generate():

const { text } = await ai.generate({
  model: gemini15Pro,
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

Ví dụ này sử dụng tệp tham chiếu mô hình do trình bổ trợ mô hình xuất. Một lựa chọn khác là chỉ định mô hình bằng cách sử dụng giá trị nhận dạng chuỗi:

const { text } = await ai.generate({
  model: 'googleai/gemini-1.5-pro-latest',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

Giá trị nhận dạng chuỗi mô hình có dạng providerid/modelid, trong đó mã nhà cung cấp (trong trường hợp này là googleai) xác định trình bổ trợ và mã mô hình là giá trị nhận dạng chuỗi dành riêng cho trình bổ trợ cho một phiên bản cụ thể của mô hình.

Một số trình bổ trợ mô hình, chẳng hạn như trình bổ trợ Ollama, cung cấp quyền truy cập vào hàng chục mô hình khác nhau và do đó không xuất các tệp tham chiếu mô hình riêng lẻ. Trong những trường hợp này, bạn chỉ có thể chỉ định một mô hình cho generate() bằng cách sử dụng giá trị nhận dạng chuỗi của mô hình đó.

Những ví dụ này cũng minh hoạ một điểm quan trọng: khi bạn sử dụng generate() để thực hiện các lệnh gọi mô hình AI tạo sinh, việc thay đổi mô hình bạn muốn sử dụng chỉ là vấn đề truyền một giá trị khác cho tham số mô hình. Bằng cách sử dụng generate() thay vì SDK mô hình gốc, bạn có thể linh hoạt sử dụng một số mô hình khác nhau trong ứng dụng và thay đổi mô hình trong tương lai.

Cho đến nay, bạn chỉ thấy các ví dụ về các lệnh gọi generate() đơn giản nhất. Tuy nhiên, generate() cũng cung cấp một giao diện cho các hoạt động tương tác nâng cao hơn với các mô hình tạo sinh. Bạn sẽ thấy giao diện này trong các phần sau.

Lời nhắc của hệ thống

Một số mô hình hỗ trợ việc cung cấp lời nhắc của hệ thống. Lời nhắc này sẽ đưa ra hướng dẫn cho mô hình về cách bạn muốn mô hình phản hồi tin nhắn của người dùng. Bạn có thể sử dụng lời nhắc của hệ thống để chỉ định một tính cách mà bạn muốn mô hình áp dụng, giọng điệu của câu trả lời, định dạng của câu trả lời, v.v.

Nếu mô hình bạn đang sử dụng hỗ trợ lời nhắc hệ thống, bạn có thể cung cấp lời nhắc bằng thông số system:

const { text } = await ai.generate({
  system: 'You are a food industry marketing consultant.',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

Tham số mô hình

Hàm generate() nhận một tham số config, thông qua đó, bạn có thể chỉ định các chế độ cài đặt không bắt buộc để kiểm soát cách mô hình tạo nội dung:

const { text } = await ai.generate({
  prompt: 'Invent a menu item for a pirate themed restaurant.',
  config: {
    maxOutputTokens: 400,
    stopSequences: ['<end>', '<fin>'],
    temperature: 1.2,
    topP: 0.4,
    topK: 50,
  },
});

Các tham số chính xác được hỗ trợ phụ thuộc vào từng mô hình và API mô hình. Tuy nhiên, các tham số trong ví dụ trước là phổ biến đối với hầu hết mọi mô hình. Sau đây là nội dung giải thích về các tham số này:

Các tham số kiểm soát độ dài đầu ra

maxOutputTokens

LLM hoạt động trên các đơn vị được gọi là mã thông báo. Mã thông báo thường ánh xạ đến một trình tự ký tự cụ thể, nhưng không bắt buộc phải như vậy. Khi bạn truyền một câu lệnh vào một mô hình, một trong những bước đầu tiên cần thực hiện là định dạng chuỗi câu lệnh thành một chuỗi mã thông báo. Sau đó, LLM sẽ tạo một chuỗi mã thông báo từ dữ liệu đầu vào được tạo mã thông báo. Cuối cùng, trình tự mã thông báo sẽ được chuyển đổi trở lại thành văn bản, đó là kết quả của bạn.

Tham số mã thông báo đầu ra tối đa chỉ đặt giới hạn về số lượng mã thông báo cần tạo bằng LLM. Mỗi mô hình có thể sử dụng một trình phân tích cú pháp khác nhau, nhưng bạn nên xem xét một từ tiếng Anh được tạo thành từ 2 đến 4 mã thông báo.

Như đã nêu trước đó, một số mã thông báo có thể không liên kết với trình tự ký tự. Một ví dụ như vậy là thường có một mã thông báo cho biết kết thúc của trình tự: khi LLM tạo mã thông báo này, trình tự sẽ ngừng tạo mã thông báo khác. Do đó, có thể và thường thì LLM tạo ra ít mã thông báo hơn số lượng tối đa vì đã tạo mã thông báo "dừng".

stopSequences

Bạn có thể sử dụng tham số này để đặt mã thông báo hoặc trình tự mã thông báo. Khi được tạo, các mã thông báo này sẽ cho biết kết thúc đầu ra của LLM. Các giá trị chính xác để sử dụng ở đây thường phụ thuộc vào cách huấn luyện mô hình và thường do trình bổ trợ mô hình đặt. Tuy nhiên, nếu đã nhắc mô hình tạo một trình tự dừng khác, bạn có thể chỉ định trình tự đó tại đây.

Xin lưu ý rằng bạn đang chỉ định các chuỗi ký tự chứ không phải mã thông báo. Trong hầu hết trường hợp, bạn sẽ chỉ định một trình tự ký tự mà trình tạo mã thông báo của mô hình ánh xạ đến một mã thông báo duy nhất.

Các thông số kiểm soát "mẫu quảng cáo"

Các tham số nhiệt độ, top-ptop-k cùng kiểm soát mức độ "sáng tạo" mà bạn muốn mô hình có được. Dưới đây là nội dung giải thích ngắn gọn về ý nghĩa của các tham số này, nhưng điều quan trọng hơn cần lưu ý là: các tham số này được dùng để điều chỉnh đặc điểm của đầu ra LLM. Giá trị tối ưu cho các giá trị này phụ thuộc vào mục tiêu và lựa chọn ưu tiên của bạn, và có thể chỉ tìm thấy thông qua thử nghiệm.

nhiệt độ

Về cơ bản, LLM là các máy dự đoán mã thông báo. Đối với một chuỗi mã thông báo nhất định (chẳng hạn như câu lệnh), LLM dự đoán, đối với mỗi mã thông báo trong từ vựng của nó, khả năng mã thông báo đó xuất hiện tiếp theo trong chuỗi. Nhiệt độ là hệ số tỷ lệ mà các dự đoán này được chia trước khi được chuẩn hoá thành xác suất từ 0 đến 1.

Giá trị nhiệt độ thấp (từ 0 đến 1) làm tăng sự khác biệt về khả năng giữa các mã thông báo, dẫn đến việc mô hình sẽ ít có khả năng tạo ra một mã thông báo mà mô hình đã đánh giá là không có khả năng. Điều này thường được coi là kết quả ít sáng tạo hơn. Mặc dù về mặt kỹ thuật, 0.0 không phải là giá trị hợp lệ, nhưng nhiều mô hình coi giá trị này là chỉ báo cho biết mô hình sẽ hoạt động một cách xác định và chỉ xem xét mã thông báo có nhiều khả năng nhất.

Các giá trị nhiệt độ cao (những giá trị lớn hơn 1.0) sẽ nén sự khác biệt về xác suất giữa các mã thông báo, nhờ đó, mô hình có nhiều khả năng tạo ra các mã thông báo mà trước đây mô hình đã đánh giá là khó có thể xảy ra. Điều này thường được coi là kết quả sáng tạo hơn. Một số API mô hình áp đặt nhiệt độ tối đa, thường là 2.0.

topP

Top-p là một giá trị từ 0,0 đến 1,0, kiểm soát số lượng mã thông báo có thể có mà bạn muốn mô hình xem xét, bằng cách chỉ định xác suất tích luỹ của các mã thông báo. Ví dụ: giá trị 1.0 có nghĩa là xem xét mọi mã thông báo có thể có (nhưng vẫn tính đến xác suất của từng mã thông báo). Giá trị 0,4 có nghĩa là chỉ xem xét các mã thông báo có nhiều khả năng nhất, có xác suất cộng lại là 0,4 và loại trừ các mã thông báo còn lại.

topK

Top-k là một giá trị số nguyên cũng kiểm soát số lượng mã thông báo có thể có mà bạn muốn mô hình xem xét, nhưng lần này là bằng cách chỉ định rõ ràng số lượng mã thông báo tối đa. Việc chỉ định giá trị 1 có nghĩa là mô hình sẽ hoạt động một cách xác định.

Thử nghiệm với các tham số của mô hình

Bạn có thể thử nghiệm hiệu quả của các tham số này đối với kết quả do các tổ hợp mô hình và lời nhắc khác nhau tạo ra bằng cách sử dụng Giao diện người dùng dành cho nhà phát triển. Khởi động giao diện người dùng dành cho nhà phát triển bằng lệnh genkit start và giao diện này sẽ tự động tải tất cả các mô hình do các trình bổ trợ được định cấu hình trong dự án của bạn xác định. Bạn có thể nhanh chóng thử nhiều lời nhắc và giá trị cấu hình mà không cần phải lặp lại các thay đổi này trong mã.

Kết quả có cấu trúc

Khi sử dụng AI tạo sinh làm thành phần trong ứng dụng, bạn thường muốn đầu ra ở định dạng khác với văn bản thuần tuý. Ngay cả khi chỉ tạo nội dung để hiển thị cho người dùng, bạn vẫn có thể hưởng lợi từ kết quả có cấu trúc chỉ nhằm mục đích trình bày nội dung đó một cách hấp dẫn hơn cho người dùng. Tuy nhiên, đối với các ứng dụng AI tạo sinh nâng cao hơn, chẳng hạn như sử dụng đầu ra của mô hình theo phương thức lập trình hoặc đưa đầu ra của mô hình này vào mô hình khác, bạn phải có đầu ra có cấu trúc.

Trong Genkit, bạn có thể yêu cầu đầu ra có cấu trúc từ một mô hình bằng cách chỉ định giản đồ khi gọi generate():

import { z } from 'genkit'; // Import Zod, which is re-exported by Genkit.
const MenuItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  calories: z.number(),
  allergens: z.array(z.string()),
});

const { output } = await ai.generate({
  prompt: 'Invent a menu item for a pirate themed restaurant.',
  output: { schema: MenuItemSchema },
});

Giản đồ đầu ra của mô hình được chỉ định bằng thư viện Zod. Ngoài ngôn ngữ định nghĩa giản đồ, Zod cũng cung cấp tính năng kiểm tra loại thời gian chạy, giúp thu hẹp khoảng cách giữa các loại TypeScript tĩnh và đầu ra không thể dự đoán của các mô hình AI tạo sinh. Zod cho phép bạn viết mã có thể dựa vào thực tế là lệnh gọi tạo thành công sẽ luôn trả về kết quả tuân thủ các loại TypeScript của bạn.

Khi bạn chỉ định một giản đồ trong generate(), Genkit sẽ thực hiện một số việc ở chế độ nền:

  • Bổ sung hướng dẫn bổ sung về định dạng đầu ra mong muốn cho câu lệnh. Điều này cũng có tác dụng phụ là chỉ định cho mô hình nội dung chính xác mà bạn muốn tạo (ví dụ: không chỉ đề xuất một mục trong trình đơn mà còn tạo nội dung mô tả, danh sách các chất gây dị ứng, v.v.).
  • Phân tích cú pháp đầu ra của mô hình thành một đối tượng JavaScript.
  • Xác minh rằng kết quả tuân thủ giản đồ.

Để nhận kết quả có cấu trúc từ lệnh gọi tạo thành công, hãy sử dụng thuộc tính output của đối tượng phản hồi:

if (output) {
  const { name, description, calories, allergens } = output;
}

Xử lý lỗi

Lưu ý trong ví dụ trước, thuộc tính output có thể là null. Điều này có thể xảy ra khi mô hình không tạo được đầu ra tuân thủ giản đồ. Chiến lược tốt nhất để xử lý các lỗi như vậy sẽ phụ thuộc vào trường hợp sử dụng chính xác của bạn, nhưng sau đây là một số gợi ý chung:

  • Thử một mô hình khác. Để đầu ra có cấu trúc thành công, mô hình phải có khả năng tạo đầu ra ở định dạng JSON. Các LLM mạnh mẽ nhất, như Gemini và Claude, đủ linh hoạt để thực hiện việc này; tuy nhiên, các mô hình nhỏ hơn, chẳng hạn như một số mô hình cục bộ mà bạn sẽ sử dụng với Ollama, có thể không tạo ra được đầu ra có cấu trúc một cách đáng tin cậy trừ phi chúng được huấn luyện riêng để làm việc đó.

  • Sử dụng các khả năng cưỡng chế của Zod: Bạn có thể chỉ định trong giản đồ rằng Zod nên cố gắng cưỡng chế các loại không tuân thủ thành loại do giản đồ chỉ định. Nếu giản đồ của bạn bao gồm các loại nguyên gốc khác ngoài chuỗi, thì việc sử dụng tính năng cưỡng bức Zod có thể làm giảm số lượng lỗi generate() mà bạn gặp phải. Phiên bản MenuItemSchema sau đây sử dụng tính năng ép kiểu để tự động khắc phục các trường hợp mô hình tạo thông tin về lượng calo dưới dạng chuỗi thay vì số:

    const MenuItemSchema = z.object({
      name: z.string(),
      description: z.string(),
      calories: z.coerce.number(),
      allergens: z.array(z.string()),
    });
    
  • Thử gọi lại hàm generate(). Nếu mô hình bạn đã chọn hiếm khi không tạo được đầu ra tuân thủ, bạn có thể coi lỗi này giống như lỗi mạng và chỉ cần thử lại yêu cầu bằng cách sử dụng một số loại chiến lược thời gian đợi gia tăng.

Phát trực tuyến

Khi tạo một lượng lớn văn bản, bạn có thể cải thiện trải nghiệm cho người dùng bằng cách hiển thị kết quả khi kết quả được tạo – truyền trực tuyến kết quả. Bạn có thể thấy một ví dụ quen thuộc về việc truyền trực tuyến trong hầu hết các ứng dụng trò chuyện LLM: người dùng có thể đọc phản hồi của mô hình đối với tin nhắn của họ khi mô hình đang được tạo, điều này giúp cải thiện khả năng phản hồi của ứng dụng và tăng cường ảo tưởng về việc trò chuyện với một đối tác thông minh.

Trong Genkit, bạn có thể truyền phát đầu ra bằng phương thức generateStream(). Cú pháp của phương thức này tương tự như phương thức generate():

const { response, stream } = await ai.generateStream(
  'Suggest a complete menu for a pirate themed restaurant.'
);

Đối tượng phản hồi có một thuộc tính stream mà bạn có thể sử dụng để lặp lại đầu ra truyền trực tuyến của yêu cầu khi được tạo:

for await (const chunk of stream) {
  console.log(chunk.text);
}

Bạn cũng có thể nhận được kết quả đầy đủ của yêu cầu, như với yêu cầu không truyền trực tuyến:

const completeText = (await response).text;

Tính năng truyền trực tuyến cũng hoạt động với đầu ra có cấu trúc:

const MenuSchema = z.object({
  starters: z.array(MenuItemSchema),
  mains: z.array(MenuItemSchema),
  desserts: z.array(MenuItemSchema),
});

const { response, stream } = await ai.generateStream({
  prompt: 'Suggest a complete menu for a pirate themed restaurant.',
  output: { schema: MenuSchema },
});

for await (const chunk of stream) {
  // `output` is an object representing the entire output so far.
  console.log(chunk.output);
}

// Get the completed output.
const { output } = await response;

Dòng dữ liệu đầu ra có cấu trúc hoạt động hơi khác so với dòng văn bản: thuộc tính output của một đoạn phản hồi là một đối tượng được tạo từ việc tích luỹ các đoạn đã được tạo cho đến thời điểm hiện tại, thay vì một đối tượng đại diện cho một đoạn duy nhất (có thể không hợp lệ). Mỗi phần đầu ra có cấu trúc theo một nghĩa nào đó sẽ thay thế phần trước đó.

Ví dụ: Dưới đây là 5 kết quả đầu tiên từ ví dụ trước:

null

{ starters: [ {} ] }

{
  starters: [ { name: "Captain's Treasure Chest", description: 'A' } ]
}

{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350
    }
  ]
}

{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350,
      allergens: [Array]
    },
    { name: 'Shipwreck Salad', description: 'Fresh' }
  ]
}

Phương thức nhập đa phương thức

Các ví dụ bạn đã thấy cho đến nay đã sử dụng chuỗi văn bản làm lời nhắc mô hình. Mặc dù đây vẫn là cách phổ biến nhất để nhắc các mô hình AI tạo sinh, nhưng nhiều mô hình cũng có thể chấp nhận các nội dung nghe nhìn khác làm câu lệnh. Lời nhắc nội dung nghe nhìn thường được dùng cùng với lời nhắc văn bản để hướng dẫn mô hình thực hiện một số thao tác trên nội dung nghe nhìn, chẳng hạn như thêm chú thích cho hình ảnh hoặc chép lời bản ghi âm.

Khả năng chấp nhận dữ liệu đầu vào đa phương tiện và các loại nội dung đa phương tiện bạn có thể sử dụng hoàn toàn phụ thuộc vào mô hình và API của mô hình đó. Ví dụ: loạt mô hình Gemini 1.5 có thể chấp nhận hình ảnh, video và âm thanh làm lời nhắc.

Để cung cấp lời nhắc nội dung nghe nhìn cho một mô hình hỗ trợ lời nhắc đó, thay vì truyền một lời nhắc văn bản đơn giản đến generate, hãy truyền một mảng bao gồm một phần nội dung nghe nhìn và một phần văn bản:

const { text } = await ai.generate([
  { media: { url: 'https://example.com/photo.jpg' } },
  { text: 'Compose a poem about this image.' },
]);

Trong ví dụ trên, bạn đã chỉ định một hình ảnh bằng cách sử dụng URL HTTPS có thể truy cập công khai. Bạn cũng có thể truyền trực tiếp dữ liệu phương tiện bằng cách mã hoá dữ liệu đó dưới dạng URL dữ liệu. Ví dụ:

import { readFile } from 'node:fs/promises';
const b64Data = await readFile('photo.jpg', { encoding: 'base64url' });
const dataUrl = `data:image/jpeg;base64,${b64Data}`;

const { text } = await ai.generate([
  { media: { url: dataUrl } },
  { text: 'Compose a poem about this image.' },
]);

Tất cả các mô hình hỗ trợ đầu vào nội dung nghe nhìn đều hỗ trợ cả URL dữ liệu và URL HTTPS. Một số trình bổ trợ mô hình hỗ trợ thêm các nguồn nội dung nghe nhìn khác. Ví dụ: trình bổ trợ Vertex AI cũng cho phép bạn sử dụng URL Cloud Storage (gs://).

Tạo nội dung nghe nhìn

Cho đến nay, hầu hết các ví dụ trên trang này đều xử lý việc tạo văn bản bằng LLM. Tuy nhiên, bạn cũng có thể sử dụng Genkit với các mô hình tạo hình ảnh. Việc sử dụng generate() với mô hình tạo hình ảnh cũng tương tự như việc sử dụng LLM. Ví dụ: để tạo hình ảnh bằng mô hình Imagen2 thông qua Vertex AI:

  1. Genkit sử dụng URL data: làm định dạng đầu ra chuẩn cho nội dung nghe nhìn được tạo. Đây là một định dạng chuẩn có nhiều thư viện để xử lý. Ví dụ này sử dụng gói data-urls từ jsdom:

    npm i --save data-urls
    npm i --save-dev @types/data-urls
  2. Để tạo hình ảnh và lưu hình ảnh đó vào một tệp, hãy gọi generate(), chỉ định mô hình tạo hình ảnh và loại nội dung nghe nhìn của định dạng đầu ra:

    import { imagen3Fast, vertexAI } from '@genkit-ai/vertexai';
    import parseDataURL from 'data-urls';
    import { genkit } from 'genkit';
    
    import { writeFile } from 'node:fs/promises';
    
    const ai = genkit({
      plugins: [vertexAI({ location: 'us-central1' })],
    });
    
    (async () => {
      const { media } = await ai.generate({
        model: imagen3Fast,
        prompt: 'photo of a meal fit for a pirate',
        output: { format: 'media' },
      });
    
      if (media === null) throw new Error('No media generated.');
    
      const data = parseDataURL(media.url);
      if (data === null) throw new Error('Invalid "data:" URL.');
    
      await writeFile(`output.${data.mimeType.subtype}`, data.body);
    })();
    

Các bước tiếp theo

Tìm hiểu thêm về Genkit

  • Là nhà phát triển ứng dụng, cách chính để bạn tác động đến kết quả của các mô hình AI tạo sinh là thông qua lời nhắc. Hãy đọc phần Quản lý lời nhắc để tìm hiểu cách Genkit giúp bạn phát triển lời nhắc hiệu quả và quản lý lời nhắc đó trong cơ sở mã của bạn.
  • Mặc dù generate() là hạt nhân của mọi ứng dụng sử dụng AI tạo sinh, nhưng các ứng dụng thực tế thường yêu cầu thêm công việc trước và sau khi gọi mô hình AI tạo sinh. Để phản ánh điều này, Genkit giới thiệu khái niệm về luồng. Luồng được xác định như các hàm nhưng thêm các tính năng bổ sung như khả năng quan sát và triển khai đơn giản. Để tìm hiểu thêm, hãy xem phần Xác định quy trình công việc.

Sử dụng LLM nâng cao

  • Một cách để nâng cao khả năng của LLM là nhắc chúng bằng danh sách các cách mà chúng có thể yêu cầu bạn cung cấp thêm thông tin hoặc yêu cầu bạn thực hiện một số hành động. Đây được gọi là gọi công cụ hoặc gọi hàm. Các mô hình được huấn luyện để hỗ trợ chức năng này có thể phản hồi một câu lệnh bằng một phản hồi được định dạng đặc biệt, cho ứng dụng gọi biết rằng ứng dụng đó sẽ thực hiện một số hành động và gửi kết quả trở lại LLM cùng với câu lệnh ban đầu. Genkit có các hàm thư viện tự động hoá cả quá trình tạo lời nhắc và các phần tử vòng lặp phản hồi lệnh gọi của quá trình triển khai lệnh gọi công cụ. Hãy xem phần Gọi công cụ để tìm hiểu thêm.
  • Tạo sinh tăng cường truy xuất (RAG) là một kỹ thuật dùng để đưa thông tin theo miền cụ thể vào đầu ra của mô hình. Việc này được thực hiện bằng cách chèn thông tin liên quan vào lời nhắc trước khi chuyển thông tin đó đến mô hình ngôn ngữ. Để triển khai RAG một cách hoàn chỉnh, bạn cần kết hợp một số công nghệ: mô hình tạo văn bản nhúng, cơ sở dữ liệu vectơ và mô hình ngôn ngữ lớn. Hãy xem phần Tạo bằng cách tăng cường truy xuất (RAG) để tìm hiểu cách Genkit đơn giản hoá quy trình điều phối các phần tử này.

Kiểm thử đầu ra của mô hình

Là một kỹ sư phần mềm, bạn đã quen với các hệ thống có tính chất xác định, trong đó cùng một đầu vào luôn tạo ra cùng một đầu ra. Tuy nhiên, với các mô hình AI mang tính xác suất, kết quả có thể thay đổi dựa trên các sắc thái tinh tế trong dữ liệu đầu vào, dữ liệu huấn luyện của mô hình và thậm chí là tính ngẫu nhiên được đưa vào một cách có chủ ý bằng các tham số như nhiệt độ.

Trình đánh giá của Genkit được thiết kế để đánh giá chất lượng của các phản hồi của LLM bằng nhiều chiến lược. Đọc thêm trên trang Đánh giá.