多轮对话搜索的服务创建操作指南和调优建议。
服务创建
单击快速创建,选择多轮对话搜索,进入服务创建界面,编辑服务名称并选择服务所使用的引擎,完成创建中进入索引配置
引擎
提供检索服务的基础组建,可在资源中心进行引擎管理也可在快速创建页面直接选择或添加。更多信息可查看引擎管理操作指南。
已适配引擎列表 | 版本 | 配置 | 插件 | 链接 |
阿里云Elasticsearch | V8.9 V7.10 V7.7 V6.8 V6.7 | 基础建议2核8G,存在向量检索需求8核32G | 无要求 |
数据导入
数据源
企业知识库存储,可在资源中心进行数据源管理也可在快速创建页面直接选择或添加。更多信息可查看数据源管理操作指南。
已适配数据源列表 | 链接 |
阿里云 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; 解析字段为默认字段,固定全选; |
配置索引
源数据表索引配置
完成数据源配置后, 需配置索引结构来完成索引构建。基于不同的数据来源和使用场景, 数据字段内容会有差异,但索引构建的流程相似,下面以阿里云 OSS数据源为例介绍索引构建流程。
字段名
字段名称, 对采用OSS文件格式作为数据源的实例,字段名称跟离线数据解析结果字段对应,离线解析结果默认的字段名称包括:
字段名称 | 字段描述 | 字段类型 |
docId | 主键、唯一标识id | varchar |
name | 文件名称 | varchar |
title | 解析片段标题内容 | varchar |
content | 解析片段正文内容 | varchar |
url | url | varchar |
对采用数据表作为数据源的实例,字段名和表格字段名一一对应, 假设数据源表格中只包含"id", "content"字段, 数据表索引配置对应显示"id", "content"字段名, 字段类型跟源数据表中定义的字段类型保持一致。
索引字段类型
索引字段类型定义了字段的数据类型,以便搜索引擎(例如ElasticSearch)能够正确地处理和索引这些字段的值。以ElasticSearch为例,常见的索引字段类型:
索引字段类型 | 字段类型说明 |
text | 用于索引长文本,例如文章内容、描述等。文本类型会进行分词处理,以便能够根据单词进行搜索和匹配。 |
keyword | 用于索引短文本,例如标签、关键字等。关键字类型不会进行分词处理,整个字段作为一个整体进行索引和匹配。 |
integer | 用于索引INT类型数字,数字类型可以用于排序、范围查询等操作 |
long | 用于索引LONG类型数字,数字类型可以用于排序、范围查询等操作 |
double | 用于索引DOUBLE类型数字,数字类型可以用于排序、范围查询等操作 |
float | 用于索引FLOAT类型数字,数字类型可以用于排序、范围查询等操作 |
date | 用于索引日期和时间。日期类型可以进行日期范围查询、排序等操作。 |
boolean | 用于索引布尔值,即true或false |
binary | 用于索引二进制数据,例如图片、文件等 |
文本块切分/Chunk
当该字段文本长度比较长且需要作为大模型回答的参考内容时,建议勾选该字段。勾选后该字段的长文本会被切分为短的文本块;若不勾选,部分较长的文本后半段会被直接截断。OSS数据源的content字段默认勾选。
向量化
文本向量化是将文本数据转换为数值向量的过程。它将文本中的词语、句子表示为向量形式,以便能够信息检索等任务中进行相关性计算。勾选向量化后,搜索的准确性能够得到提升,对于用户输入的问题与相关知识库内容字面不一致的情况也能搜到正确的知识。
文本向量化实例
输入文本:"一条黄色的裙子"
向量化后结果:[0.2694664001464844,-0.3998311161994934,-0.14598636329174042,-0.4976918697357178,-0.13986249268054962,0.6272065043449402,-0.1434994637966156,-0.33319777250289917]
向量化后为一个浮点数列表,列表长度取决于向量化模型的输出维度
在索引构建阶段, 向量化只对TEXT类型字段生效
如果选择多个TEXT字段向量化,算法模型将自动将多个字段拼接计算向量结果
分析器
在索引构建过程中,分析器(OR 分词器)是用于将文本数据分割成词的工具。它是文本分析过程中的一个重要组件,用于构建倒排索引,以便能够对文本进行搜索和匹配。
分析器将输入的文本按照一定的规则进行分割,分析器可以将一个长文本分割成多个词,以便能够对这些词进行索引和搜索。
企业搜索提供多种内置的分析器,包括:
阿里分析器
介绍:阿里巴巴开发的中英文分词工具,适配多种业务场景,多轮对话搜索默认选项。
分词样例
输入文本:"阿里巴巴是一家全球的互联网科技公司。"
分词结果:"阿里巴巴 / 是 / 一家 / 全球 / 的 / 互联网 / 科技 / 公司 / 。"
Ik分析器
介绍:开源Ik分词器, 分词效果跟阿里分析器类似
单字分析器
介绍:按照单个字符(UTF8编码)进行分割,适用于语义检索要求不高、要求高召回的检索场景
分词样例
输入文本:"单字分词器是一种最基础的分词方式。"
分词结果:"单 / 字 / 分 / 词 / 器 / 是 / 一 / 种 / 最 / 基 / 础 / 的 / 分 / 词 / 方 / 式 / 。"
拼音分析器
介绍:针对中文字段进行拼音解析、使用于拼音检索场景
分词样例:
输入文本:"我爱中文分词器"
分词结果: "wo ai zhong wen fen ci qi"
Ngram分析器:
介绍: 按照N-gram字符(UTF8编码)进行分割, N默认值为3
分词样例:
输入文本:"中文分词器"
ngram分词结果(N=3):"中 / 文 / 分 / 词 / 器/ 中文 / 文分 / 分词 / 词器/ 中文分 / 文分词 / 分词器"
通过选择合适的分析器,可以使得搜索引擎在索引和搜索文本数据时更准确和灵活。
是否关联文件数据
当接入数据源同时存在文件类型及数据库类型数据时,且“文件路径字段”和“文件类型字段”都是数据库中的字段,需要开启“关联文件数据”功能,可以参考最佳实践说明。开启后,系统会自动校验,若源数据表中字段和系统自动扩展字段中的“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。
搜索字段
全文检索字段,需要为keywords或text类型,用来执行搜索操作,匹配查询条件,限制搜索范围。
接口返回字段
接口返回字段是指搜索请求后的返回结果字段,可在索引配置字段中选择业务所需字段,此字段会在开放接口openapi中的fields字段返回。后续可应用于大模型多轮对话中的参考内容。
大模型引用字段
大模型引用字段是指搜索请求后接口返回字段需要被大模型作为参考内容引用的字段。此字段需要是接口返回字段中的子集。
为大模型可以更精准的获取有效信息,以给出更准确的答复。例如接口返回字段为"id", "content",由于"id"字段并未携带有效信息辅助大模型理解,因此只选择"content"作为大模型引用字段。
是否自动更新
若数据源索引配置需要定期更新,则需要打开此开关。支持每小时/每天/每月三种周期自动更新,支持配置对应更新的时间点以及时区。
服务测试
LLM参数配置
配置修改完成后均需要单击保存配置才能生效!
生成内容最大长度(max_tokens)
控制每次生成的对话内容长度。注意输入生成内容的最大长度不应超过2048,超过会对输入内容进行截断。
采样选择
较低的top_p代表更加谨慎的输出;较高的top_p对应更加具有创造力的输出。一般推荐设置为0.7-0.8,可根据实际情况进行调整。
流式输出模式(stream)
是:最终输出结果将在生成结果的过程中逐字输出。
否:最终输出结果将在全部生成完毕后整段输出。
大模型兜底回复
要:如果搜索请求后并未返回有效信息,则采用大模型做兜底回复
不要:如果搜索请求后并未返回有效信息,不采用大模型做兜底回复,支持配置相应回复话术。
Tips
调试方法:初次配置完后,请选择索引文档中的一篇作为目标,并针对这篇文章撰写一个问题。将问题输入测试页面查看模型返回,如符合预期可以多测几个;如不符合预期,可以开启Debug开关
然后可以看到多轮对话链路具体日志,如果觉得展示框太小可以复制出来到其他文本编辑器或者JSON编辑器查看。我们主要关注”child_execs“里面的内容
{
"start_time":1692850565627,
"trace_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"exec_params":{
"streaming":true,
"debug":true,
"async_run":false,
"session_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"flow_params":{
"top_p":"0.7",
"search_size":3,
"api_key":"**************",
"content_fields":"title,content",
"max_new_tokens":512,
"temperature":1,
"rank_model_info":"{"rankModelInfo": {"default": {"features": [{"name": "vector_index", "weights": 0.5, "threshold": 0, "norm": true}, {"name": "static_value", "field": "_rc_t_score", "weights": 0.5, "threshold": 0, "norm": true}], "aggregate_algo": "weight_avg"}}}",
"human_input":"牧云",
"custom_config_info":"{"rerankSize": 200, "uqVectorRecallRatio": 0.5}",
"type":"title,content",
"fields":"title,content",
"scene":"dolphin_search_ms_index_es_113_prod"
},
"flow_json":null,
"flow_json_url":"https://******/corp_search.json"
},
"exec_result":{
"result":[
"对",
"不",
"起",
",",
"现",
"有",
"搜",
"索",
"结",
"果",
"中",
"不",
"包",
"含",
"该",
"问",
"题",
"相",
"关",
"内",
"容",
",",
"暂",
"时",
"无",
"法",
"提",
"供",
"答",
"案",
"。"
],
"ext":{
},
"output_tokens":null,
"request_id":null,
"input_tokens":null,
"prompt":"{"query": "牧云", "model_id": "daily-top_qad-392", "api_key": "**************", "stream": true, "search_results": [{"id": 1, "content": "\\n产品团队核心成员曾负责阿里云整体内部保障,总结了过去10多年时间阿里巴巴在企业安全运营上的最佳做法,安全运营团队应先清晰的知道企业当前面临的关键挑战是什么?以及企业对风险的容忍度区间是怎样的?我们能够接受什么风险?不能够接受什么风险?一旦发生的安全事件超过这个风险容忍度,将直接导致企业陷入无法经营的状态,业务连续性受到影响。因此只要能够证明可真正影响到业务的风险才是真实的安全风险,应被列为最高优先级修复,而所有安全控制措施的唯一目的就是减缓业务风险。", "raw_search_result": {"_rc_score": 18.187634, "_q_score": 1.0, "_id": "7606980412276885772_129", "title": "", "_score": 18.187634, "content": "产品团队核心成员曾负责阿里云整体内部保障,总结了过去10多年时间阿里巴巴在企业安全运营上的最佳做法,安全运营团队应先清晰的知道企业当前面临的关键挑战是什么?以及企业对风险的容忍度区间是怎样的?我们能够接受什么风险?不能够接受什么风险?一旦发生的安全事件超过这个风险容忍度,将直接导致企业陷入无法经营的状态,业务连续性受到影响。因此只要能够证明可真正影响到业务的风险才是真实的安全风险,应被列为最高优先级修复,而所有安全控制措施的唯一目的就是减缓业务风险。"}}, {"id": 2, "content": "\\nWebShell是什么", "raw_search_result": {"_rc_score": 9.906794, "_q_score": 0.5446994369910897, "_id": "5751733942449846217_6", "title": "", "_score": 9.906794, "content": "WebShell是什么"}}, {"id": 3, "content": "\\n1.牧云管理平台", "raw_search_result": {"_rc_score": 9.759266, "_q_score": 0.5365879915991272, "_id": "18103204782719913721_10", "title": "", "_score": 9.759266, "content": "1.牧云管理平台"}}], "history_messages": [], "temperature": 1.0, "top_p": 0.7, "top_k": 50, "length_penalty": 1.0, "num_doc": 3, "answer_doc": false, "max_new_tokens": 512, "tp_answer": "", "allow_direct_answer": true}"
},
"child_execs":[
{
"start_time":1692850565683,
"trace_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"exec_params":{
"top_p":0.7,
"api_key":"**************",
"stream":false,
"max_new_tokens":512,
"query":"牧云",
"history_messages":[
],
"model_id":"daily-top_qad-392",
"tp_search":""
},
"exec_result":{
"do_search":true
},
"child_execs":null,
"end_time":1692850566121,
"exec_name":"search_toggle",
"exec_status":true,
"exec_kind":"AI_FLOW_STEP",
"exec_message":null
},
{
"start_time":1692850566122,
"trace_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"exec_params":{
"top_p":0.7,
"api_key":"**************",
"stream":false,
"max_new_tokens":512,
"tp_query_rewrite":"",
"query":"牧云",
"history_messages":[
],
"model_id":"daily-top_qad-392"
},
"exec_result":{
"queries_r":[
"牧云是什么"
]
},
"child_execs":null,
"end_time":1692850566617,
"exec_name":"search_rewrite",
"exec_status":true,
"exec_kind":"AI_FLOW_STEP",
"exec_message":null
},
{
"start_time":1692850566618,
"trace_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"exec_params":{
"customConfigInfo":{
"rerankSize":200,
"uqVectorRecallRatio":0.5
},
"page":1,
"uq":"牧云是什么",
"fields":[
"content",
"title"
],
"rows":3,
"type":"title,content",
"scene":"dolphin_search_ms_index_es_113_prod",
"rankModelInfo":{
"rankModelInfo":{
"default":{
"features":[
{
"name":"vector_index",
"threshold":0,
"weights":0.5,
"norm":true
},
{
"field":"_rc_t_score",
"name":"static_value",
"threshold":0,
"weights":0.5,
"norm":true
}
],
"aggregate_algo":"weight_avg"
}
}
}
},
"exec_result":{
"msg":null,
"code":200,
"data":{
"headers":{
"__d_head_rtm":"1692850566901",
"__d_head_sip":"192.168.43.28",
"__d_head_es_rt":"t:32",
"__d_head_engine_rt":"q:104-s:92-r:7-i:65",
"__d_head_ver":"0.0.1-SNAPSHOT"
},
"debug":null,
"data":{
"qpInfos":[
{
"tokenized":[
"牧",
"云",
"是",
"什么"
],
"stopWords":[
],
"spellcheck":false,
"cleanQuery":"牧云是什么",
"query":"牧云是什么",
"sensitive":false,
"synonymWords":[
],
"recognitions":[
{
"name":"O",
"text":"牧"
},
{
"name":"O",
"text":"云"
},
{
"name":"O",
"text":"是"
},
{
"name":"O",
"text":"什么"
}
],
"spellchecked":"牧云是什么",
"rewrite":"牧云是什么",
"operator":"AND"
}
],
"total":89,
"docs":[
{
"_rc_score":18.187634,
"_q_score":1,
"_id":"7606980412276885772_129",
"title":"",
"_score":18.187634,
"content":"产品团队核心成员曾负责阿里云整体内部保障,总结了过去10多年时间阿里巴巴在企业安全运营上的最佳做法,安全运营团队应先清晰的知道企业当前面临的关键挑战是什么?以及企业对风险的容忍度区间是怎样的?我们能够接受什么风险?不能够接受什么风险?一旦发生的安全事件超过这个风险容忍度,将直接导致企业陷入无法经营的状态,业务连续性受到影响。因此只要能够证明可真正影响到业务的风险才是真实的安全风险,应被列为最高优先级修复,而所有安全控制措施的唯一目的就是减缓业务风险。"
},
{
"_rc_score":9.906794,
"_q_score":0.5446994369910897,
"_id":"5751733942449846217_6",
"title":"",
"_score":9.906794,
"content":"WebShell是什么"
},
{
"_rc_score":9.759266,
"_q_score":0.5365879915991272,
"_id":"18103204782719913721_10",
"title":"",
"_score":9.759266,
"content":"1.牧云管理平台"
}
],
"keywords":[
{
"schema":"title,content",
"name":"全文",
"value":"牧云是什么",
"fuzzy":true
}
],
"totalDistinct":89,
"extras":null,
"aggs":null
},
"success":true,
"rid":null,
"message":null,
"status":0
},
"success":true,
"requestId":"3C90873D-CAAB-437D-925A-5E8D90E2E746",
"httpStatusCode":200
},
"child_execs":null,
"end_time":1692850566905,
"exec_name":"search",
"exec_status":true,
"exec_kind":"AI_FLOW_STEP",
"exec_message":null
},
{
"start_time":1692850570204,
"trace_id":"f-s-5NRRqmDDUgkNGFLXw88888",
"exec_params":{
"top_p":0.7,
"api_key":"**************",
"stream":false,
"max_new_tokens":512,
"query":null,
"history_messages":[
{
"role":"user",
"content":"牧云"
},
{
"role":"assistant",
"content":"对不起,现有搜索结果中不包含该问题相关内容,暂时无法提供答案。"
}
],
"model_id":"daily-top_qad-392"
},
"exec_result":{
"queries_s":[
"牧云是什么?",
"牧云有哪些特点?",
"牧云的优势是什么?"
]
},
"child_execs":null,
"end_time":1692850571168,
"exec_name":"search_recommend",
"exec_status":true,
"exec_kind":"AI_FLOW_STEP",
"exec_message":null
}
],
"end_time":null,
"exec_name":"corp_search.json",
"exec_status":true,
"exec_kind":"AI_FLOW",
"exec_message":null
}
按照以下步骤进行排查:
首先看第一个{}框起来的dict里面,do_search是否为false。假如do_search为false,需要检查您撰写的query不是一个需要搜索就能得到答案的,例如”你好“之类。如您默认所有query都需要搜索,可以联系我们帮您开启强制搜索开关。
看第二个{}框起来的dict里面,queries_r是否满足预期。queries_r是模型对于您输入query的一个重写(重新表达),通常用于多轮对话时发生上下文指代的情况。如您默认所有query都不需要此类重写,可以联系我们帮您关闭重写。
看第三个{}框起来的dict里面,exec_result->data->docs中前num_docs个文档中是否包含了目标文档,如果不包含说明没搜到。这时需要您在搜索增强模块调试出合适的排序公式,确保对应query能够搜到目标文档。将调试好的排序公式填写进来,并单击保存配置。
在确保目标文档出现在前num_docs个文档中之后,如仍然返回不符合预期的结果,请调整LLM参数配置中相关生成参数大小以达到预期。
搜索增强参数配置
条数配置
名词解释:知识条为搜索召回的相关索引条目,以搜索接口返回字段为结构构成,通过排序计算,相关度高的知识条优先排序。若“候选知识条数”选择3条,则选择排序分数最高的三条知识条作为参考内容传给下游大模型。
数值限制:当前模型上限阈值为6000,阈值=候选知识条数*单条知识长度。
推荐值:候选知识条数为3,单条知识长度上限为1000。
功能描述:控制输入给大模型的知识条范围。
Tips:
若候选知识条数越多,则大模型的回复泛化性越高,但由于存在模型上限阈值,其单条知识长度有限,若知识长度过短,则可能导致信息不完整,影响大模型回复的精准度。
多路召回-向量召回比例
名词解释:召回模型主要包括文本相关性召回和语义向量召回。其中文本相关性召回是从文本分词后的词粒度的一致性上做文档召回,语义向量召回是指将文本转为语义向量后在向量空间里的寻找空间距离最靠近的文档作为召回。
推荐值:目前建议50%,表示文本召回和语义向量召回的文档数各占总召回数量的一半。
功能描述:控制query召回时向量召回部分占所有召回数量的比例。
Tips:
若希望不使用向量召回(仅用文本相关性召回)设置为0%,当前版本不支持仅向量召回(不建议设置成100%)。
精排DOC数量
名词解释:进入精排计算的最大文档数量。
推荐值:200-500。
功能描述:query在召回所有相关文本后,会基于召回的结果做一个基础的相关性打分并排序,当召回的文档数目总数大于当前设置的精排DOC数量N时,会取基础相关性打分最高的TOP N进入精排计算。
Tips:
该数字越大表示用于精排的文档数越多,对于最终效果会更好,但精排计算所消耗时间会更长。
自定义排序公式
名词解释:产品提供了丰富的排序特征供用户根据实际情况实现自定义排序。排序公式为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类型
norm_factor:float类型, 归一化系数,用于调节归一化后的分数分布。
具体每项特征具体说明如下:
特征说明:
特征名 | 说明 | 特征特殊参数 |
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,
"threshold":10,
"norm":true
},
{
"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":"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")
对话测试
完成所有参数配置并保存后,即可进行对话测试。您可在界面上通过输入框或多轮对话搜索API,输入您的问题,即可得到所对应的回答。LLM大模型将把搜索得到的知识片段与上下文信息进行总结和生成,从而进行问题的回答。