## 選擇不同的文件搜尋方法 使用***search_type***參數可選擇不同的文件搜尋方法去找出與問題相關的文件段落,可使用***svm***, ***mmr***, ***tfidf***, ***knn***。另可使用***merge***,為前三者的合併。 1. ***支持向量機(svm)*** 使用輸入提示和文件向量來訓練svm模型,訓練後,svm可用於基於其與訓練數據的相似性對新向量進行評分。 2. ***Max Marginal Relevance(mmr)*** 通過余弦相似度選擇相似的文件,但它也考慮多樣性,因此它還會懲罰與已選擇文件的接近。 3. ***詞頻-逆文檔頻率(tfidf)*** 是信息檢索和文本挖掘中常用的權重技術。TF-IDF是一種統計方法,用於評估詞語在一個文檔集合或語料庫中相對於該集合中的一個特定文檔的重要性。 4. ***K-最近鄰居(KNN)*** 是一種機器學習算法,用於分類和回歸問題。對於新數據點,它計算其與已知數據點的距離,然後基於最近的 k 個鄰居來預測類別或數值。在分類中,以多數票決定類別,而在回歸中則計算鄰居的平均值。 5. ***Okapi BM25(bm25)***(BM 是最佳匹配的縮寫)是一種基於查詢詞出現在每個文檔中的檢索功能,而不考慮它們在文檔中的相鄰關系的排名一組文檔的方法。它是一系列具有略有不同組件和參數的評分函數。 </br> </br> ## 自動選擇搜尋方法 ***auto***是另一種可以選擇的文件搜尋策略,使用***bm25***/***tfidf***來搜尋相同詞語的文件,並用svm搜尋近似詞意的文件,若兩者皆沒有找到,則使用rerank模型去遍歷文件,但會相當緩慢。 ## 自訂搜尋方法 如果你希望設計自己的方法找尋最相似的文檔,可以建立search_type函數,並將此函數作為***search_type***參數 此函數輸入包含: ##### 1.query_embeds: 查詢的嵌入。(numpy array) ##### 2.docs_embeds: 所有文檔的嵌入。(表示文檔嵌入的 numpy 數組的list) ##### 3.k: 所要選擇的最相關文檔的數量。(integer) ##### 4.relevancy_threshold: 相關性閾值。如果查詢和文檔之間的距離小於 relevancy_threshold,則選擇該文檔。(float) ##### 5.log: 一個字典,可用於記錄任何您希望記錄的其他信息。(dictionary) </br> </br> #### 此函數須回傳相似文檔的index順序(list) </br> </br> ### example 如範例,我們使用歐幾里得距離度量來識別最相關的文檔。它返回一個表示距離小於指定閾值的查詢和文檔嵌入之間的前 k 個文檔的索引列表。 ```python!= import akasha def cust(query_embeds, docs_embeds, k:int, relevancy_threshold:float, log:dict): from scipy.spatial.distance import euclidean import numpy as np distance = [[euclidean(query_embeds, docs_embeds[idx]),idx] for idx in range(len(docs_embeds))] distance = sorted(distance, key=lambda x: x[0]) ## change dist if embeddings not between 0~1 max_dist = 1 while max_dist < distance[-1][0]: max_dist *= 10 relevancy_threshold *= 10 ## add log para log['dd'] = "miao" return [idx for dist,idx in distance[:k] if (max_dist - dist) >= relevancy_threshold] doc_path = "./mic/" prompt = "五軸是什麼?" qa = akasha.Doc_QA(verbose=True, search_type = cust, embeddings="hf:shibing624/text2vec-base-chinese") qa.get_response(doc_path= doc_path, prompt = prompt) ```