服务创建
单击快速创建,选择结构化信息搜索,进入服务创建界面,编辑服务名称并选择服务所使用的引擎及数据源,完成创建后进入索引配置界面。
引擎
提供检索服务的基础组件,可在资源中心进行引擎管理也可在快速创建页面直接选择或添加。更多信息可查看引擎管理操作指南。
已适配引擎列表 | 配置 | 插件 | 链接 |
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(越相关分数越小),默认为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")