0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Cách Sử Dụng AI và MCP Để Thu Thập Dữ Liệu

Đăng vào 2 ngày trước

• 11 phút đọc

Cách Xây Dựng Công Cụ Tùy Chỉnh Cho Copilot Với Python và Zyte API

Các trợ lý lập trình AI như GitHub Copilot rất mạnh mẽ, nhưng khả năng của chúng thường bị hạn chế. Chúng có thể viết mã, nhưng không phải lúc nào cũng có thể tương tác với các API bên ngoài cụ thể hoặc truy cập các công cụ độc quyền liên quan đến dự án của bạn. Vậy nếu bạn có thể cung cấp cho trợ lý AI của mình quyền truy cập trực tiếp vào các công cụ chuyên biệt, như API thu thập dữ liệu hiệu suất cao?

Đó chính xác là nội dung mà hướng dẫn này sẽ đề cập. Chúng ta sẽ xây dựng một máy chủ MCP đơn giản bằng Python, máy chủ này sẽ cung cấp các chức năng tùy chỉnh như là công cụ cho trợ lý AI của bạn. Để minh họa một trường hợp sử dụng mạnh mẽ trong thực tế, chúng ta sẽ tích hợp Zyte API để cung cấp cho AI khả năng thu thập dữ liệu web tinh vi, cho phép nó truy cập và xử lý nội dung từ hầu như bất kỳ trang web nào.


Tại Sao Nên Mở Rộng Khả Năng Của AI?

Theo mặc định, một trợ lý AI không thể truy cập các trang web trực tiếp nếu chúng bị chặn bởi phát hiện bot, cũng như không thể tương tác với môi trường staging nội bộ của công ty bạn hoặc các API riêng tư. Bằng cách xây dựng một cầu nối công cụ tùy chỉnh, bạn có thể cấp quyền và khả năng cụ thể:

  • Truy Cập Dữ Liệu Bị Hạn Chế: Cho phép AI truy vấn các cơ sở dữ liệu hoặc API nội bộ.
  • Vượt Qua Các Khóa Web: Sử dụng dịch vụ thu thập dữ liệu web mạnh mẽ như Zyte API để lấy nội dung web một cách đáng tin cậy, vượt qua các biện pháp chống thu thập dữ liệu mà thường thì sẽ ngăn cản AI.
  • Thực Hiện Các Nhiệm Vụ Chuyên Biệt: Tạo ra các công cụ cho các phép toán phức tạp, xử lý hình ảnh hoặc tương tác với phần cứng cụ thể.

Trong hướng dẫn này, chúng ta sẽ sử dụng một framework Python để tạo ra những công cụ này và chứng minh cách thực hiện các nhiệm vụ thu thập dữ liệu web nâng cao chỉ bằng cách trò chuyện với Copilot.


Bước 1: Thiết Lập Máy Chủ Công Cụ Cơ Bản

Đầu tiên, chúng ta cần tạo một máy chủ cơ bản sẽ chứa các công cụ của chúng ta. Chúng ta sẽ sử dụng một framework Python được thiết kế cho mục đích này (ở đây được đề cập dựa trên một thư viện để tạo công cụ MCP, hay Giao thức Đàm thoại Máy).

Hãy bắt đầu với một ví dụ tối thiểu. Tạo một tệp Python (ví dụ: main.py) và thêm mã sau. Máy chủ cơ bản này định nghĩa một công cụ duy nhất có tên là add_two_numbers.

python Copy
# main.py
from fastmcp import FastMCP
from base64 import b64decode
import requests
import os

mcp = FastMCP("Máy Chủ MCP Demo")

# @mcp.tool decorator đăng ký hàm là một công cụ có sẵn cho AI.
@mcp.tool
def add_two_numbers(a: int, b: int) -> int:
    """Cộng hai số nguyên lại với nhau."""
    return a + b

if __name__ == "__main__":
    mcp.run()

Điểm chính ở đây là decorator @mcp.tool. Điều này cho biết framework máy chủ sẽ cung cấp hàm add_two_numbers để các trợ lý AI như Copilot có thể tìm và thực thi nó.


Bước 2: Cấu Hình và Xác Minh

Để làm cho các công cụ này có thể được phát hiện bởi IDE của bạn và trợ lý AI trên một dự án cụ thể, bạn cần tạo một tệp cấu hình.

  1. Tạo Tệp Cấu Hình: Trong thư mục gốc của dự án của bạn, tạo một tệp .mcp/mcp.json. Tệp JSON này cho biết môi trường cục bộ nơi tìm thấy máy chủ công cụ của bạn. Bạn thường có thể tạo một mẫu cho tệp này bằng cách sử dụng một lệnh do framework công cụ cung cấp (ví dụ: fastmcp install mcp.json main.py).

  2. Ví Dụ Cấu Hình (.mcp/mcp.json):

    json Copy
    {"servers": {
    "Máy Chủ MCP Demo": {
        "command": "uv",
        "args": [
            "run",
            "--with",
            "fastmcp",
            "fastmcp",
            "run",
            "/path/to/main.py"
        ],
        "env": {}
    }
    }}
  3. Chạy và Xác Minh:

Copy
  * Khởi động máy chủ Python của bạn. Bạn nên thấy đầu ra cho thấy rằng máy chủ đang chạy và đã phát hiện các công cụ của bạn.
  * Trong IDE của bạn (như VS Code), mở palette lệnh (`Cmd+Shift+X` hoặc `Ctrl+Shift+X`) và tìm kiếm các tiện ích mở rộng quản lý công cụ AI. Bạn nên thấy "Máy Chủ MCP Demo" được liệt kê là hoạt động.
  * Bạn cũng có thể mở giao diện trò chuyện Copilot, tìm tùy chọn "Cấu hình Công Cụ" và xác minh rằng công cụ `add_two_numbers` được liệt kê.

Để kiểm tra, hãy yêu cầu Copilot thực hiện nhiệm vụ, rõ ràng nói với nó sử dụng công cụ của bạn:

Lời Nhắc: "Sử dụng máy chủ MCP, cộng 5 và 6."

Copilot sẽ yêu cầu quyền để chạy công cụ từ máy chủ cục bộ của bạn. Sau khi bạn cho phép, nó sẽ thực thi hàm trên máy chủ của bạn và trả về kết quả (11). Điều này xác nhận kết nối giữa AI của bạn và mã tùy chỉnh của bạn đang hoạt động.


Bước 3: Tăng Cường AI Của Bạn Với Khả Năng Thu Thập Dữ Liệu Web

Giờ đây, hãy tạo một công cụ mà lấy nội dung trang web bằng cách sử dụng Zyte API. Điều này cho phép chúng ta thu thập dữ liệu từ các trang thường bị bảo vệ bởi các biện pháp chống bot.

1. Định Nghĩa Hàm Công Cụ Mới

Đầu tiên, hãy định nghĩa chữ ký hàm trong main.py. Chúng ta sẽ tạo một hàm extract_html nhận vào một URL và trả về nội dung trang. Cần thiết phải thêm một docstring mô tả để AI hiểu công cụ này làm gì và khi nào nên sử dụng nó.

python Copy
import requests
import base64
import os

# ... (hàm add_two_numbers trước đó) ...

@mcp.tool
def extract_html(url: str) -> dict:
    """
    Trích xuất nội dung HTML từ một URL nhất định bằng cách sử dụng Zyte API.
    Trả về nội dung HTML.
    """
    # Logic gọi API sẽ ở đây
    pass

2. Xử Lý An Toàn Các Khóa API

Không bao giờ mã hóa khóa API của bạn. Chúng ta sẽ sử dụng biến môi trường để giữ cho chúng an toàn. Thêm một kiểm tra ở đầu kịch bản của bạn để đảm bảo rằng khóa API có sẵn trước khi khởi động máy chủ.

python Copy
# Ở đầu main.py
import os

API_KEY = os.getenv("ZYTE_API_KEY")
if API_KEY is None:
    raise ValueError("Biến môi trường ZYTE_API_KEY chưa được thiết lập.")

3. Triển Khai Lời Gọi API Zyte

Bây giờ, chúng ta sẽ triển khai logic bên trong hàm extract_html. Chúng ta sẽ thực hiện một yêu cầu đến điểm cuối API Zyte, truyền URL mục tiêu và khóa API của chúng ta. Zyte API xử lý các proxy, thử lại và kết xuất trình duyệt, trả về HTML sạch.

python Copy
# main.py - hàm extract_html đã cập nhật

@mcp.tool
def extract_html(url: str) -> dict:
    """
    Trích xuất nội dung HTML từ một URL nhất định bằng cách sử dụng Zyte API.
    Trả về nội dung HTML.
    """
    response = requests.post(
        "https://api.zyte.com/v1/extract",
        auth=(API_KEY, ""), # Sử dụng khóa API của bạn ở đây
        json={
            "url": url,
            "httpResponseBody": True # Yêu cầu thân HTML thô
        }
    )
    response_data = response.json()

    # Giải mã phản hồi HTML được mã hóa Base64 từ Zyte API
    html_content = base64.b64decode(response_data["httpResponseBody"]).decode('utf-8')

    return {"html": html_content}

Sau khi thêm mã này, khởi động lại máy chủ của bạn. Công cụ extract_html mới sẽ có sẵn cho trợ lý AI của bạn.


Bước 4: Ứng Dụng Thực Tế: Thu Thập và Phân Tích Trang Sản Phẩm

Hãy xem điều này hoạt động như thế nào. Giá trị thực không chỉ là lấy HTML; mà là cho phép AI lý luận về dữ liệu mà nó không thể truy cập trước đó.

Kịch bản: Chúng ta muốn trích xuất thông tin sản phẩm từ một trang thương mại điện tử thường chặn các công cụ thu thập dữ liệu.

Quy trình làm việc:

  1. Lấy HTML thông qua công cụ:

    Lời Nhắc: "Trích xuất HTML từ [URL trang sản phẩm] bằng cách sử dụng Zyte."

    Copilot sẽ gọi công cụ extract_html của bạn. Zyte API sẽ xử lý yêu cầu, vượt qua bất kỳ khóa nào, và gửi HTML đầy đủ trở lại ngữ cảnh của AI.

  2. Yêu cầu AI phân tích dữ liệu:

    Lời Nhắc: "Đây là một trang sản phẩm. Cho tôi CSS selectors cho một schema sản phẩm tiêu chuẩn (tên, giá, mô tả) hoạt động trên trang này. Sau đó, trả về một khối mã Python sử dụng BeautifulSoup để phân tích nó."

Bây giờ, vì AI đã có quyền truy cập vào HTML thực tế thông qua công cụ của bạn, nó có thể chính xác tạo ra các CSS selectors và mã phân tích hoạt động. Nếu không có công cụ tùy chỉnh, Copilot có thể sẽ trả lời "Tôi không thể truy cập các trang web trực tiếp" hoặc cung cấp mã không chức năng chung chung.

Dưới đây là một ví dụ về những gì AI có thể tạo ra:

python Copy
# Mã do AI tạo dựa trên ngữ cảnh HTML được lấy

from bs4 import BeautifulSoup

# Nội dung HTML sẽ được tải ở đây từ đầu ra bước trước
html_doc = """... nội dung HTML đầy đủ từ Zyte API ..."""
soup = BeautifulSoup(html_doc, 'html.parser')

product_schema = {
    "name": soup.select_one("h1.product-title").get_text(strip=True) if soup.select_one("h1.product-title") else None,
    "price": soup.select_one("span.price-amount").get_text(strip=True) if soup.select_one("span.price-amount") else None,
    "description": soup.select_one("div.product-description").get_text(strip=True) if soup.select_one("div.product-description") else None,
}

print(product_schema)

Kết Luận: Khai Phá Tiềm Năng Của AI

Tạo ra các công cụ tùy chỉnh cho trợ lý AI của bạn tạo ra cầu nối giữa việc tạo mã đa năng và tự động hóa chuyên biệt, cụ thể cho dự án. Như đã chứng minh, việc xây dựng một máy chủ Python đơn giản để cung cấp các chức năng là tương đối đơn giản. Bằng cách kết nối các dịch vụ bên ngoài mạnh mẽ như Zyte API, bạn thực sự cung cấp cho AI của mình sức mạnh siêu phàm, cho phép thực hiện các quy trình phức tạp như thu thập dữ liệu web đáng tin cậy và trích xuất dữ liệu trực tiếp từ môi trường phát triển của bạn.

Cách tiếp cận này cho phép bạn xây dựng các tích hợp mạnh mẽ, chuyên biệt, chỉ bị giới hạn bởi các công cụ bạn quyết định tạo ra.

Mã Hoàn Chỉnh

python Copy
from fastmcp import FastMCP
from base64 import b64decode
import requests
import os

mcp = FastMCP("Máy Chủ MCP Demo")


@mcp.tool
def add(a: int, b: int) -> int:
    """Cộng hai số lại"""
    return a + b


@mcp.tool
def subtract(a: int, b: int) -> int:
    """Trừ hai số"""
    return a - b


@mcp.tool
def request_html(url: str) -> str:
    """Lấy nội dung HTML từ một URL"""
    response = requests.get(url)
    return response.text


@mcp.tool
def zyte_product(url: str) -> dict:
    """
    Lấy dữ liệu sản phẩm từ Zyte API và trả về JSON sản phẩm.
    """
    api_key = os.environ.get("ZYTE_API_KEY")
    if not api_key:
        raise RuntimeError("Biến môi trường ZYTE_API_KEY chưa được thiết lập")
    api_response = requests.post(
        "https://api.zyte.com/v1/extract",
        auth=(api_key, ""),
        json={
            "url": url,
            "httpResponseBody": True,
            "product": True,
            "productOptions": {"extractFrom": "httpResponseBody", "ai": True},
            "followRedirect": True,
        },
    )
    data = api_response.json()
    return data["product"]


@mcp.tool
def get_html_from_zyte(url: str) -> dict:
    """
    Lấy và trả về chỉ nội dung HTML từ Zyte API cho một URL nhất định.
    """
    api_key = os.environ.get("ZYTE_API_KEY")
    if not api_key:
        raise RuntimeError("Biến môi trường ZYTE_API_KEY chưa được thiết lập")
    api_response = requests.post(
        "https://api.zyte.com/v1/extract",
        auth=(api_key, ""),
        json={
            "url": url,
            "httpResponseBody": True,
        },
    )
    http_response_body: bytes = b64decode(api_response.json()["httpResponseBody"])
    return {"html": http_response_body.decode("utf-8")}


if __name__ == "__main__":
    mcp.run()

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào