Tìm hiểu thông tin cơ bản trên Google Tìm kiếm

Tính năng Liên kết với Google Tìm kiếm kết nối mô hình Gemini với nội dung web theo thời gian thực và hoạt động với tất cả ngôn ngữ hiện có. Nhờ đó, Gemini có thể đưa ra câu trả lời chính xác hơn và trích dẫn các nguồn có thể xác minh ngoài phạm vi kiến thức của mình.

Tính năng liên kết giúp bạn xây dựng các ứng dụng có thể:

  • Tăng độ chính xác về mặt thực tế: Giảm hiện tượng ảo giác của mô hình bằng cách dựa vào thông tin thực tế để đưa ra câu trả lời.
  • Truy cập thông tin theo thời gian thực: Giải đáp thắc mắc về các sự kiện và chủ đề gần đây.
  • Cung cấp trích dẫn: Tạo dựng niềm tin của người dùng bằng cách cho thấy nguồn của các tuyên bố của mô hình.

Python

from google import genai
from google.genai import types

# Configure the client
client = genai.Client()

# Define the grounding tool
grounding_tool = types.Tool(
    google_search=types.GoogleSearch()
)

# Configure generation settings
config = types.GenerateContentConfig(
    tools=[grounding_tool]
)

# Make the request
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Who won the euro 2024?",
    config=config,
)

# Print the grounded response
print(response.text)

JavaScript

import { GoogleGenAI } from "@google/genai";

// Configure the client
const ai = new GoogleGenAI({});

// Define the grounding tool
const groundingTool = {
  googleSearch: {},
};

// Configure generation settings
const config = {
  tools: [groundingTool],
};

// Make the request
const response = await ai.models.generateContent({
  model: "gemini-2.5-flash",
  contents: "Who won the euro 2024?",
  config,
});

// Print the grounded response
console.log(response.text);

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "contents": [
      {
        "parts": [
          {"text": "Who won the euro 2024?"}
        ]
      }
    ],
    "tools": [
      {
        "google_search": {}
      }
    ]
  }'

Bạn có thể tìm hiểu thêm bằng cách thử sổ tay Công cụ tìm kiếm.

Cách hoạt động của tính năng làm dịu tâm trạng bằng Google Tìm kiếm

Khi bạn bật công cụ google_search, mô hình sẽ tự động xử lý toàn bộ quy trình tìm kiếm, xử lý và trích dẫn thông tin.

grounding-overview

  1. Lời nhắc của người dùng: Ứng dụng của bạn gửi lời nhắc của người dùng đến Gemini API khi bật công cụ google_search.
  2. Phân tích câu lệnh: Mô hình phân tích câu lệnh và xác định xem Google Tìm kiếm có thể cải thiện câu trả lời hay không.
  3. Google Tìm kiếm: Nếu cần, mô hình sẽ tự động tạo một hoặc nhiều cụm từ tìm kiếm và thực thi các cụm từ đó.
  4. Xử lý kết quả tìm kiếm: Mô hình xử lý kết quả tìm kiếm, tổng hợp thông tin và xây dựng phản hồi.
  5. Phản hồi dựa trên kết quả tìm kiếm: API trả về một phản hồi cuối cùng, thân thiện với người dùng dựa trên kết quả tìm kiếm. Phản hồi này bao gồm câu trả lời dạng văn bản của mô hình và groundingMetadata với các cụm từ tìm kiếm, kết quả trên web và trích dẫn.

Tìm hiểu về phản hồi nối đất

Khi một phản hồi được căn chỉnh thành công, phản hồi đó sẽ bao gồm trường groundingMetadata. Dữ liệu có cấu trúc này rất cần thiết để xác minh các tuyên bố và tạo trải nghiệm trích dẫn phong phú trong ứng dụng của bạn.

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Spain won Euro 2024, defeating England 2-1 in the final. This victory marks Spain's record fourth European Championship title."
          }
        ],
        "role": "model"
      },
      "groundingMetadata": {
        "webSearchQueries": [
          "UEFA Euro 2024 winner",
          "who won euro 2024"
        ],
        "searchEntryPoint": {
          "renderedContent": "<!-- HTML and CSS for the search widget -->"
        },
        "groundingChunks": [
          {"web": {"uri": "https://vertexaisearch.cloud.google.com.....", "title": "aljazeera.com"}},
          {"web": {"uri": "https://vertexaisearch.cloud.google.com.....", "title": "uefa.com"}}
        ],
        "groundingSupports": [
          {
            "segment": {"startIndex": 0, "endIndex": 85, "text": "Spain won Euro 2024, defeatin..."},
            "groundingChunkIndices": [0]
          },
          {
            "segment": {"startIndex": 86, "endIndex": 210, "text": "This victory marks Spain's..."},
            "groundingChunkIndices": [0, 1]
          }
        ]
      }
    }
  ]
}

Gemini API trả về thông tin sau đây bằng groundingMetadata:

  • webSearchQueries : Mảng các cụm từ tìm kiếm được sử dụng. Điều này hữu ích cho việc gỡ lỗi và hiểu rõ quá trình suy luận của mô hình.
  • searchEntryPoint : Chứa HTML và CSS để hiển thị các Gợi ý tìm kiếm bắt buộc. Bạn có thể xem toàn bộ yêu cầu về việc sử dụng trong Điều khoản dịch vụ.
  • groundingChunks : Mảng các đối tượng chứa nguồn web (urititle).
  • groundingSupports : Mảng các đoạn để kết nối phản hồi của mô hình text với các nguồn trong groundingChunks. Mỗi đoạn liên kết một văn bản segment (do startIndexendIndex xác định) với một hoặc nhiều groundingChunkIndices. Đây là yếu tố chính để tạo trích dẫn cùng dòng.

Bạn cũng có thể sử dụng tính năng căn cứ vào Google Tìm kiếm kết hợp với công cụ ngữ cảnh URL để căn cứ câu trả lời vào cả dữ liệu công khai trên web và các URL cụ thể mà bạn cung cấp.

Phân bổ nguồn bằng trích dẫn cùng dòng

API này trả về dữ liệu trích dẫn có cấu trúc, cho phép bạn kiểm soát hoàn toàn cách hiển thị nguồn trong giao diện người dùng. Bạn có thể sử dụng các trường groundingSupportsgroundingChunks để liên kết trực tiếp các câu lệnh của mô hình với nguồn của các câu lệnh đó. Dưới đây là một mẫu phổ biến để xử lý siêu dữ liệu nhằm tạo một câu trả lời có các trích dẫn cùng dòng, có thể nhấp vào.

Python

def add_citations(response):
    text = response.text
    supports = response.candidates[0].grounding_metadata.grounding_supports
    chunks = response.candidates[0].grounding_metadata.grounding_chunks

    # Sort supports by end_index in descending order to avoid shifting issues when inserting.
    sorted_supports = sorted(supports, key=lambda s: s.segment.end_index, reverse=True)

    for support in sorted_supports:
        end_index = support.segment.end_index
        if support.grounding_chunk_indices:
            # Create citation string like [1](link1)[2](link2)
            citation_links = []
            for i in support.grounding_chunk_indices:
                if i < len(chunks):
                    uri = chunks[i].web.uri
                    citation_links.append(f"[{i + 1}]({uri})")

            citation_string = ", ".join(citation_links)
            text = text[:end_index] + citation_string + text[end_index:]

    return text

# Assuming response with grounding metadata
text_with_citations = add_citations(response)
print(text_with_citations)

JavaScript

function addCitations(response) {
    let text = response.text;
    const supports = response.candidates[0]?.groundingMetadata?.groundingSupports;
    const chunks = response.candidates[0]?.groundingMetadata?.groundingChunks;

    // Sort supports by end_index in descending order to avoid shifting issues when inserting.
    const sortedSupports = [...supports].sort(
        (a, b) => (b.segment?.endIndex ?? 0) - (a.segment?.endIndex ?? 0),
    );

    for (const support of sortedSupports) {
        const endIndex = support.segment?.endIndex;
        if (endIndex === undefined || !support.groundingChunkIndices?.length) {
        continue;
        }

        const citationLinks = support.groundingChunkIndices
        .map(i => {
            const uri = chunks[i]?.web?.uri;
            if (uri) {
            return `[${i + 1}](${uri})`;
            }
            return null;
        })
        .filter(Boolean);

        if (citationLinks.length > 0) {
        const citationString = citationLinks.join(", ");
        text = text.slice(0, endIndex) + citationString + text.slice(endIndex);
        }
    }

    return text;
}

const textWithCitations = addCitations(response);
console.log(textWithCitations);

Nội dung phản hồi mới có trích dẫn nội tuyến sẽ có dạng như sau:

Spain won Euro 2024, defeating England 2-1 in the final.[1](https:/...), [2](https:/...), [4](https:/...), [5](https:/...) This victory marks Spain's record-breaking fourth European Championship title.[5]((https:/...), [2](https:/...), [3](https:/...), [4](https:/...)

Giá

Khi bạn sử dụng Grounding với Google Tìm kiếm, dự án của bạn sẽ được tính phí theo yêu cầu API bao gồm công cụ google_search. Nếu mô hình quyết định thực thi nhiều cụm từ tìm kiếm để trả lời một câu lệnh (ví dụ: tìm kiếm "UEFA Euro 2024 winner""Spain vs England Euro 2024 final score" trong cùng một lệnh gọi API), thì đây được tính là một lần sử dụng công cụ có tính phí cho yêu cầu đó.

Để biết thông tin chi tiết về giá, hãy xem trang giá của Gemini API.

Mô hình được hỗ trợ

Không bao gồm các mô hình Thử nghiệm và Xem trước. Bạn có thể tìm thấy các tính năng của chúng trên trang tổng quan về mô hình.

Mô hình Tìm thông tin cơ bản trên Google Tìm kiếm
Gemini 2.5 Pro ✔️
Gemini 2.5 Flash ✔️
Gemini 2.0 Flash ✔️
Gemini 1.5 Pro ✔️
Gemini 1.5 Flash ✔️

Kết nối với các mô hình Gemini 1.5 (Cũ)

Mặc dù bạn nên dùng công cụ google_search cho Gemini 2.0 trở lên, nhưng Gemini 1.5 hỗ trợ một công cụ cũ có tên là google_search_retrieval. Công cụ này cung cấp chế độ dynamic cho phép mô hình quyết định có thực hiện tìm kiếm hay không dựa trên độ tin cậy của mô hình rằng câu lệnh cần thông tin mới. Nếu độ tin cậy của mô hình cao hơn dynamic_threshold mà bạn đặt (giá trị trong khoảng từ 0 đến 1), thì mô hình sẽ thực hiện tìm kiếm.

Python

# Note: This is a legacy approach for Gemini 1.5 models.
# The 'google_search' tool is recommended for all new development.
import os
from google import genai
from google.genai import types

client = genai.Client()

retrieval_tool = types.Tool(
    google_search_retrieval=types.GoogleSearchRetrieval(
        dynamic_retrieval_config=types.DynamicRetrievalConfig(
            mode=types.DynamicRetrievalConfigMode.MODE_DYNAMIC,
            dynamic_threshold=0.7 # Only search if confidence > 70%
        )
    )
)

config = types.GenerateContentConfig(
    tools=[retrieval_tool]
)

response = client.models.generate_content(
    model='gemini-1.5-flash',
    contents="Who won the euro 2024?",
    config=config,
)
print(response.text)
if not response.candidates[0].grounding_metadata:
  print("\nModel answered from its own knowledge.")

JavaScript

// Note: This is a legacy approach for Gemini 1.5 models.
// The 'googleSearch' tool is recommended for all new development.
import { GoogleGenAI, DynamicRetrievalConfigMode } from "@google/genai";

const ai = new GoogleGenAI({});

const retrievalTool = {
  googleSearchRetrieval: {
    dynamicRetrievalConfig: {
      mode: DynamicRetrievalConfigMode.MODE_DYNAMIC,
      dynamicThreshold: 0.7, // Only search if confidence > 70%
    },
  },
};

const config = {
  tools: [retrievalTool],
};

const response = await ai.models.generateContent({
  model: "gemini-1.5-flash",
  contents: "Who won the euro 2024?",
  config,
});

console.log(response.text);
if (!response.candidates?.[0]?.groundingMetadata) {
  console.log("\nModel answered from its own knowledge.");
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \

  -H "Content-Type: application/json" \
  -X POST \
  -d '{
    "contents": [
      {"parts": [{"text": "Who won the euro 2024?"}]}
    ],
    "tools": [{
      "google_search_retrieval": {
        "dynamic_retrieval_config": {
          "mode": "MODE_DYNAMIC",
          "dynamic_threshold": 0.7
        }
      }
    }]
  }'

Bước tiếp theo