Cách Xây Dựng Cơ Sở Dữ Liệu Kiến Thức RAG Từ Bất Cứ Trang Web Nào 2026
TL;DR
Một cơ sở kiến thức RAG hữu ích bắt đầu với các tài liệu nguồn sạch sẽ, có thể truy nguyên—không phải là một mô hình nhúng. Bảo tồn URL chuẩn, tiêu đề, thời gian thu thập, tiêu đề và hash nội dung với mỗi đoạn.
Quy trình là thu thập → chuẩn hóa → loại bỏ trùng lặp → chia đoạn → nhúng → lưu trữ → truy xuất → trả lời với trích dẫn. Đánh giá từng ranh giới độc lập để sai sót trong việc truy xuất không bị nhầm lẫn với sai sót của mô hình.
Markdown là một định dạng trao đổi thực tiễn cho việc thu thập nội dung từ website. Nó loại bỏ nhiều tiếng ồn điều hướng trong khi giữ cấu trúc tiêu đề có thể hướng dẫn việc chia đoạn theo nghĩa.
Sử dụng Nstproxy Crawl khi bạn cần nội dung website đã được hiển thị mà không cần duy trì trình duyệt và tổ chức proxy. Ví dụ dưới đây sử dụng tuyến thu thập hiện tại của nó, sau đó minh họa một cơ sở truy xuất cục bộ không có phụ thuộc.
Hệ thống tạo nội dung tăng cường lấy dữ liệu chỉ đáng tin cậy như bằng chứng mà nó có thể truy xuất. Nếu việc thu thập dữ liệu từ trang web lưu trữ các thông báo cookie, điều hướng lặp đi lặp lại, bản sao cũ, và các mảnh thông tin không có metadata nguồn, một mô hình ngôn ngữ mạnh hơn không thể sửa chữa nguồn gốc bị thiếu.
Hướng dẫn này xây dựng một pipeline nhỏ có thể kiểm tra và chỉ ra nơi các hệ thống sản xuất cần các thành phần mạnh mẽ hơn. Nó sử dụng một cơ sở dữ liệu vector hash cục bộ để logic truy xuất có thể chạy với thư viện chuẩn của Python. Thay thế cơ sở dữ liệu đó bằng một mô hình nhúng sản xuất và chỉ mục vector sau khi các hợp đồng dữ liệu hoạt động.
Pipeline Crawl-for-RAG Cần Gì?
Một pipeline crawl-for-RAG cần sáu thuộc tính: phạm vi bao quát, nội dung sạch, danh tính ổn định, phân đoạn hữu ích, vector có thể truy xuất, và câu trả lời có nguồn gốc. Tốc độ quan trọng, nhưng sự hoàn thiện và khả năng truy nguyên còn quan trọng hơn.
Bản ghi tối thiểu cho mỗi trang đã lấy nên chứa:
Trường
Tại sao nó quan trọng
source_url
Cho phép một câu trả lời trích dẫn bằng chứng
canonical_url
Ngăn chặn trùng lặp tham số URL
title và tiêu đề
Cải thiện hiển thị và ranh giới ngữ nghĩa
crawled_at
Hỗ trợ các chính sách tính mới
content_hash
Phát hiện nội dung không thay đổi hoặc trùng lặp
markdown
Cung cấp văn bản chuẩn hóa với cấu trúc
http_status
Tách biệt các trang không khả dụng khỏi việc trích xuất trống
bối cảnh/địa phương truy cập
Giải thích sự khác biệt về khu vực hoặc ngôn ngữ
Nstproxy Crawl có thể biến các URL thành các định dạng như Markdown và JSON trong khi xử lý cơ sở hạ tầng render. Nó không thay thế chính sách cơ sở tri thức của bạn: ứng dụng của bạn vẫn phải quyết định đâu là những đường dẫn được phép, tần suất làm mới, và cái gì đủ điều kiện là một tài liệu được chấp nhận.
Trước khi thu thập dữ liệu, hãy kiểm tra các quy tắc của trang web và quyền hạn của bạn. Giao thức loại trừ Robot định nghĩa cách mà các bot khám phá hướng dẫn robots.txt, nhưng sự tuân thủ của robot chỉ là một phần trong đánh giá hợp pháp và hợp đồng. Xem hướng dẫn hợp pháp về thu thập dữ liệu web của Nstproxy để có danh sách kiểm tra rộng hơn.
Bước 1: Định Nghĩa Phạm Vi và Thu Thập Dữ Liệu Từ Trang Web
Bắt đầu với một sơ đồ trang web, một gốc tài liệu đã biết, hoặc một hạt giống URL được biên soạn. Thêm các quy tắc cho phép và từ chối rõ ràng. Đối với một trang tài liệu, bạn có thể cho phép /docs/ và loại trừ đăng nhập, tìm kiếm, phân trang thay đổi, tham số truy vấn, và các tệp nhị phân có thể tải xuống.
API trực tiếp của Nstproxy hiện tại chấp nhận các yêu cầu thu thập dữ liệu đã xác thực tại đường dẫn bên dưới. Đường dẫn đã được xác minh để đạt được xác thực vào ngày 3 tháng 9 năm 2026; một phản hồi thành công không thể được kiểm tra mà không có khóa tài khoản. Xác nhận các trường yêu cầu trong tài liệu thu thập dữ liệu hiện tại trước khi sử dụng trong sản xuất.
Lưu trữ phản hồi thô trước khi chuẩn hóa. Việc giữ lại dữ liệu thô giúp nâng cấp trình phân tích có thể tái tạo và cho bạn bằng chứng khi một quy tắc trích xuất thay đổi. Không bao giờ ghi lại khóa API, cookie, hoặc dữ liệu cá nhân từ các trang đã xác thực.
Nếu bạn đang quyết định giữa các phương pháp khám phá, hãy đọc thu thập dữ liệu vs thu thập thông tin. Thu thập dữ liệu một URL đã biết là thích hợp cho việc làm mới có mục tiêu; thu thập thông tin là phù hợp khi việc khám phá liên kết là một phần của công việc.
Bước 2: Chuẩn Hóa và Loại Bỏ Trùng Lặp Trước Khi Nhúng
Chuẩn hóa nên loại bỏ điều hướng lặp đi lặp lại, văn bản chân trang, thông báo cookie, điều khiển vô hình, và tiêu đề trống mà không làm phẳng cấu trúc tài liệu có ý nghĩa. Markdown hữu ích vì các tiêu đề, danh sách, mã, và liên kết vẫn tồn tại ở dạng gọn. CommonMark cung cấp một cơ sở hữu ích cho việc phân tích Markdown nhất quán.
Sử dụng hai danh tính:
Danh tính URL: chuẩn hóa chữ hoa/thường của chế độ/host, xóa các tham số theo dõi, giải quyết chuyển hướng, và ưu tiên một URL canonical ủy quyền.
Danh tính Nội dung: băm văn bản thân thể đã chuẩn hóa để phát hiện các bản sao phản chiếu hoặc tham số hóa.
Đừng loại bỏ mọi gần giống mù quáng. Tài liệu sản phẩm có thể lặp lại một cảnh báo chung nhưng chứa các quy trình khác nhau. Các băm chính xác là an toàn cho sự trùng lặp chính xác; độ tương đồng mơ hồ nên tạo ra các ứng viên có thể xem xét.
Freshness belongs in the same contract. Store crawled_at, source modification hints when available, and the extractor version. On refresh, re-embed only changed chunks and delete vectors for removed pages.
Bước 3: Phân Chia Xung Quanh Ý Nghĩa, Không Phải Số Ký Tự Tùy Ý
Một khối nên đủ lớn để trả lời một câu hỏi có khả năng và đủ nhỏ để truy xuất chính xác. Bắt đầu với các đoạn có nhận thức về tiêu đề, sau đó chia các phần dài theo đoạn hoặc câu. Gắn tiêu đề breadcrumb vào mỗi khối con.
Một chính sách khởi đầu thực tiễn là:
chia tại các ranh giới H2/H3;
nhắm tới khoảng 300–700 token mỗi khối;
giữ nguyên các khối mã và bảng khi có thể;
thêm một sự chồng chéo nhỏ chỉ qua những đoạn văn liên tục thực sự;
thêm tiêu đề trang và đường dẫn tiêu đề vào văn bản nhúng;
lưu trữ văn bản hiển thị chưa chỉnh sửa riêng biệt.
Không có kích thước khối tốt nhất thế giới. Đánh giá dựa trên các câu hỏi thực. Nếu câu trả lời cần các sự kiện trải dài qua một quy trình dài, hãy truy xuất các khối lân cận hoặc sử dụng truy xuất cha-con thay vì làm cho mỗi khối quá lớn.
Bước 4: Nhúng, Lưu Trữ và Truy Xuất Một Cơ Sở Địa Phương Có Thể Chạy Được
Tập lệnh sau đây triển khai toàn bộ cơ chế địa phương chỉ với thư viện tiêu chuẩn của Python. Nó sử dụng một vector túi từ đã băm xác định - không phải là một nhúng sản xuất ngữ nghĩa. Giới hạn đó là có chủ đích: bạn có thể chạy luồng dữ liệu cục bộ, kiểm tra các bản ghi SQLite, và sau đó chỉ thay thế embed().
import hashlib
import json
import math
import re
import sqlite3
from datetime import datetime, timezone
DIMENSIONS =256defnormalize(text:str)->str: text = re.sub(r"\r\n?","\n", text) text = re.sub(r"[ \t]+"," ", text) text = re.sub(r"\n{3,}","\n\n", text)return text.strip()defchunk_markdown(markdown:str, max_words:int=90): chunks, heading,buffer=[],"",[]for line in normalize(markdown).splitlines():if line.startswith("#"):ifbuffer: chunks.append((heading,"\n".join(buffer)))buffer=[] heading = line.lstrip("# ")else:buffer.append(line)iflen(" ".join(buffer).split())>= max_words: chunks.append((heading,"\n".join(buffer)))buffer=[]ifbuffer: chunks.append((heading,"\n".join(buffer)))return[(h, t.strip())for h, t in chunks if t.strip()]defembed(text:str): vector =[0.0]* DIMENSIONS
for token in re.findall(r"[a-z0-9]+", text.lower()): slot =int(hashlib.sha256(token.encode()).hexdigest()[:8],16)% DIMENSIONS
vector[slot]+=1.0 length = math.sqrt(sum(x * x for x in vector))or1.0return[x / length for x in vector]defcosine(a, b):returnsum(x * y for x, y inzip(a, b))defingest(db, url, title, markdown): cleaned = normalize(markdown) page_hash = hashlib.sha256(cleaned.encode()).hexdigest() crawled_at = datetime.now(timezone.utc).isoformat() db.execute("DELETE FROM chunks WHERE source_url = ?",(url,))for index,(heading, text)inenumerate(chunk_markdown(cleaned)): embedding_text =f"{title}\n{heading}\n{text}" db.execute("INSERT INTO chunks VALUES (?, ?, ?, ?, ?, ?, ?)",(url, title, heading, index, text, json.dumps(embed(embedding_text)),f"{page_hash}:{crawled_at}"),) db.commit()defsearch(db, question, limit=3): query_vector = embed(question) rows = db.execute("SELECT source_url, title, heading, body, vector FROM chunks").fetchall() ranked =[(cosine(query_vector, json.loads(vector)), url, title, heading, body)for url, title, heading, body, vector in rows
]returnsorted(ranked, reverse=True)[:limit]db = sqlite3.connect(":memory:")db.execute("""CREATE TABLE chunks (
source_url TEXT, title TEXT, heading TEXT, chunk_index INTEGER,
body TEXT, vector TEXT, version TEXT
)""")sample ="""# Acme Docs
## Authentication
Send an API key in the Authorization header. Never expose the key in client code.
## Retries
Retry rate limits with exponential backoff and jitter. Do not retry invalid credentials.
"""ingest(db,"https://example.com/docs","Acme Docs", sample)for score, url, title, heading, body in search(db,"How should I handle rate limits?"):print(f"{score:.3f}\t{heading}\t{url}\t{body}")
The script was executed locally with Python 3 using the included illustrative document. It ranked the “Retries” section first for the rate-limit question. This confirms chunk storage and retrieval wiring; it does not validate semantic quality on a real corpus.
Để sản xuất, thay thế hàm vector cục bộ bằng API nhúng, và thay thế tìm kiếm tuyến tính bằng chỉ mục vector. pgvector thêm tìm kiếm vector chính xác và xấp xỉ vào PostgreSQL; cơ sở dữ liệu vector quản lý là một tùy chọn khác. Bảo tồn cùng một siêu dữ liệu bất kể động cơ lưu trữ.
Bước 5: Tạo Câu Trả Lời Chỉ Từ Bằng Chứng Được Lấy
Chuyển những phần tốt nhất tới mô hình trả lời với các URL nguồn và một chỉ dẫn nghiêm ngặt: trả lời từ ngữ cảnh cung cấp, trích dẫn các tuyên bố, và cho biết khi nào bằng chứng là không đủ. Đừng để mô hình tự động thay thế kiến thức chung cho nội dung trang thiếu.
Một giai đoạn trả lời mạnh mẽ nên:
áp dụng ngưỡng độ liên quan tuyệt đối, không chỉ “ba hàng đầu”;
đa dạng hóa kết quả để một trang bị lặp lại không chiếm tất cả các vị trí;
bao gồm các phần lân cận cho các thủ tục;
lọc theo người thuê, địa phương, phiên bản sản phẩm và kiểm soát truy cập;
trích dẫn URL nguồn tiêu chuẩn bên cạnh mỗi tuyên bố được hỗ trợ;
ghi lại ID phần đã lấy để đánh giá sau này.
Việc tái xếp hạng có thể cải thiện độ chính xác sau khi lấy vector ban đầu. Lấy hybrid—vector ngữ nghĩa cộng với điểm từ khóa—đặc biệt hữu ích cho mã lỗi, tên sản phẩm và các tham số API chính xác.
Hướng dẫn máy chủ MCP tìm kiếm web của Nstproxy cung cấp bối cảnh liên quan để kết nối bằng chứng web trực tiếp với các đại lý AI. Cơ sở dữ liệu tri thức cố định và tìm kiếm trực tiếp giải quyết các vấn đề khác nhau: cái trước có thể kiểm soát và nhanh chóng, trong khi cái sau có thể khám phá các trang mới hơn.
Bước 6: Đánh Giá Quy Trình Từ Đầu Đến Cuối
Xây dựng một tập câu hỏi từ các vé hỗ trợ thực, tiêu đề tài liệu, và các trường hợp lỗi đã biết. Đối với mỗi câu hỏi, gán trang nguồn mong đợi và liệu kho chứa có chứa câu trả lời không.
Đo lường ít nhất:
độ bao phủ quét: các trang mong đợi được chấp nhận thành công;
thời gian mới mẻ: thời gian từ sự thay đổi nguồn đến cập nhật có thể tìm kiếm;
độ thu hồi lấy: bằng chứng mong đợi xuất hiện trong tập ứng cử viên;
độ chính xác trích dẫn: các trang được trích dẫn thực sự hỗ trợ câu trả lời;
độ trung thành của câu trả lời: các tuyên bố được nội dung lấy được bao hàm;
chất lượng từ chối: hệ thống từ chối khi bằng chứng vắng mặt.
Gỡ lỗi theo thứ tự đó. Nếu trang đúng không bao giờ được quét, việc điều chỉnh nhúng là nỗ lực lãng phí. Nếu phần đúng được lấy nhưng câu trả lời đã bỏ qua nó, hãy thay đổi lời nhắc hoặc giai đoạn mô hình.
Những Sai Lầm Thường Gặp Khi Nhập liệu RAG
Sai lầm phổ biến nhất là nhúng HTML thô. Nó lấp đầy chỉ mục với menu, văn bản script, và nội dung mẫu lặp lại. Các lỗi tốn kém khác bao gồm chia nhỏ trước khi loại bỏ trùng lặp, mất đường dẫn tiêu đề, bỏ sót URL tiêu chuẩn, làm mới toàn bộ kho chứa thay vì các trang đã thay đổi, và cho phép nội dung đã xóa vẫn có thể tìm kiếm.
An ninh cũng quan trọng không kém. Đừng quét các trang riêng tư vào một chỉ mục chia sẻ trừ khi việc lấy dữ liệu tuân thủ mô hình ủy quyền nguồn. Hãy xem văn bản bị đánh cắp như đầu vào không đáng tin: nó có thể chứa chèn nhắc nhằm vào các đại lý hạ nguồn. Giữ các chỉ dẫn hệ thống riêng biệt và hạn chế những gì các công cụ thời gian trả lời có thể làm.
Trước khi ra mắt, xác nhận rằng mỗi phần đều có nguồn tiêu chuẩn, đường dẫn tiêu đề, thời gian quét, phiên bản, và mã băm nội dung. Xác minh sự truyền phát xóa, bộ lọc truy cập, giới hạn thử lại, khả năng quan sát, và chính sách làm mới đã được tài liệu hóa. Giữ một tập câu hỏi vàng nhỏ trong CI để parser hoặc thay đổi mô hình không thể giảm chất lượng thu hồi một cách âm thầm.
Bộ thu thập thông tin là thành phần đầu tiên, nhưng nó đặt trần cho mọi thứ ở hạ nguồn. Markdown sạch, có phiên bản cộng với các cổng chất lượng rõ ràng cung cấp cho các giai đoạn nhúng và trả lời bằng chứng mà họ thực sự có thể sử dụng.
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Crawl for RAG là gì?","acceptedAnswer":{"@type":"Answer","text":"Crawl for RAG là quá trình khám phá các trang web, trích xuất nội dung và siêu dữ liệu sạch, chia nhỏ và nhúng nó, và lưu trữ để tạo ra nội dung tăng cường."}},{"@type":"Question","name":"Tôi nên lưu trữ HTML hay Markdown cho RAG?","acceptedAnswer":{"@type":"Answer","text":"Markdown thường dễ chia nhỏ và kiểm toán hơn vì nó loại bỏ nhiều thành phần giao diện trang trong khi vẫn giữ nguyên tiêu đề, danh sách, liên kết, bảng và mã. Giữ HTML thô riêng biệt khi xử lý lại hoặc tuân thủ yêu cầu."}},{"@type":"Question","name":"Tần suất cập nhật cơ sở tri thức RAG nên như thế nào?","acceptedAnswer":{"@type":"Answer","text":"Tần suất làm mới nên tuân theo sự biến động của nguồn và rủi ro kinh doanh. Một trang tài liệu có thể cần cập nhật theo sự kiện hoặc hàng ngày; một kho lưu trữ ổn định có thể cần ít hơn. Sử dụng băm nội dung để xử lý lại các trang đã thay đổi và loại bỏ nội dung đã xóa ngay lập tức."}},{"@type":"Question","name":"Ví dụ này có sử dụng nhúng sản xuất không?","acceptedAnswer":{"@type":"Answer","text":"Không. Nó sử dụng một vector băm địa phương xác định để trình bày quy trình mà không cần phụ thuộc. Thay thế nó bằng một mô hình nhúng ngữ nghĩa và một chỉ mục vector trước khi sử dụng sản xuất."}}]}
Kai Watanabe
Sep. 3rd 2026
110M+ IP that voi ti le truy cap thanh cong 99.9%
Phan hoi trung binh ~0.5s cho tac vu dong thoi cao
Chi tu $0.1/GB
Truy cap ngay cac pool proxy residential, datacenter, IPv6 va ISP cao cap.