# Agent đọc web cho khách hàng: chọn crawler, giữ nguồn và đừng coi robots.txt là giấy phép

> Bản demo agent tìm kiếm web có thể xong trong một buổi chiều. Phần khó đến vào tuần sau, khi trang web trả về 403, đường link được trích dẫn không nói đúng điều agent khẳng định, và bộ phận pháp lý muốn biết ai đã cho phép crawl.

Bản gốc: https://fdetimes.net/vi/bach-khoa/agent-tim-kiem-web-va-crawl-tai-lieu/

Khách hàng muốn có một agent mỗi tuần đọc review sản phẩm của đối thủ trên G2 rồi tóm tắt cho đội sản phẩm. Bản demo chạy ngay buổi chiều đầu tiên.

Đến tuần thứ hai thì crawler nhận lỗi 403, một câu tóm tắt dẫn đến trang chẳng nói gì về điều nó khẳng định, và trưởng phòng pháp lý hỏi: ai cho phép lấy dữ liệu từ trang này?

Ba câu hỏi đó ứng với ba phần việc mà một FDE phải làm khi đưa agent đọc web vào môi trường thật: chọn công cụ lấy dữ liệu, kiểm soát nguồn, và nói rõ rủi ro pháp lý với khách hàng.

Các phần dưới đây bám theo đúng tình huống G2 ấy, và phần nào cũng kết thúc bằng việc bạn nên làm đầu tiên ở chỗ khách hàng.

## Chọn crawler theo việc cần làm, không theo độ nổi tiếng

Lấy được nội dung của một trang chỉ là bước đầu. Câu hỏi thật là bạn cần tùy biến đến mức nào, chạy ở quy mô bao nhiêu, và ai trả tiền khi số trang tăng lên gấp mười lần. Ba công cụ thường gặp đứng ở ba vị trí khá khác nhau.

| | Crawl4AI | Jina Reader | Firecrawl |
|---|---|---|---|
| Là loại gì | Crawler mã nguồn mở, thiết kế để gắn vào LLM, agent và data pipeline; xuất Markdown tối ưu cho RAG | Dịch vụ đọc trang, bắt đầu được mà không cần tài khoản | Nền tảng scraping phổ biến cho AI |
| Chi phí | Mã nguồn mở, tự chạy trong pipeline của bạn | Miễn phí đến một triệu token khi gọi qua API | Trả theo credit, chia theo gói |
| Giới hạn | Không vượt được trang có bot detection mạnh | Ít tùy biến, không hợp crawl quy mô lớn | Chi phí tăng mạnh khi quy mô lớn |

Nhìn vào bảng, thứ tự hợp lý là thế này. Dùng Jina Reader để kiểm chứng ý tưởng trong ngày đầu, khi một triệu token miễn phí còn dư dả. Chuyển sang Crawl4AI khi pipeline cần chạy lâu dài và cần tùy biến nhiều hơn mức Jina cho phép.

Chỉ chọn Firecrawl sau khi đã ước lượng chi phí credit theo số trang thật của khách hàng, chứ đừng ước lượng theo số trang của bản demo.

Việc đầu tiên nên làm ở chỗ khách hàng: hỏi xem mỗi tuần cần đọc bao nhiêu trang, trên bao nhiêu domain. Con số đó quyết định công cụ nhiều hơn mọi bảng so sánh.

## Lỗi 403 là một tín hiệu, không chỉ là một bug

Trong một hướng dẫn kết hợp Crawl4AI với DeepSeek, Bright Data ghi lại rằng lần thử đầu tiên trên G2 trả về 403. Crawl4AI không vượt được những trang được bảo vệ mạnh như vậy, và họ phải dùng một trình duyệt từ xa (Scraping Browser) mới lấy được nội dung.

Về kỹ thuật, đó là một cách giải quyết. Nhưng với một FDE, 403 trước hết cho biết chủ trang không muốn bị bot đọc. Quyết định có vượt qua hay không là quyết định kinh doanh và pháp lý của khách hàng, không nên là lựa chọn mặc định nằm trong code của bạn.

Khi gặp 403, hãy ghi lại domain đó và đưa nó vào danh sách cần khách hàng duyệt, thay vì lặng lẽ đổi sang proxy.

## Trang web thường dài hơn cửa sổ ngữ cảnh

Cũng trong ví dụ G2, trang review quá dài nên không thể đưa nguyên trang vào model DeepSeek chạy qua Groq vì vượt giới hạn token. Cách xử lý là dùng CSS selector để chỉ lấy phần liên quan rồi mới đưa vào mô hình.

Thử hình dung một trang review có thanh điều hướng, quảng cáo, footer, hàng chục sản phẩm gợi ý, và chỉ một khối chứa nội dung review. Nếu đưa cả trang vào, bạn trả tiền cho phần rác, có nguy cơ vượt context, và cho model thêm nhiều cơ hội trích nhầm đoạn.

Khi chỉ giữ khối review, mỗi lần gọi rẻ hơn, và quan trọng hơn là mỗi khẳng định đều truy ngược được về một đoạn cụ thể.

Vì thế, selector nên được coi là cấu hình của từng domain, lưu cùng pipeline và có test. Khi trang đổi giao diện, selector hỏng, và bạn muốn phát hiện điều đó bằng một test thất bại chứ không phải bằng một bản tóm tắt rỗng gửi cho sếp của khách hàng.

## Có trích dẫn chưa có nghĩa là có bằng chứng

Tài liệu của PraisonAI về Web Search Agent khuyên một điều đơn giản: dặn agent ghi kèm các URL nó đã dùng. Đây là mức kiểm soát nguồn tối thiểu, và nhiều đội dừng ở đó.

Dừng ở đó là chưa đủ. Một hướng dẫn chọn công cụ AI search trên Useful AI cảnh báo rằng việc có nguồn không có nghĩa là nguồn nói đúng điều câu trả lời nói. Họ đề xuất tiêu chí đánh giá là nguồn được dẫn phải ủng hộ đúng khẳng định cụ thể, không chỉ cùng chủ đề.

**Điểm mấu chốt:** Một link cùng chủ đề mà không ủng hộ đúng khẳng định còn nguy hiểm hơn không có link, vì nó khiến người đọc tin.

Áp vào ví dụ G2: agent viết "người dùng phàn nàn nhiều về thời gian onboarding" và dẫn một trang review của đúng sản phẩm đó. Trang là thật và đúng chủ đề. Nhưng nếu trong khối review không có câu nào nói về onboarding thì khẳng định này không có căn cứ, dù nhìn qua vẫn có vẻ được dẫn nguồn đầy đủ.

Cách khắc phục là bắt agent trả về bản ghi nguồn cho từng khẳng định chứ không chỉ một danh sách URL. Một bản ghi tối thiểu nên có:

```json
{
"claim": "Người dùng phàn nàn về thời gian onboarding",
"url": "https://...",
"selector": "div.review-body",
"quote": "<đoạn nguyên văn lấy từ khối đã crawl>",
"support": "direct | topical | none"
}
```

Trường `quote` buộc agent chỉ ra đúng đoạn văn. Một bước kiểm tra thứ hai, có thể là một lần gọi LLM riêng hoặc một người chấm mẫu, sẽ gán nhãn `support`. Khẳng định nào chỉ đạt mức `topical` hoặc `none` sẽ bị loại hoặc được đánh dấu trước khi đến tay khách hàng.

PraisonAI còn khuyên bật `memory=True` để agent dựa vào các truy vấn trước thay vì tìm lại cùng một nội dung ở mỗi lượt. Trong pipeline chạy hằng tuần, điều này giúp giảm số lần gọi search.

Việc đầu tiên nên làm ở chỗ khách hàng: thống nhất rằng "đúng" nghĩa là `direct`, rồi đo tỉ lệ đó trên 20 câu trả lời mẫu trước khi bàn đến chuyện mở rộng.

## robots.txt: tòa án nói gì, và vì sao vẫn nên tôn trọng nó

Ngày 15/12/2025, trong vụ Ziff Davis v. OpenAI, tòa S.D.N.Y. cho rằng chỉ dẫn trong robots.txt chỉ là lời yêu cầu, không phải cơ chế kiểm soát truy cập vào tác phẩm có bản quyền theo DMCA §1201. Theo tòa, bỏ qua robots.txt không phải là hành vi "circumvention" theo DMCA.

Đọc kỹ thì phạm vi của phán quyết khá hẹp. Nó chỉ trả lời một câu hỏi về một điều luật. Nó không loại trừ các khiếu kiện khác như vi phạm hợp đồng hay vi phạm bản quyền. Vì vậy, "tòa nói robots.txt không ràng buộc" không thể trở thành lý do để crawl mọi thứ.

Cách làm an toàn với tư cách FDE là coi robots.txt và điều khoản sử dụng của từng domain là đầu vào của buổi scoping. Hãy liệt kê nguồn, ghi lại mỗi trang cho phép gì, và để bộ phận pháp lý của khách hàng ký duyệt. Bạn không phải luật sư, và cũng không nên tự đóng vai luật sư.

Việc của bạn là làm cho rủi ro hiện rõ để người có thẩm quyền quyết định.

## Năm bước cho dự án agent đọc web tiếp theo

1. Lập danh sách nguồn: domain nào, bao nhiêu trang, tần suất ra sao, và robots.txt cùng điều khoản sử dụng của từng nơi nói gì.
2. Từ con số quy mô, chọn công cụ và ước lượng chi phí theo số trang thật.
3. Viết selector cho từng domain, kèm test để phát hiện khi giao diện thay đổi.
4.

Thiết kế bản ghi nguồn theo từng khẳng định, bật memory để giảm tìm kiếm lặp lại, và đặt một bước kiểm tra mức độ ủng hộ trước khi xuất kết quả.
5. Bàn giao cho khách hàng một bảng nguồn đã được duyệt cùng quy trình xử lý khi gặp 403.

## Những lỗi hay gặp nhất

Lỗi phổ biến nhất là ước lượng chi phí dựa trên bản demo rồi bất ngờ khi chạy thật ở quy mô lớn. Lỗi thứ hai là đưa nguyên trang vào model, vừa tốn token vừa làm trích dẫn kém chính xác. Lỗi thứ ba là chỉ kiểm tra xem câu trả lời có link hay không mà không kiểm tra link có ủng hộ đúng khẳng định.

Lỗi thứ tư khó thấy hơn: coi việc vượt bot detection là một bài toán kỹ thuật thuần túy, rồi trích phán quyết về robots.txt như thể đó là giấy phép.

Những lỗi này thường chỉ lộ ra khi agent chạy thật, nên từng xử lý chúng là chất liệu đáng kể khi bạn viết CV hay đi phỏng vấn cho vị trí FDE.

Thay vì ghi "xây agent RAG trên dữ liệu web", hãy ghi việc cụ thể như "thiết kế lớp kiểm tra trích dẫn theo từng khẳng định" hoặc "lập danh mục nguồn dữ liệu có pháp lý duyệt", và sẵn sàng kể lại một lần bạn gặp 403 rồi xử lý ra sao.

Agent đọc web không được đánh giá ở chỗ nó tìm được bao nhiêu trang. Nó được đánh giá ở chỗ mỗi câu nó viết ra có thể được bảo vệ trước đội sản phẩm, và khi cần, trước cả bộ phận pháp lý.

**Thử ngay tuần này:**

- Lấy một trang dài bạn hay đọc, viết CSS selector chỉ giữ phần nội dung chính, rồi so số token trước và sau khi cắt.
- Cho một agent tìm kiếm trả lời 5 câu hỏi kèm URL, sau đó tự chấm từng khẳng định theo ba mức: ủng hộ đúng, chỉ cùng chủ đề, hoặc không liên quan.
- Viết bảng nguồn dữ liệu một trang cho một dự án giả định, gồm các cột: domain, robots.txt nói gì, điều khoản sử dụng, ai duyệt.

## Nguồn

- [AI-Powered Web Scraper with Crawl4AI and DeepSeek](https://brightdata.com/blog/web-data/crawl4ai-and-deepseek-web-scraping)

- [Best Web Scraping Tools for AI Applications: My Favourites](https://www.thetoolnerd.com/p/best-web-scraping-tools-for-ai-applications)

- [Web Search Agent - PraisonAI Documentation](https://praison.ai/docs/agents/websearch)

- [8 Best AI Search Engines for 2025](https://usefulai.com/tools/ai-search-engines)

- [Are Robots.txt Instructions Legally Binding?–Ziff Davis v. OpenAI](https://blog.ericgoldman.org/archives/2025/12/are-robots-txt-instructions-legally-binding-ziff-davis-v-openai.htm)
