Gemini API תומך בקלט בפורמט PDF, כולל מסמכים ארוכים (עד 3,600 דפים). המודלים של Gemini מעבדים קובצי PDF באמצעות ראייה מקורית, ולכן הם יכולים להבין גם תוכן טקסט וגם תוכן תמונה במסמכים. בעזרת תמיכה מקורית ב-PDF, מודלים של Gemini יכולים:
- לנתח דיאגרמות, תרשימים וטבלאות במסמכים
- חילוץ מידע לפורמטים מובְנים של פלט
- מענה על שאלות לגבי תוכן חזותי וטקסטואלי במסמכים
- לסכם מסמכים
- תמלול תוכן של מסמך (למשל ל-HTML) תוך שמירה על פריסות ועיצוב, לשימוש באפליקציות במורד הזרם
במדריך הזה נסביר כמה דרכים אפשריות לשימוש ב-Gemini API לעיבוד מסמכי PDF.
קלט בפורמט PDF
בעומס שימושי של קובצי PDF שגודלם קטן מ-20MB, אפשר לבחור בין העלאת מסמכים בקידוד base64 לבין העלאה ישירה של קבצים שמאוחסנים באופן מקומי.
כ-inline_data
אפשר לעבד מסמכי PDF ישירות מכתובות URL. הנה קטע קוד שמראה איך עושים את זה:
DOC_URL="https://discovery.ucl.ac.uk/id/eprint/10089234/1/343019_3_art_0_py4t4l_convrt.pdf"
PROMPT="Summarize this document"
DISPLAY_NAME="base64_pdf"
# Download the PDF
wget -O "${DISPLAY_NAME}.pdf" "${DOC_URL}"
# Check for FreeBSD base64 and set flags accordingly
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
# Base64 encode the PDF
ENCODED_PDF=$(base64 $B64FLAGS "${DISPLAY_NAME}.pdf")
# Generate content using the base64 encoded PDF
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"inline_data": {"mime_type": "application/pdf", "data": "'"$ENCODED_PDF"'"}},
{"text": "'$PROMPT'"}
]
}]
}' 2> /dev/null > response.json
cat response.json
echo
jq ".candidates[].content.parts[].text" response.json
# Clean up the downloaded PDF
rm "${DISPLAY_NAME}.pdf"
פרטים טכניים
ב-Gemini 1.5 Pro וב-Gemini 1.5 Flash יש תמיכה ב-3,600 דפי מסמכים לכל היותר. דפי המסמך חייבים להיות באחד מסוגי ה-MIME הבאים של נתוני טקסט:
- 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
כל דף במסמך שווה ל-258 אסימונים.
אין מגבלות ספציפיות למספר הפיקסלים במסמך, מלבד חלון ההקשר של המודל. עם זאת, דפים גדולים יותר מוקטנים לרזולוציה מקסימלית של 3072x3072 תוך שמירה על יחס הגובה-רוחב המקורי שלהם, ודפים קטנים יותר מוגדלים לרזולוציה של 768x768 פיקסלים. אין הפחתת עלות של עמודים בגדלים קטנים יותר, מלבד רוחב הפס, או שיפור בביצועים של עמודים ברזולוציה גבוהה יותר.
לקבלת התוצאות הטובות ביותר:
- לפני ההעלאה, צריך לסובב את הדפים לכיוון הנכון.
- הימנעו מדפים מטושטשים.
- אם משתמשים בדף יחיד, צריך למקם את הנחיית הטקסט אחרי הדף.
קובצי PDF גדולים
אפשר להשתמש ב-File API כדי להעלות מסמך בכל גודל. תמיד צריך להשתמש ב-File API כשהגודל הכולל של הבקשה (כולל הקבצים, הנחיות הטקסט, הוראות המערכת וכו') גדול מ-20MB.
קוראים ל-media.upload
כדי להעלות קובץ באמצעות File API. הקוד הבא מעלה קובץ מסמך ואז משתמש בקובץ בקריאה ל-models.generateContent
.
קובצי PDF גדולים מכתובות URL
שימוש ב-File API לקובצי PDF גדולים שזמינים מכתובות URL, כדי לפשט את תהליך ההעלאה והעיבוד של המסמכים האלה ישירות דרך כתובות ה-URL שלהם:
PDF_PATH="https://www.nasa.gov/wp-content/uploads/static/history/alsj/a17/A17_FlightPlan.pdf"
DISPLAY_NAME="A17_FlightPlan"
PROMPT="Summarize this document"
# Download the PDF from the provided URL
wget -O "${DISPLAY_NAME}.pdf" "${PDF_PATH}"
MIME_TYPE=$(file -b --mime-type "${DISPLAY_NAME}.pdf")
NUM_BYTES=$(wc -c < "${DISPLAY_NAME}.pdf")
echo "MIME_TYPE: ${MIME_TYPE}"
echo "NUM_BYTES: ${NUM_BYTES}"
tmp_header_file=upload-header.tmp
# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
-D upload-header.tmp \
-H "X-Goog-Upload-Protocol: resumable" \
-H "X-Goog-Upload-Command: start" \
-H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
-H "Content-Type: application/json" \
-d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null
upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"
# Upload the actual bytes.
curl "${upload_url}" \
-H "Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Offset: 0" \
-H "X-Goog-Upload-Command: upload, finalize" \
--data-binary "@${DISPLAY_NAME}.pdf" 2> /dev/null > file_info.json
file_uri=$(jq ".file.uri" file_info.json)
echo "file_uri: ${file_uri}"
# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"text": "'$PROMPT'"},
{"file_data":{"mime_type": "application/pdf", "file_uri": '$file_uri'}}]
}]
}' 2> /dev/null > response.json
cat response.json
echo
jq ".candidates[].content.parts[].text" response.json
# Clean up the downloaded PDF
rm "${DISPLAY_NAME}.pdf"
קובצי PDF גדולים שמאוחסנים באופן מקומי
NUM_BYTES=$(wc -c < "${PDF_PATH}")
DISPLAY_NAME=TEXT
tmp_header_file=upload-header.tmp
# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
-D upload-header.tmp \
-H "X-Goog-Upload-Protocol: resumable" \
-H "X-Goog-Upload-Command: start" \
-H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Header-Content-Type: application/pdf" \
-H "Content-Type: application/json" \
-d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null
upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"
# Upload the actual bytes.
curl "${upload_url}" \
-H "Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Offset: 0" \
-H "X-Goog-Upload-Command: upload, finalize" \
--data-binary "@${PDF_PATH}" 2> /dev/null > file_info.json
file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri
# Now generate content using that file
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"text": "Can you add a few more lines to this poem?"},
{"file_data":{"mime_type": "application/pdf", "file_uri": '$file_uri'}}]
}]
}' 2> /dev/null > response.json
cat response.json
echo
jq ".candidates[].content.parts[].text" response.json
כדי לוודא שה-API שמר בהצלחה את הקובץ שהעליתם ולקבל את המטא-נתונים שלו, אפשר להפעיל את files.get
. רק הערך של name
(וכתוצאה מכך, הערך של uri
) הוא ייחודי.
name=$(jq ".file.name" file_info.json)
# Get the file of interest to check state
curl https://generativelanguage.googleapis.com/v1beta/files/$name > file_info.json
# Print some information about the file you got
name=$(jq ".file.name" file_info.json)
echo name=$name
file_uri=$(jq ".file.uri" file_info.json)
echo file_uri=$file_uri
כמה קובצי PDF
ה-API של Gemini מסוגל לעבד כמה מסמכי PDF בבקשה אחת, כל עוד הגודל המצטבר של המסמכים וההנחיה לטקסט נמצא בחלון ההקשר של המודל.
DOC_URL_1="https://arxiv.org/pdf/2312.11805"
DOC_URL_2="https://arxiv.org/pdf/2403.05530"
DISPLAY_NAME_1="Gemini_paper"
DISPLAY_NAME_2="Gemini_1.5_paper"
PROMPT="What is the difference between each of the main benchmarks between these two papers? Output these in a table."
# Function to download and upload a PDF
upload_pdf() {
local doc_url="$1"
local display_name="$2"
# Download the PDF
wget -O "${display_name}.pdf" "${doc_url}"
local MIME_TYPE=$(file -b --mime-type "${display_name}.pdf")
local NUM_BYTES=$(wc -c < "${display_name}.pdf")
echo "MIME_TYPE: ${MIME_TYPE}"
echo "NUM_BYTES: ${NUM_BYTES}"
local tmp_header_file=upload-header.tmp
# Initial resumable request
curl "${BASE_URL}/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
-D "${tmp_header_file}" \
-H "X-Goog-Upload-Protocol: resumable" \
-H "X-Goog-Upload-Command: start" \
-H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
-H "Content-Type: application/json" \
-d "{'file': {'display_name': '${display_name}'}}" 2> /dev/null
local upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"
# Upload the PDF
curl "${upload_url}" \
-H "Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Offset: 0" \
-H "X-Goog-Upload-Command: upload, finalize" \
--data-binary "@${display_name}.pdf" 2> /dev/null > "file_info_${display_name}.json"
local file_uri=$(jq ".file.uri" "file_info_${display_name}.json")
echo "file_uri for ${display_name}: ${file_uri}"
# Clean up the downloaded PDF
rm "${display_name}.pdf"
echo "${file_uri}"
}
# Upload the first PDF
file_uri_1=$(upload_pdf "${DOC_URL_1}" "${DISPLAY_NAME_1}")
# Upload the second PDF
file_uri_2=$(upload_pdf "${DOC_URL_2}" "${DISPLAY_NAME_2}")
# Now generate content using both files
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"file_data": {"mime_type": "application/pdf", "file_uri": '$file_uri_1'}},
{"file_data": {"mime_type": "application/pdf", "file_uri": '$file_uri_2'}},
{"text": "'$PROMPT'"}
]
}]
}' 2> /dev/null > response.json
cat response.json
echo
jq ".candidates[].content.parts[].text" response.json
המאמרים הבאים
מידע נוסף זמין במקורות המידע הבאים:
- אסטרטגיות להצגת בקשות להעלאת קבצים: Gemini API תומך בהצגת בקשות להעלאת קבצים עם נתוני טקסט, תמונות, אודיו ווידאו, שנקראות גם בקשות להצגת נתונים במגוון מודלים.
- הוראות מערכת: הוראות המערכת מאפשרות לכם לקבוע את התנהגות המודל בהתאם לצרכים ולתרחישים הספציפיים שלכם.