前言
在刚过去不久的双十一中,相信不少消费者都经历了购物狂欢带来的兴奋与挑战。随着电商行业的迅猛发展,线上购物已成为人们生活中不可或缺的一部分。然而,在海量的商品信息面前,如何快速找到心仪的产品、获得个性化的推荐,成为了众多消费者和商家共同关注的问题。
自今年9月14日以来,淘宝就开始内测AI助手“淘宝问问”,它接入阿里通义大模型,旨在帮助用户提升在淘宝上的商品推荐和搜索效率。
换做传统的购物方式,大多是进去“关键词搜索”➡“商品展示页”,当用户搜索较为复杂或模糊的需求的时候,搜索的结果常常不尽如意,购买效率往往较低,所以,为了提升用户在复杂需求场景下的使用效率,淘宝问问为商家和用户分别提供了提升种草内容生产效率的AI内容工具,以及提升商品搜索效率的AI导购工具。
比如说,我们可以直接提问:“有哪些小众耐磨女士运动鞋?”
淘宝问问提供的答案分为三个主要板块:
品牌推荐:展示一系列精选的品牌供用户选择;
兴趣商品推荐:呈现用户“可能感兴趣”的商品链接;
关联问题:提供一些与当前查询相关的周边问题,方便用户进一步探索。
其中,“兴趣商品推荐”推荐基于用户的日常搜索数据。例如,如果用户之前搜索过女士运动鞋品牌,这些品牌的相关商品将被优先推荐,确保个性化和相关性。
同时,如果我们有明确的需求,也可以采用逐轮对话的方式直接挑选出符合要求的商品:
那么如此好用且强大的功能是如何实现的呢?本文就将深入探讨阿里云提供的《主动式智能导购AI助手构建》解决方案,揭秘其背后的技术原理,分享部署实践中的心得体会,并讨论该技术对重塑现代购物体验的深远影响。希望通过对这一先进工具的解析,能够为更多开发者和技术爱好者带来启发,同时也为寻求优化用户体验的电商从业者提供有价值的参考。
主动式智能导购 AI 助手构建
技术解决方案地址:https://www.aliyun.com/solution/tech-solution/build-an-ai-shopping-assistant
方案架构
该Multi-Agent架构主要以规划助理(Router Agent)作为核心,接收用户的购买意向或参数输入,并根据对话历史和用户输入选择合适的商品导购助理(如手机导购、冰箱导购、电视导购)进行回复。商品导购助理(Shopping Agent)会主动询问用户的商品参数偏好,收集完整参数后,系统通过百炼应用或SQL查询商品数据库进行智能商品检索,生成推荐的商品列表。用户与各助理的对话历史为每个助理的决策提供了参考依据,确保推荐更加精准和个性化。
【注释】
Multi-Agent架构:多智能体架构,它模拟了现实世界中代理(agent)之间的互动与合作。在这种架构中,系统由多个自主的、智能的代理组成,每个代理都能执行特定的任务,并且能够根据环境变化做出决策。代理之间通过消息传递或共享知识库进行沟通和协作,以完成复杂的任务或解决问题。本次涉及到的Agent有多个,分别是规划助理(Router Agent)和商品导购助理(Shopping Agent),而商品导购助理(Shopping Agent)又分为手机导购助理、电视导购助理、冰箱导购助理。
百炼平台:百炼平台是阿里云推出的一个大型预训练模型服务平台,它基于深度学习技术,旨在为开发者和企业提供强大的自然语言处理(NLP)和机器学习能力。对于文中提到的商品检索场景,百炼平台可以用于理解用户的查询意图,解析商品参数偏好,并且智能化地从海量的商品信息中检索出最符合用户需求的商品推荐结果。这不仅提升了搜索的效率,也增强了用户体验,使得导购过程更加个性化和精准。
快速部署
回到解决方案,点击立即部署,跳转至操作文档界面
访问已有的函数计算应用模板,进入如下界面:
进入到百炼平台中,点击个人头像,获取自己的API-Key
选择 直接部署 ,填入自己的API-Key,其它表单项保持默认,单击页面左下角的创建并部署默认环境,等待项目部署完成即可(预计耗时 1 分钟)
开始部署后会跳转至如下界面:
当看到部署完成,点击访问域名:
此时,网站一键部署完成:
这里我们也可以借助官方文档学习一下,看看官方编写的Agent prompt设定是什么样的
ROUTER_AGENT_INSTRUCTION = """你是一个问题分类器
请根结合用户的提问和上下文判断用户是希望了解的商品具体类型。
注意,你的输出结果只能是下面列表中的某一个,不能包含任何其他信息:
- 手机(用户在当前输入中提到要买手机,或正在进行手机参数的收集)
- 电视机(用户在当前输入中提到要买电视机,或正在进行电视参数的收集)
- 冰箱(用户在当前输入中提到要买冰箱,或正在进行冰箱参数的收集)
- 其他(比如用户要买非上述三个产品、用户要买不止一个产品等情况)
输出示例:
手机
"""
router_agent = Assistants.create(
model="qwen-plus",
name='引导员,路由器',
description='你是一个商城的引导员,负责将用户问题路由到不同的导购员。',
instructions=ROUTER_AGENT_INSTRUCTION
)
上述是规划助理的设定prompt,我们可以清晰的看到,该设定明确规划助理的任务是作为问题分类器,根据用户的提问和上下文来确定用户感兴趣的商品类型,并且严格规定输出只能是从预定义列表中选择一个类别,即手机、电视机或冰箱,以及一个兜底的“其他”选项,用于处理不在上述三个主要类别内的查询。这种严格的输出限制确保了输出的一致性和简洁性,便于后续处理逻辑直接使用这些信息,同时通过提供具体的判断标准提高了分类的准确性。
但是,在实际的业务中,这种设定在面对复杂或模糊的用户请求时也会缺乏灵活性,尤其是在用户有多个购物意向或需要更深入理解上下文的情况下,可能会导致分类不准确或过于泛化的问题,所以此处并不能直接投入到生产环境中去使用。
在识别意图之后,会再分理至不同的Agent进行处理,通过预先定义的映射表agent_map,系统能够依据用户的问题类型选择最合适的导购员来提供服务。如果用户的查询被分类为“手机”、“电视机”或“冰箱”,系统将会把请求转交给专门负责该类商品的导购员代理,由它们来生成详细的回复内容。
agent_map = {
"意图分类": router_agent.id,
"手机": mobilephone_guide_agent.id,
"冰箱": fridge_guide_agent.id,
"电视机": tv_guide_agent.id
}
def chat(input_prompt, thread_id):
# 首先根据用户问题及 thread 中存储的历史对话识别用户意图
router_agent_response = get_agent_response(agent_name="意图分类", input_prompt=input_prompt, thread_id=thread_id)
classification_result = parse_streaming_response(router_agent_response)
response_json = {
"content": "",
}
# 如果分类识别为其他时,引导用户调整提问方式
if classification_result == "其他":
return_json["content"] = "不好意思,我没有理解您的问题,能换个表述方式么?"
return_json['current_agent'] = classification_result
return_json['thread_id'] = thread_id
yield f"{json.dumps(return_json)}\n\n"
# 如果分类是手机、电视机或冰箱时,让对应的 Agent 进行回复
else:
agent_response = get_agent_response(agent_name=classification_result, input_prompt=input_prompt, thread_id=thread_id)
for chunk in agent_response:
response_json["content"] = chunk
response_json['current_agent'] = classification_result
response_json['thread_id'] = thread_id
yield f"{json.dumps(response_json)}\n\n"
其实也可以看出,每个特定商品类型的Agent都经过了优化,可以较好地理解和回应与之相关的具体问题和需求。如果分类结果是“其他”,则意味着用户的查询不符合预设的商品类别,这时系统会提示用户调整提问方式,以获得更准确的帮助。整个过程确保了用户的问题能够被快速且精准地路由到最适合的处理节点,从而提高了服务效率和用户体验。
应用于生产环境
上述其实也提到,demo确实无法直接适用于生产环境,不过好在官方文档中给出了适配生产环境的方式
首先第一点,适配生产环境必须要修改对应的知识库内容
这里又不得不提到我们的百炼平台了,关于这一块的操作步骤可以参考百炼官方文档
解决方案这里写的确实太简洁了,大家参考上面的百炼官方文档即可
第二点,也是最关键的,就是修改源码中的prompt
这一块确实也没办法直接给出,并且需要反复调试才可以达到最优,这里周周推荐一个取巧的方式,就是将官方的prompt丢给千问,让千问模仿给出符合自己需求的
比如手机导购助理的Agent prompt设定如下:
MOBILEPHONE_GUIDE_AGENT_INSTRUCTION = """你是负责给顾客推荐手机的智能导购员。
你需要按照下文中【手机的参数列表】中的顺序来主动询问用户需要什么参数的手机,一次只能问一个参数,不要对一个参数进行重复提问。
如果用户告诉了你这个参数值,你要继续询问剩余的参数。
如果用户询问这个参数的概念,你要用你的专业知识为他解答,并继续向他询问需要哪个参数。
如果用户有提到不需要继续购买商品,请输出:感谢光临,期待下次为您服务。
【手机的参数列表】
1.使用场景:【游戏、拍照、看电影】
2.屏幕尺寸:【6.4英寸、6.6英寸、6.8英寸、7.9英寸折叠屏】
3.RAM空间+存储空间:【8GB+128GB、8GB+256GB、12GB+128GB、12GB+256GB】
如果【参数列表】中的参数都已收集完毕,你要问他:“请问您是否确定购买?”,并同时将顾客选择的参数信息输出,如:用于拍照|8GB+128GB|6.6英寸。问他是否确定需要这个参数的手机。如果顾客决定不购买,要问他需要调整哪些参数。
如果顾客确定这个参数符合要求,你要按照以下格式输出:
【使用场景:拍照,屏幕尺寸:6.8英寸,存储空间:128GB,RAM空间:8GB】。请你只输出这个格式的内容,不要输出其它信息。"""
mobilephone_guide_agent = Assistants.create(
model="qwen-max",
name='手机导购',
description='你是一个手机导购,你需要询问顾客想要什么参数的手机。',
instructions=MOBILEPHONE_GUIDE_AGENT_INSTRUCTION
)
我们想写一个在线问诊的Agent prompt设定,可以如此提问:
已知手机导购助理prompt如下:XXX
请你模仿帮我构建一个适用于在线问诊的Agent prompt设定
通义给出的回复如下:
ONLINE_DIAGNOSIS_AGENT_INSTRUCTION = """你是负责提供在线健康咨询服务的智能医疗助手。
你的任务是根据【问诊参数列表】中的顺序,逐步询问用户有关其症状、病史等信息,每次只问一个问题,并确保不重复提问。如果用户提供了相关信息,继续询问下一个参数。如果用户对某个术语或概念有疑问,请用通俗易懂的语言解释,并继续询问其他参数。如果用户表示不再需要服务或感觉不适,请输出:“感谢您的信任,祝您早日康复,如有需要随时联系我们。”
【问诊参数列表】
1. 主要症状:请描述您当前最困扰的症状(如头痛、咳嗽、发热等)。
2. 症状持续时间:这些症状已经持续多久了?
3. 既往病史:您是否有任何慢性疾病或其他健康问题?(如高血压、糖尿病等)
4. 当前用药情况:您目前正在服用哪些药物?
5. 过敏史:您是否对某些食物、药物或物质过敏?
6. 其他相关信息:您还有其他想要告知医生的信息吗?
当所有【问诊参数列表】中的信息都收集完毕后,你需要告诉用户:“我们已经收集到了您的基本信息,接下来会根据您提供的信息进行初步分析。”然后向用户提出:“请问您是否希望我们为您预约一位专业医生进行详细咨询?”同时将用户提供的信息总结并展示给用户确认。
如果用户同意进一步咨询,则按照以下格式输出:
【主要症状:头痛,症状持续时间:三天,既往病史:无,当前用药情况:无,过敏史:青霉素】
如果你无法提供具体的医疗建议或诊断,一定要提醒用户及时就医,并强调你所提供的只是基于现有信息的初步建议,不能代替专业医生的面对面诊疗。确保始终以用户的健康和安全为优先考虑。
请注意,在整个沟通过程中保持耐心和同情心,尊重用户的隐私和感受。"""
online_diagnosis_agent = Assistants.create(
model="qwen-max",
name='在线医疗助手',
description='你是一个在线医疗助手,负责询问患者有关症状、病史等信息,为用户提供初步健康咨询。',
instructions=ONLINE_DIAGNOSIS_AGENT_INSTRUCTION
)
当然,这个还可以进一步细化【问诊参数列表】,给出prompt如下:
请根据医生就诊的实际过程来优化【问诊参数列表】
最终优化后的Agent prompt设定如下:
ONLINE_DIAGNOSIS_AGENT_INSTRUCTION = """你是负责提供在线健康咨询服务的智能医疗助手。
你的任务是根据【问诊参数列表】中的顺序,逐步询问用户有关其症状、病史等信息,每次只问一个问题,并确保不重复提问。如果用户提供了相关信息,继续询问下一个参数。如果用户对某个术语或概念有疑问,请用通俗易懂的语言解释,并继续询问其他参数。如果用户表示不再需要服务或感觉不适,请输出:“感谢您的信任,祝您早日康复,如有需要随时联系我们。”
【问诊参数列表】
1. **基本信息**:
- 您的年龄、性别和职业是什么?
2. **主要症状**:
- 请描述您当前最困扰的症状(如头痛、咳嗽、发热等),并说明这些症状首次出现的时间。
3. **症状特点**:
- 这些症状是否有特定的时间模式?例如,是否在早晨更为严重,或者是在某些活动后加剧?
4. **伴随症状**:
- 是否还有其他伴随症状?比如恶心、呕吐、呼吸困难等。
5. **既往病史**:
- 您是否有任何慢性疾病或其他健康问题?(如高血压、糖尿病等)
6. **家族病史**:
- 您的直系亲属中是否有人患有类似症状或相关疾病?
7. **用药情况**:
- 您目前正在服用哪些药物?包括处方药、非处方药、草药或补充剂。
8. **过敏史**:
- 您是否对某些食物、药物或物质过敏?
9. **生活方式与环境因素**:
- 您的生活方式如何?例如,饮食习惯、运动频率、吸烟饮酒情况等。
- 您的工作或生活环境是否存在可能影响健康的因素?
10. **近期变化**:
- 最近几周内,您的生活或工作环境中是否发生了重大变化?
11. **其他相关信息**:
- 您还有其他想要告知医生的信息吗?
当所有【问诊参数列表】中的信息都收集完毕后,你需要告诉用户:“我们已经收集到了您的基本信息,接下来会根据您提供的信息进行初步分析。”然后向用户提出:“请问您是否希望我们为您预约一位专业医生进行详细咨询?”同时将用户提供的信息总结并展示给用户确认。
如果用户同意进一步咨询,则按照以下格式输出:
【基本信息:年龄30,性别男,职业程序员,主要症状:头痛,症状首次出现时间:三天前,症状特点:早晨较重,伴随症状:无,既往病史:无,家族病史:无,用药情况:无,过敏史:青霉素,生活方式:久坐办公室,近期变化:最近加班较多】
如果你无法提供具体的医疗建议或诊断,一定要提醒用户及时就医,并强调你所提供的只是基于现有信息的初步建议,不能代替专业医生的面对面诊疗。确保始终以用户的健康和安全为优先考虑。
请注意,在整个沟通过程中保持耐心和同情心,尊重用户的隐私和感受。"""
online_diagnosis_agent = Assistants.create(
model="qwen-max",
name='在线医疗助手',
description='你是一个在线医疗助手,负责询问患者有关症状、病史等信息,为用户提供初步健康咨询。',
instructions=ONLINE_DIAGNOSIS_AGENT_INSTRUCTION
)
在测试完成后,可以开始进行第三步,将智能导购集成到已有的网站中,这里可以直接参考10分钟在网站上增加一个AI助手
其实最终效果就和这个类似:
也可以参看我以前的文章:详解基于百炼平台及函数计算快速上线网页AI助手
总结
这篇体验下来,说实话,与之前【10分钟在网站上增加一个AI助手】的逻辑基本一致,只是由单Agent变成了多Agent,虽然听起来只是数量多了点,但是实际上是代表了框架和服务能力的一次质的飞跃。
在单Agent模式下,所有的用户请求都被同一个通用的AI助手处理,这可能导致对于复杂或多意图的问题响应不够精确或者需要更多的时间来理解上下文。而多Agent架构允许根据用户的输入和需求动态地选择最合适的专家级Agent来进行对话管理,从而确保了更专业、更快速的服务响应。例如,在电商场景中,当用户询问关于手机的信息时,系统会自动将请求转交给专门负责手机导购的Agent;如果用户随后转向咨询电视机,则另一个专精于电视产品的Agent会接手继续服务。
整个解决方案确实也非常优秀,基本没有槽点,具有很高的指导性和可操作性!好评!