การแคชบริบทใน Firebase AI Logic

สำหรับฟีเจอร์ AI คุณอาจส่งโทเค็นอินพุต (เนื้อหา) เดียวกันซ้ำๆ ไปยังโมเดล สำหรับกรณีการใช้งานเหล่านี้ คุณสามารถ แคช เนื้อหาดังกล่าวแทนได้ ซึ่งหมายความว่าคุณจะส่งเนื้อหาไปยังโมเดล 1 ครั้ง จัดเก็บเนื้อหา และอ้างอิง เนื้อหาในคำขอที่ตามมา

การแคชบริบทช่วยลดเวลาในการตอบสนองและค่าใช้จ่ายได้อย่างมากสำหรับงานที่ทำซ้ำๆ ซึ่งเกี่ยวข้องกับ เนื้อหาจำนวนมาก เช่น ข้อความจำนวนมาก ไฟล์เสียง หรือไฟล์วิดีโอ กรณีการใช้งานที่พบบ่อยบางส่วนสำหรับเนื้อหาที่แคชไว้ ได้แก่ เอกสารเพอร์โซนาโดยละเอียด ฐานของโค้ด หรือคู่มือ

โมเดล Gemini มีกลไกการแคช 2 แบบที่แตกต่างกัน ดังนี้

  • การแคชแบบไม่เจาะจง: เปิดใช้โดยอัตโนมัติ ในโมเดลส่วนใหญ่ ไม่รับประกันการประหยัดค่าใช้จ่าย

  • การแคชแบบเจาะจง: สามารถเปิดใช้ เลือกได้ และ ด้วยตนเอง ในโมเดลส่วนใหญ่ มักจะส่งผลให้ ประหยัดค่าใช้จ่าย

การแคชแบบเจาะจงมีประโยชน์ในกรณีที่คุณต้องการรับประกันการประหยัดค่าใช้จ่ายมากขึ้น แต่ต้องเพิ่มงานของนักพัฒนาแอป

สำหรับการแคชแบบไม่เจาะจงและแบบเจาะจง ฟิลด์ cachedContentTokenCount ในข้อมูลเมตาของการตอบกลับจะระบุจำนวนโทเค็นในส่วนที่แคชไว้ของอินพุต สำหรับการแคชแบบเจาะจง โปรดตรวจสอบข้อมูลราคา ที่ด้านล่างของหน้านี้

โมเดลที่รองรับ

ระบบรองรับการแคชเมื่อใช้โมเดลต่อไปนี้

  • gemini-3.1-pro-preview
  • gemini-3.5-flash
  • gemini-3.1-flash-lite
  • gemini-2.5-pro
  • gemini-2.5-flash
  • gemini-2.5-flash-lite

โมเดลที่สร้างสื่อ (เช่น โมเดล "Nana Banana" อย่าง gemini-3.1-flash-image) ไม่ รองรับการแคชบริบท

ข้อจำกัดด้านขนาดของเนื้อหาที่แคชไว้

แต่ละโมเดลมีข้อกำหนดจำนวนโทเค็น ขั้นต่ำ สำหรับเนื้อหาที่แคชไว้ ส่วนจำนวนโทเค็นสูงสุดจะขึ้นอยู่กับหน้าต่างบริบทของโมเดล

  • โมเดล Gemini Pro: โทเค็นขั้นต่ำ 4096 รายการ
  • โมเดล Gemini Flash: โทเค็นขั้นต่ำ 1024 รายการ

นอกจากนี้ ขนาดสูงสุดของเนื้อหาที่คุณแคชไว้โดยใช้ BLOB หรือข้อความคือ 10 MB



การแคชแบบไม่เจาะจง

การแคชแบบไม่เจาะจงจะเปิดใช้โดยค่าเริ่มต้น และพร้อมให้บริการสำหรับโมเดล Gemini ส่วนใหญ่

Google จะส่งต่อการประหยัดค่าใช้จ่ายโดยอัตโนมัติหากคำขอของคุณตรงกับเนื้อหาที่แคชไว้ ต่อไปนี้คือวิธีเพิ่มโอกาสที่คำขอของคุณจะใช้การแคชแบบไม่เจาะจง

  • ลองวางเนื้อหาขนาดใหญ่และเนื้อหาที่พบบ่อยไว้ที่จุดเริ่มต้นของพรอมต์
  • ลองส่งคำขอที่มีคำนำหน้าที่คล้ายกันภายในระยะเวลาสั้นๆ

ระบบจะระบุจำนวนโทเค็นในส่วนที่แคชไว้ของอินพุตในฟิลด์ cachedContentTokenCount ในข้อมูลเมตาของการตอบกลับ



การแคชแบบเจาะจง

การแคชแบบเจาะจง ไม่ได้ เปิดใช้โดยค่าเริ่มต้น และเป็น ความสามารถเสริมของโมเดล Gemini

วิธีตั้งค่าและใช้แคชเนื้อหาแบบเจาะจง

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



สร้างและใช้แคชแบบเจาะจง

การสร้างและใช้แคชเนื้อหาแบบเจาะจงต้องมีสิ่งต่อไปนี้

  1. สร้างแคชแบบเจาะจง

  2. อ้างอิงแคชในเทมเพลตพรอมต์ของเซิร์ฟเวอร์

  3. อ้างอิงเทมเพลตพรอมต์ของเซิร์ฟเวอร์ในคำขอพรอมต์จากแอป

ข้อมูลสำคัญเกี่ยวกับการสร้างและใช้แคชแบบเจาะจง

แคชต้องสอดคล้องกับคำขอพรอมต์ของแอปและเทมเพลตพรอมต์ของเซิร์ฟเวอร์ โดยมีรายละเอียดดังนี้

  • แคชมีไว้สำหรับผู้ให้บริการ Gemini API ที่เฉพาะเจาะจง คำขอพรอมต์ของแอปต้องใช้ผู้ให้บริการรายเดียวกัน
    สำหรับ Firebase AI Logic เราขอแนะนำให้ใช้แคชเนื้อหาแบบเจาะจง กับ Vertex AI Gemini APIเท่านั้น ข้อมูลและ ตัวอย่างทั้งหมดในหน้านี้มีไว้สำหรับผู้ให้บริการ Gemini API รายดังกล่าว

  • แคชมีไว้สำหรับโมเดล Gemini ที่เฉพาะเจาะจง คำขอพรอมต์ของแอปต้องใช้โมเดลเดียวกัน

  • แคชมีไว้สำหรับสถานที่ที่เฉพาะเจาะจงเมื่อใช้ Vertex AI Gemini API
    สถานที่สำหรับแคชแบบเจาะจงต้องตรงกับ สถานที่ของเทมเพลตพรอมต์ของเซิร์ฟเวอร์ และ สถานที่ที่คุณเข้าถึงโมเดล ในคำขอพรอมต์ของแอป

นอกจากนี้ โปรดทราบข้อจำกัดและข้อกำหนดต่อไปนี้สำหรับการแคชแบบเจาะจง

  • เมื่อสร้างแคชแบบเจาะจงแล้ว คุณจะเปลี่ยนแปลงสิ่งใดๆ เกี่ยวกับแคชไม่ได้ ยกเว้น TTL หรือเวลาหมดอายุ

  • คุณสามารถแคชประเภท MIME ของไฟล์อินพุตที่ รองรับ หรือแม้แต่ข้อความที่ระบุไว้ในคำขอสร้างแคช

  • หากต้องการรวมไฟล์ไว้ในแคช คุณต้องระบุไฟล์เป็น Cloud Storage URI โดยต้องไม่ใช่ URL ของเบราว์เซอร์หรือ URL ของ YouTube

    นอกจากนี้ ระบบจะตรวจสอบข้อจำกัดการเข้าถึงไฟล์ใน เวลาสร้างแคช และ จะไม่ตรวจสอบข้อจำกัดการเข้าถึงอีกครั้งในเวลาที่ผู้ใช้ส่งคำขอ ด้วยเหตุนี้ โปรดตรวจสอบว่าข้อมูลที่รวมอยู่ในแคชแบบเจาะจงเหมาะสำหรับผู้ใช้ทุกคนที่ส่งคำขอซึ่งรวมแคชดังกล่าว

  • หากต้องการใช้คำแนะนำหรือเครื่องมือของระบบ (เช่น การดำเนินการโค้ด, บริบท URL, Grounding with Google Search, หรือ Grounding with Google Maps) แคชเองต้องมีการกำหนดค่าของคำแนะนำหรือเครื่องมือเหล่านั้น คุณ ไม่สามารถ กำหนดค่าในเทมเพลตพรอมต์ของเซิร์ฟเวอร์หรือในคำขอพรอมต์ของแอป โปรดทราบว่าเทมเพลตพรอมต์ของเซิร์ฟเวอร์ ยังไม่ รองรับการเรียกใช้ฟังก์ชัน (หรือการแชท) ดูรายละเอียดเกี่ยวกับวิธีกำหนดค่าคำแนะนำ และเครื่องมือของระบบในแคชได้ที่ REST API ของ Vertex AI Gemini API

ขั้นตอนที่ 1: สร้างแคช

สร้างแคชโดยใช้ REST API ของ Vertex AI Gemini API โดยตรง

ตัวอย่างต่อไปนี้แสดงการสร้างแคชแบบเจาะจงของไฟล์ PDF เป็นเนื้อหา

ไวยากรณ์:

PROJECT_ID="PROJECT_ID"
MODEL_ID="GEMINI_MODEL"  # for example, gemini-3.5-flash
LOCATION="LOCATION"  # location for both the cache and the model
MIME_TYPE="MIME_TYPE"
CACHED_CONTENT_URI="CLOUD_STORAGE_FILE_URI"  # must be a Cloud Storage URI
CACHE_DISPLAY_NAME="CACHE_DISPLAY_NAME"  # optional
TTL="CACHE_TIME_TO_LIVE"  # optional (if not specified, defaults to 3600s)

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents \
-d @- <<EOF
{
  "model":"projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}",
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "fileData": {
            "mimeType": "${MIME_TYPE}",
            "fileUri": "${CACHED_CONTENT_URI}"
          }
        }
      ]
    }
  ],
  "displayName": "${CACHE_DISPLAY_NAME}",
  "ttl": "${TTL}"
}
EOF

ตัวอย่างคำขอ:

PROJECT_ID="my-amazing-app"
MODEL_ID="gemini-3.5-flash"
LOCATION="global"
MIME_TYPE="application/pdf"
CACHED_CONTENT_URI="gs://cloud-samples-data/generative-ai/pdf/2312.11805v3.pdf"
CACHE_DISPLAY_NAME="Gemini - A Family of Highly Capable Multimodal Model (PDF)"
TTL="7200s"

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents \
-d @- <<EOF
{
  "model":"projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}",
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "fileData": {
            "mimeType": "${MIME_TYPE}",
            "fileUri": "${CACHED_CONTENT_URI}"
          }
        }
      ]
    }
  ],
  "displayName": "${CACHE_DISPLAY_NAME}",
  "ttl": "${TTL}"
}
EOF

ตัวอย่างการตอบกลับ:

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

{
  "name": "projects/861083271981/locations/global/cachedContents/4545031458888089601",
  "model": "projects/my-amazing-app/locations/global/publishers/google/models/gemini-3.5-flash",
  "createTime": "2024-06-04T01:11:50.808236Z",
  "updateTime": "2024-06-04T01:11:50.808236Z",
  "expireTime": "2024-06-04T02:11:50.794542Z"
}

ขั้นตอนที่ 2: อ้างอิงแคชในเทมเพลตพรอมต์ของเซิร์ฟเวอร์

หลังจากสร้างแคชแล้ว ให้อ้างอิงแคชตาม name ภายในcachedContent พร็อพเพอร์ตี้ของ เทมเพลตพรอมต์ของเซิร์ฟเวอร์

ตรวจสอบว่าคุณปฏิบัติตามข้อกำหนดต่อไปนี้เมื่อสร้างเทมเพลตพรอมต์ของเซิร์ฟเวอร์

ไวยากรณ์:

{{cachedContent name="YOUR_CACHE_RESOURCE_NAME"}}

{{role "user"}}
{{userPrompt}}

ตัวอย่าง:

{{cachedContent name="projects/861083271981/locations/global/cachedContents/4545031458888089601"}}

{{role "user"}}
{{userPrompt}}

อีกทางเลือกหนึ่งคือ ค่าของพารามิเตอร์ name ในเทมเพลตพรอมต์ของเซิร์ฟเวอร์ อาจเป็น ตัวแปรอินพุตแบบไดนามิก เช่น {{cachedContent name=someVariable}} ช่วยให้คุณรวม name ของแคชเป็นอินพุตสำหรับคำขอจาก แอปได้

ขั้นตอนที่ 3: อ้างอิงเทมเพลตพรอมต์ของเซิร์ฟเวอร์ในคำขอจากแอป

โปรดระมัดระวังอย่างยิ่งเกี่ยวกับสิ่งต่อไปนี้เมื่อเขียนคำขอ

Swift

// ...

// Initialize the Vertex AI Gemini API backend service
// Create a `TemplateGenerativeModel` instance
// Make sure to specify the same location as the server prompt template and the cache
let model = FirebaseAI.firebaseAI(backend: .vertexAI(location: "LOCATION"))
                                  .templateGenerativeModel()

do {
    let response = try await model.generateContent(
        // Specify your template ID
        templateID: "TEMPLATE_ID"
    )
    if let text = response.text {
        print("Response Text: \(text)")
    }
} catch {
    print("An error occurred: \(error)")
}
print("\n")

Kotlin

// ...

// Initialize the Vertex AI Gemini API backend service
// Create a `TemplateGenerativeModel` instance
// Make sure to specify the same location as the server prompt template and the cache
val model = Firebase.ai(backend = GenerativeBackend.vertexAI(location = "LOCATION"))
                        .templateGenerativeModel()

val response = model.generateContent(
    // Specify your template ID
    "TEMPLATE_ID",
)

val text = response.text
println(text)

Java

// ...

// Initialize the Vertex AI Gemini API backend service
// Create a `TemplateGenerativeModel` instance
// Make sure to specify the same location as the server prompt template and the cache
TemplateGenerativeModel generativeModel = FirebaseAI.getInstance().templateGenerativeModel();

TemplateGenerativeModelFutures model = TemplateGenerativeModelFutures.from(generativeModel);

Future<GenerateContentResponse> response = model.generateContent(
    // Specify your template ID
    "TEMPLATE_ID"
);
addCallback(response,
      new FutureCallback<GenerateContentResponse>() {
          public void onSuccess(GenerateContentResponse result) {
            System.out.println(result.getText());
          }
          public void onFailure(Throwable t) {
            reportError(t);
          }
    }
executor);

Web

// ...

// Initialize the Vertex AI Gemini API backend service
// Make sure to specify the same location as the server prompt template and the cache
const ai = getAI(app, { backend: new VertexAIBackend('LOCATION') });

// Create a `TemplateGenerativeModel` instance
const model = getTemplateGenerativeModel(ai);

const result = await model.generateContent(
  // Specify your template ID
  'TEMPLATE_ID'
);

const response = result.response;
const text = response.text();

Dart

// ...

// Initialize the Vertex AI Gemini API backend service
// Create a `TemplateGenerativeModel` instance
// Make sure to specify the same location as the server prompt template and the cache
var _model = FirebaseAI.vertexAI(location: 'LOCATION').templateGenerativeModel()

var response = await _model.generateContent(
        // Specify your template ID
        'TEMPLATE_ID',
      );

var text = response?.text;
print(text);

Unity

// ...

// Initialize the Vertex AI Gemini API backend service
// Make sure to specify the same location as the server prompt template and the cache
var firebaseAI = FirebaseAI.GetInstance(FirebaseAI.Backend.VertexAI(location: "LOCATION"));

// Create a `TemplateGenerativeModel` instance
var model = firebaseAI.GetTemplateGenerativeModel();

try
{
  var response = await model.GenerateContentAsync(
      // Specify your template ID
      "TEMPLATE_ID"
  );
  Debug.Log($"Response Text: {response.Text}");
}
catch (Exception e) {
  Debug.LogError($"An error occurred: {e.Message}");
}



จัดการแคชแบบเจาะจง

ส่วนนี้อธิบายการจัดการแคชเนื้อหาแบบเจาะจง ซึ่งรวมถึงวิธี แสดงแคชทั้งหมด, รับข้อมูลเมตาเกี่ยวกับแคช, อัปเดต TTL หรือเวลาหมดอายุของแคช, และ ลบแคช

คุณจัดการแคชแบบเจาะจงโดยใช้ REST API ของ Vertex AI Gemini API

เมื่อสร้างแคชเนื้อหาแบบเจาะจงแล้ว คุณจะเปลี่ยนแปลงสิ่งใดๆ เกี่ยวกับแคชไม่ได้ ยกเว้น TTL หรือเวลาหมดอายุ

แสดงแคชทั้งหมด

คุณสามารถแสดงแคชแบบเจาะจงทั้งหมดที่พร้อมใช้งานสำหรับโปรเจ็กต์ คำสั่งนี้จะแสดงเฉพาะแคชในสถานที่ที่ระบุ

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"

curl \
-X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents

รับข้อมูลเมตาเกี่ยวกับแคช

คุณไม่สามารถดึงหรือดูเนื้อหาที่แคชไว้จริง อย่างไรก็ตาม คุณ สามารถดึง ข้อมูลเมตา เกี่ยวกับแคชแบบเจาะจง ซึ่งรวมถึง name, model, display_name, usage_metadata, create_time, update_time และ expire_time

คุณต้องระบุ CACHE_ID ซึ่งเป็นส่วนสุดท้ายใน name ของทรัพยากรแบบเต็มของแคช

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
CACHE_ID="CACHE_ID"  # the final segment in the `name` of the cache

curl \
-X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents/${CACHE_ID}

อัปเดต TTL หรือเวลาหมดอายุของแคช

เมื่อสร้างแคชแบบเจาะจง คุณสามารถตั้งค่า ttl หรือ expire_time ได้โดยไม่บังคับ

  • ttl: TTL (Time to Live) สำหรับแคช ซึ่งก็คือจำนวนวินาทีและนาโนวินาทีที่แคชจะมีอายุหลังจากสร้างหรือหลังจากอัปเดต ttl แล้วก่อนที่จะหมดอายุ เมื่อคุณตั้งค่า ttl ระบบจะอัปเดต expireTime ของแคชโดยอัตโนมัติ

  • expire_time: Timestamp (เช่น 2024-06-30T09:00:00.000000Z) ที่ระบุวันที่และเวลา แน่นอน ที่แคชจะหมดอายุ

หากไม่ได้ตั้งค่าใดค่าหนึ่ง ค่า TTL เริ่มต้นคือ 1 ชั่วโมง ไม่มีขอบเขตขั้นต่ำหรือสูงสุดสำหรับ TTL

สำหรับแคชแบบเจาะจงที่มีอยู่ คุณสามารถเพิ่มหรืออัปเดต ttl หรือ expire_time ได้ คุณต้องระบุ CACHE_ID ซึ่งเป็นส่วนสุดท้ายใน name ของทรัพยากรแบบเต็มของแคช

อัปเดต ttl

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
CACHE_ID="CACHE_ID"  # the final segment in the `name` of the cache
TTL="CACHE_TIME_TO_LIVE"

curl \
-X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents/${CACHE_ID} -d \
'{
  "ttl": "'$TTL'"
}'

อัปเดต expire_time

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
CACHE_ID="CACHE_ID"  # the final segment in the `name` of the cache
EXPIRE_TIME="ABSOLUTE_TIME_CACHE_EXPIRES"

curl \
-X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents/${CACHE_ID} -d \
'{
  "expire_time": "'$EXPIRE_TIME'"
}'

ลบแคช

เมื่อไม่ต้องการใช้แคชแบบเจาะจงอีกต่อไป คุณสามารถลบแคชได้

คุณต้องระบุ CACHE_ID ซึ่งเป็นส่วนสุดท้ายใน name ของทรัพยากรแบบเต็มของแคช

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
CACHE_ID="CACHE_ID"  # the final segment in the `name` of the cache

curl \
-X DELETE \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/cachedContents/${CACHE_ID}



ราคาสำหรับการแคชแบบเจาะจง

การแคชแบบเจาะจงเป็นฟีเจอร์แบบชำระเงินที่ออกแบบมาเพื่อลดค่าใช้จ่าย ราคาจะขึ้นอยู่กับปัจจัยต่อไปนี้

  • โทเค็นอินพุตสำหรับการสร้างแคช: สำหรับการแคชแบบไม่เจาะจงและแบบเจาะจง ระบบจะเรียกเก็บเงินคุณสำหรับโทเค็นอินพุตที่ใช้สร้างแคชในราคา โทเค็นอินพุตมาตรฐาน

  • พื้นที่เก็บข้อมูลของแคช: สำหรับการแคชแบบเจาะจง จะมีค่าใช้จ่ายในการจัดเก็บตามระยะเวลาที่จัดเก็บแคชด้วย แต่ไม่มีค่าใช้จ่ายในการจัดเก็บสำหรับการแคชแบบไม่เจาะจง ดูข้อมูลเพิ่มเติมได้ที่ ราคาสำหรับ Vertex AI Gemini API

  • การใช้เนื้อหาที่แคชไว้: การแคชแบบเจาะจงจะรับประกันส่วนลดเมื่อมีการอ้างอิงแคชแบบเจาะจง ซึ่งหมายความว่าคุณจะได้รับส่วนลดสำหรับโทเค็นอินพุตเมื่อโทเค็นเหล่านั้นอ้างอิงแคชที่มีอยู่ สำหรับ Gemini 2.5 และโมเดลที่ใหม่กว่า ส่วนลดนี้คือ 90%

ระบบจะระบุจำนวนโทเค็นในส่วนที่แคชไว้ของอินพุตในฟิลด์ cachedContentTokenCount ในข้อมูลเมตาของการตอบกลับ