Cách tương tác với API bằng lệnh gọi hàm trong Gemini

1. Tổng quan

Chức năng gọi trong Gemini là gì?

Gemini API trong Vertex AI là một nhóm mô hình AI tạo sinh do Google DeepMind phát triển, được thiết kế cho các trường hợp sử dụng đa phương thức. Gọi hàm là một tính năng của các mô hình Gemini giúp nhà phát triển dễ dàng nhận dữ liệu có cấu trúc đầu ra từ các mô hình tạo sinh.

Sau đó, nhà phát triển có thể sử dụng những dữ liệu đầu ra này để gọi các API khác và trả về dữ liệu phản hồi có liên quan cho mô hình. Nói cách khác, lệnh gọi hàm giúp bạn kết nối các mô hình tạo sinh với các hệ thống bên ngoài. Nhờ đó, nội dung được tạo có chứa thông tin chính xác và mới nhất.

Cách hoạt động của lệnh gọi hàm

Hàm được mô tả bằng cách sử dụng nội dung khai báo hàm, giúp mô hình tạo sinh hiểu được mục đích và tham số trong một hàm. Sau khi bạn truyền phần khai báo hàm trong truy vấn đến mô hình tạo sinh, mô hình sẽ trả về một đối tượng có cấu trúc bao gồm tên của các hàm có liên quan và đối số của các hàm đó dựa trên truy vấn của người dùng. Lưu ý rằng khi gọi hàm, mô hình sẽ không thực sự gọi hàm này. Thay vào đó, bạn có thể sử dụng hàm và tham số được trả về để gọi hàm này bằng bất kỳ ngôn ngữ, thư viện hoặc khung nào bạn muốn!

Giao diện API

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ xây dựng một quy trình AI tạo sinh bằng Vertex AI Gemini API và Python. Khi dùng ứng dụng của bạn, người dùng có thể hỏi về tỷ giá hối đoái. Hệ thống sẽ tìm nạp dữ liệu mới nhất từ một API bên ngoài và trả lời người dùng.

Kiến thức bạn sẽ học được

  • Cách tương tác với mô hình Gemini bằng thư viện ứng dụng Python
  • Cách xác định nội dung khai báo hàm và đăng ký nội dung đó làm công cụ
  • Cách gọi cho Gemini và nhận phản hồi cho một cuộc gọi chức năng
  • Cách trả về phản hồi của hàm cho Gemini và phản hồi người dùng

Bạn cần có

  • Một dự án trong Google Cloud
  • Một trình duyệt như Chrome
  • Môi trường phát triển Python như Colab hoặc Colab Enterprise

2. Thiết lập và yêu cầu

Để có thể bắt đầu sử dụng tính năng gọi hàm trong Gemini, bạn cần bật Vertex AI API và cài đặt phiên bản mới nhất của thư viện ứng dụng Vertex AI Python.

Bật Vertex AI API

Để bật Vertex AI API, hãy làm theo các bước sau:

  1. Trong trình duyệt, hãy chuyển đến trang Chi tiết dịch vụ API Vertex AI.
  2. Nhấp vào nút Enable (Bật) để bật Vertex AI API trong dự án của bạn trên Google Cloud.

Cài đặt thư viện ứng dụng Python cho Vertex AI

Để cài đặt các thư viện ứng dụng Python cho Vertex AI, hãy làm theo các bước sau:

  1. Mở cửa sổ dòng lệnh trong môi trường phát triển.
  2. Xác minh rằng bạn có môi trường phát triển Python hợp lệ và tham khảo các nguyên tắc này nếu cần.
  3. Chạy lệnh sau để cài đặt thư viện ứng dụng Python cho Vertex AI:
    pip install --upgrade google-cloud-aiplatform
    
  4. Nếu đang chạy trong một môi trường sổ tay, thì bạn có thể cần phải khởi động lại thời gian chạy/hạt nhân để sử dụng các gói mới cài đặt.

Giờ đây, bạn đã có thể sử dụng Vertex AI API!

3. Tìm hiểu vấn đề

Bạn đã bao giờ tương tác với một mô hình ngôn ngữ lớn hoặc mô hình AI tạo sinh và hỏi về thông tin theo thời gian thực hoặc thông tin hiện tại rồi chỉ nhận được câu trả lời chứa thông tin lỗi thời hoặc thông tin không chính xác chưa?

Hãy thử ngay! Trước tiên, chúng ta sẽ nhập các gói Python có liên quan và khởi chạy mô hình Gemini. Bạn có thể chạy mã sau trong môi trường phát triển Python như Colab hoặc Colab Enterprise và bằng cách cài đặt phiên bản mới nhất của SDK Vertex AI cho Python:

import vertexai
from vertexai.generative_models import GenerativeModel
model = GenerativeModel("gemini-1.5-pro-001")

Bây giờ, hãy cùng đặt câu hỏi về tỷ giá hối đoái cho các đơn vị tiền tệ khác nhau hôm nay:

response = model.generate_content(
    "What's the exchange rate for euros to dollars today?"
)
print(response.text)

Mô hình đó sẽ tạo ra một câu trả lời hạn chế hoặc lỗi thời cho bạn, tương tự như sau:

As an AI language model, I don't have access to real-time currency exchange
rates. However, as of my last update in September 2021, the approximate exchange
rate between euros (EUR) and US dollars (USD) was:

1 EUR ≈ 1.18 USD

Please note that currency exchange rates constantly fluctuate and can vary
depending on various factors such as economic conditions, supply and demand,
political events, and more. To obtain the most up-to-date and accurate exchange
rate, I recommend using a reliable currency converter or financial website that
provides live rates.

[...]

Nếu nhận được loại phản hồi này, người dùng cuối sẽ cần chuyển đổi ngữ cảnh để tra cứu đơn vị tiền tệ mà họ quan tâm, tìm nạp tỷ giá hối đoái mới nhất và tự thực hiện mọi lượt chuyển đổi.

Tốt nhất là một quy trình mô hình tạo sinh có thể xử lý một số hoặc tất cả những nhiệm vụ này cho người dùng. Trong phần tiếp theo, bạn sẽ thử một số giải pháp phổ biến để nhận phản hồi có cấu trúc từ các mô hình tạo sinh. Nhờ đó, bạn có thể gọi các hệ thống bên ngoài.

4. Thử các giải pháp phổ biến

Khi làm việc với các mô hình tạo sinh trong những tình huống mà bạn cần thông tin hoặc dữ liệu mới nhất từ các nguồn bên ngoài, bạn có thể gọi một API bên ngoài, sau đó đưa kết quả trở lại mô hình tạo sinh để mô hình đó dùng trong quá trình phản hồi.

Trước khi gọi một hệ thống bên ngoài, bạn cần xác định hàm phù hợp để sử dụng, trích xuất các tham số có liên quan từ người dùng và đặt các tham số đó vào một đối tượng dữ liệu có cấu trúc. Quá trình này thường bao gồm kỹ thuật soạn câu lệnh đầy đủ để ép buộc mô hình tạo sinh xuất ra dữ liệu có cấu trúc hợp lệ.

Hãy xem lại câu hỏi chúng ta đã hỏi trong phần trước và thêm một số hướng dẫn bổ sung cho mô hình. Hãy thử gửi yêu cầu sau đến mô hình Gemini:

user_prompt = "What's the exchange rate from euros to US dollars today?"

response = model.generate_content("""
Your task is to extract parameters from the user's input and return it as a
structured JSON payload. The user will ask about the exchange rate and which
currency they are converting from and converting to.

User input: {user_prompt}

Please extract the currencies as parameters and put them in a JSON object.
""".format(user_prompt=user_prompt))
print(response.text)

Kết quả này là phản hồi văn bản sau, không phải là JSON hợp lệ và sẽ khó đối với chúng ta khi xử lý:

```json
{
  "currency_from": "euros",
  "currency_to": "US dollars"
}
```

Cụ thể, dòng đầu tiên và cuối cùng của phản hồi bằng văn bản có dấu phẩy ngược để phân định khối mã, dòng đầu tiên bao gồm thông số xác định ngôn ngữ và các giá trị trong đối tượng JSON không phải là chữ viết tắt tiêu chuẩn gồm 3 chữ cái mà API trao đổi tiền tệ sẽ sử dụng làm tham số đầu vào.

Chúng ta có thể thử sử dụng Python để xử lý hậu kỳ văn bản này thành JSON hợp lệ và một từ điển, thêm hướng dẫn khác vào câu lệnh, cung cấp một hoặc nhiều ví dụ về kết quả mong muốn, tinh chỉnh mô hình hoặc thực hiện một lệnh gọi khác đến mô hình tạo sinh để yêu cầu dọn dẹp JSON.

Tuy nhiên, vẫn có một cách mang tính quyết định hơn! Hãy tìm hiểu cách sử dụng chức năng gọi hàm trong Gemini để truy vấn thông tin trong các dịch vụ bên ngoài và trả về câu trả lời phù hợp cho người dùng cuối.

5. Cách hoạt động của lệnh gọi hàm

Trước khi bắt đầu trích xuất tham số và gọi hàm, hãy cùng tìm hiểu các bước gọi hàm và những thành phần nào được sử dụng trong thời gian chạy.

Tổng quan về chức năng gọi điện trên Gemini

Dữ liệu do người dùng nhập vào Gemini API

Câu lệnh của người dùng sẽ được gửi đến Gemini API. Trong lệnh gọi API đó đến mô hình Gemini, nhà phát triển đã xác định một hoặc nhiều nội dung khai báo hàm trong một công cụ để mô hình Gemini biết được những hàm có thể gọi và cách gọi các hàm đó.

Gemini API trả về một Lệnh gọi hàm

Dựa vào nội dung nhập và câu lệnh của người dùng, Gemini sẽ trả về câu trả lời cho Lệnh gọi hàm bằng dữ liệu có cấu trúc, bao gồm tên hàm cần gọi và các tham số tương ứng để sử dụng.

Tạo yêu cầu API

Sau đó, bạn sẽ dùng tên hàm và tham số để tạo yêu cầu API nhằm truy xuất thông tin từ API hoặc hệ thống bên ngoài. Yêu cầu và phản hồi này của API được nhà phát triển triển khai trong mã xử lý ứng dụng và diễn ra bên ngoài phạm vi SDK và Gemini API. Ví dụ: bạn có thể sử dụng thư viện requests trong Python để gọi API REST và nhận phản hồi JSON. Hoặc bạn có thể gọi hàm này bằng cách sử dụng phương pháp ưu tiên và thư viện ứng dụng.

Trả về phản hồi của API cho Gemini

Cuối cùng, bạn sẽ chuyển phản hồi của API về mô hình Gemini để mô hình Gemini có thể tạo câu trả lời cho câu lệnh ban đầu của người dùng cuối hoặc gọi một phản hồi khác cho Lệnh gọi hàm nếu mô hình Gemini xác định rằng cần thêm thông tin.

6. Chọn API của bạn

Giờ đây, khi đã nắm được quy trình tổng thể và các bước cụ thể trong lệnh gọi hàm, bạn sẽ xây dựng một quy trình AI tạo sinh để tìm nạp tỷ giá hối đoái mới nhất. Trước tiên, chúng ta cần chọn API mà chúng ta muốn sử dụng làm nguồn thông tin.

Đối với ứng dụng đổi tiền, chúng tôi sẽ sử dụng API REST tại https://www.frankfurter.app/ để tìm nạp thông tin mới nhất về tỷ giá hối đoái toàn cầu.

Để tương tác với API REST này, chúng ta có thể thực hiện lệnh gọi API REST bằng requests trong Python như sau:

import requests
url = "https://api.frankfurter.app/latest"
response = requests.get(url)
response.text

hoặc một yêu cầu cURL, chẳng hạn như:

curl https://api.frankfurter.app/latest

Thao tác này sẽ trả về phản hồi tương tự như:

{
  "amount": 1,
  "base": "EUR",
  "date": "2023-12-20",
  "rates": {
    "AUD": 1.6186, "BGN": 1.9558, "BRL": 5.3287,
    "CAD": 1.4609, "CHF": 0.946, "CNY": 7.8121,
    "CZK": 24.538, "DKK": 7.4565, "GBP": 0.86555,
    "HKD": 8.5439, "HUF": 385.23, "IDR": 16994,
    "ILS": 3.9983, "INR": 91.06, "ISK": 150.3,
    "JPY": 157.12, "KRW": 1425.62, "MXN": 18.6867,
    "MYR": 5.0977, "NOK": 11.2895, "NZD": 1.7421,
    "PHP": 60.991, "PLN": 4.3413, "RON": 4.9699,
    "SEK": 11.129, "SGD": 1.4562, "THB": 38.252,
    "TRY": 31.883, "USD": 1.0944, "ZAR": 20.111
  }
}

Vì việc gọi hàm trên Gemini không thực sự thực hiện lệnh gọi API bên ngoài cho bạn, nên không có quy định hạn chế nào như vậy đối với loại API bạn sử dụng! Bạn có thể sử dụng một Dịch vụ Cloud Run, một Hàm đám mây, một yêu cầu API cho một dịch vụ của Google Cloud hoặc bất kỳ API REST nào bên ngoài.

7. Xác định hàm và công cụ

Giờ đây, bạn đã chọn API REST để sử dụng, giờ đây, chúng ta có thể xác định thông số kỹ thuật của API và đăng ký hàm này trong một công cụ.

Đảm bảo rằng bạn đã cài đặt phiên bản mới nhất của Vertex AI SDK dành cho Python.

Sau đó, hãy nhập các mô-đun cần thiết từ SDK Python và khởi chạy mô hình Gemini:

from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerativeModel,
    Part,
    Tool,
)

model = GenerativeModel("gemini-1.5-pro-001")

Xem lại API REST tại https://api.frankfurter.app/, chúng ta có thể thấy API này chấp nhận các tham số đầu vào sau:

Thông số

Loại

Mô tả

from

Chuỗi

Đơn vị tiền tệ cần chuyển đổi

to

Chuỗi

Đơn vị tiền tệ cần chuyển đổi sang

date

Chuỗi

Ngày tìm nạp tỷ giá hối đoái

Bằng cách sử dụng các tham số này, quy cách một phần OpenAPI cho API REST này ở định dạng YAML sẽ có dạng như sau:

openapi: 3.0.0
info:
  title: Frankfurter Exchange Rate API
  description: This API provides current and historical exchange rates
  version: 1.0.0
servers:
  - url: https://api.frankfurter.app
paths:
  /{date}:
    get:
      summary: Get the latest currency exchange rates.
      parameters:
        - name: date
          in: path
          description: Get currency rates for a specific date or 'latest' if a date is not specified
          required: true
          schema:
            type: string
        - name: from
          in: query
          description: The currency to convert from.
          required: true
          schema:
            type: string
        - name: to
          in: query
          description: The currency to convert to.
          schema:
            type: string

Bây giờ, hãy đăng ký tài khoản này là FunctionDeclaration bằng SDK Python cho Gemini:

get_exchange_rate_func = FunctionDeclaration(
    name="get_exchange_rate",
    description="Get the exchange rate for currencies between countries",
    parameters={
    "type": "object",
    "properties": {
        "currency_date": {
            "type": "string",
            "description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
        },
        "currency_from": {
            "type": "string",
            "description": "The currency to convert from in ISO 4217 format"
        },
        "currency_to": {
            "type": "string",
            "description": "The currency to convert to in ISO 4217 format"
        }
    },
         "required": [
            "currency_from",
            "currency_date",
      ]
  },
)

Hãy nhớ mô tả hàm và tham số càng chi tiết càng tốt, vì mô hình tạo sinh sẽ sử dụng thông tin này để xác định hàm cần chọn và cách điền các tham số trong lệnh gọi hàm.

Cuối cùng, bạn cần xác định Tool bao gồm phần khai báo hàm:

exchange_rate_tool = Tool(
    function_declarations=[get_exchange_rate_func],
)

Ở đây, bạn đang sử dụng một nội dung khai báo hàm trong một công cụ, nhưng xin lưu ý rằng bạn có thể đăng ký một hoặc nhiều nội dung khai báo hàm trong một công cụ, và mô hình này sẽ chọn hàm phù hợp để dùng trong thời gian chạy. Tham khảo tài liệu về Gọi hàm trong Gemini API để biết thêm thông tin về FunctionDeclaration, Tool và các lớp có liên quan trong Gemini SDK cho Python.

Bạn đã hoàn tất việc định cấu hình các định nghĩa hàm và công cụ. Trong phần tiếp theo, chúng ta sẽ gọi mô hình tạo sinh bằng công cụ này và lấy lại một lệnh gọi hàm có thể dùng để gọi API REST.

8. Tạo lệnh gọi hàm

Bây giờ, bạn có thể nhắc mô hình tạo sinh và thêm tool mà bạn đã định nghĩa:

prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""

response = model.generate_content(
    prompt,
    tools=[exchange_rate_tool],
)

Hãy cùng xem đối tượng phản hồi:

print(response.candidates[0].content)

role: "model"
parts {
  function_call {
    name: "get_exchange_rate"
    args {
      fields {
        key: "currency_to"
        value {
          string_value: "SEK"
        }
      }
      fields {
        key: "currency_from"
        value {
          string_value: "AUD"
        }
      }
      fields {
        key: "currency_date"
        value {
          string_value: "latest"
        }
      }
    }
  }
}

Có vẻ như mô hình đã chọn một hàm có sẵn và trả về một lệnh gọi hàm cho hàm get_exchange_rate cùng với các tham số. Các tham số có định dạng đúng mà chúng ta muốn. Thật tuyệt vì bạn đã nhận được câu trả lời có cấu trúc từ các mô hình tạo sinh!

Ở phần tiếp theo, bạn sẽ sử dụng thông tin trong phản hồi để tạo yêu cầu API.

9. Tạo yêu cầu API

Hãy nhớ rằng việc gọi hàm trong Gemini không thực sự thực hiện lệnh gọi API bên ngoài thay cho bạn. Thay vào đó, bạn có thể thoải mái sử dụng bất kỳ ngôn ngữ, thư viện hoặc khung nào tuỳ thích!

Tại đây, bạn sẽ dùng thư viện requests trong Python để gọi API REST của tỷ giá hối đoái.

Hãy giải nén phản hồi vào từ điển Python:

params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
    params[key[9:]] = value
params

Bây giờ, chúng ta có thể gọi requests hoặc bất kỳ phương thức nào khác:

import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text

Kết quả nào dẫn đến câu trả lời tương tự như:

'{"amount":1.0,"base":"AUD","date":"2024-01-16","rates":{"SEK":6.8682}}'

Đồng thời, chúng tôi đã nhận được phản hồi từ API REST, với thông tin mới nhất về tỷ giá hối đoái của hôm nay. Trong phần tiếp theo, chúng ta sẽ chuyển thông tin này trở lại mô hình để mô hình có thể tạo ra câu trả lời phù hợp cho người dùng.

10. Tạo phản hồi

Cuối cùng, hãy tạo phản hồi cho người dùng bằng cách chuyển phản hồi của hàm về mô hình ở lượt trò chuyện tiếp theo:

response = model.generate_content(
    [
    Content(role="user", parts=[
        Part.from_text(prompt + """Give your answer in steps with lots of detail
            and context, including the exchange rate and date."""),
    ]),
    Content(role="function", parts=[
        Part.from_dict({
            "function_call": {
                "name": "get_exchange_rate",
            }
        })
    ]),
    Content(role="function", parts=[
        Part.from_function_response(
            name="get_exchange_rate",
            response={
                "content": api_response.text,
            }
        )
    ]),
    ],
    tools=[exchange_rate_tool],
)


response.candidates[0].content.parts[0].text

Sau khi chúng ta truyền phản hồi của hàm trở lại mô hình, mô hình sẽ phản hồi lời nhắc của người dùng cùng với thông tin liên quan trong phản hồi của API.

The exchange rate from Australian dollars to Swedish krona on January 16, 2024,
is 1 Australian dollar is equal to 6.8663 Swedish krona.

So, 500 Australian dollars would be worth 500 * 6.8663 = 3,433.15 Swedish krona.

11. Xem ví dụ về mã đầy đủ

Hiện tại, bạn có thể đặt mã Python vào API phụ trợ bằng cách sử dụng dịch vụ Cloud Run, Cloud Function hoặc một dịch vụ Cloud khác, rồi triển khai một ứng dụng giao diện người dùng sử dụng API phụ trợ này để thực hiện các truy vấn mô hình và lệnh gọi API.

Dưới đây là ví dụ về mã đầy đủ cho giải pháp cuối cùng của chúng tôi:

import requests
from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerativeModel,
    Part,
    Tool,
)

model = GenerativeModel("gemini-1.5-pro-001")

get_exchange_rate_func = FunctionDeclaration(
    name="get_exchange_rate",
    description="Get the exchange rate for currencies between countries",
    parameters={
    "type": "object",
    "properties": {
        "currency_date": {
            "type": "string",
            "description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
        },
        "currency_from": {
            "type": "string",
            "description": "The currency to convert from in ISO 4217 format"
        },
        "currency_to": {
            "type": "string",
            "description": "The currency to convert to in ISO 4217 format"
        }
    },
         "required": [
            "currency_from",
            "currency_date",
      ]
  },
)

exchange_rate_tool = Tool(
    function_declarations=[get_exchange_rate_func],
)

prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""

response = model.generate_content(
    prompt,
    tools=[exchange_rate_tool],
)

response.candidates[0].content

params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
    params[key[9:]] = value
params

import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text

response = model.generate_content(
    [
    Content(role="user", parts=[
        Part.from_text(prompt + """Give your answer in steps with lots of detail
            and context, including the exchange rate and date."""),
    ]),
    Content(role="function", parts=[
        Part.from_dict({
            "function_call": {
                "name": "get_exchange_rate",
            }
        })
    ]),
    Content(role="function", parts=[
        Part.from_function_response(
            name="get_exchange_rate",
            response={
                "content": api_response.text,
            }
        )
    ]),
    ],
    tools=[exchange_rate_tool],
)


response.candidates[0].content.parts[0].text

Trong quá trình triển khai này, chúng ta đã sử dụng 2 yêu cầu đối với mô hình tạo sinh: một yêu cầu tạo lệnh gọi hàm và một yêu cầu khác trả về phản hồi hàm. Xin lưu ý rằng đây chỉ là một phương thức để xử lý các lệnh gọi hàm và câu trả lời của hàm bằng Gemini. Bạn cũng có thể thực hiện các lệnh gọi hàm bổ sung để biết thêm thông tin về truy vấn của mình hoặc sử dụng lệnh gọi hàm với các phương thức trò chuyện và không đồng bộ.

Để xem thêm các mã mẫu, hãy tham khảo sổ tay mẫu về chức năng gọi điện trong Gemini.

12. Xin chúc mừng

Bằng cách sử dụng tính năng gọi hàm trong Gemini, bạn đã xây dựng thành công một quy trình AI tạo sinh sử dụng với Vertex AI Gemini API và Python! Người dùng có thể hỏi về tỷ giá hối đoái, sau đó hệ thống sẽ tìm nạp dữ liệu mới nhất từ một API bên ngoài và đưa ra câu trả lời.

Với câu lệnh của người dùng cuối, tính năng gọi hàm trong Gemini sẽ đảm nhận việc chọn hàm phù hợp, trích xuất các tham số từ câu lệnh và trả về một đối tượng dữ liệu có cấu trúc để bạn thực hiện lệnh gọi API bên ngoài.

Thiết kế của chức năng gọi hàm trong Gemini nhằm mang đến cho bạn khả năng ưu việt nhất của cả hai phương diện trong việc trích xuất các tham số một cách tất định, đồng thời để việc tóm tắt và tạo nội dung cho mô hình tạo sinh. Bạn có thể dùng thử các API và câu lệnh khác trong quy trình của mình, cũng như khám phá chức năng khác có liên quan đến Gemini API trong Vertex AI.

Giao diện API

Dọn dẹp

Bạn có thể dọn dẹp sau đây để tránh phát sinh phí cho tài khoản Google Cloud của mình đối với các tài nguyên dùng trong lớp học lập trình này:

Tìm hiểu thêm

Tiếp tục tìm hiểu về AI đàm thoại và AI tạo sinh qua những hướng dẫn và tài nguyên sau:

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.