RAG với API tìm kiếm
GET /v1/legal/search là endpoint tìm kiếm cấp độ đơn vị được thiết kế để đưa thẳng vào pipeline RAG: nó trả về từng đơn vị điều/khoản/điểm có thể định địa chỉ riêng biệt kèm theo chuỗi trích dẫn được tạo sẵn, thay vì toàn bộ văn bản mà bạn phải tự chia nhỏ.
Các chế độ tìm kiếm (Modes)
| Chế độ | Chi phí | Hành vi |
|---|---|---|
fts (mặc định) | 1 đơn vị | Tìm kiếm toàn văn (Postgres full-text search) trên các từ tiếng Việt không dấu |
semantic | 2 đơn vị, Builder+ | Độ tương đồng cosine trên e5 embeddings |
hybrid | 2 units, Builder+ | Kết hợp Reciprocal Rank Fusion giữa fts + semantic |
Bắt đầu với fts cho các thuật ngữ chính xác (mã số thuế, thuật ngữ định nghĩa); chuyển sang hybrid khi các truy vấn của bạn là câu hỏi ngôn ngữ tự nhiên thay vì từ khóa — nó xếp hạng nhất quán vượt trội so với từng chế độ riêng lẻ.
Yêu cầu (Request)
curl "https://api.crawlpipe.com/v1/legal/search?q=th%E1%BB%9Di%20h%E1%BA%A1n%20n%E1%BB%99p%20thu%E1%BA%BF&mode=hybrid&eff_status=con_hieu_luc&limit=5" \
-H "Authorization: Bearer cp_live_a1b2c3d4e5f6…"import requests
resp = requests.get(
"https://api.crawlpipe.com/v1/legal/search",
params={
"q": "thời hạn nộp thuế",
"mode": "hybrid",
"eff_status": "con_hieu_luc", # chỉ văn bản đang còn hiệu lực
"limit": 5,
},
headers={"Authorization": "Bearer cp_live_a1b2c3d4e5f6…"},
)
data = resp.json()["data"]const params = new URLSearchParams({
q: "thời hạn nộp thuế",
mode: "hybrid",
eff_status: "con_hieu_luc",
limit: "5",
});
const res = await fetch(`https://api.crawlpipe.com/v1/legal/search?${params}`, {
headers: { Authorization: "Bearer cp_live_a1b2c3d4e5f6…" },
});
const { data } = await res.json();Lọc theo eff_status=con_hieu_luc trừ khi trường hợp của bạn đặc biệt cần nội dung đã hết hiệu lực hoặc chưa có hiệu lực — câu trả lời RAG dựa trên luật đã hết hạn là một lỗi phổ biến và có thể tránh được.
Xây dựng cửa sổ ngữ cảnh (Context window)
Trường unit.content của mỗi kết quả đã được giới hạn theo phạm vi đơn vị (một khoản/điểm duy nhất, hoặc toàn bộ điều khi văn bản chưa được chia nhỏ hơn). Nối top-k các chuỗi unit.content làm ngữ cảnh của bạn và giữ unit.citation đi kèm mỗi đoạn:
{
"score": 0.87,
"unit": {
"path": "c2.d5.k3",
"unit_type": "khoan",
"content": "Hóa đơn điện tử phải được lập theo định dạng chuẩn dữ liệu…",
"citation": "Khoản 3 Điều 5 Thông tư 18/2026/TT-BTC"
},
"document": {
"doc_number": "18/2026/TT-BTC",
"eff_status": "con_hieu_luc",
"source": { "key": "vbpl", "url": "…" }
}
}Hướng dẫn trích dẫn
citation được tạo phía máy chủ ("Khoản 3 Điều 5 Thông tư 18/2026/TT-BTC") — hãy dán trực tiếp ngay sau văn bản trả lời tham chiếu đến đoạn đó. Đừng tự tạo trích dẫn từ unit.path; định dạng có thể bổ sung chi tiết (ví dụ cấp điểm) mà không cần thông báo trước, nhưng citation ổn định theo hợp đồng. Nếu bạn cần liên kết sâu, hãy dùng document.source.url.
Cập nhật dữ liệu mới nhất
Kết quả tìm kiếm phản ánh phiên bản đang có hiệu lực tại thời điểm truy vấn. Nếu ứng dụng của bạn lưu bộ nhớ đệm câu trả lời, hãy đăng ký luồng thay đổi hoặc webhooks để các câu trả lời RAG trong bộ nhớ đệm tự động bị vô hiệu hóa khi khoản liên quan được sửa đổi.