Kalıcı sohbet oturumları oluşturma

Kullanıcılarınızın çoğu, büyük dil modelleriyle ilk kez chatbot'lar üzerinden etkileşim kuracaktır. LLM'ler sohbet simülasyonundan çok daha fazlasını yapabilse de sohbet, tanıdık ve kullanışlı bir etkileşim biçimi olmaya devam etmektedir. Kullanıcılarınız bu şekilde doğrudan modelle etkileşime geçmeyecek olsa bile sohbet tarzında istemler, bir yapay zeka modelinin ürettiği çıktıyı etkilemenin güçlü bir yoludur.

Genkit, bu etkileşim tarzını desteklemek için sohbet tabanlı LLM uygulamaları oluşturmanızı kolaylaştıran bir dizi arayüz ve soyutlama sağlar.

Başlamadan önce

Bu sayfayı okumadan önce Yapay zeka modelleriyle içerik oluşturma sayfasında ele alınan içerik hakkında bilgi sahibi olmanız gerekir.

Bu sayfadaki kod örneklerini çalıştırmak istiyorsanız önce Başlangıç kılavuzundaki adımları tamamlayın. Tüm örneklerde, Genkit'i projenize bağımlı olarak yüklemiş olduğunuz varsayılmaktadır.

Sohbet oturumuyla ilgili temel bilgiler

Konsol tabanlı, minimal bir chatbot uygulaması aşağıda verilmiştir:

import { genkit } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";

import { createInterface } from "node:readline/promises";

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

(async () => {
  const chat = ai.chat();
  console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
  const readline = createInterface(process.stdin, process.stdout);
  while (true) {
    const userInput = await readline.question("> ");
    const { text } = await chat.send(userInput);
    console.log(text);
  }
})();

Bu programla yapılan bir sohbet oturumu aşağıdaki örneğe benzer:

You're chatting with Gemini. Ctrl-C to quit.

> hi
Hi there! How can I help you today? 

> my name is pavel
Nice to meet you, Pavel! What can I do for you today? 

> what's my name?
Your name is Pavel! I remembered it from our previous interaction. 

Is there anything else I can help you with?

Bu kısa etkileşimden de görebileceğiniz gibi, bir sohbet oturumuna mesaj gönderdiğinizde model, yanıtlarında o ana kadarki oturumu kullanabilir. Bunun nedeni, Genkit'in arka planda birkaç işlem yapmasıdır:

  • Varsa sohbet geçmişini depolama alanından alır (devamlılık ve depolama alanı hakkında daha fazla bilgiyi aşağıda bulabilirsiniz).
  • generate() ile aynı şekilde isteği modele gönderir ancak sohbet geçmişini otomatik olarak ekler
  • Model yanıtını sohbet geçmişine kaydeder

Model yapılandırması

chat() yöntemi, generate() ile aynı yapılandırma seçeneklerinin çoğunu kabul eder. Yapılandırma seçeneklerini modele iletmek için:

const chat = ai.chat({
  model: gemini15Pro,
  system:
    "You're a pirate first mate. Address the user as Captain and assist " +
    "them however you can.",
  config: {
    temperature: 1.3,
  },
});

Durum bilgisine sahip sohbet oturumları

Bir sohbet oturumunun mesaj geçmişini kaydetmenin yanı sıra herhangi bir JavaScript nesnesini de kaydedebilirsiniz. Bu sayede, yalnızca ileti geçmişindeki bilgilere dayanarak durumu daha yapılandırılmış bir şekilde yönetebilirsiniz.

Durumu bir oturuma dahil etmek için oturumu açıkça oluşturmanız gerekir:

interface MyState {
  userName: string;
}

const session = ai.createSession<MyState>({
  initialState: {
    userName: 'Pavel',
  },
});

Ardından oturum içinde sohbet başlatabilirsiniz:

const chat = session.chat();

Oturum durumunu sohbetin gidişatına göre değiştirmek için araçlar tanımlayın ve isteklerinize ekleyin:

const changeUserName = ai.defineTool(
  {
    name: 'changeUserName',
    description: 'can be used to change user name',
    inputSchema: z.object({
      newUserName: z.string(),
    }),
  },
  async (input) => {
    await ai.currentSession<MyState>().updateState({
      userName: input.newUserName,
    });
    return 'changed username to ${input.newUserName}';
  }
);
const chat = session.chat({
  model: gemini15Pro,
  tools: [changeUserName],
});
await chat.send('change user name to Kevin');

Çok iş parçacıklı oturumlar

Tek bir oturumda birden fazla sohbet mesaj dizisi bulunabilir. Her ileti dizisinin kendi ileti geçmişi vardır ancak tek bir oturum durumunu paylaşırlar.

const lawyerChat = session.chat('lawyerThread', {
  system: 'talk like a lawyer',
});
const pirateChat = session.chat('pirateThread', {
  system: 'talk like a pirate',
});

Oturum devamlılığı (DENEYSEL)

Yeni bir sohbet veya oturum başlattığınızda oturum varsayılan olarak yalnızca bellekte depolanacak şekilde yapılandırılır. Bu sayfanın başındaki örnek sohbet robotunda olduğu gibi, oturumun yalnızca programınızın tek bir çağrısı boyunca devam etmesi gerektiğinde bu yeterlidir. Ancak LLM sohbetlerini bir uygulamaya entegre ederken genellikle içerik oluşturma mantığınızı durum bilgisi olmayan web API uç noktaları olarak dağıtırsınız. Kalıcı sohbetlerin bu kurulumda çalışması için uç noktalarınızın çağrıları arasında durumu koruyabilecek bir tür oturum depolama alanı uygulamanız gerekir.

Bir sohbet oturumuna kalıcılık eklemek için Genkit'in SessionStore arayüzünü uygulamanız gerekir. Oturum durumunu ayrı JSON dosyalarına kaydeden örnek bir uygulamayı aşağıda bulabilirsiniz:

class JsonSessionStore<S = any> implements SessionStore<S> {
  async get(sessionId: string): Promise<SessionData<S> | undefined> {
    try {
      const s = await readFile(`${sessionId}.json`, { encoding: 'utf8' });
      const data = JSON.parse(s);
      return data;
    } catch {
      return undefined;
    }
  }

  async save(sessionId: string, sessionData: SessionData<S>): Promise<void> {
    const s = JSON.stringify(sessionData);
    await writeFile(`${sessionId}.json`, s, { encoding: 'utf8' });
  }
}

Bu uygulama, pratik kullanımlar için muhtemelen yeterli değildir ancak oturum depolama alanı uygulamasının yalnızca iki görevi yerine getirmesi gerektiğini gösterir:

  • Oturum kimliğini kullanarak depolama alanından oturum nesnesi alma
  • Belirli bir oturum nesnesini oturum kimliğine göre dizine ekleme

Depolama alanı arka ucunuz için arayüzü uyguladıktan sonra, uygulamanızın bir örneğini oturum oluşturucularına iletin:

// To create a new session:
const session = ai.createSession({
  store: new JsonSessionStore(),
});

// Save session.id so you can restore the session the next time the
// user makes a request.
// If the user has a session ID saved, load the session instead of creating
// a new one:
const session = await ai.loadSession(sessionId, {
    store: new JsonSessionStore(),
});