# Kịch bản demo — SQL Server 2025 Native Vector Search **Thời lượng:** 10-12 phút. **Đối tượng:** Cổ đông / lãnh đạo doanh nghiệp / khối nghiệp vụ. **Thông điệp chính:** *"Chạy AI tạo sinh trên dữ liệu khách hàng nhạy cảm ngay trong SQL Server — không cần đẩy data ra ngoài firewall, không cần mua thêm vector database, không cần đổi kỹ năng đội ngũ."* --- ## Chuẩn bị trước khi vào phòng (5 phút) ```powershell # Refresh PATH, bật Ollama $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [Environment]::GetEnvironmentVariable('Path','User') if (-not (Get-Process ollama -ErrorAction SilentlyContinue)) { Start-Process -FilePath 'ollama' -ArgumentList 'serve' -WindowStyle Hidden Start-Sleep -Seconds 3 } # Kill UI cũ + start fresh Get-CimInstance Win32_Process -Filter "Name='python.exe' OR Name='py.exe'" | Where-Object { $_.CommandLine -match 'server\.py' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue } $env:HELPDESK_EMBEDDING_MODE='real'; $env:HELPDESK_OLLAMA_MODEL='bge-m3' $env:HELPDESK_UI_PORT='8081'; $env:HELPDESK_SQL_SERVER='.\SQLEXPRESS' $env:HELPDESK_SQL_DATABASE='CustomerAIDemo2022' Start-Process -FilePath 'py' -ArgumentList '-3','d:\DSA\Demo_DBMS\ui\server.py' -WindowStyle Hidden Start-Sleep -Seconds 3 Start-Process 'http://127.0.0.1:8081' ``` **Verify trước khi mời cổ đông vào:** - Sidebar: Feedback **162**, Real · bge-m3 **162**, Critical **34**, VIP **54** - Issue Groups load đầy đủ 8 nhóm - Search thử "trừ tiền" mode Semantic-like → có kết quả score >0.75 - Ctrl+F5 1 lần để load CSS mới nhất **Mở sẵn 2 cửa sổ:** - **Cửa sổ 1**: trình duyệt http://127.0.0.1:8081 (full screen, zoom 110%) - **Cửa sổ 2**: SSMS hoặc terminal sqlcmd cho phần "proof of architecture" (Act 6) --- ## Mở đầu (1 phút) **Lời thoại:** > "Ban điều hành đặt một câu hỏi đơn giản: trong hàng vạn phản hồi khách hàng tháng vừa rồi, có bao nhiêu phản hồi đang nói về **cùng một vấn đề nghiêm trọng** — giao dịch thất bại nhưng tài khoản vẫn bị trừ tiền? > > Nếu chỉ search bằng từ khóa như `trừ tiền`, `mất tiền`, `ghi nợ` — chúng ta sẽ **bỏ sót rất nhiều cách diễn đạt khác**: khách hàng có thể viết 'số dư giảm', 'tiền bị giữ', 'app báo timeout'. > > Để bắt được ngữ nghĩa, doanh nghiệp thường nghĩ đến việc đẩy dữ liệu lên các dịch vụ AI bên ngoài — nhưng đây là dữ liệu khách hàng nhạy cảm, **không thể rời tường lửa**. Demo này sẽ cho thấy SQL Server 2025 giải quyết bài toán đó như thế nào." **Chỉ vào sidebar:** > "Đây là 162 phản hồi khách hàng, đã được biến thành 162 vector embedding 1024 chiều, lưu trực tiếp trong SQL Server. 34 vụ Critical, 54 khách VIP." --- ## Act 1 — Keyword search bị sót (1 phút) **Hành động:** 1. Dropdown **Mode** → chọn **Keyword** 2. Ô **Keyword**: gõ `trừ tiền` 3. **Days**: 365 4. Click **Search** **Kết quả mong đợi:** ~10-15 row khớp đúng chữ "trừ tiền". **Lời thoại:** > "Đây là cách truyền thống: tìm các phản hồi chứa cụm 'trừ tiền'. Ra 12 kết quả — có vẻ đủ, nhưng thực ra rất nhiều phản hồi cùng bản chất đã **bị bỏ sót** vì khách viết theo cách khác. Ví dụ 'số dư giảm', 'ghi nợ', 'tiền bị giữ'." **Chốt:** > "Đội nghiệp vụ không thể đoán được tất cả từ khóa khách hàng dùng. Đây là lý do keyword search là giải pháp dưới mức cần thiết cho bài toán risk triage." --- ## Act 2 — Semantic search trên SQL Server (2-3 phút) **Hành động:** 1. Dropdown **Mode** → đổi lại **Semantic-like** 2. Ô **Natural language question**: nhập ``` khách hàng bị trừ tiền dù giao dịch thất bại ``` 3. **Days**: 365 (giữ nguyên) 4. Click **Search** **Kết quả mong đợi:** Top 5 cosine score >0.78, ra các phản hồi như: - "App báo giao dịch thất bại sau OTP nhưng tài khoản vẫn bị trừ tiền" - "Chuyển khoản thất bại nhưng số dư tài khoản bị giảm" - "Đơn hàng không thành công, tiền chưa được hoàn về" - "Ví điện tử bị trừ tiền cho đơn hàng tôi không đặt" **Lời thoại:** > "Bây giờ tôi đặt câu hỏi **bằng tiếng tự nhiên**, như cách CEO sẽ hỏi: 'khách hàng bị trừ tiền dù giao dịch thất bại'." > > *(click Search, chờ 1-2s)* > > "Đây là điểm khác biệt. SQL Server đang so sánh **ý nghĩa**, không phải từ khóa. Hãy chú ý dòng đầu — score 0.80 — câu phản hồi này thậm chí **không chứa từ 'trừ tiền'** mà nói 'số dư giảm', nhưng hệ thống vẫn xếp đầu vì hiểu nó cùng bản chất." **Chỉ vào kết quả số 3-4:** > "Hai dòng này từ 2 sản phẩm khác nhau — Internet Banking và E-Wallet — nhưng cùng vấn đề. Với keyword search, ban quản trị rủi ro sẽ phải phân tách bằng tay. Với semantic search, đây là **kết quả tự nhiên**." **Bonus — cross-lingual (optional 30s):** - Nhập câu hỏi tiếng Anh: `customer charged for failed transaction` - Vẫn ra kết quả tiếng Việt tương ứng > "Model `bge-m3` được train đa ngôn ngữ. Nếu doanh nghiệp có chi nhánh quốc tế, đội tiếng Anh có thể query ngay vào dữ liệu khách hàng tiếng Việt — không cần dịch trước, không cần index riêng cho từng ngôn ngữ." --- ## Act 3 — Semantic + bộ lọc nghiệp vụ (2 phút) **Hành động:** 1. Giữ nguyên câu hỏi ở Act 2 2. **Segment** → chọn **VIP** 3. **Risk** → chọn **Critical** 4. Click **Search** **Kết quả mong đợi:** ~3-5 row, đều VIP + Critical, vẫn semantic match. **Lời thoại:** > "Đây là điểm mạnh khi vector nằm **trong SQL Server**. Tôi không cần đẩy ra vector database riêng rồi sync ngược về CRM. Tôi kết hợp tìm theo ngữ nghĩa với các filter nghiệp vụ quen thuộc — VIP, mức rủi ro Critical, trong 365 ngày gần nhất — **ngay trong một câu T-SQL**." **Click VIP Critical button:** > "Đây là shortcut cho lãnh đạo: chỉ cần một click — tìm các vụ VIP gặp sự cố nghiêm trọng nhất. Đây là input vào báo cáo rủi ro hàng tuần." **Chốt:** > "Nếu dùng kiến trúc vector database tách rời, mỗi lần thay filter ta phải đồng bộ lại trạng thái. Native Vector Search loại bỏ hoàn toàn vòng đồng bộ này — giảm độ trễ dữ liệu từ vài giờ xuống real-time." --- ## Act 4 — Từ một case nghiêm trọng → tìm cụm case tương tự (1-2 phút) **Hành động:** 1. Trên 1 row Critical bất kỳ ở Act 3, click nút **Similar** 2. Bảng "Similar Cases" bên phải đổ ra ~10-12 case tương tự **Lời thoại:** > "Giả sử team vận hành phát hiện một vụ nghiêm trọng — VIP gặp lỗi trừ tiền sau OTP. Câu hỏi tiếp theo: **vụ này có lan rộng không?** Có bao nhiêu khách khác đang gặp giống thế?" > > *(click Similar)* > > "Hệ thống lấy embedding của case này và tìm 12 case gần nhất trong toàn bộ feedback. Bạn thấy cluster các vụ tương tự xuất hiện ngay — đây là **risk discovery tự động**, không cần phải đọc thủ công hàng nghìn phản hồi." **Mở rộng:** > "Trên SQL Server 2025 production với hàng triệu phản hồi, `VECTOR_SEARCH` với DiskANN index trả về top-K trong dưới 100ms. Đây là sức mạnh approximate nearest neighbor được tích hợp gốc." --- ## Act 5 — Mở vector ra để chứng minh (1-2 phút) — *KEY MOMENT* **Hành động:** 1. Trên 1 row kết quả, click nút **Vector** 2. Modal mở ra hiển thị toàn bộ embedding **Modal hiển thị:** - Model: `bge-m3` - Dimensions: **1024** - Norm: **1.000000** - Min / Max / Mean - First 20 dimensions (preview) - Full vector 1024 floats (scroll) - Nút **Copy JSON** **Lời thoại:** > "Để chứng minh đây không phải 'AI ma thuật' mà là một artifact toán học cụ thể, tôi mở vector của phản hồi này ra." > > *(click Vector)* > > "1024 con số floating-point. Đây là **biểu diễn ngữ nghĩa** của câu 'App báo giao dịch thất bại sau OTP nhưng tài khoản vẫn bị trừ tiền'. Model `bge-m3` chạy **local trên Ollama** sinh ra vector này, sau đó SQL Server tính cosine similarity với vector của câu hỏi để xếp hạng." **Chỉ vào "Norm 1.0":** > "Norm bằng 1 nghĩa là vector đã được chuẩn hóa — cosine similarity tương đương dot product, tối ưu cho tìm kiếm nhanh." **Chốt thông điệp:** > "Toàn bộ 1024 con số này **không bao giờ rời khỏi máy chủ doanh nghiệp**. Embedding model chạy nội bộ, vector lưu trong SQL Server, query cũng được embed local. Không có một byte nào đi tới OpenAI, Google, hay Anthropic." *(Đóng modal)* --- ## Act 6 — Bằng chứng kiến trúc (1 phút) **Hành động:** chuyển sang cửa sổ sqlcmd / SSMS **Query để chạy:** ```sql USE CustomerAIDemo2022; -- 1. Confirm SQL Server version SELECT @@VERSION; -- 2. Confirm 162 feedback + 162 real embeddings in SQL Server SELECT (SELECT COUNT(*) FROM dbo.CustomerFeedback) AS feedbacks, (SELECT COUNT(DISTINCT FeedbackId) FROM dbo.RealFeedbackEmbedding) AS embedded_feedbacks, (SELECT COUNT(*) FROM dbo.RealFeedbackEmbedding) AS total_dimension_rows, (SELECT TOP 1 ModelName FROM dbo.RealEmbeddingMetadata ORDER BY CreatedAt DESC) AS model_used; -- 3. Show one embedding lives entirely inside SQL Server SELECT TOP 5 FeedbackId, DimensionIndex, Value FROM dbo.RealFeedbackEmbedding WHERE FeedbackId = 1 ORDER BY DimensionIndex; ``` **Lời thoại:** > "Đây là SQL Server thật — phiên bản hiển thị ở dòng đầu. Bảng `CustomerFeedback` chứa 162 phản hồi gốc; bảng `RealFeedbackEmbedding` chứa 162 × 1024 = 165,888 dimension rows. > > Trên bản SQL Server 2025 Preview, dữ liệu này sẽ nằm gọn trong **một cột kiểu `VECTOR(1024)`** của bảng `CustomerFeedback`, được index bởi DiskANN, query bằng cú pháp `VECTOR_SEARCH`. Pipeline business logic không thay đổi." **Chuyển sang demo các file SQL:** ```powershell Get-Content .\sql\02_register_external_model_ollama.sql | Select-Object -First 35 ``` > "Đây là phần `CREATE EXTERNAL MODEL` — chỉ cần một câu DDL, SQL Server biết cách gọi embedding model local qua HTTPS. Endpoint chỉ định `https://localhost:11435` — local TLS reverse proxy. Không bao giờ ra Internet." --- ## Kết bài (1 phút) > "Để tóm tắt: với SQL Server 2025 Native Vector Search, doanh nghiệp: > > 1. **Áp dụng AI tạo sinh trên dữ liệu khách hàng nhạy cảm** mà data không rời tường lửa. > 2. **Tiết kiệm chi phí mua vector database thương mại** — vector lưu cùng với data nghiệp vụ trong DB hiện hữu. > 3. **Tận dụng kỹ năng T-SQL sẵn có** — đội DBA, đội BI, đội báo cáo không phải học stack mới. > 4. **Tuân thủ các đạo luật bảo mật khắt khe** — vì không có dữ liệu rời môi trường kiểm soát. > > Demo hôm nay chạy trên 162 phản hồi mẫu. Trên dữ liệu sản xuất hàng triệu phản hồi, kiến trúc và pipeline **không thay đổi** — chỉ cần thêm vector index và scale cluster. Đây là sự khác biệt giữa một POC và một sản phẩm enterprise-ready." --- ## Câu hỏi thường gặp (Q&A prep) | Câu hỏi cổ đông có thể đặt | Trả lời ngắn | |---|---| | "Embedding model có chính xác bằng OpenAI không?" | `bge-m3` là model open-source state-of-the-art, top 5 MTEB benchmark. Đa ngôn ngữ, 1024 dim. Cho bài toán helpdesk classification, khác biệt với OpenAI text-embedding-3 dưới 2-3%. | | "Trên 1 triệu phản hồi thì nhanh đến đâu?" | DiskANN trên SQL Server 2025: top-K trong 50-150ms. Build index ~1-2 giờ một lần. Reindex tự động khi update vector. | | "Vector chiếm bao nhiêu storage?" | 1024 dim × 4 byte = 4KB/vector. 1 triệu phản hồi = ~4GB cho vector + index. Nhỏ so với CRM data thông thường. | | "Có cần GPU không?" | Embedding model chạy CPU vẫn được (Ollama mặc định). GPU tăng tốc 5-10x. Indexing và search trên SQL Server **không cần GPU**. | | "Tại sao không dùng vector DB chuyên dụng như Pinecone?" | (1) Dữ liệu phải đẩy ra ngoài. (2) Phải sync vector ↔ business data. (3) Mất tính transactional. (4) Thêm vendor, thêm chi phí. (5) Đội phải học stack mới. | | "Còn rủi ro vendor lock-in với Microsoft?" | Vector data type follow standards SQL. Có thể migrate sang Postgres+pgvector. Embedding model là open-source standard, không phụ thuộc Microsoft. | | "Demo này có chạy trên SQL Server 2025 production thật không?" | Hôm nay chạy nhánh fallback trên SQL Server 2022 Express vì SQL 2025 đang ở Preview. Code 2025 (folder `sql/00-08`) đã viết sẵn, switch sang khi 2025 GA hoặc Azure SQL bật tính năng. | --- ## Fallback khi demo gặp sự cố | Sự cố | Cứu nhanh | |---|---| | Search trả 0 row | Tăng **Days** lên 3650, đổi câu hỏi ngắn gọn hơn | | Search báo lỗi connection Ollama | Mở terminal 2: `Start-Process ollama -ArgumentList 'serve'`, restart UI | | Sidebar hiển thị `...` | API overview lỗi — chạy lại script restart UI ở phần Chuẩn bị | | Modal Vector lỗi "JSON" | Lỗi cũ đã fix, restart UI | | Toàn bộ UI trắng | Check process `py.exe` còn chạy không; nếu chết, restart | --- ## Mở rộng nếu còn thời gian (2-3 phút) **5a — So sánh giữa SQL Server 2025 và fallback 2022:** Mở `sql/05_create_vector_index.sql`: ```sql CREATE VECTOR INDEX IX_CustomerFeedback_Embedding ON dbo.CustomerFeedback(Embedding) USING DISKANN METRIC COSINE; SELECT TOP (10) FeedbackId, Product, FeedbackText FROM VECTOR_SEARCH( TABLE = dbo.CustomerFeedback AS f, COLUMN = Embedding, SIMILAR_TO = AI_GENERATE_EMBEDDINGS('khách bị trừ tiền' USE MODEL LocalEmbeddingModel), METRIC = 'cosine', TOP_N = 10 ) WITH APPROXIMATE; ``` > "Đây là cú pháp SQL Server 2025 production. Một câu T-SQL = embed query + ANN search + filter — không có code Python, không có HTTP call thêm." **5b — Pipeline scale lên data thật:** > "Trên một core banking 5 triệu phản hồi/năm, kế hoạch triển khai: > - Tuần 1: Cài SQL 2025, tạo schema vector, sinh embedding lần đầu (~6 giờ batch). > - Tuần 2: Tích hợp với CDC để embed incremental cho phản hồi mới. > - Tuần 3: Tích hợp dashboard nghiệp vụ, training đội. > - Go-live trong 1 tháng." --- ## Slide gợi ý (nếu cần) | # | Tiêu đề | Visual | |---|---|---| | 1 | Vấn đề cổ đông đặt ra | Hình minh họa: helpdesk inbox tràn ngập | | 2 | Vì sao không thể dùng OpenAI | Sơ đồ: data rời firewall = risk | | 3 | Kiến trúc demo | Diagram đã có trong README | | 4 | Live demo | (đây là phần script trên) | | 5 | Chi phí so sánh | Bảng: Pinecone/Weaviate vs Native SQL | | 6 | Roadmap triển khai | Timeline 1 tháng | | 7 | Q&A | (đã chuẩn bị câu trả lời trên) |