Skip to content
Lesson 8/12 · Generative AI cho người mới bắt đầu (Microsoft)

Xây ứng dụng tìm kiếm

Tìm kiếm ngữ nghĩa khác tìm kiếm từ khoá thế nào, text embedding là gì, cách tạo chỉ mục embedding và tìm bằng cosine similarity.

This content is currently available in Vietnamese only.

Beginner@shine19048 min read

LLM không chỉ dùng cho chatbot và sinh văn bản. Bạn còn có thể xây ứng dụng tìm kiếm bằng embedding. Embedding là biểu diễn dạng số của dữ liệu, còn gọi là vector, và có thể dùng để tìm kiếm ngữ nghĩa trên dữ liệu.

Video bài học (tiếng Anh): xem trên YouTube.

Trong bài này, bạn sẽ xây một ứng dụng tìm kiếm cho startup giáo dục của chúng ta. Startup là một tổ chức phi lợi nhuận cung cấp giáo dục miễn phí cho học sinh ở các nước đang phát triển. Startup có rất nhiều video YouTube để học sinh học về AI, và muốn xây ứng dụng tìm kiếm cho phép học sinh tìm video bằng cách gõ một câu hỏi.

Ví dụ, học sinh có thể gõ 'What are Jupyter Notebooks?' hoặc 'What is Azure ML', và ứng dụng sẽ trả về danh sách video YouTube liên quan tới câu hỏi; tốt hơn nữa, ứng dụng trả về link tới đúng vị trí trong video chứa câu trả lời.

Giới thiệu

Bài này gồm:

  • Tìm kiếm ngữ nghĩa và tìm kiếm từ khoá.
  • Text embedding là gì.
  • Tạo chỉ mục text embedding.
  • Tìm kiếm trên chỉ mục text embedding.

Mục tiêu học tập

Sau bài này, bạn sẽ có thể:

  • Phân biệt tìm kiếm ngữ nghĩa và tìm kiếm từ khoá.
  • Giải thích text embedding là gì.
  • Tạo ứng dụng dùng embedding để tìm kiếm dữ liệu.

Vì sao xây ứng dụng tìm kiếm?

Xây ứng dụng tìm kiếm giúp bạn hiểu cách dùng embedding để tìm dữ liệu, đồng thời học cách xây một ứng dụng mà học sinh dùng để tìm thông tin nhanh.

Bài học có kèm một chỉ mục embedding (Embedding Index) của bản chép lời các video trên kênh YouTube AI Show của Microsoft, kênh dạy về AI và machine learning. Chỉ mục chứa embedding cho từng bản chép lời video tính tới tháng 10/2023. Bạn sẽ dùng chỉ mục này để xây ứng dụng tìm kiếm cho startup. Ứng dụng trả về link tới vị trí trong video chứa câu trả lời, một cách tuyệt vời để học sinh tìm nhanh thông tin cần thiết.

Dưới đây là ví dụ một truy vấn ngữ nghĩa cho câu hỏi 'can you use rstudio with azure ml?'. Hãy xem URL YouTube: nó chứa mốc thời gian đưa bạn tới đúng chỗ trong video có câu trả lời.

Truy vấn ngữ nghĩa cho câu hỏi "can you use rstudio with Azure ML"

Tìm kiếm ngữ nghĩa là gì?

Tìm kiếm ngữ nghĩa (semantic search) là kỹ thuật tìm kiếm dùng ngữ nghĩa, tức ý nghĩa, của các từ trong truy vấn để trả về kết quả liên quan.

Ví dụ: bạn đang muốn mua xe và tìm 'my dream car'. Tìm kiếm ngữ nghĩa hiểu rằng bạn không mơ về một chiếc xe, mà đang tìm mua chiếc xe lý tưởng. Nó hiểu ý định của bạn và trả về kết quả liên quan. Cách còn lại là tìm kiếm từ khoá (keyword search), sẽ tìm theo nghĩa đen những giấc mơ về xe và thường trả về kết quả không liên quan.

Text embedding là gì?

Text embedding là kỹ thuật biểu diễn văn bản dùng trong xử lý ngôn ngữ tự nhiên. Text embedding là biểu diễn dạng số mang ngữ nghĩa của văn bản, giúp máy dễ hiểu dữ liệu. Có nhiều model để tạo text embedding; trong bài này, chúng ta tập trung vào sinh embedding bằng OpenAI Embedding Model.

Ví dụ, giả sử đoạn văn sau nằm trong bản chép lời một tập của kênh AI Show:

text
Today we are going to learn about Azure Machine Learning.

Ta gửi đoạn văn tới OpenAI Embedding API và nó trả về embedding gồm 1536 con số, tức một vector. Mỗi số trong vector biểu diễn một khía cạnh khác nhau của văn bản. Cho ngắn gọn, đây là 10 số đầu tiên:

python
[-0.006655829958617687, 0.0026128944009542465, 0.008792596869170666, -0.02446001023054123, -0.008540431968867779, 0.022071078419685364, -0.010703742504119873, 0.003311325330287218, -0.011632772162556648, -0.02187200076878071, ...]

Chỉ mục embedding được tạo thế nào?

Chỉ mục embedding của bài được tạo bằng một loạt script Python. Script và hướng dẫn nằm trong README ở thư mục scripts của bài. Bạn không cần chạy các script này để hoàn thành bài, vì chỉ mục đã có sẵn.

Các script làm những việc sau:

  1. Tải bản chép lời của từng video trong playlist AI Show.
  2. Dùng OpenAI Functions để thử trích tên người nói từ 3 phút đầu của bản chép lời. Tên người nói của mỗi video được lưu trong chỉ mục embedding_index_3m.json.
  3. Văn bản chép lời được chia thành các đoạn 3 phút. Mỗi đoạn gồm khoảng 20 từ chồng lấn với đoạn kế tiếp, để embedding của đoạn không bị cắt cụt và cho ngữ cảnh tìm kiếm tốt hơn.
  4. Mỗi đoạn văn bản được gửi tới OpenAI Chat API để tóm tắt thành 60 từ. Bản tóm tắt cũng được lưu trong chỉ mục embedding_index_3m.json.
  5. Cuối cùng, đoạn văn bản được gửi tới OpenAI Embedding API. API trả về vector 1536 số biểu diễn ý nghĩa của đoạn. Đoạn văn cùng vector embedding được lưu trong chỉ mục embedding_index_3m.json.

Cơ sở dữ liệu vector

Để bài học đơn giản, chỉ mục embedding được lưu trong file JSON embedding_index_3m.json và nạp vào một Pandas DataFrame. Tuy nhiên, trong production, chỉ mục sẽ được lưu trong một cơ sở dữ liệu vector (vector database) như Azure Cognitive Search, Redis, Pinecone, Weaviate và nhiều lựa chọn khác.

Hiểu cosine similarity

Đã biết text embedding, bước tiếp theo là học cách dùng nó để tìm dữ liệu, cụ thể là tìm các embedding giống nhất với một truy vấn bằng cosine similarity.

Cosine similarity là gì?

Cosine similarity là thước đo độ tương đồng giữa hai vector; bạn cũng sẽ nghe gọi là nearest neighbor search (tìm láng giềng gần nhất). Để tìm theo cosine similarity, bạn cần vector hoá văn bản truy vấn bằng OpenAI Embedding API. Sau đó tính cosine similarity giữa vector truy vấn và từng vector trong chỉ mục. Nhớ rằng chỉ mục có một vector cho mỗi đoạn chép lời video. Cuối cùng, sắp xếp kết quả theo cosine similarity: các đoạn có cosine similarity cao nhất là giống truy vấn nhất.

Về mặt toán học, cosine similarity đo cosin của góc giữa hai vector trong không gian nhiều chiều. Phép đo này hữu ích vì nếu hai tài liệu cách xa nhau theo khoảng cách Euclid do khác kích thước, chúng vẫn có thể có góc nhỏ hơn và do đó cosine similarity cao hơn. Xem thêm công thức tại Cosine similarity.

Xây ứng dụng tìm kiếm đầu tiên

Tiếp theo, chúng ta học cách xây ứng dụng tìm kiếm bằng embedding. Ứng dụng cho phép học sinh tìm video bằng cách gõ câu hỏi, trả về danh sách video liên quan và link tới vị trí trong video chứa câu trả lời.

Giải pháp được xây và kiểm thử trên Windows 11, macOS và Ubuntu 22.04 với Python 3.10 trở lên. Bạn có thể tải Python tại python.org.

Bài tập: xây ứng dụng tìm kiếm cho học sinh

Startup đã được giới thiệu ở đầu bài. Giờ là lúc giúp học sinh xây ứng dụng tìm kiếm cho bài đánh giá của mình.

Trong bài tập này, bạn tạo các dịch vụ Azure OpenAI dùng để xây ứng dụng tìm kiếm. Bạn cần một subscription Azure để hoàn thành.

Mở Azure Cloud Shell

  1. Đăng nhập Azure portal.
  2. Chọn biểu tượng Cloud Shell ở góc trên bên phải Azure portal.
  3. Chọn Bash làm loại môi trường.

Tạo resource group

Hướng dẫn này dùng resource group tên "semantic-video-search" ở East US. Bạn có thể đổi tên resource group, nhưng khi đổi vị trí của resource, hãy kiểm tra bảng model khả dụng.

shell
az group create --name semantic-video-search --location eastus

Tạo resource Azure OpenAI Service

Trong Azure Cloud Shell, chạy lệnh sau để tạo resource Azure OpenAI Service:

shell
az cognitiveservices account create --name semantic-video-openai --resource-group semantic-video-search \
    --location eastus --kind OpenAI --sku s0

Lấy endpoint và key cho ứng dụng

Trong Azure Cloud Shell, chạy các lệnh sau để lấy endpoint và key của resource Azure OpenAI Service:

shell
az cognitiveservices account show --name semantic-video-openai \
   --resource-group  semantic-video-search | jq -r .properties.endpoint
az cognitiveservices account keys list --name semantic-video-openai \
   --resource-group semantic-video-search | jq -r .key1

Triển khai model OpenAI Embedding

Trong Azure Cloud Shell, chạy lệnh sau để triển khai (deploy) model OpenAI Embedding:

shell
az cognitiveservices account deployment create \
    --name semantic-video-openai \
    --resource-group  semantic-video-search \
    --deployment-name text-embedding-ada-002 \
    --model-name text-embedding-ada-002 \
    --model-version "2"  \
    --model-format OpenAI \
    --sku-capacity 100 --sku-name "Standard"

Lời giải

Mở notebook lời giải trong GitHub Codespaces và làm theo hướng dẫn trong Jupyter Notebook.

Khi chạy notebook, bạn sẽ được yêu cầu nhập truy vấn. Ô nhập trông như sau:

Ô nhập để người dùng gõ truy vấn

Bài tiếp theo: Tích hợp function calling.

Nguồn