搜索增强

服务创建

image.png

单击快速创建,选择搜索增强,进入服务创建界面,编辑服务名称并选择服务所使用的引擎及数据源,完成创建后进入索引配置界面。

引擎

提供检索服务的基础组建,可在资源中心进行引擎管理也可在快速创建页面直接选择或添加。更多信息可查看引擎管理操作指南。

已适配引擎列表

版本

配置

插件

链接

阿里云Elasticsearch

V8.9 

V7.10 

V7.7 

V6.8 

V6.7

基础建议2核8G,存在向量检索需求8核32G

无要求

数据导入

image

image.png

数据源

企业知识库存储,可在资源中心进行数据源管理也可在快速创建页面直接选择或添加。更多信息可查看数据源管理操作指南。

已适配数据源列表

链接

阿里云 RDS MySQL

阿里云 MaxCompute

阿里云 OSS

子路径/库表

企业知识库当前所选数据源存储地址,系统读取所选数据源下的目录文件/库表,支持按子路径选择目录文件及其子目录/库表。

解析字段

系统离线解析数据源字段,用于构建索引。

勾选使用该字段,对勾选的字段将入库构建索引,不同的字段类型在搜索过程中参与到召回、排序的链路中,在查询结果中可以展示。未勾选字段将不会构建索引。

数据源类型

是否为faq

解析字段

RDS MySQL

/MaxCompute

要求数据库库表字段类型为:id、question、answer、sim_question、url、gmt_modified;

解析字段同所选数据库库表字段,非固定可选;

OSS

支持解析的文件格式为.csv/.xlsx;

要求数据源字段类型为id、question、answer、sim_question、url;

支持解析的文件格式.pdf/.docx/.txt/.md/.html;

解析字段为默认字段,固定全选;

配置索引

数据源表

image.png

字段名,描述,类型

字段名称, 对采用oss文件格式作为数据源的实例,字段名称跟离线数据解析结果字段对应,离线解析结果默认的字段名称包括如下:

字段名称

字段描述

字段类型

docId

主键、唯一标识id

varchar

name

文件名称

varchar

title

解析片段标题内容

varchar

content

解析片段正文内容

varchar

url

url

varchar

对采用数据表作为数据源的实例,字段名和表格字段名一一对应。字段名不允许带有'_'前缀。

索引字段类型

索引字段类型定义了字段的数据类型,以便搜索引擎(例如ElasticSearch)能够正确地处理和索引这些字段的值。以ElasticSearch为例,常见的索引字段类型:

目前可选的索引字段类型包括:

索引字段类型

字段类型说明

text

用于索引长文本,例如文章内容、描述等。文本类型会进行分词处理,以便能够根据单词进行搜索和匹配。

keyword

用于索引短文本,例如标签、关键字等。关键字类型不会进行分词处理,整个字段作为一个整体进行索引和匹配。

integer

用于索引INT类型数字,数字类型可以用于排序、范围查询等操作

long

用于索引LONG类型数字,数字类型可以用于排序、范围查询等操作

double

用于索引DOUBLE类型数字,数字类型可以用于排序、范围查询等操作

float

用于索引FLOAT类型数字,数字类型可以用于排序、范围查询等操作

date

用于索引日期和时间。日期类型可以进行日期范围查询、排序等操作。

boolean

用于索引布尔值,即true或false

binary

用于索引二进制数据,例如图片、文件等

文本块切分/chunk

在搜索增强场景中,字段勾选文本切分chunk, 那么会对改字段进行进一步的切分以满足下游任务使用的要求, 针对不同的数据源、使用场景,文本切分chunk的勾选建议:

  1. 对OSS文件数据源, 离线数据处理流程会自动对离线数据进行文本chunk分析,必须针对标题或者内容字段勾选文本快切分功能才能触发离线文本分析流程

  2. 对数据库数据源,数据库中保存用户已处理数据,这里文本块切分chunk功能可以不勾选

分析器

在索引构建过程中,分析器(OR 分词器)是用于将文本数据分割成词的工具。它是文本分析过程中的一个重要组件,用于构建倒排索引,以便能够对文本进行搜索和匹配。

分析器将输入的文本按照一定的规则进行分割,分析器可以将一个长文本分割成多个独立的单字或者词汇片段,以便能够对这些片段进行索引和搜索。

企业搜索提供多种内置的分析器,包括:

阿里分析器

介绍:阿里巴巴开发的中英文分词工具

分词样例

输入文本:"阿里巴巴是一家全球的互联网科技公司。"

分词结果:"阿里巴巴 / 是 / 一家 / 全球 /  的 / 互联网 / 科技 / 公司 / 。"

Ik分析器

介绍: 开源Ik分词器, 分词效果跟阿里分析器类似

单字分析器:

介绍: 按照单个字符(UTF8编码)进行分割,适用于语义检索要求不高、要求高召回的检索场景

分词样例:

输入文本:"单字分词器是一种最基础的分词方式。"

分词结果:"单 / 字 / 分 / 词 / 器 / 是 / 一 / 种 / 最 / 基 / 础 / 的 / 分 / 词 / 方 / 式 / 。"

拼音分析器

介绍: 针对中文字段进行拼音解析、使用于拼音检索场景

分词样例:

输入文本:"我爱中文分词器"

分词结果: "wo ai zhong wen fen ci qi"

Ngram分析器:

介绍: 按照N-gram字符(UTF8编码)进行分割, N默认值为3

分词样例:

输入文本:"中文分词器"

ngram分词结果(N=3):"中 / 文 / 分 / 词 / 器/ 中文 / 文分 / 分词 / 词器/ 中文分 / 文分词 / 分词器"

通过选择合适的分析器,可以使得搜索引擎在索引和搜索文本数据时更准确和灵活。

特征增强

通过增加特征因子,引入对应增强算法,提升搜索效果和效率。特征因子包括如下:

特征因子1,分词:

名词解释:将连续的字序列按照一定的规范重新组合成语义独立词序列的过程。

功能说明;对带构建索引的文本进行中文分词处理。

示例:

输入文本:“一条黄色的裙子”,分词后结果:["一条", "黄色", "的", "裙子"]

特征因子2,term权重:

名词解释:将输入的文本分词后的结果做每个term的重要性打分。

功能说明;对带构建索引的文本进行中文term权重预测。

示例:

输入文本:“一条黄色的裙子”

term权重:[0.44163678889106406, 0.6124273381472254, 0.07400746404941613, 1.0]

tips:term权重输出长度和分词结果的长度一致。

特征因子3,实体识别:

名词解释:指识别文本中具有特定意义的实体,包括人名、地名、机构名、专有名词等,以及时间、数量等文字。

功能说明:对带构建索引的文本进行实体识别。

示例:

输入文本:“一条黄色的裙子”

分词后结果:{"mention": "黄色", "type": "颜色", "score": 1.0},

{"mention": "裙子", "type": "品类", "score": 1.0},

tips:mention表示实体词,type表示实体类比,score为模型的置信度打分。

向量化

文本向量化是将文本数据转换为数值向量的过程。它将文本中的词语、句子表示为向量形式,以便能够信息检索等任务中进行相关性计算。

文本向量化实例:

输入文本:"一条黄色的裙子"

向量化后结果:[0.2694664001464844,-0.3998311161994934,-0.14598636329174042,-0.4976918697357178,-0.13986249268054962,0.6272065043449402,-0.1434994637966156,-0.33319777250289917]

注意:

1、向量化后为一个浮点数列表,列表长度取决于向量化模型的输出维度;

2、在索引构建阶段, 向量化只对TEXT类型字段生效;

3、如果选择多个TEXT字段向量化,算法模型将自动将多个字段拼接计算向量结果。

image

是否关联文件数据

当接入数据源同时存在文件类型及数据库类型数据时,且“文件路径字段”和“文件类型字段”都是数据库中的字段,需要开启“关联文件数据”功能,可以参考最佳实践说明。开启后,系统会自动校验,若源数据表中字段和系统自动扩展字段中的“title、content、parent、hier_title、nid”有重复,则需退出流程,更改字段名称。

文件存储类型

现支持OSS和HTTP两类数据。

文件路径字段

此字段用于获取存在oss中文件路径数据,字段需为keyword/text字段。

文件类型字段

此字段用于获取存在oss中文件类型数据,字段需为keyword/text字段,文件类型当前支持 .pdf/.docx/.txt/.md/.html。

系统自动扩展字段

系统自动扩展字段固定为“title、content、parent、hier_title、nid”。

支持配置chunk参数,“chunk size指定”范围值在50以上,“chunk overlap指定”范围值需小于chunk size指定数值,可以等于0。

image.png

搜索字段

全文检索字段,需要为keywords或text类型,用来执行搜索操作,匹配查询条件,限制搜索范围。

接口返回字段

接口返回字段是指搜索请求后的返回结果字段,可在索引配置字段中选择业务所需字段,此字段会在开放接口openapi中的fields字段返回。后续可应用于大模型多轮对话中的参考内容。

是否自动更新

若数据源索引配置需要定期更新,则需要打开此开关。支持每小时/每天/每月三种周期自动更新,支持配置对应更新的时间点以及时区。

配置加载

image.png

在完成创建与配置流程后,进行配置加载,此期间您可以离开当前页面进行其他操作,不会影响服务构建和数据导入工作完成。

服务测试及线上调优配置

image

image

搜索输入

服务测试搜索入参支持两种方式:

  1. JSON配置:搜索输入以json格式输入,搜索参数可以参考搜索增强API

  2. 高级参数配置:服务测试界面设置高级参数配置,选择“添加配置参数”,并选择相应参数进行配置,点击“保存”后参数配置生效。

请求入参:

字段

类型

说明

默认值

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")

{
 "field":"_rc_t_score",
 "weights":0.25,
 "threshold":0
},

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")

image.png