Bağlam üzerinden bilgi aktarma

LLM ile çalışan bir geliştiricinin aynı anda işleyebileceği farklı bilgi kategorileri vardır:

  • Giriş: Belirli bir arama için LLM'nin yanıtını yönlendirmek amacıyla doğrudan alakalı olan bilgiler. Özetlenmesi gereken metin buna örnek gösterilebilir.
  • Oluşturma bağlamı: LLM ile alakalı ancak aramaya özgü olmayan bilgiler. Örneğin, mevcut saat veya kullanıcının adı.
  • Yürütme bağlamı: LLM çağrısını çevreleyen kod için önemli olan ancak LLM'nin kendisi için önemli olmayan bilgiler. Buna örnek olarak kullanıcının mevcut kimlik doğrulama jetonu verilebilir.

Genkit, oluşturma ve yürütme bağlamını süreç boyunca dağıtabilecek tutarlı bir context nesnesi sağlar. Bu bağlam, akışlar, araçlar ve istemler dahil olmak üzere tüm işlemler için kullanılabilir.

Bağlam, yürütme kapsamında çağrılan tüm işlemlere otomatik olarak yayılır: Bir akışa iletilen bağlam, akış içinde yürütülen istemlere sunulur. generate() yöntemine iletilen bağlam, oluşturma döngüsü içinde çağrılan araçlar tarafından kullanılabilir.

Bağlam neden önemlidir?

En iyi uygulama olarak, LLM'ye bir görevi tamamlamak için ihtiyaç duyduğu minimum miktarda bilgi sağlamanız gerekir. Bu, birden fazla nedenden dolayı önemlidir:

  • LLM'nin sahip olduğu alakasız bilgi ne kadar az olursa görevini iyi yapma olasılığı o kadar yüksek olur.
  • Bir LLM'nin kullanıcı veya hesap kimlikleri gibi bilgileri araçlara aktarması gerekiyorsa bu bilgiler, LLM'nin kandırılmasıyla sızdırılabilir.

Bağlam, kodlarınızdan herhangi biri tarafından kullanılabilen ancak LLM'ye gönderilmesi gerekmeyen ek bir bilgi kanalı sağlar. Örneğin, araç sorgularını mevcut kullanıcının kullanılabilir kapsamıyla sınırlandırmanıza olanak tanıyabilir.

Bağlam yapısı

Bağlam bir nesne olmalıdır ancak özelliklerine siz karar verirsiniz. Bazı durumlarda Genkit bağlamı otomatik olarak doldurur. Örneğin, kalıcı oturumlar kullanıldığında state mülkü bağlama otomatik olarak eklenir.

Bağlamı en yaygın kullanımlarından biri, mevcut kullanıcıyla ilgili bilgileri depolamaktır. Kimlik doğrulama bağlamını aşağıdaki biçimde eklemenizi öneririz:

{
  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
  }
}

Bağlam nesnesi, yürütme akışının başka bir yerinde bilmeniz gerekebilecek tüm bilgileri depolayabilir.

Bir işlemde bağlamı kullanma

Bir işlemde bağlamı kullanmak için işlev tanımınızla otomatik olarak sağlanan bağlam yardımcısına erişebilirsiniz:

Akış

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;
});

Araç

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);
});

İstem dosyası

Dotprompt şablonları kullanıldığında bağlam, @ değişken ön ekiyle sağlanır. Örneğin, istem şablonunda {auth: {name: 'Michael'}} bağlam nesnesine şu şekilde erişilebilir:

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

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

Çalışma zamanında bağlam bilgisi sağlama

Bir işleme bağlam sağlamak için işlemi çağırırken bağlam nesnesini bir seçenek olarak iletirsiniz.

Akışlar

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

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

Oluşturma

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},
});

İstemler

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

Bağlam yayma ve geçersiz kılma

Varsayılan olarak, sağladığınız bağlam, orijinal çağrınız sonucunda çağrılan tüm işlemlere otomatik olarak dağıtılır. Akışınız diğer akışları çağırıyorsa veya oluşturma işleminiz araçları çağırıyorsa aynı bağlam sağlanır.

Bir işlemdeki bağlamı geçersiz kılmak isterseniz mevcut bağlamı değiştirmek için farklı bir bağlam nesnesi iletebilirsiniz:

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}});
}); 

Bağlam değiştirildiğinde aynı şekilde yayılır. Bu örnekte, otherFlow'ün yürütülmesi sırasında çağrılan tüm işlemler, geçersiz kılınan bağlamı devralır.