Milvus 2.6 中的詞組配對(Phrase Match with Slop):如何提高詞組層級的全文檢索準確度
隨著非結構化資料持續爆炸性成長,以及 AI 模型不斷變得更聰明,向量搜尋已成為許多 AI 系統 - RAG pipelines、AI 搜尋、代理、推薦引擎等的預設檢索層。它之所以有效,是因為它能捕捉意義:不僅是使用者輸入的字詞,還有字詞背後的意圖。
然而,一旦這些應用程式進入生產階段,團隊往往會發現語意理解只是擷取問題的其中一面。許多工作負載還依賴於嚴格的文字規則,例如匹配精確的術語、保留字序或識別具有技術、法律或操作意義的詞組。
Milvus 2.6透過直接在向量資料庫中引入原生全文搜尋,消除了這種分割。有了內建於核心引擎的標記與位置索引,Milvus 可以解釋查詢的語意,同時強制執行精確的關鍵字與短語層級限制。其結果是一個統一的檢索管道,在這個管道中,意義與結構會互相強化,而不是活在獨立的系統中。
詞組匹配(Phrase Match)是這種全文檢索功能的關鍵部分。它可辨識按順序一起出現的詞彙序列,這對於檢測日誌模式、錯誤簽署、產品名稱,以及任何由文字順序定義意義的文字都非常重要。在這篇文章中,我們將解釋Phrase Match 如何在Milvus 中運作,slop 如何增加真實世界文字所需的靈活性,以及為什麼這些功能讓向量-全文混合搜尋不僅成為可能,而且在單一資料庫中非常實用。
什麼是短語匹配?
短語匹配 (Phrase Match) 是 Milvus 中的一種全文查詢類型,它著重於結構,具體來說,就是一連串的單字是否以相同的順序出現在文件中。當不允許任何彈性時,查詢會嚴格執行:詞彙必須依序出現在彼此旁邊。因此,像「機器人機器學習」這樣的查詢只有在這三個字以連續短語的形式出現時才會匹配。
問題在於真實的文字很少有如此整齊的表現。自然語言會帶來雜訊:額外的形容詞會溜進來、日誌會重新排列欄位、產品名稱會增加修飾詞,而且人類作者在撰寫時並沒有考慮到查詢引擎。嚴格的詞組匹配很容易就會破壞--插入一個字、重寫一個詞或調換一個詞都可能造成遺漏。而在許多人工智能系統中,尤其是面對生產的系統,遺漏相關的日誌行或規則觸發短語是不可接受的。
Milvus 2.6 藉由一個簡單的機制來解決這個問題:滯後。Slop 定義了查詢字詞之間允許的迴旋空間。Slop 讓您決定是否可以容忍多出一個字,或是兩個字,甚至是輕微的重新排序是否仍算匹配,而不是將一個短語視為脆而不靈活的。這讓詞組搜尋從二進制的通過與否測試,轉變成可控制、可調整的檢索工具。
要瞭解這一點的重要性,試想一下搜尋日誌中所有熟悉的網路錯誤「連線被對等重設」的變體。實際上,您的記錄可能會如下所示:
connection reset by peer
connection fast reset by peer
connection was suddenly reset by the peer
peer reset connection by ...
peer unexpected connection reset happened
驟眼看來,所有這些都代表相同的基本事件。但一般的擷取方法卻很吃力:
BM25 在結構上有困難。
它將查詢視為一袋關鍵字,而忽略它們出現的順序。只要「連結」和「對等」在某處出現,BM25 就可能將文件排在很高的位置 - 即使這個詞組是相反的或與您實際要搜尋的概念無關。
矢量搜尋在限制條件下掙扎。
嵌入式最擅長捕捉意義和語義關係,但卻無法強制執行「這些字詞必須以這樣的順序出現」這樣的規則。您可能會擷取語意相關的訊息,但仍會遺漏調試或合規所需的確切結構模式。
詞組匹配填補了這兩種方法之間的缺口。透過使用slop,您可以精確指定可接受的變化程度:
slop = 0- 完全匹配(所有詞彙必須依序連續出現。)slop = 1- 允許多一個字(以單一插入詞涵蓋常見的自然語言變化。)slop = 2- 允許插入多個字(處理更具描述性或冗長的措辭。)slop = 3- 允許重新排序(支援排序顛倒或松散的詞組,這通常是真實文字中最難處理的情況。)
與其寄望於評分演算法「準確無誤」,您可以明確地宣告您的應用程式所需的結構容限。
短語匹配如何在 Milvus 中運作
Milvus 中的短語匹配由Tantivy搜尋引擎函式庫提供,在具有位置資訊的倒置索引之上實作。它不只是檢查詞彙是否出現在文件中,還會驗證它們是否以正確的順序出現,而且出現的距離在可控制的範圍內。
下圖說明了這個過程:
1.文件標記化(含位置)
當文件插入 Milvus 時,文本欄位會被分析器處理,分析器會將文本分割成標記(單詞或術語),並記錄每個標記在文件中的位置。例如,doc_1 被標記為:machine (pos=0), learning (pos=1), boosts (pos=2), efficiency (pos=3).
2.建立反向索引
接下來,Milvus 會建立反向索引。倒置索引不是將文件映射到其內容,而是將每個符記映射到其出現的文件,以及該符記在每個文件中的所有記錄位置。
3.短語匹配
當執行短語查詢時,Milvus 首先使用倒置索引來識別包含所有查詢符記的文件。然後,它會比較標記的位置來驗證每個候選詞,以確保詞彙以正確的順序出現,並且在允許的slop 距離之內。只有滿足這兩個條件的文件才會被傳回作為匹配。
下圖總結了短語匹配的端對端工作方式。
如何在 Milvus 中啟用短語匹配
短語匹配在類型為 VARCHAR,Milvus 中的字串類型。要使用它,您必須配置您的收集模式,以便 Milvus 執行文字分析並儲存欄位的位置資訊。要做到這一點,需要啟用兩個參數:enable_analyzer 和enable_match 。
設定 enable_analyzer 和 enable_match
要為特定的 VARCHAR 欄位開啟短語匹配,在定義欄位模式時,將這兩個參數都設定為True 。它們一起告訴 Milvus
將文字標記化(透過
enable_analyzer),並且建立具有位置偏移的反向索引(透過
enable_match)。
短語匹配依賴於這兩個步驟:分析器將文字分解為標記,而匹配索引則儲存這些標記出現的位置,從而實現高效的短語和基於斜坡的查詢。
以下是在text 欄位上啟用短語匹配的模式配置範例:
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name=“id”,
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
schema.add_field(
field_name=‘text’, # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name=“embeddings”,
datatype=DataType.FLOAT_VECTOR,
dim=5
)
使用短語匹配進行搜尋:濫用如何影響候選集
一旦您在集合模式中啟用了 VARCHAR 欄位的匹配,您就可以使用PHRASE_MATCH 表達式執行短語匹配。
注意:PHRASE_MATCH 表達式不區分大小寫。您可以使用PHRASE_MATCH 或phrase_match 。
在搜尋作業中,詞組匹配通常應用在向量相似性排序之前。它首先根據明確的文字限制過濾文件,縮小候選集的範圍。然後使用向量內嵌對剩餘的文件重新排序。
下面的範例顯示了不同的slop 值如何影響這個過程。透過調整slop 參數,您可以直接控制哪些文件通過詞組篩選並進入向量排序階段。
假設您有一個名為tech_articles 的集合,其中包含以下五個實體:
| doc_id | 文字 |
|---|---|
| 1 | 機器學習提升大規模資料分析的效率 |
| 2 | 學習以機器為基礎的方法對於現代人工智能的進步至關重要 |
| 3 | 深度學習機器架構可優化計算負載 |
| 4 | 機器迅速提升持續學習的模型效能 |
| 5 | 學習先進的機器演算法擴展 AI 能力 |
slop=1
在此,我們允許的斜率為 1。篩選條件適用於包含短語「學習機器」的文件,略有彈性。
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”,
data=[query_vector],
filter=filter_slop1,
search_params={“params”: {“nprobe”: 10}},
limit=10,
output_fields=[“id”, “text”]
)
匹配結果:
| doc_id | 文字 |
|---|---|
| 2 | 學習機器化對於現代人工智能的進步至關重要 |
| 3 | 深度學習機器架構可優化計算負載 |
| 5 | 學習先進的機器演算法可擴展 AI 能力 |
slop=2
此範例允許 2 的斜率,意即「機器」和「學習」兩詞之間最多允許有兩個額外的代名詞(或反向詞)。
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
匹配結果:
| doc_id | 文字 |
|---|---|
| 1 | 機器學習提升大規模資料分析的效率 |
| 3 | 深度學習機器架構可優化計算負載 |
slop=3
在這個範例中,3 的斜率提供了更大的彈性。篩選程式搜尋「機器學習」,字詞之間最多允許三個符號位置。
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
匹配結果:
| doc_id | 文字 |
|---|---|
| 1 | 機器學習提升大規模資料分析的效率 |
| 2 | 學習以機器為基礎的方法對於現代人工智能的進步至關重要 |
| 3 | 深度學習機器架構可優化計算負載 |
| 5 | 學習先進的機器演算法可擴展 AI 能力 |
快速提示:在 Milvus 中啟用短語匹配之前您需要瞭解的事項
短語匹配提供短語層級篩選支援,但啟用短語匹配所涉及的不只是查詢時的設定。在生產設定中應用之前,了解相關的注意事項是很有幫助的。
在欄位上啟用片語匹配會建立反向索引,這會增加儲存使用量。確切的成本取決於文字長度、唯一標記數量和分析器設定等因素。當處理大型文字欄位或高心數資料時,應事先考慮此開銷。
分析器配置是另一個關鍵的設計選擇。一旦在收集模式中定義了分析器,就無法變更。之後,若要切換到不同的分析器,就必須刪除現有的集合,然後以新的模式重新建立。因此,分析器的選擇應該被視為長期的決定,而不是實驗。
短語匹配行為與文字的標記化方式緊密相連。在將分析器套用到整個集合之前,建議使用
run_analyzer方法來檢查標記化輸出,並確認它符合您的期望。此步驟有助於避免微妙的不匹配和稍後意外的查詢結果。如需詳細資訊,請參閱Analyzer Overview。
總結
短語匹配 (Phrase Match) 是一種核心的全文搜尋類型,除了簡單的關鍵字匹配之外,還能使用短語層級和位置限制。藉由代號順序和接近性,它提供了一種可預測且精確的方式,可根據詞彙在文字中的實際出現方式來過濾文件。
在現代檢索系統中,詞組匹配通常應用在向量式排序之前。它首先將候選集限制為明確滿足所需短語或結構的文件。然後再使用向量搜尋,依據語意相關性對這些結果進行排序。這種模式在日誌分析、技術文件搜尋和 RAG 管道等情境中特別有效,在這些情境中,必須先強制執行文字限制,然後才考慮語意相似性。
隨著 Milvus 2.6 引入slop 參數,短語匹配對自然語言變化的容忍度變得更高,同時保留了其作為全文過濾機制的角色。這使得短語層級的限制更容易應用於生產檢索工作流程中。
使用示範腳本試試看,並探索Milvus 2.6,看看短語感知檢索如何融入您的堆疊。
對最新 Milvus 的任何功能有問題或想要深入瞭解?加入我們的 Discord 頻道或在 GitHub 上提出問題。您也可以透過 Milvus Office Hours 預約 20 分鐘的一對一課程,以獲得深入的瞭解、指導和問題解答。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



