انتقال اطلاعات از طریق زمینه

دسته‌های مختلفی از اطلاعات وجود دارد که توسعه‌دهنده‌ای که با یک LLM کار می‌کند ممکن است به طور همزمان آنها را مدیریت کند:

  • ورودی: اطلاعاتی که مستقیماً برای راهنمایی پاسخ LLM برای یک تماس خاص مرتبط است. نمونه آن متنی است که باید خلاصه شود.
  • زمینه نسل: اطلاعاتی که مربوط به LLM است، اما مختص تماس نیست. یک مثال از این زمان فعلی یا نام یک کاربر است.
  • زمینه اجرا: اطلاعاتی که برای کد اطراف تماس LLM مهم است اما برای خود LLM مهم نیست. نمونه ای از این رمز تایید فعلی کاربر است.

Genkit یک شی context سازگار را فراهم می کند که می تواند زمینه تولید و اجرا را در طول فرآیند منتشر کند. این زمینه برای همه اقدامات از جمله جریان ها ، ابزارها و درخواست ها در دسترس است.

زمینه به طور خودکار به تمام اقداماتی که در محدوده اجرا خوانده می شوند منتشر می شود: زمینه ارسال شده به یک جریان برای دستورهای اجرا شده در جریان در دسترس قرار می گیرد. متن ارسال شده به متد generate() برای ابزارهایی که در حلقه تولید فراخوانی می شوند در دسترس است.

چرا زمینه مهم است؟

به عنوان بهترین روش، شما باید حداقل اطلاعاتی را که برای تکمیل یک کار به LLM نیاز دارد، ارائه دهید. این به دلایل متعددی مهم است:

  • هرچه LLM اطلاعات اضافی کمتری داشته باشد، احتمال بیشتری دارد که در وظایف خود به خوبی عمل کند.
  • اگر یک LLM نیاز به انتقال اطلاعاتی مانند شناسه های کاربر یا حساب به ابزار داشته باشد، به طور بالقوه می تواند فریب داده شود تا اطلاعات درز کند.

Context کانال جانبی اطلاعاتی را در اختیار شما قرار می دهد که می تواند توسط هر کد شما استفاده شود، اما لزوماً نباید به LLM ارسال شود. به عنوان مثال، می‌تواند به شما اجازه دهد پرس و جوهای ابزار را به محدوده موجود کاربر فعلی محدود کنید.

ساختار زمینه

متن باید یک شی باشد، اما ویژگی های آن با شماست. در برخی شرایط Genkit به طور خودکار زمینه را پر می کند. به عنوان مثال، هنگام استفاده از جلسات مداوم، ویژگی state به طور خودکار به متن اضافه می شود.

یکی از رایج ترین کاربردهای زمینه، ذخیره اطلاعات کاربر فعلی است. ما توصیه می کنیم که زمینه اعتبار را در قالب زیر اضافه کنید:

{
  auth: {
    uid: "...", // the user's unique identifier
    token: {...}, // the decoded claims of a user's id token
    rawToken: "...", // the user's raw encoded id token
    // ...any other fields
  }
}

شیء زمینه می‌تواند هر اطلاعاتی را که ممکن است لازم باشد در جای دیگری در جریان اجرا بدانید، ذخیره کند.

از زمینه در یک عمل استفاده کنید

برای استفاده از متن در یک کنش، می‌توانید به کمکی که به طور خودکار به تعریف تابع شما ارائه می‌شود، دسترسی داشته باشید:

جریان

const summarizeHistory = ai.defineFlow({
  name: 'summarizeMessages',
  inputSchema: z.object({friendUid: z.string()}),
  outputSchema: z.string();
}, async ({friendUid}, {context}) => {
  if (!context.auth?.uid) throw new Error("Must supply auth context.");
  const messages = await listMessagesBetween(friendUid, context.auth.uid);
  const {text} = await ai.generate({
    prompt:
      `Summarize the content of these messages: ${JSON.stringify(messages)}`,
  });
  return text;
});

ابزار

const searchNotes = ai.defineTool({
  name: 'searchNotes',
  description: "search the current user's notes for info",
  inputSchema: z.object({query: z.string()}),
  outputSchmea: z.array(NoteSchema);
}, async ({query}, {context}) => {
  if (!context.auth?.uid) throw new Error("Must be called by a signed-in user.");
  return searchUserNotes(context.auth.uid, query);
});

فایل اعلان

هنگام استفاده از الگوهای Dotprompt ، زمینه با پیشوند متغیر @ در دسترس است. به عنوان مثال، یک شی متنی از {auth: {name: 'Michael'}} می‌تواند در الگوی درخواستی مانند زیر قابل دسترسی باشد:

---
input:
  schema:
    pirateStyle?: boolean
---

{{#if pirateStyle}}
Avast, {{@auth.name}}, how be ye today?
{{else}}
Hello, {{@auth.name}}, how are you today?
{{/if}}

زمینه را در زمان اجرا فراهم کنید

برای ارائه متن به یک اقدام، هنگام فراخوانی اقدام، شی متن را به عنوان یک گزینه ارسال می کنید.

جریان می یابد

const summarizeHistory = ai.defineFlow(/* ... */);

const summary = await summarizeHistory(friend.uid, {context: {auth: currentUser}});

نسل

const {text} = await ai.generate({
  prompt: "Find references to ocelots in my notes.",
  // the context will propagate to tool calls
  tools: [searchNotes],
  context: {auth: currentUser},
});

درخواست می کند

const helloPrompt = ai.prompt('sayHello');
helloPrompt({pirateStyle: true}, {context: {auth: currentUser}});

انتشار متن و لغو

به‌طور پیش‌فرض، وقتی زمینه را ارائه می‌دهید، به‌طور خودکار به همه اقداماتی که در نتیجه تماس اصلی شما خوانده می‌شوند، منتشر می‌شود. اگر جریان شما جریان های دیگر را فراخوانی می کند، یا نسل شما ابزارها را فراخوانی می کند، همین زمینه فراهم می شود.

اگر می‌خواهید متن را در یک کنش نادیده بگیرید، می‌توانید یک شی بافت متفاوت را برای جایگزینی موجود ارسال کنید:

const otherFlow = ai.defineFlow(/* ... */);

const myFlow = ai.defineFlow({
  // ...
}, (input, {context}) => {
  // override the existing context completely
  otherFlow({/*...*/}, {context: {newContext: true}});
  // or selectively override
  otherFlow({/*...*/}, {context: {...context, updatedContext: true}});
}); 

هنگامی که متن جایگزین می شود، به همان روش منتشر می شود. در این مثال، هر اقدامی که otherFlow در حین اجرای آن فراخوانی کرد، زمینه لغو شده را به ارث می برد.