การทำความเข้าใจเอกสาร

Gemini API รองรับอินพุต PDF รวมถึงเอกสารที่มีความยาว (สูงสุด 3, 600 หน้า) โมเดล Gemini จะประมวลผล PDF ด้วยระบบการมองเห็นแบบดั้งเดิม จึงเข้าใจทั้งเนื้อหาข้อความและรูปภาพในเอกสาร โมเดล Gemini จะทําสิ่งต่อไปนี้ได้เมื่อรองรับ PDF แบบเนทีฟ

  • วิเคราะห์แผนภาพ แผนภูมิ และตารางในเอกสาร
  • ดึงข้อมูลในรูปแบบเอาต์พุตที่มีโครงสร้าง
  • ตอบคำถามเกี่ยวกับเนื้อหาที่เป็นภาพและข้อความในเอกสาร
  • สรุปเอกสาร
  • ถอดเสียงเนื้อหาเอกสาร (เช่น เป็น HTML) โดยคงเลย์เอาต์และการจัดรูปแบบไว้เพื่อใช้ในแอปพลิเคชันดาวน์สตรีม

บทแนะนำนี้จะแสดงวิธีต่างๆ ในการใช้ Gemini API เพื่อประมวลผลเอกสาร PDF

อินพุต PDF

สำหรับเพย์โหลด PDF น้อยกว่า 20 MB คุณสามารถเลือกระหว่างการอัปโหลดเอกสารที่เข้ารหัส 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 รองรับหน้าเอกสารได้สูงสุด 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
  • มาร์กดาวน์ - text/md
  • CSV - text/csv
  • XML - text/xml
  • RTF - text/rtf

แต่ละหน้าเอกสารจะเท่ากับโทเค็น 258 รายการ

แม้ว่าจะไม่มีขีดจำกัดที่เจาะจงสำหรับจำนวนพิกเซลในเอกสารนอกเหนือจากกรอบบริบทของโมเดล แต่ระบบจะปรับขนาดหน้าเว็บขนาดใหญ่ให้ความละเอียดสูงสุด 3072x3072 พิกเซลโดยคงอัตราส่วนภาพเดิมไว้ ส่วนหน้าเว็บขนาดเล็กจะปรับขนาดให้ใหญ่ขึ้นเป็น 768x768 พิกเซล หน้าเว็บที่มีความละเอียดต่ำจะไม่มีค่าใช้จ่ายลดลง นอกเหนือจากแบนด์วิดท์ หรือประสิทธิภาพที่ดีขึ้นสำหรับหน้าเว็บที่มีความละเอียดสูง

เพื่อผลลัพธ์ที่ดีที่สุด ให้ทำดังนี้

  • หมุนหน้าเว็บให้อยู่ในแนวที่ถูกต้องก่อนอัปโหลด
  • หลีกเลี่ยงหน้าเว็บที่เบลอ
  • หากใช้หน้าเดียว ให้วางพรอมต์ข้อความไว้หลังหน้านั้น

PDF ขนาดใหญ่

คุณสามารถใช้ File API เพื่ออัปโหลดเอกสารได้ทุกขนาด ใช้ File API เสมอเมื่อคำขอทั้งหมด (รวมถึงไฟล์ ข้อความแจ้ง ระบบ วิธีการ ฯลฯ) มีขนาดใหญ่กว่า 20 MB

โทรหา 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 หลายไฟล์

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 รองรับการแจ้งด้วยข้อมูลข้อความ รูปภาพ เสียง และวิดีโอ หรือที่เรียกว่าการแจ้งแบบหลายรูปแบบ
  • คำสั่งของระบบ: คำสั่งของระบบช่วยให้คุณควบคุมลักษณะการทํางานของโมเดลตามความต้องการและกรณีการใช้งานที่เฉพาะเจาะจง