ইন্টারাপ্ট হল একটি বিশেষ ধরনের টুল যা আপনার কাছে নিয়ন্ত্রণ ফিরিয়ে আনতে LLM জেনারেশন-এবং-টুল-কলিং লুপকে বিরতি দিতে পারে। আপনি প্রস্তুত হলে, আপনি উত্তর পাঠিয়ে জেনারেশন পুনরায় শুরু করতে পারেন যে LLM পরবর্তী প্রজন্মের জন্য প্রক্রিয়া করে।
ব্যাঘাতের জন্য সবচেয়ে সাধারণ ব্যবহারগুলি কয়েকটি বিভাগে পড়ে:
- হিউম্যান-ইন-দ্য-লুপ: একটি ইন্টারেক্টিভ এআই-এর ব্যবহারকারীকে প্রয়োজনীয় তথ্য স্পষ্ট করতে বা LLM-এর কাজটি সম্পূর্ণ হওয়ার আগে নিশ্চিত করতে সক্ষম করে, নিরাপত্তা এবং আত্মবিশ্বাসের একটি পরিমাপ প্রদান করে।
- অ্যাসিঙ্ক প্রসেসিং: একটি অ্যাসিঙ্ক্রোনাস টাস্ক শুরু করা যা শুধুমাত্র ব্যান্ডের বাইরে সম্পূর্ণ করা যেতে পারে, যেমন একজন মানব পর্যালোচককে একটি অনুমোদনের বিজ্ঞপ্তি পাঠানো বা একটি দীর্ঘ-চলমান পটভূমি প্রক্রিয়া বন্ধ করা।
- একটি স্বায়ত্তশাসিত টাস্ক থেকে প্রস্থান করুন: মডেলটিকে একটি টাস্ককে সম্পূর্ণ হিসাবে চিহ্নিত করার একটি উপায় প্রদান করা, একটি ওয়ার্কফ্লোতে যা একটি দীর্ঘ সিরিজের টুল কলের মাধ্যমে পুনরাবৃত্তি হতে পারে।
আপনি শুরু করার আগে
এখানে নথিভুক্ত সমস্ত উদাহরণ অনুমান করে যে আপনি ইতিমধ্যেই জেনকিট নির্ভরতা ইনস্টল করার সাথে একটি প্রকল্প সেট আপ করেছেন। আপনি যদি এই পৃষ্ঠায় কোডের উদাহরণ চালাতে চান, তাহলে প্রথমে শুরু করুন গাইডের ধাপগুলি সম্পূর্ণ করুন৷
খুব গভীরভাবে ডাইভ করার আগে, আপনার নিম্নলিখিত ধারণাগুলির সাথেও পরিচিত হওয়া উচিত:
- এআই মডেলগুলির সাথে সামগ্রী তৈরি করা ।
- ইনপুট এবং আউটপুট স্কিমা সংজ্ঞায়িত করার জন্য Genkit এর সিস্টেম।
- টুল কল করার সাধারণ পদ্ধতি।
বাধার ওভারভিউ
একটি উচ্চ স্তরে, একটি LLM-এর সাথে ইন্টারঅ্যাক্ট করার সময় একটি বিঘ্নের মত দেখায়:
- কলিং অ্যাপ্লিকেশনটি একটি অনুরোধের সাথে এলএলএমকে অনুরোধ করে। প্রম্পটে টুলগুলির একটি তালিকা অন্তর্ভুক্ত রয়েছে, যার মধ্যে অন্তত একটি বাধার জন্য রয়েছে যা LLM একটি প্রতিক্রিয়া তৈরি করতে ব্যবহার করতে পারে।
- এলএলএম হয় একটি সম্পূর্ণ প্রতিক্রিয়া বা একটি নির্দিষ্ট বিন্যাসে একটি টুল কল অনুরোধ তৈরি করে। LLM-এর কাছে, একটি ইন্টারাপ্ট কল অন্য যেকোন টুল কলের মতো দেখায়।
- যদি LLM একটি ইন্টারাপ্ট টুলকে কল করে, Genkit লাইব্রেরি অতিরিক্ত প্রক্রিয়াকরণের জন্য মডেলের কাছে অবিলম্বে প্রতিক্রিয়া পাঠানোর পরিবর্তে স্বয়ংক্রিয়ভাবে প্রজন্মকে বিরতি দেয়।
- বিকাশকারী একটি ইন্টারাপ্ট কল করা হয়েছে কিনা তা পরীক্ষা করে, এবং ইন্টারাপ্ট প্রতিক্রিয়ার জন্য প্রয়োজনীয় তথ্য সংগ্রহ করার জন্য যা কিছু প্রয়োজন তা সম্পাদন করে।
- বিকাশকারী মডেলটিতে একটি বিঘ্নিত প্রতিক্রিয়া পাস করে প্রজন্ম পুনরায় শুরু করে। এই ক্রিয়াটি ধাপ 2-এ ফিরে আসার ট্রিগার করে।
ম্যানুয়াল-প্রতিক্রিয়া বাধা সংজ্ঞায়িত করুন
সবচেয়ে সাধারণ ধরনের বাধা LLM কে ব্যবহারকারীর কাছ থেকে স্পষ্টীকরণের অনুরোধ করতে দেয়, উদাহরণস্বরূপ একটি বহু-পছন্দের প্রশ্ন জিজ্ঞাসা করে।
এই ব্যবহারের ক্ষেত্রে, Genkit উদাহরণের defineInterrupt()
পদ্ধতি ব্যবহার করুন:
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()
});
নোট করুন যে একটি ইন্টারাপ্টের outputSchema
আপনার সরবরাহ করা প্রতিক্রিয়া ডেটার সাথে মিলে যায় এমন কিছুর বিপরীতে যা একটি টুল ফাংশন দ্বারা স্বয়ংক্রিয়ভাবে জনবহুল হবে।
বাধা ব্যবহার করুন
অন্যান্য ধরনের টুলের মতো বিষয়বস্তু তৈরি করার সময় ইন্টারাপ্টগুলি tools
অ্যারেতে চলে যায়। আপনি একই generate
কলে সাধারণ সরঞ্জাম এবং বাধা উভয়ই পাস করতে পারেন:
উৎপন্ন
const response = await ai.generate({
prompt: 'Ask me a movie trivia question.',
tools: [askQuestion],
});
সংজ্ঞায়িত প্রম্পট
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' });
প্রম্পট ফাইল
---
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.
তারপর আপনি নিম্নলিখিত হিসাবে আপনার কোডে প্রম্পট চালাতে পারেন:
```ts
// assuming prompt file is named partyPlanner.prompt
const partyPlanner = ai.prompt('partyPlanner');
const response = await partyPlanner({ partyType: 'birthday' });
```
চ্যাট
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 অবিলম্বে একটি বিঘ্নিত টুল কল প্রাপ্তির একটি প্রতিক্রিয়া ফেরত.
বাধা সাড়া
আপনি যদি আপনার জেনারেট কলে এক বা একাধিক বাধা পাস করেন, তাহলে আপনাকে বাধাগুলির জন্য প্রতিক্রিয়া পরীক্ষা করতে হবে যাতে আপনি সেগুলি পরিচালনা করতে পারেন:
// 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
একটি বিঘ্নের প্রতিক্রিয়া একটি পরবর্তী generate
কলে resume
বিকল্প ব্যবহার করে করা হয়, বিদ্যমান ইতিহাসে পাস করা নিশ্চিত করে। প্রতিটি টুলের একটি .respond()
পদ্ধতি রয়েছে যা প্রতিক্রিয়া তৈরি করতে সহায়তা করে।
একবার পুনরায় চালু হলে, মডেলটি টুল এক্সিকিউশন সহ জেনারেশন লুপে পুনরায় প্রবেশ করে, যতক্ষণ না এটি সম্পূর্ণ হয় বা অন্য কোনো বাধা ট্রিগার না হয়:
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);
পুনঃসূচনাযোগ্য বাধা সহ সরঞ্জাম
বিঘ্নের জন্য আরেকটি সাধারণ প্যাটার্ন হল এমন একটি ক্রিয়া নিশ্চিত করার প্রয়োজন যা এলএলএম আসলে এটি সম্পাদন করার আগে প্রস্তাব করে। উদাহরণস্বরূপ, একটি পেমেন্ট অ্যাপ ব্যবহারকারীকে নির্দিষ্ট ধরণের স্থানান্তর নিশ্চিত করতে চাইতে পারে।
এই ব্যবহারের ক্ষেত্রে, আপনি কখন একটি ইন্টারাপ্ট ট্রিগার করতে হবে এবং অতিরিক্ত মেটাডেটা দিয়ে একটি ইন্টারাপ্ট পুনরায় চালু হলে কী করতে হবে তার চারপাশে কাস্টম যুক্তি যোগ করতে আপনি স্ট্যান্ডার্ড defineTool
পদ্ধতি ব্যবহার করতে পারেন।
একটি পুনঃসূচনাযোগ্য টুল সংজ্ঞায়িত করুন
প্রতিটি টুল এর বাস্তবায়ন সংজ্ঞার দ্বিতীয় যুক্তিতে দুটি বিশেষ সাহায্যকারীর অ্যাক্সেস আছে:
-
interrupt
: যখন বলা হয়, এই পদ্ধতিটি একটি বিশেষ ধরনের ব্যতিক্রম ছুঁড়ে দেয় যা জেনারেশন লুপকে থামাতে ধরা হয়। আপনি একটি বস্তু হিসাবে অতিরিক্ত মেটাডেটা প্রদান করতে পারেন. -
resumed
: যখন একটি বাধাপ্রাপ্ত প্রজন্মের থেকে একটি অনুরোধ{resume: {restart: ...}}
বিকল্পটি ব্যবহার করে পুনরায় চালু করা হয় (নীচে দেখুন), এই সাহায্যকারীতে পুনরায় চালু করার সময় দেওয়া মেটাডেটা থাকে।
আপনি যদি একটি পেমেন্ট অ্যাপ তৈরি করেন, উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট পরিমাণের বেশি স্থানান্তর করার আগে ব্যবহারকারীর সাথে নিশ্চিত করতে চাইতে পারেন:
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);
}
এই উদাহরণে, প্রথম এক্সিকিউশনে (যখন resumed
অনির্ধারিত থাকে), টুলটি পরীক্ষা করে যে পরিমাণ $100 ছাড়িয়েছে কিনা, এবং যদি তাই হয় তবে একটি বাধা ট্রিগার করে। দ্বিতীয় সঞ্চালনের সময়, এটি প্রদত্ত নতুন মেটাডেটাতে একটি স্থিতি সন্ধান করে এবং স্থানান্তরটি সম্পাদন করে বা একটি প্রত্যাখ্যান প্রতিক্রিয়া প্রদান করে, এটি অনুমোদিত বা প্রত্যাখ্যানের উপর নির্ভর করে।
বাধা পরে টুল পুনরায় চালু করুন
বিঘ্নিত সরঞ্জামগুলি আপনাকে এর উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়:
- যখন একটি প্রাথমিক টুল অনুরোধ একটি বাধা ট্রিগার করা উচিত.
- জেনারেশন লুপ কবে এবং আবার শুরু করবেন কিনা।
- পুনরায় শুরু করার সময় টুলটিতে কী অতিরিক্ত তথ্য প্রদান করতে হবে।
পূর্ববর্তী বিভাগে দেখানো উদাহরণে, অ্যাপ্লিকেশনটি ব্যবহারকারীকে ট্রান্সফার পরিমাণ ঠিক আছে কিনা তা নিশ্চিত করতে বাধাপ্রাপ্ত অনুরোধ নিশ্চিত করতে বলতে পারে:
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);