# Tool: `canifa_knowledge_search` — Tài liệu Kỹ thuật (RAG Pipeline)

---

## 1. Tổng quan (Semantic Search)

Khác với các công cụ tìm kiếm theo từ khóa (Keyword Search), `canifa_knowledge_search` sử dụng cơ chế **Tìm kiếm ngữ nghĩa (Semantic Search)**. Tool này cho phép chatbot hiểu được ý định của khách hàng ngay cả khi họ không dùng chính xác từ ngữ có trong tài liệu.

- **Dữ liệu nguồn**: Bảng `shared_source.chatbot_rsa_knowledge` (chứa chính sách, bảng size, hướng dẫn sử dụng...).
- **Công nghệ**: Vector Embedding + Cosine Similarity (StarRocks).

---

## 2. Luồng xử lý RAG (Retrieval-Augmented Generation)

![Knowledge Search RAG Flow](data/32-knowledge-company-search-tool/knowledge_search_flow.svg)

---

## 3. Thuật toán chi tiết

### Bước 1 — Vector hóa câu hỏi (Embedding)
Câu hỏi của khách (`query`) được gửi đến `Embedding Service` để chuyển đổi thành một mảng số thực (Vector). 
*Ví dụ: "Đổi hàng ở đâu?" → `[0.12, -0.05, 0.88, ...]`*

### Bước 2 — Tìm kiếm Vector trên StarRocks
Sử dụng hàm `approx_cosine_similarity` để so sánh vector câu hỏi với hàng ngàn vector đoạn văn bản (chunks) có sẵn trong Database. Tool lấy ra **Top 5 đoạn văn bản** có điểm tương đồng cao nhất.

### Bước 3 — Nhóm kết quả (Metadata Grouping)
Do một tài liệu dài thường được cắt thành nhiều đoạn (chunks), tool sẽ thực hiện nhóm các đoạn này lại theo `title` nằm trong `metadata`. Điều này giúp Agent 2 nhận được thông tin liền mạch và có ngữ cảnh đầy đủ.

---

## 4. Đặc điểm vận hành (Quan trọng)

> [!TIP]
> **Khả năng Cache cao**: Dữ liệu kiến thức thương hiệu (chính sách, bảng size) thường là dữ liệu tĩnh, rất ít khi thay đổi. Do đó, kết quả của tool này **nên được cache** theo cặp `(query, result)` để tối ưu chi phí Embedding và tốc độ phản hồi.

- **Bảo mật**: Chỉ tra cứu trong kho tri thức công khai của Canifa.
- **Giới hạn**: Không dùng để tìm sản phẩm hoặc cửa hàng (đã có tool riêng).

---

## 5. Ví dụ Output

```
=== TÀI LIỆU: Chính sách đổi trả ===
Khách hàng có thể đổi trả hàng trong vòng 30 ngày kể từ ngày mua...

=== TÀI LIỆU: Hướng dẫn chọn Size ===
Đối với áo Polo nam, size L phù hợp cho người từ 65-75kg...
```
