ทําความเข้าใจและนับโทเค็น


Gemini และโมเดล Generative AI อื่นๆ จะประมวลผลอินพุตและเอาต์พุตในระดับรายละเอียดที่เรียกว่า โทเค็น

เกี่ยวกับโทเค็น

โดยโทเค็นอาจเป็นอักขระเดี่ยว เช่น z หรือทั้งคำ เช่น cat คํายาวๆ จะแบ่งออกเป็นโทเค็นหลายรายการ ชุดโทเค็นทั้งหมดที่โมเดลใช้เรียกว่าคําศัพท์ และกระบวนการแยกข้อความออกเป็นโทเค็นเรียกว่าการแยกโทเค็น

สำหรับโมเดล Gemini โทเค็นจะเท่ากับประมาณ 4 อักขระ 100 โทเค็นเท่ากับคำภาษาอังกฤษประมาณ 60-80 คำ

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

นับโทเค็น

อินพุตและเอาต์พุตทั้งหมดจาก Gemini API จะได้รับการจัดทําเป็นโทเค็น ซึ่งรวมถึงข้อความ ไฟล์รูปภาพ และรูปแบบอื่นๆ ที่ไม่ใช่ข้อความ

คุณนับโทเค็นได้ดังนี้

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

  • ใช้แอตทริบิวต์ usageMetadata ในออบเจ็กต์ response หลังจากเรียกใช้ generate_content
    การดำเนินการนี้จะแสดงจํานวนโทเค็นทั้งหมดในทั้งอินพุตและเอาต์พุต ดังนี้ totalTokenCount
    นอกจากนี้ยังแสดงผลจํานวนโทเค็นของอินพุตและเอาต์พุตแยกกัน ดังนี้ promptTokenCount (โทเค็นอินพุต) และ candidatesTokenCount (โทเค็นเอาต์พุต)

นับโทเค็นข้อความ

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

อีกทางเลือกหนึ่งคือการเรียกใช้ generateContent แล้วใช้แอตทริบิวต์ usageMetadata ในออบเจ็กต์ response เพื่อรับผลลัพธ์ต่อไปนี้

  • จํานวนโทเค็นแยกต่างหากของอินพุต (promptTokenCount) และเอาต์พุต (candidatesTokenCount)
  • จํานวนโทเค็นทั้งหมดในทั้งอินพุตและเอาต์พุต (totalTokenCount)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "The quick brown fox jumps over the lazy dog.";
const countTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: prompt,
});
console.log(countTokensResponse.totalTokens);

const generateResponse = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: prompt,
});
console.log(generateResponse.usageMetadata);

นับโทเค็นแบบหลายรอบ (แชท)

หากคุณเรียกใช้ countTokens ด้วยประวัติการแชท ระบบจะแสดงผลจํานวนโทเค็นทั้งหมดของข้อความจากบทบาทแต่ละบทบาทในแชท (totalTokens)

อีกทางเลือกหนึ่งคือการเรียกใช้ sendMessage แล้วใช้แอตทริบิวต์ usageMetadata ในออบเจ็กต์ response เพื่อรับผลลัพธ์ต่อไปนี้

  • จํานวนโทเค็นแยกต่างหากของอินพุต (promptTokenCount) และเอาต์พุต (candidatesTokenCount)
  • จํานวนโทเค็นทั้งหมดในทั้งอินพุตและเอาต์พุต (totalTokenCount)

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

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
// Initial chat history.
const history = [
  { role: "user", parts: [{ text: "Hi my name is Bob" }] },
  { role: "model", parts: [{ text: "Hi Bob!" }] },
];
const chat = ai.chats.create({
  model: "gemini-2.0-flash",
  history: history,
});

// Count tokens for the current chat history.
const countTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: chat.getHistory(),
});
console.log(countTokensResponse.totalTokens);

const chatResponse = await chat.sendMessage({
  message: "In one sentence, explain how a computer works to a young child.",
});
console.log(chatResponse.usageMetadata);

// Add an extra user message to the history.
const extraMessage = {
  role: "user",
  parts: [{ text: "What is the meaning of life?" }],
};
const combinedHistory = chat.getHistory();
combinedHistory.push(extraMessage);
const combinedCountTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: combinedHistory,
});
console.log(
  "Combined history token count:",
  combinedCountTokensResponse.totalTokens,
);

นับโทเค็นหลายรูปแบบ

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

  • เมื่อใช้ Gemini 2.0 ระบบจะนับอินพุตรูปภาพที่มีทั้ง 2 มิติไม่เกิน 384 พิกเซลเป็นโทเค็น 258 รายการ ระบบจะครอบตัดและปรับขนาดรูปภาพที่มีขนาดใหญ่กว่าในมิติข้อมูลอย่างน้อย 1 หรือทั้ง 2 มิติเป็นไทล์ขนาด 768x768 พิกเซลตามที่จำเป็น โดยแต่ละรูปภาพจะนับเป็นโทเค็น 258 รายการ ก่อน Gemini 2.0 รูปภาพใช้โทเค็น 258 รายการแบบคงที่

  • ระบบจะแปลงไฟล์วิดีโอและไฟล์เสียงเป็นโทเค็นในอัตราคงที่ต่อไปนี้ วิดีโอที่ 263 โทเค็นต่อวินาทีและเสียงที่ 32 โทเค็นต่อวินาที

ไฟล์ภาพ

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

อีกทางเลือกหนึ่งคือการเรียกใช้ generateContent แล้วใช้แอตทริบิวต์ usageMetadata ในออบเจ็กต์ response เพื่อรับผลลัพธ์ต่อไปนี้

  • จํานวนโทเค็นแยกต่างหากของอินพุต (promptTokenCount) และเอาต์พุต (candidatesTokenCount)
  • จํานวนโทเค็นทั้งหมดในทั้งอินพุตและเอาต์พุต (totalTokenCount)

ตัวอย่างที่ใช้รูปภาพที่อัปโหลดจาก File API

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const organ = await ai.files.upload({
  file: path.join(media, "organ.jpg"),
  config: { mimeType: "image/jpeg" },
});

const countTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: createUserContent([
    prompt,
    createPartFromUri(organ.uri, organ.mimeType),
  ]),
});
console.log(countTokensResponse.totalTokens);

const generateResponse = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: createUserContent([
    prompt,
    createPartFromUri(organ.uri, organ.mimeType),
  ]),
});
console.log(generateResponse.usageMetadata);

ตัวอย่างที่แสดงรูปภาพเป็นข้อมูลในบรรทัด

// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const imageBuffer = fs.readFileSync(path.join(media, "organ.jpg"));

// Convert buffer to base64 string.
const imageBase64 = imageBuffer.toString("base64");

// Build contents using createUserContent and createPartFromBase64.
const contents = createUserContent([
  prompt,
  createPartFromBase64(imageBase64, "image/jpeg"),
]);

const countTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: contents,
});
console.log(countTokensResponse.totalTokens);

const generateResponse = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: contents,
});
console.log(generateResponse.usageMetadata);

ไฟล์วิดีโอหรือไฟล์เสียง

ระบบจะแปลงเสียงและวิดีโอเป็นโทเค็นในอัตราคงที่ต่อไปนี้

  • วิดีโอ: 263 โทเค็นต่อวินาที
  • เสียง: 32 โทเค็นต่อวินาที

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

อีกทางเลือกหนึ่งคือการเรียกใช้ generateContent แล้วใช้แอตทริบิวต์ usageMetadata ในออบเจ็กต์ response เพื่อรับผลลัพธ์ต่อไปนี้

  • จํานวนโทเค็นแยกต่างหากของอินพุต (promptTokenCount) และเอาต์พุต (candidatesTokenCount)
  • จํานวนโทเค็นทั้งหมดในทั้งอินพุตและเอาต์พุต (totalTokenCount)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this video";
let videoFile = await ai.files.upload({
  file: path.join(media, "Big_Buck_Bunny.mp4"),
  config: { mimeType: "video/mp4" },
});

// Poll until the video file is completely processed (state becomes ACTIVE).
while (!videoFile.state || videoFile.state.toString() !== "ACTIVE") {
  console.log("Processing video...");
  console.log("File state: ", videoFile.state);
  await sleep(5000);
  videoFile = await ai.files.get({ name: videoFile.name });
}

const countTokensResponse = await ai.models.countTokens({
  model: "gemini-2.0-flash",
  contents: createUserContent([
    prompt,
    createPartFromUri(videoFile.uri, videoFile.mimeType),
  ]),
});
console.log(countTokensResponse.totalTokens);

const generateResponse = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: createUserContent([
    prompt,
    createPartFromUri(videoFile.uri, videoFile.mimeType),
  ]),
});
console.log(generateResponse.usageMetadata);

คำแนะนำและเครื่องมือของระบบ

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

หากคุณใช้วิธีการของระบบ จํานวน totalTokens จะเพิ่มขึ้นเพื่อแสดงถึงการเพิ่ม systemInstruction

หากคุณใช้การเรียกใช้ฟังก์ชัน จํานวน totalTokens จะเพิ่มขึ้นเพื่อแสดงการเพิ่ม tools