用心打造
VPS知识分享网站

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

这两年随着 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)拼音中英文混合搜索

赞(0)
未经允许不得转载;国外vps网站 » 基于大模型的多意图增强搜索
分享到