服務創建
單擊快速創建,選擇結構化信息搜索,進入服務創建界面,編輯服務名稱并選擇服務所使用的引擎及數據源,完成創建后進入索引配置界面。
引擎
提供檢索服務的基礎組件,可在資源中心進行引擎管理也可在快速創建頁面直接選擇或添加。更多信息可查看引擎管理操作指南。
已適配引擎列表 | 配置 | 插件 | 鏈接 |
OTS | 最小生產環境推薦至少2 VCU,具體資源預估參考OST幫助文檔 | 無要求 |
數據導入
數據源
企業知識庫存儲,可在資源中心進行數據源管理也可在快速創建頁面直接選擇或添加。更多信息可查看數據源管理操作指南。
已適配數據源列表 | 鏈接 |
阿里云 OTS |
子路徑/庫表
企業知識庫當前所選數據源存儲地址,系統讀取所選數據源下的目錄文件/庫表,支持按子路徑選擇目錄文件及其子目錄/庫表。
解析字段
系統離線解析數據源字段,用于構建索引。解析字段中所選數據庫表字段,非固定可選。
勾選使用該字段,被勾選的字段將入庫構建索引,不同的字段類型在搜索過程中參與到召回、排序的鏈路中,在查詢結果中可以展示。未勾選字段將不會構建索引。
字段描述tips:請用中文盡量簡短并準確描述字段含義,此描述會作為搜索算法語義理解依賴,影響搜索準確性。僅支持在服務未完成創建時進行編輯,服務創建后則無法再次更新,需到服務測試中更新并保存生效;
配置索引
數據源表
字段名,字段描述,字段類型
對采用數據表作為數據源的實例,字段名和表格字段名一一對應。字段名不允許帶有'_'前綴。
支持數組
可以選擇該字段是否支持數組,但需要同時滿足以下兩個條件才可進行配置:
原表字段類型必須為string類型。
索引字段類型必須為keyword類型。
索引字段類型
索引字段類型定義了字段的數據類型,以便搜索引擎(例如ElasticSearch)能夠正確地處理和索引這些字段的值。以ElasticSearch為例,常見的索引字段類型:
目前可選的索引字段類型包括:
多元索引中字段數據類型 | 數據表中字段數據類型 | 描述 |
Long | Integer | 64位長整型。 |
Double | Double | 64位雙精度浮點數。 |
Boolean | Boolean | 布爾值。 |
Keyword | String | 不可分詞字符串。 |
Text | String | 可分詞字符串或文本。關于分詞的更多信息,請參見分詞。 |
Date | Integer、String | 日期數據類型,支持自定義各種格式日期數據。更多信息,請參見日期數據類型。 |
Geo-point | String | 位置點坐標信息,格式為緯度,經度,緯度在前,經度在后,且緯度范圍為[-90,+90],經度范圍為[-180,+180]。例如35.8,-45.91。 |
Nested | String | 嵌套類型,例如[{"a": 1}, {"a": 3}]。 |
分析器
在索引構建過程中,分析器(OR 分詞器)是用于將文本數據分割成詞的工具。它是文本分析過程中的一個重要組件,用于構建倒排索引,以便能夠對文本進行搜索和匹配。
分析器將輸入的文本按照一定的規則進行分割,分析器可以將一個長文本分割成多個獨立的單字或者詞匯片段,以便能夠對這些片段進行索引和搜索。千尋搜索算法提供多種內置的分析器,包括:
只有Text類型字段可以設置分詞類型
分詞類型 | 說明 |
單字分詞 | 單字分詞適用于漢語、英語、日語等所有語言文字。Text類型字段的默認分詞類型為單字分詞,默認大小寫不敏感,不拆分英文和數字連接在一起的單詞 |
分隔符分詞 | 默認空白字符 |
最小數量語義分詞 | 將Text字段內容切分成最小數量的語義詞。例如“梨花茶”會切分成“梨”和“花茶”,切分后的結果沒有重合 |
最大數量語義分詞 | 系統會盡量多的分出語義詞,不同語義詞之間會有重疊,總長度累加后會大于原文長度,索引大小也會膨脹。例如“梨花茶”會切分成“梨花”和“花茶” |
模糊分詞 | 對文本內容進行Ngram分詞,結果介于minChars和maxChars之間 |
向量化
文本向量化是將文本數據轉換為數值向量的過程。它將文本中的詞語、句子表示為向量形式,以便能夠信息檢索等任務中進行相關性計算。
文本向量化實例:
輸入文本:"一條黃色的裙子"
向量化后結果:[0.2694664001464844,-0.3998311161994934,-0.14598636329174042,-0.4976918697357178,-0.13986249268054962,0.6272065043449402,-0.1434994637966156,-0.33319777250289917]
注意:
1、向量化后為一個浮點數列表,列表長度取決于向量化模型的輸出維度;
2、在索引構建階段, 向量化只對TEXT類型字段生效;
3、如果選擇多個TEXT字段向量化,算法模型將自動將多個字段拼接計算向量結果。
主鍵
指定主鍵,作為數據唯一標識。
數據更新所依據時間字段
指定更新時間字段,用戶后續索引更新標識,如不指定,索引數據只會執行首次構建,不會做增量更新。
搜索字段
全文檢索字段,需要為keywords或text類型,用來執行搜索操作,匹配查詢條件,限制搜索范圍。
接口返回字段
接口返回字段是指搜索請求后的返回結果字段,可在索引配置字段中選擇業務所需字段,此字段會在開放接口openapi中的fields字段返回。后續可應用于大模型多輪對話中的參考內容。
配置加載
在完成創建與配置流程后,進行配置加載,此期間您可以離開當前頁面進行其他操作,不會影響服務構建和數據導入工作完成。
服務測試及線上調優配置
搜索輸入
高級參數配置
服務測試界面設置高級參數配置,選擇“添加配置參數”,并選擇相應參數進行配置,點擊“保存”后參數配置生效。
查詢結構化解析
點擊加號添加原數據庫庫表字段索引并構建或更新相關字段描述。在字段描述中,用中文盡量簡短并準確描述字段含義,此描述會作為搜索算法語義理解依賴,影響搜索準確性。
JSON配置
搜索輸入以json格式輸入,搜索參數可以參考結構化信息搜索API。
請求入參:
字段 | 類型 | 說明 | 默認值 |
serviceId | long | 服務id | 101 |
uq | string | 用戶輸入檢索值 | |
type | string | 檢索類型(全文/分段) | 動態適配 |
queries | List<map<string, object>> | 檢索條件 | [] |
filters | List<map<string, object>> | 過濾條件 | [] |
fields | array | 召回字段(正排) | [] |
sort | array | 排序字段 | [] |
page | int | 分頁(頁碼) | 1 |
rows | int | 分頁(行數) | 10 |
rankModelInfo | map<string, object> | 算法干預配置(專用) | {} |
customConfigInfo | map<string, object> | 自定義干預配置 | {} |
debug | boolean | 調試信息 | 0 |
minScore | float | 分數閾值 | 0 |
返回出參:
字段 | 類型 | 說明 | 默認值 |
requestId | string | 請求id | xxxx |
status | int | 請求結果狀態 | 0 |
message | string | 響應信息 | |
data.total | int | 檢索總數 | 0 |
data.docs | array(map/dict/json) | 檢索結果 | [] |
debug | map<string, object> | 調試信息 |
下面是一個常用的搜索輸入示例以及對應解釋
{
"uq": "搜索請求", // 用戶搜索請求query
"type": "title,content,vector", // 召回階段使用的索引字段
"debug": false, // 是否開啟調試
"fields": [ // 召回字段
"title",
"content"
],
"page": 1, // 分頁(頁碼)初始值是1
"rows": 10, // 分頁(行數)
"customConfigInfo": {
"qpEmbedding": true, // 是否使用向量搜索
"uqVectorRecallRatio": 0.5, // 多路召回向量召回配比
"rerankSize": 100 // 排序數量
},
"rankModelInfo": { // 排序公式
"default": {
"features": [
{
"name": "vector_index", // 向量召回分數
"weights": 1.0, // 特征權重
"threshold": 0.0, // 特征閾值(低于閾值的特征將被制為0分)
"norm_factor": 0.001,
"norm": true,
"score_type": "L2"
},
{
"name":"static_value", // _rc_t_score是文本召回分數,通過static_value特征獲取
"field":"_rc_t_score",
"weights":0.1,
"threshold":0,
"norm_factor": 80, // 歸一化系數(具體請參考排序公式文檔)
"norm":true // 特征是否需要歸一化
},
{
"name": "query_match_ratio", // 查詢詞在對應字段覆蓋率
"field": "title", // 字段名
"weights": 0.5,
"threshold": 0.0,
"norm": false
},
{
"name": "cross_ranker", // 語義匹配特征
"weights": 1.0,
"threshold": 0,
"fields": ["title", "desc"] // 語義匹配特征作用字段(list類型)
},
{
"name": "doc_match_ratio", // 對應字段詞在查詢的覆蓋率
"field": "title",
"weights": 0.5,
"threshold": 0.0,
"norm": false
}
],
"aggregate_algo": "weight_avg" // 最終排序分數計算方式,當前僅支持”weight_avg“
}
}
}
多路召回-向量召回比例:
名詞解釋:召回模型主要包括文本相關性召回和語義向量召回。其中文本相關性召回是從文本分詞后的詞粒度的一致性上做文檔召回,語義向量召回是指將文本轉為語義向量后在向量空間里的尋找空間距離最靠近的文檔作為召回。
推薦值:目前建議50%,表示文本召回和語義向量召回的文檔數各占總召回數量的一半。
功能描述:控制query召回時向量召回部分占所有召回數量的比例。
tips:若希望不使用向量召回(僅用文本相關性召回)設置為0%,當前版本不支持僅向量召回(不建議設置成100%)。
精排DOC數量
名詞解釋:進入精排計算的最大文檔數量。
推薦值:200-500。
功能描述:query在召回所有相關文本后,會基于召回的結果做一個基礎的相關性打分并排序,當召回的文檔數目總數大于當前設置的精排DOC數量N時,會取基礎相關性打分最高的TOP N進入精排計算。
Tips:該數字越大表示用于精排的文檔數越多,對于最終效果會更好,但精排計算所消耗時間會更長。
最小文本匹配度
名詞解釋:搜索條件和文本的匹配程度
推薦值:80%,數值類型為百分比,取值范圍為0至100%。
功能描述:非全匹配模式下,控制匹配文本的相似度。若匹配度為0.8,則表示文本80%的內容同搜索條件相匹配。若匹配程度小于設置值,則此文本不作為參考文本。
分數閾值
名詞解釋:排序分數閾值
推薦值:0
功能描述:用于過濾低相關性分檔,所有文檔排序后,排序分數低于該分數的文檔不會返回。
自定義排序公式
名詞解釋:產品提供了豐富的排序特征供用戶根據實際情況實現自定義排序。排序公式為json格式,配置在rankModelInfo中。內置的排序模型將會根據rankModelInfo指定的排序公式對召回結果根據排序特征進行打分,并計算最終的排序分數以及排序結果。內置的排序模塊提供了多種排序特征,并且支持對每個特征配置對應索引字段,權重,閾值,以及是否歸一化等。
rankModelInfo
自定義排序公式配置字段,包含對原始query以及extra query的排序公式,每類排序公式為dict類型,dict名稱為對應的查詢字段名稱。(默認query(uq)的排序公式類型名為“default",額外的查詢排序公式類型名為其對應的在"extras"字段對應的查詢名稱)。
排序公式
每類排序公式的具體內容包含 "features" 以及 "aggregate_algo"兩部分。“features” 為具體排序特征及其參數的列表。 "aggregate_algo"目前僅支持“weight_avg",即對所有特征加權求和。 此加權求和結果即為“精排分數。
特征
每一項特征為dict格式,包含特征名稱以及特征參數。特征通用參數如下:
特征通用參數
name: 特征名
field: 計算相關性特征的索引字段。
weights: 特征權重,為float類型。
threshold: 特征分數閾值,float類型。低于閾值的特征分數將被置為0(注意:threshold過濾值為normalize前分數)。設置閾值目的是為了過濾小匹配度特征分對結果的影響,強化高匹配度特征,通過自定義設定實現對特征有效篩選。
norm: 是否將特征進行歸一化bool類型。歸一化是指通過特定的轉換方法將原始排序特征分數調整到一個統一的規模(0-1之間)。其主要目的是消除不同特征之間的量綱差異,使得不同特征分數具有可比性。
norm_factor:float類型,歸一化系數,用于適配原始分數(建議設置為原始分布的均值(不能為0))。
具體每項特征具體說明如下:
特征說明:
特征名 | 說明 | 特征特殊參數 |
vector_index | 向量匹配分數(需配置向量召回) | score_type: 向量檢索分數計算類型,可選擇L2(越相關分數越大)與IP(越相關分數越?。J為IP。需要根據向量引擎配置選擇合適的score_type。 |
text_index | 搜索引擎召回得分 Tips:該特征只支持僅文本召回時使用。使用多路召回(向量+搜索引擎)時,可以使用static_value獲得ES召回得分(field 配置為“_rc_t_score")
| |
timeliness | 時效性得分,正比于給定時間字段與基礎時間相差的毫秒數,取值范圍為[0,1] | time_field(str):時間字段名,格式為: "%Y-%m-%d %H:%M:%S.%f" field(str): 字段名,與時間字段名保持一致 base_time(str): 基礎時間字段,格式為: "%Y-%m-%d %H:%M:%S",應設置為最初始文檔的時間 normalized_number(float): 控制時效性得分的顆粒度,通常應設置為1e6 |
doc_match_ratio | 字段與查詢匹配詞個數與該字段總詞數的比值 | |
query_match_ratio | 查詢與字段匹配詞個數與查詢總詞數的比值 | |
doc_match_count | 字段與查詢匹配詞個數 | |
query_match_count | 查詢與字段匹配詞個數 | |
query_min_slide_window | 衡量查詢與字段詞匹配緊密度,即查詢在字段上匹配的詞個數與字段上包含對應詞最小窗口的比值(不考慮查詢匹配順序)。 | |
ordered_query_min_slide_window | 衡量查詢與對應字段匹配緊密度,查詢詞在某個字段上命中的分詞詞組個數與該詞組在字段上最小窗口的比值(有順序匹配)。 | |
doc_unique_ratio | 字段非重復詞個數與總詞數的比值,用于篩選重復關鍵詞的文檔。 | |
overlap_coefficient | 查詢與字段匹配詞個數與查詢與字段總詞數比值,衡量文本匹配度。 | |
char_overlap_coefficient | 查詢與字段匹配字符數與查詢與字段總字符數比值,衡量字符級別相似度。 | |
lcs_match_ratio | 查詢與字段詞級別最長公共子序列長度與查詢詞數的比值。 | |
char_lcs_match_ratio | 查詢與字段字級別最長公共子序列長度與查詢字符個數的比值,適用于email, mobile 等字符串匹配場景。 | |
edit_similarity | 根據字段與查詢的編輯距離計算的文本相似度,取值為0-1,越高代表兩者越相似。用于衡量查詢與對應字段完全匹配的程度。適用于問題與問題進行匹配的場景,建議配合較高閾值使用。 | |
char_edit_similarity | 字符級別的編輯相似度。 | |
char_sequential_match_priority | 適用于人名匹配專用特征(考慮匹配順序)。按順序計算字符級別的順序匹配度,第i個字的匹配相似度為 1/ |i-j|, j代表對應字段中與之最近的相同字符。第i個字權重為1.0 / i。最終得分為所有字相似度的加權平均。 該特征用于計算與順序相關的文本相似度。 | |
pinyin_lc_substr | 查詢與字段拼音最長公共子串長度與對應字段拼音長度的比值,衡量拼音相似度 | |
doc_pinyin_lc_substr | 查詢與字段拼音最長公共子串長度與查詢拼音長度的比值,衡量拼音相似度 | |
static_value | 將數字字段本身作為特征分數。 | |
name_pinyin_match | 人名拼音匹配專用特征,判斷查詢與對應字段的拼音全拼,拼音首字母縮寫,首字母與全拼的混合進行匹配。如某人名字段值為“張三”,該特征將檢查查詢的拼音是否為["zhangsan","zs","zhangs","zsan"] 中的任意一種,如果匹配成功,返回1分,否則返回0分。 | |
prefix_match_ratio | 詞級別前綴匹配特征,匹配得分為查詢與字段最長公共前綴長度/查詢長度。(前綴匹配指查詢和文檔從第一個位置開始每個詞按順序匹配,能完全匹配的最長字符子串)。適用于對匹配位置有要求的場景(如郵箱匹配,首位匹配相關性更高),建議與其他特征共同使用(如lcs_match_ratio) | |
char_prefix_match_ratio | 字符級別前綴匹配特征,匹配得分為查詢與字段最長公共前綴長度/查詢長度。適用于對匹配位置有要求的場景(如郵箱匹配,首位匹配相關性更高),建議與其他特征共同使用(如lcs_match_ratio) | |
pinyin_prefix_match_ratio | 拼音前綴匹配特征,匹配得分為查詢與對應字段最長公共前綴長度/查詢長度。適用于對匹配位置有要求的場景(如郵箱匹配,首位匹配相關性更高),建議與其他特征共同使用(如lcs_match_ratio) | |
is_contained | 查詢是否包含在給定字段里(list類型)某一項完全匹配,用于匹配標簽。對應索引字段必須為list[string]類型。 | |
contained_boost | 完整的查詢在給定字段中出現的次數,用于提高完全匹配查詢的匹配度。 | |
part_of_doc | 完整的查詢在給定字段中是否出現(出現為1,不出現為0),用于提高完全匹配查詢的匹配度。 |
自定義排序最佳實踐
Tips:以下例子均假設在索引中存在名為"content"的字段。
{
"rankModelInfo": {
"default": {
"features": [
{
"name": "text_index",
"weights": 1.0,
"threshold": 10,
"norm": true
},
{
"name": "query_match_ratio",
"weights": 1.0,
"threshold": 0.0,
"field":"content"
}
],
"aggregate_algo": "weight_avg"
},
}
}
{
"rankModelInfo":{
"default":{
"features":[
{
"name":"static_value",
"field":"_rc_t_score",
"weights":1,
"threshold":10,
"norm":true
},
{
"name":"vector_index",
"weights":1,
"threshold":0,
"norm":true,
"norm_factor":0.001,
"score_type": "L2"
},
{
"name":"query_match_ratio",
"weights":1,
"threshold":0,
"field":"content"
}
],
"aggregate_algo":"weight_avg"
}
}
}
{
"rankModelInfo": {
"default": {
"features": [
{
"name": "static_value",
"field": "_rc_t_score",
"weights": 1,
"threshold": 10,
"norm": true
},
{
"name": "vector_index",
"weights": 1,
"threshold": 0,
"norm": true,
"norm_factor": 0.001,
"score_type": "L2"
},
{
"name": "query_match_ratio",
"weights": 1,
"threshold": 0,
"field": "title"
}
],
"aggregate_algo": "weight_avg"
}
},
"keyword": {
"features": [
{
"name": "query_match_ratio",
"weights": 1,
"threshold": 0,
"field": "content"
}
],
"aggregate_algo": "weight_avg"
}
}
本例子展示了一個帶額外查詢“keyword”的排序公式,用戶需要在"extras"字段內配置與特征字段名相同的查詢字段(本例中為“keyword")