Không cần KYC — không giấy tờ tùy thân, không selfie, không tài liệu. Thanh toán bằng crypto: BTC, USDT, USDC, ETH, SOL, LTC
Ngôn ngữ: Tiếng Việt
Lấy khóa API

Tài liệu · Function calling · Tool use · Python

OpenAI function calling: một công cụ tìm kiếm Google trong 60 dòng Python

Mô tả một hàm google_search cho mô hình, chạy các tìm kiếm nó yêu cầu, gửi kết quả trở lại. Schema là JSON Schema thuần, nên nó chuyển sang Claude và các mô hình gọi công cụ khác.

Cập nhật lần cuối: · 5 phút đọc

Trả lời nhanh

Làm thế nào để cung cấp cho một mô hình OpenAI một công cụ tìm kiếm web?

Khai báo một hàm google_search với JSON Schema trong tools, sau đó lặp: khi mô hình trả về tool_calls, chạy từng tìm kiếm trên https://serpcrypto.com/api/v1/search và thêm kết quả dưới dạng các thông điệp tool cho đến khi nó trả lời. SerpCrypto tính 1 credit cho mỗi tìm kiếm thành công, từ 0,30 US$/1K lượt tìm kiếm, thanh toán bằng crypto không cần KYC.

Schema của công cụ trông như thế nào?

Một function tool có tên, mô tả và các tham số trong JSON Schema. Mô hình chỉ thấy ba thứ này, nên phần mô tả phải nói rõ công cụ trả về gì và khi nào dùng nó. Chỉ query là bắt buộc; country và language là tùy chọn và mặc định là US English trong mã.

Định nghĩa công cụ (định dạng Chat Completions)
{
  "type": "function",
  "function": {
    "name": "google_search",
    "description": "Search Google for current information. Returns the top results with title, link and snippet. Use it for facts newer than your training data.",
    "parameters": {
      "type": "object",
      "properties": {
        "query": { "type": "string", "description": "The search query, as a person would type it." },
        "gl": { "type": "string", "description": "Two-letter country code of the results, e.g. us, gb, de." },
        "hl": { "type": "string", "description": "Language code, e.g. en, de, pt-BR." }
      },
      "required": ["query"]
    }
  }
}

Vòng lặp gọi công cụ hoạt động như thế nào?

Gửi câu hỏi cùng tools. Nếu phản hồi chứa tool_calls, hãy chạy từng cái, thêm tin nhắn của assistant và một tin nhắn tool cho mỗi lần gọi với tool_call_id tương ứng, rồi gọi model lại. Khi một phản hồi không có lời gọi công cụ nào, đó là câu trả lời cuối cùng.

Vòng lặp dưới đây dừng sau ba lần tìm kiếm. Giới hạn này bảo vệ số dư của bạn nếu model cứ tìm mãi, và ba lần tìm kiếm trả lời được phần lớn câu hỏi về dữ kiện.

search_agent.py
"""Tool-calling loop: the model asks for searches, this code runs them on SerpCrypto."""
import json
import os

import requests
from openai import OpenAI

client = OpenAI()  # reads OPENAI_API_KEY
MODEL = os.environ["OPENAI_MODEL"]  # any OpenAI chat model with tool calling
API_URL = "https://serpcrypto.com/api/v1/search"

TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "google_search",
            "description": "Search Google for current information. Returns the top results with title, link and snippet.",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {"type": "string", "description": "The search query."},
                    "gl": {"type": "string", "description": "Two-letter country code, e.g. us."},
                    "hl": {"type": "string", "description": "Language code, e.g. en."},
                },
                "required": ["query"],
            },
        },
    }
]


def google_search(query, gl="us", hl="en"):
    r = requests.get(
        API_URL,
        params={"q": query, "gl": gl, "hl": hl},
        headers={"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]},
        timeout=90,
    )
    if r.status_code != 200:
        return f"Search failed with HTTP {r.status_code}."
    items = r.json().get("organic_results", [])[:5]
    return "\n\n".join(f"{x['title']}\n{x['link']}\n{x.get('snippet', '')}" for x in items) or "No results."


def ask(question, max_searches=3):
    messages = [{"role": "user", "content": question}]
    for _ in range(max_searches + 1):
        reply = client.chat.completions.create(model=MODEL, messages=messages, tools=TOOLS)
        msg = reply.choices[0].message
        if not msg.tool_calls:
            return msg.content
        messages.append(msg)
        for call in msg.tool_calls:
            args = json.loads(call.function.arguments)
            messages.append({"role": "tool", "tool_call_id": call.id, "content": google_search(**args)})
    return "Stopped: search limit reached."


print(ask("Which countries changed their data protection laws in 2026? Cite sources."))

Cùng một schema có dùng được với Claude và các model khác không?

Có, với một lớp wrapper khác. Tool use của Claude nhận cùng JSON Schema đó dưới input_schema, bên cạnh name và description. Hầu hết các API gọi công cụ khác cũng nhận JSON Schema cho tham số; chỉ tên các trường bên ngoài là thay đổi. Bản thân hàm tìm kiếm vẫn giữ nguyên, vì nó chỉ gọi endpoint SerpCrypto.

Cùng một công cụ cho Claude (Messages API)
{
  "name": "google_search",
  "description": "Search Google for current information. Returns the top results with title, link and snippet.",
  "input_schema": {
    "type": "object",
    "properties": {
      "query": { "type": "string", "description": "The search query." },
      "gl": { "type": "string", "description": "Two-letter country code, e.g. us." },
      "hl": { "type": "string", "description": "Language code, e.g. en." }
    },
    "required": ["query"]
  }
}

Công cụ nên trả về gì cho model?

Văn bản ngắn kèm liên kết. Năm kết quả với tiêu đề, liên kết và snippet thường đủ để model trả lời và trích dẫn. Trả về toàn bộ JSON vẫn chạy được nhưng tốn nhiều token hơn và cho model nhiều nhiễu hơn để đọc.

Thêm văn bản AI Overview khi có nếu bạn muốn model thấy tóm tắt của chính Google, và giữ các liên kết nguồn để câu trả lời có thể trích dẫn trang thay vì phần tổng quan.

Làm sao giữ chi phí tìm kiếm dễ dự đoán?

Đếm số lần gọi công cụ: mỗi lần gọi thành công là một credit. Đặt giới hạn số lần tìm kiếm cho mỗi câu hỏi, như vòng lặp làm, và ghi log mỗi lần gọi cùng truy vấn của nó để bạn thấy model hỏi gì. Trên gói 100.000 tìm kiếm mức giá là 0,56 US$/1K lượt tìm kiếm, và Credit tìm kiếm trả trước không bao giờ hết hạn: các lượt tìm kiếm chưa dùng vẫn nằm trong tài khoản của bạn cho đến khi bạn dùng.

Lỗi không tốn gì: 1 credit = 1 truy vấn tìm kiếm thành công, trả về một trang kết quả trên bất kỳ engine nào được hỗ trợ. Truy vấn thất bại không bị tính phí.

Câu hỏi về function calling

Tôi có thể dùng Responses API thay cho Chat Completions không?

Có. Responses API nhận function tool với cùng JSON Schema, với name, description và parameters ở cấp cao nhất của mỗi công cụ. Hàm tìm kiếm và ý tưởng về vòng lặp không thay đổi.

Tại sao không dùng công cụ tìm kiếm web tích hợp của nhà cung cấp model?

Các công cụ tìm kiếm tích hợp tự chọn nguồn và cài đặt của riêng chúng. Một function trên SerpCrypto cho bạn kết quả tìm kiếm Google theo quốc gia và ngôn ngữ bạn chọn, dưới dạng JSON bạn có thể ghi log, với mức giá mỗi lần tìm kiếm đã biết.

Model có thể chọn quốc gia không?

Có. gl là một tham số của công cụ, nên model có thể đặt nó từ câu hỏi, ví dụ gb cho một câu hỏi về Vương quốc Anh. Hãy giữ một giá trị mặc định trong mã của bạn cho các câu hỏi không nêu quốc gia.

Tôi có cần thẻ tín dụng để lấy khóa API tìm kiếm không?

Không. Credit SerpCrypto được thanh toán bằng BTC, USDT, USDC, ETH, SOL, LTC, không ID, không selfie và không giấy tờ. Đăng nhập bằng số tài khoản; email là tùy chọn.

Từ 0,30 US$/1K lượt tìm kiếm · không cần KYC

Lấy khóa API