PDF dosyasıyla sohbet etme

Bu codelab'de, kullanıcıların doğal dil kullanarak PDF dokümanlarından bilgi edinebilmesini sağlayan bir sohbet uygulamasının nasıl oluşturulacağı gösterilmektedir.

  1. Projenizi oluşturun
  2. Zorunlu bağımlılıkları içe aktarma
  3. Genkit'i ve varsayılan modeli yapılandırma
  4. PDF dosyasını yükleme ve ayrıştırma
  5. İsteği ayarlama
  6. Kullanıcı arayüzünü uygulama
  7. Sohbet döngüsünü uygulama
  8. Uygulamayı çalıştırma

Ön koşullar

Çalışmaya başlamadan önce aşağıdaki ön koşulları ayarlamanız gerekir:

Uygulama Adımları

Bağımlılıklarınızı ayarladıktan sonra projeyi derleyebilirsiniz.

1. Projenizi oluşturma

  1. Kaynak kodunuzu barındıracak bir dizin yapısı ve dosya oluşturun.

    $ mkdir -p chat-with-a-pdf/src && \
    cd chat-with-a-pdf && \
    touch src/index.ts
    
  2. Yeni bir TypeScript projesini başlatın.

    $ npm init -y
    
  3. pdf-parse modülünü yükleyin.

    $ npm i pdf-parse && npm i -D @types/pdf-parse
    
  4. Genkit'i projenizde kullanmak için aşağıdaki Genkit bağımlılıklarını yükleyin:

    $ npm i genkit @genkit-ai/googleai
    
    • genkit, Genkit'in temel özelliklerini sağlar.
    • @genkit-ai/googleai, Google AI Gemini modellerine erişim sağlar.
  5. Model API anahtarınızı alma ve yapılandırma

    Bu kod laboratuvarının kullandığı Gemini API'yi kullanmak için öncelikle bir API anahtarı yapılandırmanız gerekir. Henüz yoksa Google AI Studio'da anahtar oluşturun.

    Gemini API, cömert bir ücretsiz katman sunar ve başlamak için kredi kartı gerektirmez.

    API anahtarınızı oluşturduktan sonra aşağıdaki komutu kullanarak GOOGLE_GENAI_API_KEY ortam değişkenini anahtarınıza ayarlayın:

    $ export GOOGLE_GENAI_API_KEY=<your API key>
    

2. Gerekli bağımlılıkları içe aktarma

Oluşturduğunuz index.ts dosyasına, bu proje için gereken bağımlılıkları içe aktarmak üzere aşağıdaki satırları ekleyin:

import { gemini20Flash, googleAI } from '@genkit-ai/googleai';
import { genkit } from 'genkit/beta'; // chat is a beta feature
import pdf from 'pdf-parse';
import fs from 'fs';
import { createInterface } from "node:readline/promises";
  • İlk satır, gemini20Flash modelini ve googleAI eklentisini @genkit-ai/googleai paketinden içe aktararak Google'ın Gemini modellerine erişimi sağlar.
  • Sonraki iki satır, PDF dosyalarını ayrıştırmak için pdf-parse kitaplığını ve dosya sistemi işlemleri için fs modülünü içe aktarır.
  • Son satırda, kullanıcı etkileşimi için komut satırı arayüzü oluşturmak amacıyla kullanılan node:readline/promises modülünden createInterface işlevi içe aktarılır.

3. Genkit'i ve varsayılan modeli yapılandırma

Genkit'i yapılandırmak ve Gemini 2.0 Flash'i varsayılan model olarak ayarlamak için aşağıdaki satırları ekleyin.

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

Ardından kod ve hata işleme için bir iskelet ekleyebilirsiniz.

(async () => {
  try {
    // Step 1: get command line arguments

    // Step 2: load PDF file

    // Step 3: construct prompt

    // Step 4: start chat

    // Step 5: chat loop

  } catch (error) {
    console.error("Error parsing PDF or interacting with Genkit:", error);
  }
})(); // <-- don't forget the trailing parentheses to call the function!

4. PDF'yi yükleme ve ayrıştırma

  1. Komut satırından iletilen PDF dosya adını okuyacak kod ekleyin.

        // Step 1: get command line arguments
        const filename = process.argv[2];
        if (!filename) {
          console.error("Please provide a filename as a command line argument.");
          process.exit(1);
        }
    
  2. PDF dosyasının içeriğini yüklemek için kod ekleyin.

        // Step 2: load PDF file
        let dataBuffer = fs.readFileSync(filename);
        const { text } = await pdf(dataBuffer);
    

5. İstemi ayarlama

İstemi ayarlamak için kod ekleyin:

    // Step 3: construct prompt
    const prefix = process.argv[3] || "Sample prompt: Answer the user's questions about the contents of this PDF file.";
    const prompt = `
      ${prefix}
      Context:
      ${text}
    `;
  • İlk const beyanı, kullanıcı komut satırından kendi istemini iletmezse varsayılan bir istem tanımlar.
  • İkinci const beyanı, istem ön ekini ve PDF dosyasının tam metnini modelin isteminde araya yerleştirir.

6. Kullanıcı arayüzünü uygulama

Sohbeti başlatmak ve kullanıcı arayüzünü uygulamak için aşağıdaki kodu ekleyin:

    // Step 4: start chat
    const chat = ai.chat({ system: prompt });
    const readline = createInterface(process.stdin, process.stdout);
    console.log("You're chatting with Gemini. Ctrl-C to quit.\n");

İlk const beyanı, chat yöntemini çağırarak istemi (PDF dosyasının tam metnini içeren) ileterek modelle sohbeti başlatır. Kodun geri kalanı bir metin girişi oluşturur ve ardından kullanıcıya bir mesaj gösterir.

7. Sohbet döngüsünü uygulama

5. adımda, kullanıcı girişini alacak ve chat.send kullanarak bu girişi modele gönderecek kod ekleyin. Uygulamanın bu kısmı, kullanıcı CTRL + C tuşlarına basana kadar döngüde çalışır.

    // Step 5: chat loop
    while (true) {
      const userInput = await readline.question("> ");
      const { text } = await chat.send(userInput);
      console.log(text);
    }

8. Uygulamayı çalıştırma

Uygulamayı çalıştırmak için projenizin kök klasöründe terminali açıp aşağıdaki komutu çalıştırın:

npx tsx src/index.ts path/to/some.pdf

Ardından PDF dosyasıyla sohbet etmeye başlayabilirsiniz.