Mempelajari kemampuan pemrosesan dokumen dengan Gemini API

Gemini API mendukung input PDF, termasuk dokumen panjang (hingga 3.600 halaman). Model Gemini memproses PDF dengan visi native, sehingga dapat memahami konten teks dan gambar di dalam dokumen. Dengan dukungan visi PDF native, model Gemini dapat:

  • Menganalisis diagram, diagram, dan tabel di dalam dokumen.
  • Mengekstrak informasi ke dalam format output terstruktur.
  • Menjawab pertanyaan tentang konten visual dan teks dalam dokumen.
  • Meringkas dokumen.
  • Mentranskripsikan konten dokumen (misalnya ke HTML) yang mempertahankan tata letak dan pemformatan, untuk digunakan dalam aplikasi downstream (seperti dalam pipeline RAG).

Tutorial ini menunjukkan beberapa kemungkinan cara menggunakan Gemini API dengan dokumen PDF. Semua output hanya berupa teks.

Sebelum memulai: Menyiapkan project dan kunci API

Sebelum memanggil Gemini API, Anda perlu menyiapkan project dan mengonfigurasi kunci API.

Meminta dengan PDF

Panduan ini menunjukkan cara mengupload dan memproses PDF menggunakan File API atau dengan menyertakannya sebagai data inline.

Detail teknis

Gemini 1.5 Pro dan 1.5 Flash mendukung maksimum 3.600 halaman dokumen. Halaman dokumen harus dalam salah satu jenis MIME data teks berikut:

  • PDF - application/pdf
  • JavaScript - application/x-javascript, text/javascript
  • Python - application/x-python, text/x-python
  • TXT - text/plain
  • HTML - text/html
  • CSS - text/css
  • Markdown - text/md
  • CSV - text/csv
  • XML - text/xml
  • RTF - text/rtf

Setiap halaman dokumen setara dengan 258 token.

Meskipun tidak ada batas spesifik untuk jumlah piksel dalam dokumen selain jendela konteks model, halaman yang lebih besar akan diskalakan ke resolusi maksimum 3072x3072 sambil mempertahankan rasio aspek aslinya, sedangkan halaman yang lebih kecil akan diskalakan hingga 768x768 piksel. Tidak ada pengurangan biaya untuk halaman dengan ukuran yang lebih rendah, selain bandwidth, atau peningkatan performa untuk halaman dengan resolusi yang lebih tinggi.

Untuk hasil terbaik:

  • Putar halaman ke orientasi yang benar sebelum mengupload.
  • Hindari halaman yang buram.
  • Jika menggunakan satu halaman, tempatkan perintah teks setelah halaman.

Input PDF

Untuk payload PDF di bawah 20 MB, Anda dapat memilih antara mengupload dokumen yang dienkode base64 atau langsung mengupload file yang disimpan secara lokal.

Dokumen yang dienkode dengan base64

Anda dapat memproses dokumen PDF langsung dari URL. Berikut adalah cuplikan kode yang menunjukkan cara melakukannya:

import httpx
import base64

model = genai.GenerativeModel("gemini-1.5-flash")
doc_url = "https://discovery.ucl.ac.uk/id/eprint/10089234/1/343019_3_art_0_py4t4l_convrt.pdf"  # Replace with the actual URL of your PDF

# Retrieve and encode the PDF
doc_data = base64.standard_b64encode(httpx.get(doc_url).content).decode("utf-8")

prompt = "Summarize this document"

response = model.generate_content([{'mime_type':'application/pdf', 'data': doc_data}, prompt])
print(response.text)

PDF yang disimpan secara lokal

Untuk PDF yang disimpan secara lokal, Anda dapat menggunakan pendekatan berikut:

import base64

model = genai.GenerativeModel("gemini-1.5-flash")
doc_path = "/path/to/file.pdf" # Replace with the actual path to your local PDF

# Read and encode the local file
with open(doc_path, "rb") as doc_file:
    doc_data = base64.standard_b64encode(doc_file.read()).decode("utf-8")

prompt = "Summarize this document"

response = model.generate_content([{'mime_type': 'application/pdf', 'data': doc_data}, prompt])

print(response.text)

PDF berukuran besar

Anda dapat menggunakan File API untuk mengupload dokumen dalam ukuran apa pun. Selalu gunakan File API jika total ukuran permintaan (termasuk file, perintah teks, petunjuk sistem, dll.) lebih besar dari 20 MB.

Panggil media.upload untuk mengupload file menggunakan File API. Kode berikut mengupload file dokumen, lalu menggunakan file dalam panggilan ke models.generateContent.

PDF besar dari URL (:#large-pdfs-urls)

Gunakan File API untuk file PDF besar yang tersedia dari URL, yang menyederhanakan proses upload dan pemrosesan dokumen ini secara langsung melalui URL-nya:

import io
import httpx

model = genai.GenerativeModel("gemini-1.5-flash")
long_context_pdf_path = "https://www.nasa.gov/wp-content/uploads/static/history/alsj/a17/A17_FlightPlan.pdf" # Replace with the actual URL of your large PDF

# Retrieve and upload the PDF using the File API
doc_data = io.BytesIO(httpx.get(long_context_pdf_path).content)
sample_doc = genai.upload_file(data=doc_data, mime_type='application/pdf')

prompt = "Summarize this document"

response = model.generate_content([sample_doc, prompt])
print(response.text)

PDF besar yang disimpan secara lokal (:#large-pdfs-local)

import google.generativeai as genai

model = genai.GenerativeModel("gemini-1.5-flash")
sample_pdf = genai.upload_file(media / "test.pdf")
response = model.generate_content(["Give me a summary of this pdf file.", sample_pdf])
print(response.text)

Anda dapat memverifikasi bahwa API berhasil menyimpan file yang diupload dan mendapatkan metadatanya dengan memanggil files.get. Hanya name (dan secara ekstensi, uri) yang unik.

import google.generativeai as genai

myfile = genai.upload_file(media / "poem.txt")
file_name = myfile.name
print(file_name)  # "files/*"

myfile = genai.get_file(file_name)
print(myfile)

Beberapa PDF

Gemini API dapat memproses beberapa dokumen PDF dalam satu permintaan, selama ukuran gabungan dokumen dan perintah teks tetap berada dalam jendela konteks model.

import io
import httpx

model = genai.GenerativeModel("gemini-1.5-flash")

doc_url_1 = "https://arxiv.org/pdf/2312.11805" # Replace with the URL to your first PDF
doc_url_2 = "https://arxiv.org/pdf/2403.05530" # Replace with the URL to your second PDF

# Retrieve and upload both PDFs using the File API
doc_data_1 = io.BytesIO(httpx.get(doc_url_1).content)
doc_data_2 = io.BytesIO(httpx.get(doc_url_2).content)

sample_pdf_1 = genai.upload_file(data=doc_data_1, mime_type='application/pdf')
sample_pdf_2 = genai.upload_file(data=doc_data_2, mime_type='application/pdf')

prompt = "What is the difference between each of the main benchmarks between these two papers? Output these in a table."

response = model.generate_content([sample_pdf_1, sample_pdf_2, prompt])
print(response.text)

Mencantumkan file

Anda dapat mencantumkan semua file yang diupload menggunakan File API dan URI-nya menggunakan files.list.

import google.generativeai as genai

print("My files:")
for f in genai.list_files():
    print("  ", f.name)

Menghapus file

File yang diupload menggunakan File API akan otomatis dihapus setelah 2 hari. Anda juga dapat menghapusnya secara manual menggunakan files.delete.

import google.generativeai as genai

myfile = genai.upload_file(media / "poem.txt")

myfile.delete()

try:
    # Error.
    model = genai.GenerativeModel("gemini-1.5-flash")
    result = model.generate_content([myfile, "Describe this file."])
except google.api_core.exceptions.PermissionDenied:
    pass

Cache konteks dengan PDF

import os
from google.generativeai import caching
import io
import httpx

# Define the path to the PDF document (or use a URL)
long_context_pdf_path = "https://www.nasa.gov/wp-content/uploads/static/history/alsj/a17/A17_FlightPlan.pdf" # Replace with the URL of your large PDF
doc_data = io.BytesIO(httpx.get(long_context_pdf_path).content)

# Upload the PDF document using the File API
document = genai.upload_file(data=doc_data, mime_type='application/pdf')

# Specify the model name and system instruction for caching
model_name = "gemini-1.5-flash-002" # Ensure this matches the model you intend to use
system_instruction = "You are an expert analyzing transcripts."

# Create a cached content object
cache = caching.CachedContent.create(
    model=model_name,
    system_instruction=system_instruction,
    contents=[document], # The document(s) and other content you wish to cache
)

# Display the cache details
print(cache)

# Initialize a generative model from the cached content
model = genai.GenerativeModel.from_cached_content(cache)

# Generate content using the cached prompt and document
response = model.generate_content("Please summarize this transcript")

# (Optional) Print usage metadata for insights into the API call
print(response.usage_metadata)

# Print the generated text
print(response.text)

Mencantumkan cache

Anda tidak dapat mengambil atau melihat konten dalam cache, tetapi Anda dapat mengambil metadata cache (name, model, display_name, usage_metadata, create_time, update_time, dan expire_time).

Untuk mencantumkan metadata untuk semua cache yang diupload, gunakan CachedContent.list():

for c in caching.CachedContent.list():
  print(c)

Mengupdate cache

Anda dapat menetapkan ttl atau expire_time baru untuk cache. Mengubah hal lain tentang cache tidak didukung.

Contoh berikut menunjukkan cara mengupdate ttl cache menggunakan CachedContent.update().

import datetime

cache.update(ttl=datetime.timedelta(hours=2))

Menghapus cache

Layanan penyimpanan dalam cache menyediakan operasi penghapusan untuk menghapus konten secara manual dari cache. Contoh berikut menunjukkan cara menghapus cache menggunakan CachedContent.delete().

cache.delete()

Langkah berikutnya

Panduan ini menunjukkan cara menggunakan generateContent dan membuat output teks dari dokumen yang diproses. Untuk mempelajari lebih lanjut, lihat referensi berikut:

  • Strategi perintah file: Gemini API mendukung perintah dengan data teks, gambar, audio, dan video, yang juga dikenal sebagai perintah multimodal.
  • Petunjuk sistem: Petunjuk sistem memungkinkan Anda mengarahkan perilaku model berdasarkan kebutuhan dan kasus penggunaan tertentu.
  • Panduan keamanan: Terkadang model AI generatif menghasilkan output yang tidak terduga, seperti output yang tidak akurat, bias, atau menyinggung. Pascapemrosesan dan evaluasi manusia sangat penting untuk membatasi risiko bahaya dari output tersebut.