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

Trọng tâm của AI tạo sinh là các mô hình AI. Hiện tại, hai kênh nổi bật nhất Ví dụ về mô hình tạo sinh là mô hình ngôn ngữ lớn (LLM) và hình ảnh thế hệ mới. Những mô hình này nhận thông tin đầu vào, gọi là lời nhắc (phổ biến nhất 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 hay thậm chí là âm thanh hoặc video.

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

Ngoài ra, các LLM đã được chứng minh có khả năng thực hiện các nhiệm vụ khác 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 những việc phụ cần làm để hoàn thành một nhiệm vụ lớn hơn
  • Sắp xếp dữ liệu chưa được tổ chức
  • Tìm 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

Có nhiều mô hình có sẵn cho bạn, từ một số nhà cung cấp khác nhau. Một mô hình có điểm mạnh và điểm yếu riêng và một mô hình có thể vượt trội ở một nhiệm vụ nhưng lại hoạt động kém hiệu quả hơn đối với những nhà quảng cáo 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ụ đang thực hiện.

Là nhà phát triển ứng dụng, bạn thường không tương tác với AI tạo sinh mô hình trực tiếp 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 chúng thông qua các API khác nhau và không tương thích. Nếu bạn muốn sử dụng nhiều các dịch vụ mô hình của họ, bạn phải sử dụng từng SDK độc quyền của họ, có thể không tương thích với nhau. Và nếu bạn muốn nâng cấp từ một kiểu máy lên mới nhất và hiệu quả nhất, bạn có thể phải xây dựng tích hợp đó trên một lần nữa.

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 cung cấp thông tin chi tiết về cách truy cập vào bất kỳ dịch vụ mô hình AI tạo sinh nào, kèm theo đã có sẵn một số phương pháp triển khai tạo sẵn. Xây dựng chiến dịch sử dụng trí tuệ nhân tạo ứng dụng của Genkit giúp đơn giản hoá quá trình bạn thực hiện cuộc gọi đầu tiên dựa trên AI tạo sinh và giúp bạn dễ dàng kết hợp nhiều mô hình hoặc hoán đổi một mô hình cho 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 đoạn mã ví dụ trên trang này, trước tiên hãy hoàn thành các bước trong hướng dẫn Bắt đầu. Tất 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ủa mình.

Các kiểu máy mà Genkit hỗ trợ

Genkit được thiết kế để hoạt động đủ linh hoạt để dùng được mọi AI tạo sinh dịch vụ mô hình. Các thư viện cốt lõi của thư viện xác định giao diện chung để làm việc mô hình và trình bổ trợ mô hình xác định chi tiết triển khai để 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ợ để làm việc với các mô hình do Vertex AI cung cấp, AI tạo sinh của Google và Ollama:

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

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

Bạn có thể khám phá thêm bằng cách tìm gói được gắn thẻ genkit-model trên npmjs.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 bạn đang đọc từ Hướng dẫn bắt đầu, bạn đã làm việc này. Nếu không, hãy xem phầ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 ở đó trước khi đang tiếp tục.

Hàm generate()

Trong Genkit, giao diện chính mà bạn dùng để tương tác với AI tạo sinh mô hình là hàm 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 văn bản câu lệnh:

import { generate } from '@genkit-ai/ai';
import { configureGenkit } from '@genkit-ai/core';
import { gemini15Flash } from '@genkit-ai/googleai';

configureGenkit(/* ... */);

(async () => {
  const llmResponse = await generate({
    model: gemini15Flash,
    prompt: 'Invent a menu item for a pirate themed restaurant.',
  });

  console.log(await llmResponse.text());
})();

Khi bạn chạy ví dụ ngắn này, thao tác sẽ in ra 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à 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 nêu trên đã chỉ định mô hình bằng cách sử dụng một tham chiếu mô hình được xuất bởi trình bổ trợ mô hình. Bạn cũng có thể chỉ định mô hình bằng cách sử dụng giá trị nhận dạng chuỗi:

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

Giá trị nhận dạng chuỗi của mô hình sẽ có dạng providerid/modelid, trong đó mã nhà cung cấp (trong trường hợp này, googleai) xác định trình bổ trợ và mã mô hình là một giá trị nhận dạng chuỗi của trình bổ trợ cụ thể cho 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 nên không xuất mô hình riêng lẻ tài liệu tham khảo. 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 tập dữ liệu đó:

const llmResponse = await generate({
  model: 'ollama/gemma2',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

Tất cả các ví dụ trên cũng minh hoạ một điểm quan trọng: khi bạn sử dụng generate() để thực hiện lệnh gọi mô hình AI tạo sinh, thay đổi mô hình mà bạn muốn chỉ là việc truyền một giá trị khác tới thông số mô hình. Theo bằng cách sử dụng generate() thay vì SDK mô hình gốc, bạn sẽ tự cung cấp cho mình linh hoạt hơn để dễ dàng sử dụng nhiều mô hình khác nhau trong ứng dụng và thay đổi các mô hình thanh toán trong tương lai.

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

Thông số mô hình

Hàm generate() lấy tham số config mà 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 llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  config: {
    maxOutputTokens: 400,
    stopSequences: ["<end>", "<fin>"],
    temperature: 1.2,
    topP: 0.4,
    topK: 50,
  },
});

Các thông số chính xác được hỗ trợ tuỳ thuộc vào từng mô hình và mô hình API. Tuy nhiên, các tham số trong ví dụ trước phổ biến 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

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

Thông 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 tạo bằng LLM. Mỗi mô hình có thể sử dụng một trình tạo mã thông báo khác nhau, nhưng nguyên tắc chung là xem xét một từ tiếng Anh duy nhất được tạo thành từ 2 đến 4 mã thông báo.

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

stopSequences

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

Lưu ý rằng bạn đang chỉ định chuỗi ký tự chứ không phải chỉ định mã thông báo cho mỗi lượt. Trong hầu hết trong các trường hợp, bạn sẽ chỉ định chuỗi 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 "khả năng sáng tạo"

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

nhiệt độ

Về cơ bản, LLM là những công cụ 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) một LLM dự đoán, đối với mỗi mã thông báo trong từ vựng, khả năng mã thông báo xuất hiện tiếp theo trong trình tự. Nhiệt độ là hệ số tỷ lệ mà theo đó những dự đoán này được chia trước khi được chuẩn hóa thành xác suất trong khoảng từ 0 đến 1.

Các giá trị nhiệt độ thấp – từ 0.0 đến 1.0 – làm tăng sự khác biệt về khả năng xảy ra giữa các mã thông báo, dẫn đến kết quả là mô hình sẽ ít hơn nữa có khả năng tạo ra một mã thông báo mà nó đã đánh giá là không có khả năng. Việc này thường được xem 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ệ, nhiều mô hình coi đó là giá trị cho biết rằng mô hình nên hoạt động một cách quyết định và chỉ xem xét một mã thông báo có khả năng cao nhất.

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

topP

Top-p là một giá trị nằm trong khoảng từ 0,0 đến 1,0 kiểm soát số lượng có thể có mã thông báo 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 khả năng mã thông báo (nhưng vẫn tính đến xác suất của mỗi mã thông báo). Giá trị là 0, 4 có nghĩa là chỉ xem xét những mã thông báo có nhiều khả năng nhất mà có xác suất bằng 0, 4 và để loại trừ các mã thông báo còn lại khỏi quá trình xem xét.

hàng đầu

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 bằng cách chỉ định rõ ràng số lượng mã thông báo. Việc chỉ định giá trị là 1 có nghĩa là mô hình sẽ hoạt động một cách quyết định.

Thử nghiệm các thông số của mô hình

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

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

Khi sử dụng AI tạo sinh làm một 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 bạn chỉ tạo nội dung hiển thị cho người dùng, bạn có thể hưởng lợi từ đầu ra có cấu trúc chỉ vì nhằm mục đích trình bày quảng cáo hấp dẫn hơn đối với người dùng. Tuy nhiên, nếu muốn nâng cao các ứng dụng của AI tạo sinh, 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 kết quả của một mô hình vào một đầu ra có cấu trúc khác là điều bắt buộc.

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

import { z } from "zod";
const MenuItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  calories: z.number(),
  allergens: z.array(z.string()),
});

const llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  output: {
    schema: MenuItemSchema,
  },
});

Giản đồ đầu ra mô hình được chỉ định bằng thuộc tính Phân vùng thư viện của bạn. Ngoài ngôn ngữ định nghĩa giản đồ, Zod còn cung cấp môi trường thời gian chạy kiểm tra kiểu, giúp thu hẹp khoảng cách giữa các loại TypeScript tĩnh và kết quả khó đoán trước về 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à một lệnh gọi tạo thành công sẽ luôn trả về kết quả phù hợp với 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 phía sau cảnh:

  • Bổ sung hướng dẫn bổ sung cho câu lệnh về định dạng đầu ra mong muốn. Điều này cũng có tác dụng phụ là chỉ định chính xác nội dung nào cho mô hình 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 kết quả của mô hình thành một đối tượng JavaScript.
  • Xác minh rằng dữ liệu đầu ra tuân thủ giản đồ.

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

type MenuItem = z.infer<typeof MenuItemSchema>;

const output: MenuItem | null = llmResponse.output();

Xử lý lỗi

Hãy lưu ý trong ví dụ trước rằng phương thức đầu ra có thể trả về null. Điều này có thể xảy ra khi mô hình không tạo được đầu ra phù hợp với giản đồ. Bạn cũng có thể phát hiện điều kiện này bằng cách bắt NoValidCandidatesError ngoại lệ được gửi bởi create:

import { NoValidCandidatesError } from "@genkit-ai/ai";
try {
  llmResponse = await generate(/* ... */);
} catch (e) {
  if (e instanceof NoValidCandidatesError) {
    // Output doesn't conform to schema.
  }
}

Chiến lược tốt nhất để xử lý các lỗi như vậy sẽ phụ thuộc vào mức sử dụng chính xác của bạn trong trường hợp khác, 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ó thể tạo đầu ra trong JSON. Những LLM mạnh mẽ nhất, như Gemini và Roberto có đủ linh hoạt để làm việc này; tuy nhiên, các mô hình nhỏ hơn, chẳng hạn như mô hình cục bộ mà bạn sử dụng cùng với Ollama, có thể không tạo đượ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 cụ thể để làm vì vậy.

  • Tận dụng khả năng cưỡng bức của Zod: Bạn có thể chỉ định trong giản đồ Zod cần cố gắng chuyển đổi các kiểu không phù hợp thành kiểu được chỉ định bởi giản đồ. Nếu giản đồ của bạn bao gồm các loại nguyên hàm khác ngoài chuỗi, hãy sử dụng Zod thao tác ép buộc có thể làm giảm số lần generate() thất bại mà bạn gặp phải. Chiến lược phát hành đĩa đơn phiên bản sau của MenuItemSchema sử dụng chuyển đổi loại để tự động các tình huống chính xác trong đó mô hình tạo thông tin calo dưới dạng một chuỗi thay vì một số:

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

Phát trực tuyến

Khi tạo một số 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 trình bày đầu ra khi nó được tạo — truyền trực tuyến đầu ra đó. Đáp ví dụ quen thuộc về việc phát trực tiếp trong thực tế có thể thấy trong hầu hết các ứng dụng trò chuyện dựa trên mô hình ngôn ngữ lớn (LLM): người dùng có thể đọc phản hồi của mô hình cho tin nhắn của họ khi nó được tạo. Điều này cải thiện khả năng phản hồi cảm nhận của ứng dụng và tăng cường ảo tưởng về việc trò chuyện với người đồng nghiệp thông minh.

Trong Genkit, bạn có thể truyền trực tuyến dữ liệu đầu ra bằng hàm generateStream(). cú pháp tương tự như hàm generate():

import { generateStream } from "@genkit-ai/ai";
import { GenerateResponseChunk } from "@genkit-ai/ai/lib/generate";
const llmResponseStream = await generateStream({
  prompt: 'Suggest a complete menu for a pirate themed restaurant',
  model: gemini15Flash,
});

Tuy nhiên, hàm này trả về một kiểu lặp lại không đồng bộ của các đoạn phản hồi. Xử lý từng phần sau khi chúng có thể sử dụng:

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk;
  console.log(responseChunk.text());
}

Bạn vẫn có thể nhận toàn bộ câu trả lời cùng một lúc:

const llmResponse = await llmResponseStream.response();

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),
});
type Menu = z.infer<typeof MenuSchema>;

const llmResponseStream = await generateStream({
  prompt: "Suggest a complete menu for a pirate themed restaurant",
  model: gemini15Flash,
  output: { schema: MenuSchema },
});

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk<Menu>;
  // output() returns an object representing the entire output so far
  const output: Menu | null = responseChunk.output();
  console.log(output);
}

Truyền trực tuyến đầu ra có cấu trúc hoạt động hơi khác so với truyền trực tuyến văn bản. Thời gian khi gọi phương thức output() của một phân đoạn phản hồi, bạn sẽ nhận được một đối tượng được tạo nên từ việc tích luỹ các mảng dữ liệu đã được sản xuất từ trước đến nay, thay vì một đối tượng đại diện cho một phân đoạn đơn lẻ (có thể không hợp lệ trên của riêng mình). Mỗi phân đoạn của đầu ra có cấu trúc theo một nghĩa nào đó sẽ thay thế phân đoạn trước đó.

Ví dụ: sau đâ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' }
  ]
}

Nhập đa phương thức

Các ví dụ bạn thấy từ trước đến nay đã sử dụng chuỗi văn bản làm câu lệnh mẫu. Trong khi đây vẫn là cách phổ biến nhất để phát triển các mô hình AI tạo sinh. Nhiều mô hình có thể cũng chấp nhận nội dung nghe nhìn khác làm câu lệnh. Lời nhắc về nội dung nghe nhìn được dùng thường xuyên nhất trong kết hợp với các câu lệnh bằng 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ư tạo chú thích cho một hình ảnh hoặc chép lời một bản ghi âm.

Có thể chấp nhận phương tiện đầu vào và loại 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ụ: Gemini 1.5 một loạt mô hình có thể chấp nhận hình ảnh, video và âm thanh làm câu lệnh.

Để cung cấp lời nhắc về nội dung nghe nhìn cho một mô hình có hỗ trợ lời nhắc đó, thay vì truyền câu lệnh văn bản đơn giản để tạo, 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 llmResponse = await generate({
  prompt: [
    { media: { url: 'https://example.com/photo.jpg' } },
    { text: 'Compose a poem about this image.' },
  ],
  model: gemini15Flash,
});

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

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

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

Tất cả mô hình có hỗ trợ nhập nội dung nghe nhìn đều hỗ trợ cả URL dữ liệu và URL loại HTTPS. Hơi nhiều các trình bổ trợ mô hình bổ sung khả năng hỗ trợ cho các nguồn phương tiện khác. Ví dụ: Vertex AI cũng cho phép bạn sử dụng URL của Cloud Storage (gs://).

Đang 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 cách sử dụng Các mô hình ngôn ngữ lớn (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. Sử dụng generate() có mô hình tạo hình ảnh tương tự như việc sử dụng một mô hình ngôn ngữ lớn (LLM). Cho 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 đã tạo. Đây là định dạng chuẩn với nhiều thư viện có sẵn để xử lý các định dạng này. Chiến dịch này ví dụ này sử dụng gói data-urls từ jsdom:

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

    import { generate } from '@genkit-ai/ai';
    import { configureGenkit } from '@genkit-ai/core';
    import { vertexAI, imagen2 } from '@genkit-ai/vertexai';
    import parseDataURL from 'data-urls';
    
    import { writeFile } from 'node:fs/promises';
    
    configureGenkit({
      plugins: [vertexAI({ location: 'us-central1' })],
    });
    
    (async () => {
      const mediaResponse = await generate({
        model: imagen2,
        prompt: 'photo of a meal fit for a pirate',
        output: { format: 'media' },
      });
    
      const media = mediaResponse.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);
    })();
    

Ghi lại nhật ký tin nhắn

Nhiều người dùng của bạn sẽ tương tác với các mô hình ngôn ngữ lớn lần đầu tiên thời gian thông qua chatbot. Mặc dù các LLM không chỉ có khả năng mô phỏng trò chuyện, thì đó vẫn là một kiểu tương tác quen thuộc và hữu ích. Ngay cả khi người dùng sẽ không tương tác trực tiếp với mô hình theo cách này, phong cách trò chuyện nhắc nhở là một cách hiệu quả để tác động đến kết quả đầu ra do một mô hình AI tạo ra.

Để tạo nhật ký tin nhắn từ một phản hồi của mô hình, hãy gọi toHistory() phương thức:

let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();

Bạn có thể chuyển đổi tuần tự nhật ký này và lưu trữ trong cơ sở dữ liệu hoặc bộ nhớ phiên. Sau đó, hãy chuyển nhật ký cùng với lời nhắc cho các lệnh gọi trong tương lai đến generate():

response = await generate({
  model: gemini15Flash,
  prompt: 'How about in Spanish?',
  history,
});
history = response.toHistory();

Nếu mô hình bạn đang sử dụng có hỗ trợ vai trò system, bạn có thể sử dụng tên ban đầu để đặt thông báo của hệ thống:

import { MessageData } from "@genkit-ai/ai/model";
let history: MessageData[] = [
  { role: 'system', content: [{ text: 'Talk like a pirate.' }] },
];
let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
  history,
});

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

Sử dụng LLM (mô hình ngôn ngữ lớn) nâng cao

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

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

Là kỹ sư phần mềm, bạn đã quen với các hệ thống mang tính tất định đầu vào luôn tạo ra cùng một đầu ra. Tuy nhiên, hiện nay các mô hình AI đang xác suất, thì đầu ra có thể thay đổi tuỳ theo các sắc thái nhỏ trong đầu vào, dữ liệu huấn luyện của mô hình và thậm chí cả tính ngẫu nhiên do các tham số đưa vào một cách ngẫu nhiên chẳng hạn như nhiệt độ.

Nhân viên đánh giá của Genkit sử dụng những phương pháp có cấu trúc để đánh giá chất lượng của LLM (mô hình ngôn ngữ lớn) của bạn câu trả lời bằng nhiều chiến lược. Đọc thêm trên trang Đánh giá.