QuickStart và một vài cách custom nhanh giúp cải thiện Azure AI Search (phần 1)
Lời mở đầu
Với lượng dữ liệu ngày càng tăng, việc tìm kiếm và phân loại thông tin trở nên phức tạp hơn bao giờ hết. Azure AI Search là một dịch vụ tìm kiếm được cung cấp bởi Microsoft Azure, mang đến khả năng tìm kiếm thông tin mạnh mẽ và linh hoạt cho các ứng dụng và trang web.
Trong bài chia sẻ này, chúng ta sẽ khám phá cách sử dụng Azure AI Search để tìm kiếm và phân loại thông tin một cách nhanh chóng và chính xác. Chúng ta sẽ đi qua các khía cạnh quan trọng của dịch vụ này, từ việc xây dựng kho dữ liệu cho đến việc thực hiện tìm kiếm trên dịch vụ. Kèm theo là một số mẹo tùy chỉnh giúp gia tăng hiệu quả cho quá trình searching.
Nội dung
1. Giới thiệu chung
Azure AI Search cung cấp khả năng truy xuất thông tin an toàn trên quy mô lớn đối với nội dung do người dùng upload lên.
Có 2 công việc chính trên Azure AI Search là Indexing và Querying:
- Indexing (lập chỉ mục) là một quá trình tiếp nhận tải nội dung vào dịch vụ tìm kiếm của bạn và làm cho nội dung đó có thể tìm kiếm được. Định dạng tài liệu mà Azure AI Search có thể lập chỉ mục là. JSON. Bạn có thể tải lên các tài liệu JSON mà bạn đã tập hợp hoặc sử dụng trình lập chỉ mục để truy xuất dữ liệu của bạn thành JSON.
- Querying chỉ có thể thực hiện khi một chỉ mục được upload lên với nội dung Searchable. Khi bạn gửi yêu cầu truy vấn đến, dịch vụ sẽ tìm kiếm và xử lý các phản hồi. Tất cả việc thực hiện truy vấn đều diễn ra trên chỉ mục tìm kiếm mà bạn hoàn toàn kiểm soát các nội dung.
Nhưng trước khi thực hiện 2 công việc trên, chúng ta cần khởi tạo client trước để có thể giao tiếp với Azure AI Search. Như bao dịch vụ khác của azure, chúng ta sẽ cần có key và endpoint để khởi tạo client. Sau đây là code tham khảo:
from azure.core.credentials import AzureKeyCredential
from azure.search.documents.indexes import SearchIndexClient
credential = AzureKeyCredential(azure_search_key)
search_client = SearchIndexClient(
endpoint=azure_search_endpoint,
credential=credential,
)
Sau khi đã có client, chúng ta sẽ đi luôn vào chi tiết việc thực hiện 2 công việc trên.
2. Indexing
2.1. Khởi tạo index
Đầu tiên, để đẩy được dữ liệu lên index (chỉ mục) thì chúng ta sẽ cần khởi tạo index trước. Khởi tạo index có thể hiểu là công việc khai báo các trường trong index, trọng số giữa các trường, các tham số trong hàm tính, ... Khai báo trọng số và tham số là optional, nếu không quá cần đào sâu vào bên trong, bạn có thể để mặc định các giá trị ban đầu được set bởi Azure.
Dưới đây là một đoạn code ví dụ đơn giản cho việc khai báo các trường và khởi tạo index:
from azure.search.documents.indexes.models import SearchableField
from azure.search.documents.indexes.models import SearchIndex
from azure.search.documents.indexes.models import SimpleField
fields = [
SimpleField(name='id', type=SearchFieldDataType.String, key=True, sortable=True, filterable=True, facetable=True),
SimpleField(name='number', type=SearchFieldDataType.Int64),
SearchableField(name='text', type=SearchFieldDataType.String, analyzer_name='vi.microsoft'),
]
index = SearchIndex(
name=index_name,
fields=fields,
)
search_client.create_or_update_index(index)
Trong các trường được khai báo, có thể hiểu là sẽ có 2 loại chính:
- Trường với mục đích lưu trữ thông tin, không dùng để search. Những trường này sẽ được sử dụng đến sau khi dữ liệu đã được truy vấn ra từ Azure Search.
- Trường dùng để search: Khi bạn thực hiện 1 câu truy vấn để tìm kiếm 1 thông tin nào đó, việc searching sẽ được thực hiện trên những dữ liệu được lưu trong trường này để tìm ra kết quả khớp nhất với câu truy vấn.
Việc phân chia ra các trường như trên sẽ giúp bạn quản lý dữ liệu tốt hơn, vừa có thể dùng Azure Search như 1 Database lưu trữ dữ liệu vừa không sợ các trường không liên quan ảnh hưởng đến kết quả search.
Scoring Profile
Trong trường hợp chúng ta có nhiều trường được khởi tạo là SearchableField, nếu chung ta không khai báo gì thêm, quá trình search sẽ được thực hiện trên tất cả các trường, sau đó tổng hợp lại để cho ra search score cuối cùng. Ở quá trình tổng hợp kết quả, trọng số mặc định cho tất cả các trường sẽ đều là 1.
Để tinh chỉnh trọng số cho từng trường, ưu tiên một trường nào hơn, chúng ta sẽ cần khai báo ngay từ khi khởi tạo index bằng việc thêm Scoring Profile. Sau đây là một ví dụ:
from azure.search.documents.indexes.models import ScoringProfile
scoring_profile = ScoringProfile(
name='my_scoring_profile',
text_weights=TextWeights(
weights={'summary': 3, 'text': 1},
),
)
index.scoring_profiles = [scoring_profile]
"summary" và "text" là tên 2 trường SearchableField trong index.
Chúng ta hoàn toàn có thể thêm nhiều scoring_profile với những trọng số khác nhau để thử nghiệm và khi searching sẽ thiết lập tên scoring_profile mà chúng ta cần sử dụng.
2.2. Upload dữ liệu lên index
Sau khi đã có index, chúng ta sẽ tiến hành upload dữ liệu lên theo đúng các trường đã được khai báo. Trước tiên cần khởi tạo lại client, lí do là vì cần phải khai báo thêm tên index chúng ta cần tương tác do trong Azure Search có thể có nhiều index khác nhau.
search_client = earchClient(
endpoint=azure_search_endpoint,
index_name=index_name,
credential=credential,
)
Tiếp theo chỉ cần khởi tạo một dictionary với đầy đủ các trường của index và upload qua client là được. Đây là một ví dụ đơn giản:
document_upload = {
'id': str(uuid.uuid4()),
'number': number,
'text': f'Đây là nội dung số {number}',
}
search_client.upload_documents(document_upload)
Thực hiện bước này với toàn bộ dữ liệu là chúng ta đã hoàn thành công việc đầu tiên Indexing. Sau đó có thế chuyển sang bước tiếp theo là Querying. Kết quả của bước này sẽ là 1 list các dictionary như chúng ta upload ở trên, kèm theo đó là các thông tin bổ sung về quá trình search như search_score.
Tạm kết
Ở phần trên tôi đã giới thiệu sơ lược về Azure AI Search và công việc đầu tiên khi làm việc với Azure AI Search là Indexing. Ở phần tiếp theo chúng ta sẽ đi vào Querying: những cách truy xuất dữ liệu và một số mẹo tối ưu chúng. Rất hi vọng sẽ tiếp tục được mọi người đón đọc.
References
All rights reserved