Hướng dẫn này minh hoạ cách truy cập vào Gemini API cho ứng dụng Go bằng SDK AI Go của Google.
Trong hướng dẫn này, bạn sẽ tìm hiểu cách thực hiện những việc sau:
- Thiết lập dự án, bao gồm cả khoá API
- Tạo văn bản từ dữ liệu nhập chỉ có văn bản
- Tạo văn bản bằng cách nhập văn bản và hình ảnh (đa phương thức)
- Tạo cuộc trò chuyện nhiều lượt (trò chuyện)
- Sử dụng tính năng truyền trực tuyến để tương tác nhanh hơn
Ngoài ra, hướng dẫn này có các phần về trường hợp sử dụng nâng cao (như tính năng nhúng và đếm mã thông báo) cũng như các tuỳ chọn để kiểm soát việc tạo nội dung.
Điều kiện tiên quyết
Hướng dẫn này giả định rằng bạn đã quen thuộc với việc tạo ứng dụng bằng Go.
Để hoàn tất hướng dẫn này, hãy đảm bảo rằng môi trường phát triển của bạn đáp ứng các yêu cầu sau:
- Go 1.20 trở lên
Thiết lập dự án
Trước khi gọi Gemini API, bạn cần thiết lập dự án, bao gồm cả việc thiết lập khoá API, cài đặt gói SDK và khởi động mô hình.
Thiết lập khoá API
Để sử dụng Gemini API, bạn sẽ cần có khoá API. Nếu bạn chưa có khoá, hãy tạo một khoá trong Google AI Studio.
Bảo mật khoá API của bạn
Bạn không nên kiểm tra khoá API trong hệ thống quản lý phiên bản của mình. Thay vào đó, bạn nên sử dụng kho bí mật cho khoá API.
Tất cả các đoạn mã trong hướng dẫn này đều giả định rằng bạn đang truy cập vào khoá API dưới dạng một biến môi trường.
Cài đặt gói SDK
Để sử dụng Gemini API trong ứng dụng của riêng mình, bạn cần get
gói SDK Go trong thư mục mô-đun của mình:
go get github.com/google/generative-ai-go
Khởi chạy mô hình tạo sinh
Để có thể thực hiện lệnh gọi API, bạn cần nhập và khởi chạy mô hình tạo sinh.
import "github.com/google/generative-ai-go/genai"
import "google.golang.org/api/option"
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
Khi chỉ định một mô hình, hãy lưu ý những điều sau:
Sử dụng một mô hình dành riêng cho trường hợp sử dụng của bạn (ví dụ:
gemini-1.5-flash
dành cho phương thức nhập đa phương thức). Trong hướng dẫn này, hướng dẫn cho từng phương thức triển khai sẽ liệt kê mô hình được đề xuất cho từng trường hợp sử dụng.
Triển khai các trường hợp sử dụng phổ biến
Giờ đây dự án của bạn đã được thiết lập, bạn có thể khám phá việc sử dụng Gemini API để triển khai các trường hợp sử dụng khác nhau:
- Tạo văn bản từ dữ liệu nhập chỉ có văn bản
- Tạo văn bản bằng cách nhập văn bản và hình ảnh (đa phương thức)
- Tạo cuộc trò chuyện nhiều lượt (trò chuyện)
- Sử dụng tính năng truyền trực tuyến để tương tác nhanh hơn
Trong phần các trường hợp sử dụng nâng cao, bạn có thể tìm thấy thông tin về Gemini API và tính năng nhúng.
Tạo văn bản từ dữ liệu đầu vào chỉ có văn bản
Khi câu lệnh nhập chỉ bao gồm văn bản, hãy sử dụng mô hình Gemini 1.5 hoặc mô hình Gemini 1.0 Pro có generateContent
để tạo đầu ra văn bản:
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
resp, err := model.GenerateContent(ctx, genai.Text("Write a story about a magic backpack."))
if err != nil {
log.Fatal(err)
}
Tạo văn bản bằng cách nhập văn bản và hình ảnh (đa phương thức)
Gemini cung cấp nhiều mô hình có thể xử lý dữ liệu đầu vào đa phương thức (mô hình Gemini 1.5) để bạn có thể nhập cả văn bản và hình ảnh. Hãy nhớ xem lại các yêu cầu về hình ảnh đối với câu lệnh.
Khi câu lệnh nhập bao gồm cả văn bản và hình ảnh, hãy sử dụng mô hình Gemini 1.5 với phương thức generateContent
để tạo đầu ra văn bản:
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
imgData1, err := os.ReadFile(pathToImage1)
if err != nil {
log.Fatal(err)
}
imgData2, err := os.ReadFile(pathToImage1)
if err != nil {
log.Fatal(err)
}
prompt := []genai.Part{
genai.ImageData("jpeg", imgData1),
genai.ImageData("jpeg", imgData2),
genai.Text("What's different between these two pictures?"),
}
resp, err := model.GenerateContent(ctx, prompt...)
if err != nil {
log.Fatal(err)
}
Xây dựng cuộc trò chuyện nhiều lượt
Khi sử dụng Gemini, bạn có thể tạo các cuộc trò chuyện dạng tự do ở nhiều chặng. SDK đơn giản hoá quy trình bằng cách quản lý trạng thái cuộc trò chuyện. Vì vậy, không giống như GenerateContent
, bạn không phải tự lưu trữ nhật ký trò chuyện.
Để tạo một cuộc trò chuyện nhiều lượt (chẳng hạn như cuộc trò chuyện), hãy sử dụng mô hình Gemini 1.5 hoặc mô hình Gemini 1.0 Pro và bắt đầu cuộc trò chuyện bằng cách gọi startChat()
.
Sau đó, hãy sử dụng sendMessage()
để gửi tin nhắn mới cho người dùng. Thao tác này cũng sẽ thêm tin nhắn và câu trả lời vào nhật ký trò chuyện.
Có hai lựa chọn có thể áp dụng cho role
liên kết với nội dung trong cuộc trò chuyện:
user
: vai trò đưa ra lời nhắc. Giá trị này là giá trị mặc định cho lệnh gọiSendMessage
.model
: vai trò đưa ra câu trả lời. Bạn có thể dùng vai trò này khi gọiStartChat()
bằnghistory
hiện có.
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with multi-turn conversations (like chat)
model := client.GenerativeModel("gemini-1.5-flash")
// Initialize the chat
cs := model.StartChat()
cs.History = []*genai.Content{
&genai.Content{
Parts: []genai.Part{
genai.Text("Hello, I have 2 dogs in my house."),
},
Role: "user",
},
&genai.Content{
Parts: []genai.Part{
genai.Text("Great to meet you. What would you like to know?"),
},
Role: "model",
},
}
resp, err := cs.SendMessage(ctx, genai.Text("How many paws are in my house?"))
if err != nil {
log.Fatal(err)
}
Sử dụng tính năng phát trực tuyến để tương tác nhanh hơn
Theo mặc định, mô hình này trả về một phản hồi sau khi hoàn tất toàn bộ quy trình tạo. Bạn có thể đạt được các lượt tương tác nhanh hơn bằng cách không phải chờ toàn bộ kết quả mà thay vào đó hãy sử dụng tính năng truyền trực tuyến để xử lý một phần kết quả.
Ví dụ sau đây cho thấy cách triển khai truyền trực tuyến bằng phương thức GenerateContentStream
để tạo văn bản từ lời nhắc nhập văn bản và hình ảnh.
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// The Gemini 1.5 models are versatile and work with both text-only and multimodal prompts
model := client.GenerativeModel("gemini-1.5-flash")
imageBytes, err := os.ReadFile(pathToImage)
img := genai.ImageData("jpeg", imageBytes)
prompt := genai.Text("Tell me a story about this animal")
iter := model.GenerateContentStream(ctx, img, prompt)
for {
resp, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatal(err)
}
// ... print resp
}
Bạn có thể sử dụng phương pháp tương tự cho các trường hợp sử dụng chỉ nhập văn bản và trò chuyện.
prompt := genai.Text("Tell me a story about a lumberjack and his giant ox")
iter := model.GenerateContentStream(ctx, prompt)
prompt := genai.Text("And how do you feel about that?")
iter := cs.SendMessageStream(ctx, prompt)
Triển khai các trường hợp sử dụng nâng cao
Các trường hợp sử dụng phổ biến được mô tả trong phần trước của hướng dẫn này sẽ giúp bạn làm quen với việc sử dụng Gemini API. Phần này mô tả một số trường hợp sử dụng có thể được coi là nâng cao hơn.
Dùng tính năng nhúng
Nhúng là một kỹ thuật dùng để biểu diễn thông tin dưới dạng danh sách các số có dấu phẩy động trong một mảng. Với Gemini, bạn có thể biểu diễn văn bản (từ, câu và khối văn bản) ở dạng vectơ, giúp bạn dễ dàng so sánh và đối chiếu các mục nhúng. Ví dụ: hai văn bản có cùng chủ đề hoặc cảm xúc phải có các mục nhúng tương tự nhau và có thể được xác định thông qua các kỹ thuật so sánh toán học, chẳng hạn như tính tương đồng về cosin.
Sử dụng mô hình embedding-001
với phương thức EmbedContent
(hoặc phương thức BatchEmbedContent
) để tạo các mục nhúng. Ví dụ sau đây sẽ tạo một mục nhúng cho một chuỗi đơn:
ctx := context.Background()
// Access your API key as an environment variable (see "Set up your API key" above)
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("API_KEY")))
if err != nil {
log.Fatal(err)
}
defer client.Close()
// For embeddings, use the embedding-001 model
em := client.EmbeddingModel("embedding-001")
res, err := em.EmbedContent(ctx, genai.Text("The quick brown fox jumps over the lazy dog."))
if err != nil {
panic(err)
}
fmt.Println(res.Embedding.Values)
Gọi hàm
Lệnh gọi hàm giúp bạn dễ dàng nhận kết quả đầu ra dữ liệu có cấu trúc từ các mô hình tạo sinh. Sau đó, bạn có thể sử dụng những dữ liệu đầu ra này để gọi các API khác và trả về dữ liệu phản hồi liên quan cho mô hình. Nói cách khác, lệnh gọi hàm giúp bạn kết nối các mô hình tạo sinh với các hệ thống bên ngoài để nội dung được tạo có chứa thông tin mới nhất và chính xác nhất. Hãy tìm hiểu thêm trong hướng dẫn gọi hàm.
Đếm mã
Khi sử dụng các câu lệnh dài, bạn nên đếm mã thông báo trước khi gửi bất kỳ nội dung nào đến mô hình. Các ví dụ sau đây minh hoạ cách sử dụng CountTokens()
cho nhiều trường hợp sử dụng:
// For text-only input
text := "Parrots can be green and live a long time."
resp, err := model.CountTokens(ctx, genai.Text(text))
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.TotalTokens)
// For text-and-image input (multimodal)
text := "Parrots can be green and live a long time."
imageBytes, err := os.ReadFile(pathToImage)
if err != nil {
log.Fatal(err)
}
resp, err := model.CountTokens(
ctx,
genai.Text(text),
genai.ImageData("png", imageBytes))
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.TotalTokens)
Các tuỳ chọn kiểm soát việc tạo nội dung
Bạn có thể kiểm soát việc tạo nội dung bằng cách định cấu hình các tham số của mô hình và sử dụng các chế độ cài đặt an toàn.
Định cấu hình tham số của mô hình
Mọi lời nhắc bạn gửi đến mô hình đều bao gồm các giá trị tham số kiểm soát cách mô hình tạo một phản hồi. Mô hình có thể tạo ra kết quả khác nhau cho các giá trị tham số khác nhau. Tìm hiểu thêm về Thông số mô hình. Cấu hình này được duy trì trong suốt thời gian hoạt động của thực thể mô hình.
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
// Configure model parameters by invoking Set* methods on the model.
model.SetTemperature(0.9)
model.SetTopK(1)
// ...
Sử dụng chế độ cài đặt an toàn
Bạn có thể sử dụng chế độ cài đặt an toàn để điều chỉnh khả năng nhận được những phản hồi có thể được coi là gây hại. Theo mặc định, các chế độ cài đặt an toàn sẽ chặn nội dung có xác suất trung bình và/hoặc cao là nội dung không an toàn trên mọi phương diện. Tìm hiểu thêm về Chế độ cài đặt an toàn.
Dưới đây là cách đặt một chế độ cài đặt an toàn:
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
model.SafetySettings = []*genai.SafetySetting{
{
Category: genai.HarmCategoryHarassment,
Threshold: genai.HarmBlockOnlyHigh,
},
}
// ...
Bạn cũng có thể đặt nhiều chế độ cài đặt an toàn:
// ...
// The Gemini 1.5 models are versatile and work with most use cases
model := client.GenerativeModel("gemini-1.5-flash")
model.SafetySettings = []*genai.SafetySetting{
{
Category: genai.HarmCategoryHarassment,
Threshold: genai.HarmBlockOnlyHigh,
},
{
Category: genai.HarmCategoryHateSpeech,
Threshold: genai.HarmBlockMediumAndAbove,
},
}
// ...
Bước tiếp theo
Thiết kế câu lệnh là quá trình tạo các câu lệnh để gợi ra phản hồi mong muốn từ các mô hình ngôn ngữ. Việc viết câu lệnh có cấu trúc hợp lý là một phần thiết yếu để đảm bảo các câu trả lời chính xác, có chất lượng cao từ một mô hình ngôn ngữ. Tìm hiểu các phương pháp hay nhất để viết câu lệnh.
Gemini cung cấp một số biến thể của mô hình để đáp ứng nhu cầu của nhiều trường hợp sử dụng, chẳng hạn như các loại dữ liệu đầu vào và độ phức tạp, phương thức triển khai cho tính năng trò chuyện hoặc các tác vụ khác về ngôn ngữ của hộp thoại, cũng như các hạn chế về kích thước. Tìm hiểu về các mô hình Gemini hiện có.