命中前提:

  1. 库里存在该商品或与该商品有关联
  2. 关键词尽可能属于商品 title 的子串,或和商品 title 相关
  3. 关键词不能只有型号,要有品牌等信息
  4. 价格区间需要正确传入

检索服务流程

前端通过交互界面,输入一段 query,发送请求到检索服务,检索服务根据该 query 去库里查,分别查 ES 库和 Milvus 库,查出来之后通过 RRF 做个排序,然后把结果返回给前端。

这样做的话,结果的准确性完全取决于用户的关键词是什么。

这里涉及到几个关键环节:

  1. 用户输入 query 环节

  2. 服务接收并处理 query 环节

  3. 根据 query 查询数据库环节

  4. 从库中查询到数据返回给用户环节

优化方案

用户输入 query 环节

在用户输入环节进行优化,提供输入联想、纠错等功能。

针对微信公众号这种前端输入无法控制的场景,可能无法在输入这块直接提供优化,但是也可以后置,比如发送完了之后再问一下用户是否要修改为以下提供的 query 等。

输入联想

首先需要提供一个 query 模板库,该模板即为用户常输入的一些句式,然后通过用户输入的商品填充用户的输入。在输入到商品时,需要实时从库里查出对应的商品建议提示给用户。

这块需要准备句式模板库、库里的商品列表。

纠错

根据模板和库里的商品,进行实时纠错。纠错时需要提示用户确认。

服务接收并处理 query 环节

服务接收到 query 后,对该 query 做一个预处理,该预处理可以将用户的 query 进行分词、纠错、意图理解、上下文理解、商品提取等操作。

分词

分词的目的是为了更好的命中库中的数据,需要根据业务场景、库里已有的数据进行针对性分词。

需要实现的模块:

  1. 业务关键词库

  2. 商品关键词库

纠错

根据模板和库里的商品,进行纠错。纠错时需要提示用户确认。如果没有前一环节的纠错时启用该环节。

需要实现的模块:

  1. 模板库

  2. 纠错服务

意图理解

模型能力实现。

理解用户具体想要什么商品。

  1. 模型自身的理解能力

  2. 结合业务、商品库以及商品检索服务生成可提取准确关键词的意图理解

上下文理解

模型能力实现。

结合上下文理解用户具体想要什么商品。

目标商品提取

目标商品提取,使用库里的商品列表进行比对。这里需要考虑到商品的简称、别称等,可能也需要维护一个库。

目前提取出来的关键词存在不明确的场景,比如输入blackberry手机,提取出来的关键词有:黑莓9900,P9981,9982,9983,第一个带有黑莓,其他的都只有型号,型号单独当关键词去商品库里查询时,结果和目标商品会差很多。

故,这里需要使用品牌加型号的方式当关键词。

提取逻辑

根据用户输入的 query,通过百科、评价总结等 tool 返回结果,再将几轮对话的上下文作为参数去调用百川模型,最终提取出来关键词。

句式模板库

商品列表

根据 query 查询数据库环节

这个环节主要依赖数据库自身能力,能优化的就是数据源和查询参数。

根据 query 查询数据库环节中,通过优化 ES 的匹配查询能力,以及 Milvus 的向量查询能力。

ES

ES 的匹配查询能力和分词器有关系,可以优化分词器配置或自定义分词器。

Milvus

Milvus 的向量查询能力,依赖对源数据的向量化及查询参数。

目前是使用商品的 title 字段进行的向量化,查询参数 nprobe 为 128。

从库中查询到数据返回给用户环节

RRF 排序

从库里查询到结果之后,目前是做了 RRF 的排序,即 ES 和 Milvus 都命中的排在前面。

目前 RRF 的 K 值是 60。

反向验证

将查询到的结果和目标商品再进行一次反向匹配,校验库的查询能力,命中的排在前面。