درک سند

Gemini API از ورودی PDF، از جمله اسناد طولانی (تا 3600 صفحه) پشتیبانی می کند. مدل‌های Gemini فایل‌های PDF را با دید بومی پردازش می‌کنند و بنابراین می‌توانند محتوای متن و تصویر درون اسناد را درک کنند. با پشتیبانی از دید PDF بومی، مدل‌های Gemini قادرند:

  • نمودارها، نمودارها و جداول داخل اسناد را تجزیه و تحلیل کنید
  • استخراج اطلاعات به فرمت های خروجی ساخت یافته
  • به سوالات مربوط به محتوای تصویری و متنی در اسناد پاسخ دهید
  • اسناد را خلاصه کنید
  • رونویسی محتوای سند (به عنوان مثال به HTML) با حفظ طرح‌بندی و قالب‌بندی، برای استفاده در برنامه‌های پایین دست

این آموزش راه های ممکن برای استفاده از Gemini API برای پردازش اسناد PDF را نشان می دهد.

ورودی PDF

برای بارگذاری‌های PDF زیر 20 مگابایت، می‌توانید بین آپلود اسناد کدگذاری شده 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 و 1.5 Flash حداکثر از 3600 صفحه سند پشتیبانی می کنند. صفحات سند باید در یکی از انواع MIME داده متنی زیر باشند:

  • PDF - application/pdf
  • جاوا اسکریپت - application/x-javascript ، text/javascript
  • پایتون - 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 پیکسل کوچک می شوند. هیچ کاهش هزینه ای برای صفحات با اندازه های پایین تر، به جز پهنای باند، یا بهبود عملکرد برای صفحات با وضوح بالاتر وجود ندارد.

برای بهترین نتایج:

  • قبل از آپلود، صفحات را به جهت صحیح بچرخانید.
  • از صفحات تار خودداری کنید.
  • اگر از یک صفحه استفاده می کنید، اعلان متن را بعد از صفحه قرار دهید.

پی دی اف های بزرگ

می توانید از File API برای آپلود یک سند با هر اندازه ای استفاده کنید. همیشه زمانی از File API استفاده کنید که حجم کل درخواست (شامل فایل‌ها، پیام متنی، دستورالعمل‌های سیستم و غیره) بیشتر از 20 مگابایت باشد.

برای آپلود فایل با استفاده از File API media.upload تماس بگیرید. کد زیر یک فایل سند را آپلود می کند و سپس از فایل در تماس با models.generateContent استفاده می کند.

پی دی اف های بزرگ از URL ها

از File API برای فایل‌های پی‌دی‌اف بزرگی که از آدرس‌های اینترنتی موجود است، استفاده کنید، و فرآیند آپلود و پردازش این اسناد را مستقیماً از طریق 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

Gemini API قادر است چندین سند 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 از درخواست با داده‌های متنی، تصویری، صوتی و ویدیویی پشتیبانی می‌کند که به عنوان درخواست چندوجهی نیز شناخته می‌شود.
  • دستورالعمل‌های سیستم : دستورالعمل‌های سیستم به شما امکان می‌دهد رفتار مدل را بر اساس نیازهای خاص و موارد استفاده خود هدایت کنید.