+13

Đừng lạc lối nữa! Azure Cognitive Search sẽ giúp bạn tìm đúng những gì bạn đang tìm kiếm

Mở đầu

Azure là một nền tảng đám mây thông minh, do chính Microsoft phát triển. Gần đây thì nó không còn là một khái niệm mới nữa mà đã và đang được ứng dụng rất rộng rãi trong các doanh nghiệp rồi.

Với Azure, bạn có thể biến Cloud thành "ngôi nhà thứ hai" cho ứng dụng và dịch vụ của bạn. Nó cung cấp cho bạn một cách thức dễ dàng để lưu trữ, xử lý và quản lý dữ liệu của mình. Tưởng tượng rằng Azure là một người bạn đồng hành đáng tin cậy trong cuộc sống kỹ thuật số của bạn. Bạn có thể tận dụng các dịch vụ đa dạng của Azure, từ tính toán đám mây, lưu trữ, cơ sở dữ liệu cho đến trí tuệ nhân tạo và IoT. Nó giúp bạn xây dựng các ứng dụng thông minh, phân tích dữ liệu, ...

Sự phổ biến của Azure ngày càng tăng lên do những lợi ích và tính ứng dụng của nó. Có thể kể tới một số điểm nổi bật về sự phổ biến và tính ứng dụng của Azure hiện tại:

  • Đa dạng dịch vụ: Azure cung cấp hơn 200 dịch vụ cloud khác nhau, bao gồm lưu trữ, tính toán, cơ sở dữ liệu, trí tuệ nhân tạo, IoT, phân tích dữ liệu và nhiều hơn nữa. Điều này cho phép người dùng tùy chỉnh và chọn lựa các dịch vụ phù hợp với nhu cầu của họ.
  • Linh hoạt và mở rộng: Azure cung cấp khả năng mở rộng linh hoạt, cho phép người dùng tăng hoặc giảm quy mô của ứng dụng và dịch vụ một cách dễ dàng. Người dùng có thể điều chỉnh tài nguyên theo nhu cầu thực tế để tiết kiệm chi phí và tối ưu hiệu suất.
  • Bảo mật và tuân thủ quy định: Azure đảm bảo bảo mật mạnh mẽ và tuân thủ các quy định và tiêu chuẩn bảo mật quan trọng như GDPR, HIPAA và ISO. Điều này giúp người dùng tin tưởng và đảm bảo an toàn cho dữ liệu và ứng dụng của họ.
  • Hỗ trợ đa nền tảng: Azure hỗ trợ nhiều ngôn ngữ lập trình, khung phát triển và hệ điều hành khác nhau. Người dùng có thể phát triển và triển khai ứng dụng trên nền tảng của họ một cách dễ dàng và linh hoạt.
  • Tích hợp công nghệ mới: Azure liên tục cung cấp tích hợp với các công nghệ mới như trí tuệ nhân tạo, học máy, IoT và blockchain. Điều này giúp người dùng tận dụng các công nghệ tiên tiến để phát triển các ứng dụng thông minh và tiên tiến.

Về Azure, có lẽ mình sẽ có một bài viết chi tiết hơn trong tương lai. Như tiêu đề bài viết, chúng ta sẽ trọng tâm tìm hiểu về Azure Cognitive Search - một giải pháp mạnh mẽ cho hệ thống tìm kiếm dữ liệu. Azure Cognitve Search là một trong những công cụ Search Engine mạnh mẽ và có tính ứng dụng rộng rãi nhất hiện nay. Trước đó các bạn có thể đọc thêm mộ số thông tin và Search Engine và Vector Database của tác giả Bùi Quang Mạnh để hiểu hơn về nền tảng phương pháp. Chúng ta bắt tay vào thôi nhỉ

Azure Cognitive Search không phải chỉ mỗi search?

Azure Cognitive Search (hay trước đây được biết đến với cái tên Azure Search) là cloud search service, nhưng nó không đơn thuần chỉ tìm kiếm thôi đâu.

  • Tiêu đề giật vậy thôi nhưng các bạn cũng cần nắm được 2 khả năng cơ bản mà Azure Cognitive Search cung cấp cho ta, đó là indexing (đánh chỉ mục, hay chính là cách thức ta upload dữ liệu lên thế nào để search) và querying (chính là cái search mà chúng ta đang nói ở đây) data (vậy là không chỉ mỗi search nhé)
  • Có khả năng tìm kiếm thông minh: nó sử dụng các kỹ thuật và thuật toán Ai để cung cấp các tinh năng tìm kiếm thông minh như Semantic search, NLP, suggestions, classification, sentiment analysis và còn hỗ trợ tìm kiếm dữ liệu bằng tiếng Việt, tiếng Anh và nhiều ngôn ngữ khác. Điều này giúp cải thiện trải nghiệm tìm kiếm của người dùng và tăng tính tương tác
  • Quản lý dữ liệu phong phú: Azure cognitive search hỗ trợ nhiều nguồn dữ liệu phong phú như cơ sở dữ liệu SQL, Azure Blob Storage, Azure Table Storage, MongoDB, và nhiều nguồn dữ liệu khác. Điều này cho phép bạn tổ chức, xử lý và tìm kiếm thông tin từ nhiều nguồn dữ liệu khác nhau trong một hệ thống tìm kiếm duy nhất.

Ngoài ra thì còn rất nhiều ưu điểm to lớn của nó như tích hợp dễ dàng với các dịch vụ công nghệ khác của Azure, cung cấp khả năng mở rộng linh hoạt, có tính tin cậy và an toàn cao, ....

Vậy chúng ta sẽ chia ra làm 2 phần lớn là Indexing và Searching để cùng tìm hiểu nhé ^^

Indexing trong Azure Cognitive Search

Mới nghe tên chắc mọi người sẽ hơi lạ lẫm, nhưng dân dã một chút cho dễ hiểu thì nếu compare với database chúng ta hay làm việc thì sẽ như sau:

  • index ~ table: Nó đại diện cho một tập hợp các documents có cấu trúc tương tự nhau. Mỗi index chứa thông tin về cấu trúc của các tài liệu, bao gồm các trường (fields) và kiểu dữ liệu của chúng.
  • document ~ row: Mỗi document trong Azure Cognitive Search biểu diễn một đối tượng đơn lẻ hoặc một tài liệu trong hệ thống tìm kiếm. Mỗi document có thể chứa các trường (fields) chứa dữ liệu cụ thể.

Cái này thì làm việc mình thấy nó tương đương thôi chứ không lấy từ tài liệu nào cả :v. Một điều đặc biệt khác là cấu trúc mỗi index sẽ gồm các fields (lại khá giống table mà). Mình có một ví dụ về config fields bằng Python ở đây

fields = [
    SimpleField(name="id", type=SearchFieldDataType.String, key=True, sortable=True, filterable=True, facetable=True),
    SimpleField(name="file_id", type=SearchFieldDataType.String),
    SimpleField(name="vector_id", type=SearchFieldDataType.String),
    SearchableField(name="content", type=SearchFieldDataType.String, analyzer_name="vi.microsoft"),
    SearchField(name="embedding", type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
                searchable=True, vector_search_dimensions=1536, vector_search_profile="myHnswProfile"),
]

Ý Nghĩa của các trường định dạng như SimpleField hay SearchableField các bạn có thể đọc thêm tại đây. Nếu dùng cơ bản thì chắc mình chỉ quan tâm một số fields là Simple Field, SearchableField, SearchField - nghe tên chắc các bạn cũng hiểu phần nào ý nghĩa, chúng ta cần cấu hình để search engine biết những trường nào có thể search và không. Bên trong các fields sẽ gồm các thông tin bắt buộc như tên hay kiểu dữ liệu truyền vào để dễ dàng Validate

Bên cạnh việc định nghĩ các fields, thì chúng ta cùng cần quan tâm tới việc cấu hình cho thuật toán search của mình. Hiện tại Azure Cognitive Search đang hỗ trợ 4 phương thức search:

  • full-text search: Hiểu đơn giản là nó sẽ đánh chỉ mục các documents, sau đó với text query (có sử dụng kèm syntax mà mình sẽ nói ở phần dưới) thì Azure Cognitive Search sẽ tìm kiếm các document phù hợp với text query đó
  • vector search: Cái này chắc mọi người quen thuộc, chính là tính độ tương đồng giữa vector_query và các vector trong documents và ranking chúng
  • hybrid search: kết hợp full-text search và vector search. Ban đầu mình cứ nghĩ là tư tưởng sẽ kiểu dùng vector search trước sau đó dùng full-text search để filter kết quả, nhưng thử nghiệm mới vỡ lẽ, mỗi mội phương pháp search sẽ cho ra một chỉ số đánh giá, sau đó 2 chỉ số này sẽ được kết hợp lại để ranking việc search
  • semantic ranking: một phương pháp nghe ý tưởng khá xịn nhưng mình chưa có thời gian thử, phương pháp dựa trên phân tích ngữ nghĩa để cải thiện việc xếp hạng kết quả tìm kiếm. Nó sử dụng mô hình NLP để hiểu ý nghĩa của truy vấn và dữ liệu, kiểu như bạn search liên quan đến từ "con trai" thì nó sẽ hiểu bao gồm cả "đàn ông, nam thanh niên, ..." chẳng hạn

Thuật toán tìm kiếm trong Azure Cognitive Search

Hiện tại Azure Cognitive Search đang hỗ trợ 2 thuật toán tìm kiếm:

  • Hierarchical Navigable Small World (HNSW):
    • HNSW là một thuật toán tìm kiếm gần nhất (nearest neighbor) hiệu quả cho các dữ liệu có số chiều lớn.
    • Thuật toán xây dựng một cấu trúc cây phân cấp để lưu trữ các điểm dữ liệu và tìm kiếm gần nhất. Cấu trúc cây này giúp giảm độ phức tạp của việc tìm kiếm trong không gian lớn.
    • HNSW có thể xử lý các truy vấn tìm kiếm nhanh chóng và phù hợp với các trường hợp có dữ liệu có kích thước lớn và không gian tìm kiếm phức tạp.
  • Exhaustive K-nearest neighbors (KNN):
    • KNN là một thuật toán tìm kiếm gần nhất truyền thống, nó tìm kiếm các điểm gần nhất dựa trên độ đo khoảng cách.
    • Thuật toán KNN tính toán khoảng cách từ điểm tìm kiếm đến tất cả các điểm dữ liệu trong tập dữ liệu. Sau đó, nó chọn ra k điểm gần nhất dựa trên khoảng cách và trả về kết quả.
    • KNN là một thuật toán đơn giản và dễ hiểu, phù hợp với các tập dữ liệu nhỏ và không yêu cầu thời gian phản hồi nhanh.

Các bạn có thể xem đoạn code config dưới đây để hình dung rõ hơn về config 2 thuật toán này trong Azure Cognitive Search

vector_search = VectorSearch(
    algorithms=[
        HnswVectorSearchAlgorithmConfiguration(
            name="myHnsw",
            kind=VectorSearchAlgorithmKind.HNSW,
            parameters=HnswParameters(
                m=4,
                ef_construction=400,
                ef_search=500,
                metric="cosine"
            )
        ),
        ExhaustiveKnnVectorSearchAlgorithmConfiguration(
            name="myExhaustiveKnn",
            kind=VectorSearchAlgorithmKind.EXHAUSTIVE_KNN,
            parameters=ExhaustiveKnnParameters(
                metric="cosine"
            )
        )
    ],
    profiles=[
        VectorSearchProfile(
            name="myHnswProfile",
            algorithm="myHnsw",
            vectorizer="myOpenAI"
        ),
        VectorSearchProfile(
            name="myExhaustiveKnnProfile",
            algorithm="myExhaustiveKnn",
            vectorizer="myOpenAI"
        )
    ],
    vectorizers=[
        AzureOpenAIVectorizer(
            name="myOpenAI",
            kind="azureOpenAI",
            azure_open_ai_parameters=AzureOpenAIParameters(
                resource_uri=os.getenv("AZURE_OPENAI_ENDPOINT"),
                deployment_id=model,
                api_key=os.getenv("AZURE_OPENAI_API_KEY")
            )
    )  
]  
)

Tạo dữ liệu để Search

Khởi tạo Index

Với các config mình đã giới thiệu bên trên như Fields hay Search vector algorithm thì một đoạn mã khởi tạo Index khá dễ hiểu sẽ như sau

from azure.core.credentials import AzureKeyCredential  
from azure.search.documents.indexes.models import SearchIndex, VectorSearch
from azure.search.documents.indexes import SearchIndexClient  

credential = AzureKeyCredential(os.getenv("AZURE_SEARCH_ADMIN_KEY"))

index_client = SearchIndexClient(endpoint=service_endpoint, credential=credential)

fields = [...]
vector_search = VectorSearch(...)

# Create the search index with the semantic settings
index = SearchIndex(name=index_name, 
                    fields=fields,
                    vector_search=vector_search)
result = index_client.create_or_update_index(index)
print(f' {result.name} created')

Bạn có thể test lại xem index của mình đã tạo thành công chưa bằng cách liệt kê các indexes đang có

from azure.search.documents.indexes import SearchIndexClient  

index_client = SearchIndexClient(
    endpoint=service_endpoint, credential=credential)
# Get the list of indexes
indexes = index_client.list_indexes()
# Print the index names
for index in indexes:
    print(index.name)

Đẩy dữ liệu lên

Như đã định nghĩa các Fields ở trên thì dữ liệu chúng ta đẩy lên dưới dạng JSON cũng sẽ cần có các key theo đúng như Fields chúng ta đã định nghĩa, các bạn có thể xem đoạn code sau để tiện hình dung

from azure.search.documents import SearchClient

sample_input_data = [
    {
        "id": "1",
        "file_id": "1a",
        "vector_id": "1ab",
        "content": "This is content 1",
        "embedding": [0.1]*1536
    },
    {
        "id": "2",
        "file_id": "2a",
        "vector_id": "2ab",
        "content": "This is content 2",
        "embedding": [0.2]*1536
    },
    ...
]

search_client = SearchClient(endpoint=service_endpoint, index_name=index_name, credential=credential)
result = search_client.upload_documents(sample_input_data)
print(f"Uploaded {len(sample_input_data)} documents") 

Query syntax trong Cognitive Search

Simple query syntax

  • Simple Query Syntax là một cú pháp dễ sử dụng hơn và thường được sử dụng cho truy vấn cơ bản.
  • Cú pháp này cho phép bạn sử dụng các toán tử cơ bản như AND, OR, NOT, "+", "|" hay "-".
  • Ví dụ: Nếu bạn muốn tìm kiếm các văn bản chứa từ "Azure" và "Cognitive Search", bạn có thể sử dụng truy vấn "Azure AND Cognitive Search" hay "Azure +"Cognitive Search"" (chú ý dấu "+" sát từ tìm kiếm và có "" bổ trợ nếu đó là một cụm từ).
  • Simple Query Syntax hạn chế hơn so với Full Lucene Syntax và không cho phép tùy chỉnh chi tiết hơn của truy vấn.

Full Lucene query syntax

  • Full Lucene Syntax là một cú pháp mạnh mẽ hơn và linh hoạt hơn cho truy vấn tìm kiếm.
  • Cú pháp này cho phép bạn sử dụng các truy vấn phức tạp hơn bằng cách sử dụng các trường khác nhau, tùy chọn độ chính xác, truy vấn dựa trên vị trí, truy vấn theo khoảng cách, và nhiều hơn nữa.
  • Ví dụ: Bạn có thể sử dụng cú pháp "title:Azure AND description:Cognitive Search" để tìm kiếm các tài liệu có từ "Azure" trong trường "title" và từ "Cognitive Search" trong trường "description".
  • Full Lucene Syntax cho phép bạn tùy chỉnh mức độ phù hợp, sắp xếp kết quả và thực hiện các truy vấn phức tạp hơn.

Mình có ví dụ một đoạn code tìm kiếm với Azure Cognitive Search ở dưới đây

from azure.search.documents import SearchClient

search_client = SearchClient(endpoint=service_endpoint, index_name=index_name, credential=credential)
    
search_query = ('+'.join([f'\"{i}\" ' for i in query_data.keywords]))

vectors = [
    RawVectorQuery(
        vector=embedding_vector,
        k=topk,
        fields='embedding',
    ),
]

results = search_client.search(
    search_text=search_query,
    vector_queries=vectors,
    select=['file_id', 'vector_id', 'content'],
    search_fields=['content'],
    top=topk,
    search_mode='all',
    query_language='vi-vn',
)

Ở ví dụ trên, mình sử dụng syntax query là dạng tìm các docs phải có tất cả các keywords, với simple query syntax (default). Ngoài ra các bạn có thể dùng dạng syntax như Lucene hoặc Semnatic bằng cách setting query_type. Các tham số của hàm search() bạn có thể đọc thêm tại đây

Có một chú ý nhỏ nữa là ở tham số search_mode='all', theo như docs mình đọc được thì nó có độ ưu tiên cao hơn với thằng query syntax. Tức là search_mode có 2 giá trị là allany, thằng all kiểu như nó sẽ try hard hơn, mình đặt syntax query như trên là tìm tất các các docs có đủ các keywords, nó sẽ tìm các docs thỏa mãn đó; còn nếu ta set search_mode='any', thì kết quả trả về nó sẽ "mềm hơn", đó là các docs chỉ cần có ít nhất 1 trong số các keywords là đã được trả về rồi, nên các bạn cần chú ý đoạn này. Các bạn có thể đọc thêm tại đây

References


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí