Có thể ngắt là một loại công cụ đặc biệt có thể tạm dừng vòng lặp tạo và gọi công cụ LLM để trả lại quyền kiểm soát cho bạn. Khi đã sẵn sàng, bạn có thể tiếp tục tạo bằng cách gửi phản hồi mà LLM xử lý để tạo thêm.
Các trường hợp sử dụng phổ biến nhất của các ngoại lệ thuộc một số danh mục:
- Con người tham gia vào quy trình: Cho phép người dùng sử dụng AI tương tác để làm rõ thông tin cần thiết hoặc xác nhận hành động của LLM trước khi hành động đó hoàn tất, giúp đảm bảo an toàn và sự tự tin.
- Xử lý không đồng bộ: Bắt đầu một tác vụ không đồng bộ mà chỉ có thể hoàn tất ngoài phạm vi, chẳng hạn như gửi thông báo phê duyệt đến người đánh giá hoặc bắt đầu một quy trình chạy trong nền trong thời gian dài.
- Thoát khỏi tác vụ tự động: Cung cấp cho mô hình một cách để đánh dấu một tác vụ là hoàn tất, trong một quy trình công việc có thể lặp lại qua một loạt lệnh gọi công cụ dài.
Trước khi bắt đầu
Tất cả các ví dụ được ghi nhận ở đây đều giả định rằng bạn đã thiết lập một dự án có cài đặt các phần phụ thuộc Genkit. 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.
Trước khi đi sâu vào tìm hiểu, bạn cũng nên làm quen với các khái niệm sau:
- Tạo nội dung bằng các mô hình AI.
- Hệ thống của Genkit để xác định giản đồ đầu vào và đầu ra.
- Các phương thức chung của cách gọi công cụ.
Tổng quan về các ngắt
Ở cấp độ cao, đây là giao diện của một sự kiện ngắt khi tương tác với LLM:
- Ứng dụng gọi sẽ nhắc LLM bằng một yêu cầu. Câu lệnh bao gồm một danh sách các công cụ, bao gồm ít nhất một công cụ cho một sự kiện ngắt mà LLM có thể sử dụng để tạo phản hồi.
- LLM tạo một phản hồi hoàn chỉnh hoặc một yêu cầu gọi công cụ ở một định dạng cụ thể. Đối với LLM, lệnh gọi ngắt giống như mọi lệnh gọi công cụ khác.
- Nếu LLM gọi một công cụ ngắt, thư viện Genkit sẽ tự động tạm dừng quá trình tạo thay vì ngay lập tức chuyển các phản hồi trở lại mô hình để xử lý thêm.
- Nhà phát triển kiểm tra xem có lệnh gọi ngắt hay không và thực hiện mọi tác vụ cần thiết để thu thập thông tin cần thiết cho phản hồi ngắt.
- Nhà phát triển tiếp tục tạo bằng cách truyền phản hồi ngắt vào mô hình. Thao tác này sẽ kích hoạt việc quay lại Bước 2.
Xác định các ngắt phản hồi thủ công
Loại ngắt phổ biến nhất cho phép LLM yêu cầu người dùng làm rõ, chẳng hạn như bằng cách đặt câu hỏi trắc nghiệm.
Đối với trường hợp sử dụng này, hãy sử dụng phương thức defineInterrupt()
của thực thể Genkit:
import { genkit, z } from 'genkit';
import { googleAI, gemini15Flash } from '@genkitai/google-ai';
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const askQuestion = ai.defineInterrupt({
name: 'askQuestion',
description: 'use this to ask the user a clarifying question',
inputSchema: z.object({
choices: z.array(z.string()).describe('the choices to display to the user'),
allowOther: z.boolean().optional().describe('when true, allow write-ins')
}),
outputSchema: z.string()
});
Xin lưu ý rằng outputSchema
của một ngắt tương ứng với dữ liệu phản hồi mà bạn sẽ cung cấp, thay vì dữ liệu sẽ được hàm công cụ tự động điền.
Sử dụng các tín hiệu ngắt
Các tín hiệu ngắt được truyền vào mảng tools
khi tạo nội dung, giống như các loại công cụ khác. Bạn có thể truyền cả công cụ thông thường và các ngắt vào cùng một lệnh gọi generate
:
tạo
const response = await ai.generate({
prompt: 'Ask me a movie trivia question.',
tools: [askQuestion],
});
definePrompt
const triviaPrompt = ai.definePrompt(
{
name: 'triviaPrompt',
tools: [askQuestion],
input: {
schema: z.object({subject: z.string()})
},
prompt: 'Ask me a trivia question about {{subject}}
.',
}
);
const response = await triviaPrompt({ subject: 'computer history' });
Tệp lời nhắc
---
tools: [askQuestion]
input:
schema:
partyType: string
---
{{role "system"}}
Use the askQuestion tool if you need to clarify something.
{{role "user"}}
Help me plan a {{partyType}} party next week.
Sau đó, bạn có thể thực thi lời nhắc trong mã của mình như sau:
```ts
// assuming prompt file is named partyPlanner.prompt
const partyPlanner = ai.prompt('partyPlanner');
const response = await partyPlanner({ partyType: 'birthday' });
```
Chat
const chat = ai.chat({
system: 'Use the askQuestion tool if you need to clarify something.',
tools: [askQuestion],
});
const response = await chat.send('make a plan for my birthday party');
Genkit sẽ trả về phản hồi ngay lập tức khi nhận được lệnh gọi công cụ ngắt.
Phản hồi các hoạt động gián đoạn
Nếu đã truyền một hoặc nhiều tín hiệu ngắt vào lệnh gọi tạo, bạn cần kiểm tra phản hồi của các tín hiệu ngắt để có thể xử lý chúng:
// you can check the 'finishReason' of the response
response.finishReason === 'interrupted'
// or you can check to see if any interrupt requests are on the response
response.interrupts.length > 0
Bạn có thể phản hồi một sự kiện ngắt bằng cách sử dụng tuỳ chọn resume
trên lệnh gọi generate
tiếp theo, nhớ truyền vào nhật ký hiện có. Mỗi công cụ đều có một phương thức .respond()
để giúp tạo phản hồi.
Sau khi tiếp tục, mô hình sẽ quay lại vòng lặp tạo, bao gồm cả việc thực thi công cụ, cho đến khi hoàn tất hoặc một ngắt khác được kích hoạt:
let response = await ai.generate({
tools: [askQuestion],
system: 'ask clarifying questions until you have a complete solution',
prompt: 'help me plan a backyard BBQ',
});
while (response.interrupts.length) {
const answers = [];
// multiple interrupts can be called at once, so we handle them all
for (const question in response.interrupts) {
answers.push(
// use the `respond` method on our tool to populate answers
askQuestion.respond(
question,
// send the tool request input to the user to respond
await askUser(question.toolRequest.input)
)
);
}
response = await ai.generate({
tools: [askQuestion],
messages: response.messages,
resume: {
respond: answers
}
})
}
// no more interrupts, we can see the final response
console.log(response.text);
Các công cụ có thể khởi động lại các hoạt động gián đoạn
Một mẫu phổ biến khác cho các hoạt động gián đoạn là cần xác nhận một hành động mà LLM đề xuất trước khi thực sự thực hiện hành động đó. Ví dụ: một ứng dụng thanh toán có thể muốn người dùng xác nhận một số loại giao dịch chuyển tiền nhất định.
Đối với trường hợp sử dụng này, bạn có thể sử dụng phương thức defineTool
chuẩn để thêm logic tuỳ chỉnh về thời điểm kích hoạt một sự kiện ngắt và những việc cần làm khi một sự kiện ngắt được khởi động lại bằng siêu dữ liệu bổ sung.
Xác định một công cụ có thể khởi động lại
Mỗi công cụ đều có quyền truy cập vào hai trình trợ giúp đặc biệt trong đối số thứ hai của định nghĩa triển khai:
interrupt
: khi được gọi, phương thức này sẽ gửi một loại ngoại lệ đặc biệt được phát hiện để tạm dừng vòng lặp tạo. Bạn có thể cung cấp siêu dữ liệu bổ sung dưới dạng một đối tượng.resumed
: khi một yêu cầu từ một quá trình tạo bị gián đoạn được khởi động lại bằng tuỳ chọn{resume: {restart: ...}}
(xem bên dưới), trình trợ giúp này sẽ chứa siêu dữ liệu được cung cấp khi khởi động lại.
Ví dụ: nếu đang xây dựng một ứng dụng thanh toán, bạn có thể muốn xác nhận với người dùng trước khi thực hiện một khoản chuyển vượt quá một số tiền nhất định:
const transferMoney = ai.defineTool({
name: 'transferMoney',
description: 'Transfers money between accounts.',
inputSchema: z.object({
toAccountId: z.string().describe('the account id of the transfer destination'),
amount: z.number().describe('the amount in integer cents (100 = $1.00)'),
}),
outputSchema: z.object({
status: z.string().describe('the outcome of the transfer'),
message: z.string().optional(),
})
}, async (input, {context, interrupt, resumed})) {
// if the user rejected the transaction
if (resumed?.status === "REJECTED") {
return {status: 'REJECTED', message: 'The user rejected the transaction.'};
}
// trigger an interrupt to confirm if amount > $100
if (resumed?.status !== "APPROVED" && input.amount > 10000) {
interrupt({
message: "Please confirm sending an amount > $100.",
});
}
// complete the transaction if not interrupted
return doTransfer(input);
}
Trong ví dụ này, ở lần thực thi đầu tiên (khi resumed
chưa được xác định), công cụ sẽ kiểm tra xem số tiền có vượt quá 100 đô la hay không và kích hoạt một sự kiện ngắt nếu có. Ở lần thực thi thứ hai, công cụ sẽ tìm trạng thái trong siêu dữ liệu mới được cung cấp và thực hiện việc chuyển hoặc trả về phản hồi từ chối, tuỳ thuộc vào việc trạng thái đó được phê duyệt hay bị từ chối.
Khởi động lại các công cụ sau khi bị gián đoạn
Các công cụ ngắt cho phép bạn kiểm soát toàn bộ:
- Khi một yêu cầu công cụ ban đầu sẽ kích hoạt một sự kiện ngắt.
- Thời điểm và liệu có tiếp tục vòng lặp tạo hay không.
- Thông tin bổ sung cần cung cấp cho công cụ khi tiếp tục.
Trong ví dụ được trình bày ở phần trước, ứng dụng có thể yêu cầu người dùng xác nhận yêu cầu bị gián đoạn để đảm bảo số tiền chuyển là hợp lệ:
let response = await ai.generate({
tools: [transferMoney],
prompt: "Transfer $1000 to account ABC123",
});
while (response.interrupts.length) {
const confirmations = [];
// multiple interrupts can be called at once, so we handle them all
for (const interrupt in response.interrupts) {
confirmations.push(
// use the 'restart' method on our tool to provide `resumed` metadata
transferMoney.restart(
interrupt,
// send the tool request input to the user to respond. assume that this
// returns `{status: "APPROVED"}` or `{status: "REJECTED"}`
await requestConfirmation(interrupt.toolRequest.input);
)
);
}
response = await ai.generate({
tools: [transferMoney],
messages: response.messages,
resume: {
restart: confirmations,
}
})
}
// no more interrupts, we can see the final response
console.log(response.text);