亚马逊AWS官方博客

基于大模型的多意图增强搜索

这两年随着 LLM 的迅猛发展,Claude 为代表的大模型在各项评测中都获得了较好的成绩,为人工智能的发展注入了强有力的生命力。可以想象,现在和未来, AI 会渗透到各个领域,提升各个领域的运行效率,达到企业降本增效的目的。并且我们也可以想象在未来的应用中,传统的人机交互模式,有可能会被 AI 所取代。

本文将会以传统业务系统非常普遍的数据匹配检索为例,深入剖析如何利用 Claude 的强大语义分析能力,改变传统应用的交互模式并快速实现搜索性能的优化。

传统业务系统中业务对象搜索的问题和挑战

上图展示了一个非常传统的查询页面,有查询条件选择,例如省份、城市,机构类型,地址,名称等等,用户可以选择或输入具体要查询的条件,后台会根据条件,组合成 SQL 到业务库中查询,并返回结果。

传统搜索系统的问题在于:

  • 用户的使用门槛较高,必须了解系统提供的查询的每个条件的含义,还需要了解不同条件的组合方式。结构化的查询,无法适应自然语言的模式,也很难贴近人的自然想法,例如查询上海徐汇区有哪些三甲医院,传统查询模式,你必须要分解成多个不同的条件:省市,区域、机构类型、机构级别等。显然用户必须要熟悉和符合业务系统要求,非常不方便。
  • 很难适应业务变化,当业务对象发生变化的时候,需要增加和修改条件,就必然导致整个 UI 的变化和修改,开发成本上升。
  • 传统搜索算法,无法通过语义层面进行分析和理解,导致匹配和搜索效果不佳,例如 系统记录里有一家北京 306 医院,如果用户输入三零六可能就无法匹配到这家医院,从而无法查询到结果。再例如:系统记录里有一家虹桥医院,如果用户输入拼音 hongqiao hospital,传统系统也无法应对这种查询。甚至有时候多几个空格也会导致搜索结果出错。

因此,本方案尝试使用大模型的语义理解和分析能力,来对传统搜索系统的上述劣势进行优化。

解决方案

本方案利用 Claude 来增强传统的机构匹配能力,以更贴近自然语言方式来实现业务数据的智能匹配,整个方案如下图所示:

该方案主要分 2 部分:

  1. 意图识别:利用 Claude 的语义分析能力,对用户输入的信息进行意图识别,并利用格式化的方式进行输出,做进一步的意图拆分处理。
  2. 意图识别后的匹配处理,目前将意图分为两大类:一类是单纯通过名称检索机构信息,一类是通过省市,区域,地址,机构类型等方式检索机构信息。匹配的处理逻辑也会分为两种,一种是传统 RAG 模式进行检索,另一种是通过 Text2SQL 进行检索。

该方案的优点:

  1. 通过自然语言进行检索和匹配,降低了用户的使用门槛,体验更好。
  2. 降低业务数据变更的复杂度,只需要适当的修改 Prompt 就可以适配新的业务对象。
  3. 匹配能力大大提高,能够完成传统方式很难达到的匹配效果。

基于 AWS 的解决方案架构:

该架构的优点是,充分利用云原生服务,提供高可用的架构,节省构建成本和后期运营成本,极大的提高了系统的可靠性和安全性。

Demo 样例和代码片段

1)多意图识别 PE

"""\n\n你是一个搜索机器人,目的是根据用户的问题,从数据库中查询到相关的机构列表。
数据库的表结构如下:
<table>
•	name : 机构名称
•	provinace_name : 省份名称,# values: 上海市 | 河北省 | 海南省 | ...
•	city_name : 城市名称,values: 上海市 | 石家庄市 | 海口市 | ...
•	city_code : 城市编码
•	county_name : 县城名城或者区域名称, # values: 静安区 | 长安区 | 龙华区 | ...
•	county_code : 区编码
•	address : 机构具体地址,包含道路名称以及门牌号等,# values: 上海市闵行区七宝镇宝南路494号 | ...
•	root_organization_type_name : 根节点机构机构类型,# values: 非医疗机构 | 药店 | 医院 | 经销商
•	organization_type_name : 当前机构类型,# values: 单体药店 | 专科医院 | 门诊部 | 连锁门店 | 疗养院 | 诊所(卫生所、医务室、保健所)
•	hospital_level_name:医院等级,# values: 一级 | 一级丙等 | 一级乙等 | 一级甲等 | 三级 | 三级乙等 | 三级甲等 | 二级 | 二级乙等 | 二级甲等 | 未知 | 未评级
•	hospital_specialty_name : 医院专科名称,# values: 中西医结合 | 骨科 | 老年 | 肿瘤 | 血液病 | 整形外科 | 儿童 | Pilot虚拟 | 美容 | 结核病 | 精神 | 医学科学研究机构 | 妇幼保健院 | 口腔科 | 肺科 | 眼科 | 康复 | 职业病 | 中医 | 肝胆 | 皮肤科 | 传染病 | 耳鼻喉科 | 其他 | 泌尿生殖 | 妇产科 | 胸科
•	state : 状态,# values: 注销 | 在业
</table>
用户的目的是查询相关的机构列表,用户查询的意图一共有3类,具体的意图如下:
<intent_list>
•	机构名称查询:search_name。只查询机构名称。举例:上海第一人民医院
•	机构名称以及属性查询:search_name_with_attribute。查询机构名称的同时有相关属性限制。举例:状态为在业的老百姓大药房
•	属性查询:search_with_attribute。根据属性查询医院列表。举例:杨浦区的门诊部有哪些,虹桥路的药店有哪些
•	未知意图:other。根据当前问题判断不出相关意图。
</intent_list>

现在请先对用户的问题进行问题意图分类以及信息抽取。根据用户问题生成一个json格式的结果。
意图判断的要求要求如下:
<instructions>
•	最终的输出采用json格式,intent是必须的字段
•	在判断意图的同时,需要抽取问题中根数据库字段相关的属性,只输出能抽取到的相关属性
•	如果你判断不出具体的意图,返回other
•	最后只返回json结果,不需要返回其他说明,包裹在``json``中
•	如果意图是search_name_with_attribute,返回结果中必须有,intent和name
</instructions>
这里是相关的示例:
<example>
question : 上海第一人民医院。
answer : 
{{
    "intent":"search_name",
    "name" : "上海第一人民医院"
}}

question : 延安西路上的中山医院有哪家。
answer : 
{{
    "intent":"search_name_with_attribute",
    "address":"延安西路",
    "name": "中山医院"
}}

question : 杨浦区的门诊部有哪些。
answer : 
{{
    "intent": "search_with_attribute",
    "organization_type_name" : "门诊部",
    "county_name" : "杨浦区"
}}

question : HOSPITAL_JS。
answer : 
{{
    "intent": "ohter"
}}

question : 龙华春都路药店。
answer : 
{{
    "intent":"search_with_attribute",
    "county_name" : "龙华区",
    "address": "春都路",
    "root_organization_type_name" : "药店"
}}

question : 静安柳营路。
answer : 
{{
    "intent":"search_with_attribute",
    "address": "柳营路",
    "county_name" : "静安区",
}}

</example>
请根据用户的问题,判断用户的意图并抽取相关信息,最终的输出只输出json结果,包裹在``json``中。
{question}
\n\nAssistant: """

2)增强召回 PE

"""\n\n您是一个语义理解机器人,需要从系统给出的初步医疗机构名单中,筛选跟用户问题最相关的机构,去除掉不相关的机构。
在医疗机构搜索任务中,用户会对系统进行模糊提问,从而查询到对应的结果。
下面是相关的要求
<instructions>
•	候选的机构列表是一个XML结构
•	进行机构筛选的时候,需要判断用户查询的问题跟候选机构的相关性,判断相关性需要从机构名称,机构地址,机构类型等多个维度进行衡量
•	最后只返回json结果,不需要返回其他说明,包裹在``json``中
•	返回的结果中,包括keeped的机构和removed的机构,最后只输出json结果
</instructions>
这里是相关的示例:
<example>
<机构列表>
<机构 code='776446' name='国药控股药房(上海)有限公司' address='上海市静安区康宁路1095号'
root_organization_type_name='药店' />
<机构 code='436446' name='国药控股国大药房有限公司' address='上海市静安区康宁路1089号1幢101室'
root_organization_type_name='药店' />
<机构 code='945329' name='上海老百姓亭知大药' address='上海市黄埔去柳营路100号'
root_organization_type_name='药店' />
<机构 code='1534631' name='上海柳苑药房有限公司' address='上海市徐汇武康路1089号1幢101室'
root_organization_type_name='药店' />
</机构列表>

用户询问: 康宁路有什么药店?
问题分析:该问题涉及到机构地址为康宁路、机构类型为药店,所以应该去查看机构列表中机构标签属性中的地址和类型进行匹配,最终应该匹配出的机构是:

答案输出:
{{
    "keeped":  ["776446", "436446"],
    "removed" : ["945329", "1534631"]
}}

</example>
候选的机构列表如下:
<机构列表>
{agents}
</机构列表>
用户的问题如下:
{question}
请根据用户的问题,筛选最相关的机构,只需要需要json的结果,不需要输出机构的详细信息,最终的输出只输出json结果,包裹在``json``中。
\n\nAssistant: """

3)多意图识别智能搜索例子

以下为一些常见的搜索情形,在本方案中均得到了较好的解决。

3.1)单独进行机构名称搜索

3.2)搜索带属性的机构列表

3.3)拼音中英文混合搜索

本篇作者

黄海波

亚马逊云科技高级架构师。负责亚马逊云科技合作伙伴相关解决方案的建设以及合作伙伴生态合作。与合作伙伴一起,根据客户需求,分析其在技术架构层面所遇到的挑战和未来的方向,设计和落地基于亚马逊云科技平台和合作伙伴产品的架构方案。曾在知名外企任职高级系统架构师,高级研发工程师,有丰富的系统设计和研发经验。

苏品毓

亚马逊云科技行业解决方案架构师,专注于 AI/ML 和金融科技领域。曾就职于三星、猎户星空、雪球等公司,参与多个重点项目,包括手机智能语音助手,智能音箱,金融预训练模型以及金融知识图谱等,在自然语言处理领域积累了丰富的实战经验。

王舟童

亚马逊云科技资深行业解决方案架构师,负责 AI 在行业侧的解决方案设计和构建,拥有多年计算机视觉在零售行业的方案设计及落地经验。