Quy trình làm việc dựa trên tác nhân trên thiết bị (sử dụng lớp AgentRunner) cung cấp các phiên nhiều lượt được quản lý, tự động ghi lại nhật ký trò chuyện trong bộ nhớ qua các lượt, nhờ đó bạn không phải quản lý bản chép lời theo cách thủ công. (Nếu muốn trực tiếp quản lý nhật ký trò chuyện của riêng mình, bạn có thể truyền một đối tượng List<Content> nhiều lượt có vai trò USER và MODEL cùng giá trị sessionId đến một đối tượng GenerateContentRequest bằng cách sử dụng quyền truy cập trực tiếp vào mô hình.)
Trang này trình bày cách quản lý các thực thể AgentSession trong vòng đời của thành phần Android, thay đổi cấu hình và thu hồi bộ nhớ.
Phiên nhiều lượt
Quản lý các cuộc trò chuyện nhiều lượt bằng cách sử dụng các thực thể AgentSession trong phạm vi được lấy bằng phương thức runner.getOrCreateSession(sessionId). Các lượt hội thoại (tin nhắn của người dùng, lệnh gọi công cụ và phản hồi của mô hình) sẽ tự động được ghi lại trong bộ nhớ trong phiên. Các lệnh gọi tiếp theo đến phương thức session.runAsync(content) sẽ giữ nguyên các lượt trước đó làm ngữ cảnh.
Giá trị nhận dạng phiên không được để trống, có tối đa 128 ký tự và chỉ chứa
ký tự chữ-số, dấu gạch dưới, dấu gạch nối hoặc dấu chấm
(^[a-zA-Z0-9_.-]+$, ngoại trừ . và ..). Chuỗi UUID được tạo bằng
phương thức UUID.randomUUID().toString() tuân thủ các quy tắc ràng buộc này.
Để bắt đầu một cuộc trò chuyện nhiều lượt, hãy tạo một giá trị nhận dạng phiên và lấy một thực thể AgentSession từ thực thể AgentRunner của bạn:
val sessionId = "user_chat_${System.currentTimeMillis()}"
val session = runner.getOrCreateSession(sessionId)
Mỗi lệnh gọi đến phương thức session.runAsync(content) sẽ gửi một lượt câu lệnh mới trong phiên đó. Mô hình này duy trì ngữ cảnh từ các lượt trước trong cuộc trò chuyện.
Duy trì phiên hoạt động khi có thay đổi về cấu hình
Giao diện AgentSession lưu giữ nhật ký cuộc trò chuyện trong bộ nhớ và không triển khai giao diện Parcelable. Trong các ứng dụng Android, Hoạt động và Mảnh
bị huỷ và tạo lại trong quá trình thay đổi cấu hình (chẳng hạn như xoay
màn hình). Nếu bạn lưu trữ phiên trực tiếp trong một Hoạt động, nhật ký cuộc trò chuyện sẽ bị mất khi xoay.
Để lưu giữ nhật ký cuộc trò chuyện khi có thay đổi về cấu hình, hãy giữ lại thực thể AgentSession của bạn trong một lớp ViewModel của AndroidX:
package com.example.ai.agent.ui
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.mlkit.genai.agent.AgentRunner
import com.google.mlkit.genai.agent.AgentSession
import com.google.mlkit.genai.agent.textTokens
import com.google.mlkit.genai.prompt.Content
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class ChatViewModel(
private val runner: AgentRunner,
private val sessionId: String = "default_chat_session"
) : ViewModel() {
// Retain the session inside the ViewModel to survive screen rotations
private val session: AgentSession = runner.getOrCreateSession(sessionId)
private val _responseText = MutableStateFlow("")
val responseText: StateFlow<String> = _responseText.asStateFlow()
fun sendMessage(userPrompt: String) {
viewModelScope.launch {
val content = Content.builder().text(userPrompt).build()
session.runAsync(content)
.textTokens()
.collect { token ->
_responseText.update { it + token }
}
}
}
override fun onCleared() {
super.onCleared()
// Release session memory and cancel active coroutines when ViewModel is destroyed
session.close()
}
}
Quản lý bộ nhớ và dọn dẹp phiên
Giới hạn trạng thái cuộc trò chuyện trong bộ nhớ để duy trì hiệu suất của ứng dụng:
- Xoá phiên rõ ràng: Khi người dùng rời khỏi một chuỗi trò chuyện hoặc nhấn vào "Cuộc trò chuyện mới", hãy gọi phương thức
session.delete()hoặcrunner.deleteSession(sessionId)để giải phóng đồng bộ bộ nhớ được phân bổ cho các lượt và kết quả của công cụ trước đây. Ngoài ra, việc gọi phương thứcsession.close()sẽ gửi lệnh loại bỏ trong nền. - Dọn dẹp khi đăng xuất: Gọi phương thức
runner.clearAllSessions()khi người dùng đăng xuất hoặc xoá dữ liệu ứng dụng. - Dọn dẹp phiên khi kết thúc vòng đời: Gọi phương thức
session.close()khi lớpViewModelhoặc thành phần mẹ bị huỷ vĩnh viễn (trong phương thứconCleared()). Thao tác này sẽ huỷ các coroutine đang chờ xử lý và gửi lệnh loại bỏ trong nền cho phiên trò chuyện đó.
Thực thi tạm thời một lượt
Đối với các nhiệm vụ một lần của tác nhân (chẳng hạn như tạo bản tóm tắt nhanh, xác thực dữ liệu đầu vào hoặc trả lời một câu hỏi độc lập) mà không cần ngữ cảnh trước đây, hãy gọi trực tiếp phương thức runner.runSingleTurnAsync(content):
import com.google.mlkit.genai.agent.AgentEvent
import com.google.mlkit.genai.prompt.Content
val content = Content.builder()
.text("Summarize order history for customer #1042: ...")
.build()
runner.runSingleTurnAsync(content)
.collect { event ->
if (event is AgentEvent.TextMessage && !event.isPartial) {
displaySummary(event.text)
}
}
Khi gọi trực tiếp phương thức runner.runSingleTurnAsync(content), lớp AgentRunner sẽ phân bổ một phiên tạm thời trong nội bộ và tự động xoá tất cả trạng thái cuộc trò chuyện khỏi bộ nhớ sau khi luồng phản hồi hoàn tất hoặc huỷ, tránh rò rỉ bộ nhớ.
Các bước tiếp theo
- Kết nối luồng phản ứng của tác nhân với Compose trong phần Sự kiện luồng và tích hợp giao diện người dùng.
- Tìm hiểu về cách định cấu hình công cụ trong phần Xác định công cụ.