Kuptimi i dokumentit

Gemini API mbështet hyrjen PDF, duke përfshirë dokumente të gjata (deri në 3600 faqe). Modelet Gemini përpunojnë PDF-të me vizion origjinal, dhe për këtë arsye janë në gjendje të kuptojnë përmbajtjen e tekstit dhe të imazhit brenda dokumenteve. Me mbështetjen origjinale të vizionit PDF, modelet Gemini janë në gjendje të:

  • Analizoni diagramet, grafikët dhe tabelat brenda dokumenteve
  • Ekstraktoni informacionin në formate të strukturuara të daljes
  • Përgjigjuni pyetjeve në lidhje me përmbajtjen vizuale dhe tekstuale në dokumente
  • Përmblidhni dokumentet
  • Transkriptoni përmbajtjen e dokumentit (p.sh. në HTML) duke ruajtur paraqitjet dhe formatimin, për përdorim në aplikacionet e rrjedhës së poshtme

Ky udhëzues demonstron disa mënyra të mundshme për të përdorur API-në Gemini për të përpunuar dokumentet PDF.

Hyrja PDF

Për ngarkesat PDF nën 20 MB, mund të zgjidhni midis ngarkimit të dokumenteve të koduara base64 ose ngarkimit të drejtpërdrejtë të skedarëve të ruajtur në vend.

Si të dhëna_inline

Ju mund të përpunoni dokumente PDF direkt nga URL-të. Këtu është një copë kodi që tregon se si ta bëni këtë:

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"

Detaje teknike

Gemini 1.5 Pro dhe 1.5 Flash mbështesin një maksimum prej 3600 faqe dokumentesh. Faqet e dokumentit duhet të jenë në një nga llojet e mëposhtme MIME të të dhënave tekstuale:

  • 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

Çdo faqe dokumenti është e barabartë me 258 argumente.

Ndërsa nuk ka kufizime specifike për numrin e pikselëve në një dokument përveç dritares së kontekstit të modelit, faqet më të mëdha zvogëlohen në një rezolucion maksimal prej 3072x3072 duke ruajtur raportin e tyre origjinal të pamjes, ndërsa faqet më të vogla janë shkallëzuar deri në 768x768 piksele. Nuk ka ulje kostoje për faqet me madhësi më të ulët, përveç gjerësisë së brezit, ose përmirësimit të performancës për faqet me rezolucion më të lartë.

Për rezultate më të mira:

  • Rrotulloni faqet në orientimin e duhur përpara se të ngarkoni.
  • Shmangni faqet e paqarta.
  • Nëse përdorni një faqe të vetme, vendosni kërkesën për tekst pas faqes.

PDF të mëdha

Ju mund të përdorni API-në e skedarit për të ngarkuar një dokument të çdo madhësie. Përdorni gjithmonë API-në e skedarit kur madhësia totale e kërkesës (përfshirë skedarët, kërkesën për tekst, udhëzimet e sistemit, etj.) është më e madhe se 20 MB.

Telefononi media.upload për të ngarkuar një skedar duke përdorur File API. Kodi i mëposhtëm ngarkon një skedar dokumenti dhe më pas përdor skedarin në një thirrje për models.generateContent .

PDF të mëdha nga URL-të

Përdorni API-në e skedarëve për skedarë të mëdhenj PDF të disponueshëm nga URL-të, duke thjeshtuar procesin e ngarkimit dhe përpunimit të këtyre dokumenteve drejtpërdrejt përmes URL-ve të tyre:

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 të mëdha të ruajtura në vend

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

Mund të verifikoni se API e ka ruajtur me sukses skedarin e ngarkuar dhe të merrni meta të dhënat e tij duke telefonuar files.get . Vetëm name (dhe sipas zgjerimit, uri ) janë unik.

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 të shumta

Gemini API është në gjendje të përpunojë dokumente të shumta PDF në një kërkesë të vetme, për sa kohë që madhësia e kombinuar e dokumenteve dhe kërkesave të tekstit qëndron brenda dritares së kontekstit të modelit.

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

Çfarë është më pas

Për të mësuar më shumë, shikoni burimet e mëposhtme:

  • Strategjitë e nxitjes së skedarëve : Gemini API mbështet nxitjen me të dhëna teksti, imazhi, audio dhe video, të njohura gjithashtu si nxitje multimodale.
  • Udhëzimet e sistemit : Udhëzimet e sistemit ju lejojnë të drejtoni sjelljen e modelit bazuar në nevojat tuaja specifike dhe rastet e përdorimit.