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. 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 đều có đ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ó khả năng nhất, bạn có thể phải xây dựng lại tính năng 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 sử dụng AI dựa trên Genkit sẽ đơ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 thành 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ả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.

Hàm genkit.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à hàm genkit.Generate().

Lệnh gọi genkit.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 (
    "context"
    "log"

    "github.com/firebase/genkit/go/ai"
    "github.com/firebase/genkit/go/genkit"
    "github.com/firebase/genkit/go/plugins/googlegenai"
)

func main() {
    ctx := context.Background()

    g, err := genkit.Init(ctx,
        genkit.WithPlugins(&googlegenai.GoogleAI{}),
        genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
    )
    if err != nil {
        log.Fatal(err)
    }

    resp, err := genkit.Generate(ctx, g,
        ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    )
    if err != nil {
        log.Fatal(err)
    }

    log.Println(resp.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 genkit.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 genkit.Generate():

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.5-pro"),
    ai.WithPrompt("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.

Những ví dụ này cũng minh hoạ một điểm quan trọng: khi bạn sử dụng genkit.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 vào tham số mô hình. Bằng cách sử dụng genkit.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 của mình 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 genkit.Generate() đơn giản nhất. Tuy nhiên, genkit.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 các đặc điểm như 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 và định dạng của câu trả lời.

Nếu mô hình bạn đang sử dụng hỗ trợ lời nhắc của hệ thống, bạn có thể cung cấp lời nhắc bằng tuỳ chọn WithSystem():

resp, err := genkit.Generate(ctx, g,
    ai.WithSystem("You are a food industry marketing consultant."),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)

Đối với các mô hình không hỗ trợ lời nhắc hệ thống, WithSystem() sẽ mô phỏng lời nhắc đó bằng cách sửa đổi yêu cầu để giống như lời nhắc hệ thống.

Tham số mô hình

Hàm genkit.Generate() nhận một tuỳ chọn WithConfig(), 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:

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    ai.WithConfig(&googlegenai.GeminiConfig{
        MaxOutputTokens: 500,
        StopSequences:   ["<end>", "<fin>"],
        Temperature:     0.5,
        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ô 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ả đầu ra của bạn.

Tham số mã thông báo đầu ra tối đa đặ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 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 phân tích cú pháp của mô hình liên kết với 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ố temperature (nhiệt độ), top-p (top-p) và top-k (top-k) cùng kiểm soát mức độ "sáng tạo" mà bạn muốn mô hình có. Phần này cung cấp nội dung giải thích rất ngắn gọn về ý nghĩa của các tham số này, nhưng quan trọng hơn 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à một hệ số tỷ lệ mà theo đó các dự đoán này được chia trước khi được chuẩn hoá thành một 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ông có khả năng. Đ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 có xác định.

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

Bạn có thể thử nghiệm tác động 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 thực hiện nhiều lần các thay đổi này trong mã.

Ghép nối mô hình với cấu hình của mô hình đó

Do mỗi nhà cung cấp hoặc thậm chí một mô hình cụ thể có thể có giản đồ cấu hình riêng hoặc đảm bảo một số chế độ cài đặt nhất định, nên việc đặt các tuỳ chọn riêng biệt bằng WithModelName()WithConfig() có thể dễ gặp lỗi vì tuỳ chọn sau không được nhập mạnh vào tuỳ chọn trước.

Để ghép nối một mô hình với cấu hình của mô hình đó, bạn có thể tạo một tệp tham chiếu mô hình mà bạn có thể truyền vào lệnh gọi tạo:

model := googlegenai.GoogleAIModelRef("gemini-2.0-flash", &googlegenai.GeminiConfig{
    MaxOutputTokens: 500,
    StopSequences:   ["<end>", "<fin>"],
    Temperature:     0.5,
    TopP:            0.4,
    TopK:            50,
})

resp, err := genkit.Generate(ctx, g,
    ai.WithModel(model),
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
    log.Fatal(err)
}

Hàm khởi tạo cho tham chiếu mô hình sẽ thực thi việc cung cấp đúng loại cấu hình, nhờ đó có thể giảm tình trạng không khớp.

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ột mô hình vào một 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 loại đầu ra khi gọi genkit.Generate():

type MenuItem struct {
    Name        string   `json:"name"`
    Description string   `json:"description"`
    Calories    int      `json:"calories"`
    Allergens   []string `json:"allergens"`
}

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
    ai.WithOutputType(MenuItem{}),
)
if err != nil {
  log.Fatal(err) // One possible error is that the response does not conform to the type.
}

Các loại đầu ra của mô hình được chỉ định dưới dạng giản đồ JSON bằng cách sử dụng gói invopop/jsonschema. Điều này cung cấp tính năng kiểm tra kiểu thời gian chạy, giúp thu hẹp khoảng cách giữa các loại Go tĩnh và kết quả không thể đoán trước của các mô hình AI tạo sinh. Hệ thống này 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 Go của bạn.

Khi bạn chỉ định một loại đầu ra trong genkit.Generate(), Genkit sẽ thực hiện một số thao tác ở chế độ nền:

  • Bổ sung hướng dẫn bổ sung về định dạng đầu ra đã chọn cho lời nhắc. Đ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.).
  • Xác minh rằng kết quả tuân thủ giản đồ.
  • Điều phối đầu ra của mô hình thành một loại Go.

Để nhận kết quả có cấu trúc từ lệnh gọi tạo thành công, hãy gọi Output() trên phản hồi mô hình bằng một giá trị trống thuộc loại:

var item MenuItem
if err := resp.Output(&item); err != nil {
    log.Fatalf(err)
}

log.Printf("%s (%d calories, %d allergens): %s\n",
    item.Name, item.Calories, len(item.Allergens), item.Description)

Ngoài ra, bạn có thể sử dụng genkit.GenerateData() để gọi ngắn gọn hơn:

item, resp, err := genkit.GenerateData[MenuItem](ctx, g,
    ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
  log.Fatal(err)
}

log.Printf("%s (%d calories, %d allergens): %s\n",
    item.Name, item.Calories, len(item.Allergens), item.Description)

Hàm này yêu cầu tham số loại đầu ra nhưng tự động đặt tuỳ chọn WithOutputType() và gọi resp.Output() trước khi trả về giá trị.

Xử lý lỗi

Lưu ý trong ví dụ trước rằng lệnh gọi genkit.Generate() có thể dẫn đến lỗi. Một lỗi 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 có đủ tính 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 đó.

  • Đơn giản hoá giản đồ. LLM có thể gặp sự cố khi tạo các loại phức tạp hoặc lồng sâu. Hãy thử sử dụng tên rõ ràng, ít trường hơn hoặc cấu trúc phẳng nếu bạn không thể tạo dữ liệu có cấu trúc một cách đáng tin cậy.

  • Thử gọi lại lệnh gọi genkit.Generate(). Nếu mô hình bạn đã chọn hiếm khi không tạo được đầu ra tuân thủ, thì bạn có thể coi lỗi này giống như lỗi mạng và 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 giá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 tuỳ chọn WithStreaming():

resp, err := genkit.Generate(ctx, g,
    ai.WithPrompt("Suggest a complete menu for a pirate themed restaurant."),
    ai.WithStreaming(func(ctx context.Context, chunk *ai.ModelResponseChunk) error {
        // Do something with the chunk...
        log.Println(chunk.Text())
        return nil
    }),
)
if err != nil {
    log.Fatal(err)
}

log.Println(resp.Text())

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 2.0 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ợ nội dung nghe nhìn, thay vì truyền một lời nhắc văn bản đơn giản vào genkit.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. Ví dụ này chỉ định một hình ảnh bằng cách sử dụng một URL HTTPS có thể truy cập công khai.

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithMessages(
        NewUserMessage(
            NewMediaPart("image/jpeg", "https://example.com/photo.jpg"),
            NewTextPart("Compose a poem about this image."),
        ),
    ),
)

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ụ:

image, err := ioutil.ReadFile("photo.jpg")
if err != nil {
    log.Fatal(err)
}

resp, err := genkit.Generate(ctx, g,
    ai.WithModelName("googleai/gemini-2.0-flash"),
    ai.WithMessages(
        NewUserMessage(
            NewMediaPart("image/jpeg", "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(image)),
            NewTextPart("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://).

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 mô hình AI tạo sinh là thông qua lời nhắc. Hãy đọc bài viết Quản lý lời nhắc bằng Dotprompt để 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ã.
  • Mặc dù genkit.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 làm việc của AI.

Sử dụng LLM nâng cao

Ứng dụng của bạn có thể sử dụng một số kỹ thuật để khai thác lợi ích của LLM hiệu quả hơn.

  • 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ả việc 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.