本文为您介绍如何基于 PAI-FeatureStore、大模型服务和搜索召回引擎,在 PAI-Rec 推荐引擎上搭建一条 AI 导购(对话式推荐)链路,涵盖物品表数据准备、商品索引与会话存储配置、模型接入以及配置发布的完整流程。
背景信息
AI 对话推荐是面向自然语言的推荐场景。本文以商品导购作为具体案例来说明改产品的用法。用户不再只输入明确关键词,而是会用“通勤穿、显瘦一点、预算别太高、换成短袖”等口语化方式表达需求。用户可以多轮对话来明确自己的需求。 本产品可以适配不同的 AI对话推荐场景,如各种电商场景、婚纱定制、艺术品推荐,商品导购等场景。并且支持各种小语种,对于跨境业务很友好。
下图给出 AI 导购的三大核心场景,帮助建立整体直观印象:

图 1:AI 导购三大核心场景——场景化对话购物(“下周去海边度假,推荐一套防晒服穿搭”)、多条件智能筛选(“送女朋友的礼物,预算 200,粉色裙子”)、图文混合搜索(“有类似这种风格的裙子吗?”+上传图片)。每个场景都遵循“用户口语化表达 → AI 理解并匹配真实商品 → 给出带推荐理由的商品”的模式。
一条 AI 导购链路通常包含三步:
理解用户需求:从自然语言中识别品类、颜色、材质、风格、场景、价格等条件。
检索真实商品:基于物品表构建检索索引,只从真实商品中选择候选。
生成导购回复:结合商品信息、历史对话和 prompt,输出推荐理由和商品卡片引用。
从系统实现看,这条链路可以拆成四层,自上而下分工明确:

图 2:基于 PAI-Rec 的 AI 导购系统分层架构。用户交互层(Web Chat / App 内嵌 / 小程序 / API)、LLM 对话层(意图抽取、受约束召回、推荐编排、多轮状态;function-calling·agent loop·AND-first·场景化分组·ChatSearch API)、PAI-Rec 引擎层(多路召回、曝光过滤、精排打分、重排策略)、数据与模型层(FeatureStore、EasyRec、Search/Recall Engine、LLM/Embedding)。
进一步看在线运行时,用户的一句话是如何在各模块间流转的:

图 3:在线链路架构总览。左侧用户购物需求经对话入口进入 LLM 编排中枢,依次完成 ① 意图抽取(关键词·反选·价格区间)、② 受约束召回检索(调用搜索召回接口·AND-first 策略)、③ 推荐编排(按场景/人群/面料分组讲解),并由多轮对话状态管理维护上下文记忆、约束缓存与候选集跟踪;右侧 PAI-REC 推荐引擎 提供 FeatureStore、搜索召回接口、商品索引与排序/重排能力。
下面用一次具体对话,串起 LLM 对话层与 PAI-Rec 推荐引擎的协作:

图 4:LLM 对话层 + PAI-Rec 推荐引擎协作流程示例。以“想买一件 200 元以下、不要红色的衬衫”为例,后台依次完成 ① LLM 意图抽取(融合多轮历史·关键词:衬衫、反选:红色、≤200)、② 多通道召回(搜索/个性化/多模态·AND-first)、③ PAI-Rec 排序重排(用户画像偏好·多样性打散)、④ LLM 推荐编排(按场景/风格/面料分组讲解),最终以“分两组、每组附卖点”的方式回复,避免“十几件并列”的决策瘫痪。
因此,数据准备的重点不是“把数据库所有字段都导进去”,而是从用户会怎么描述商品出发,准备能被模型检索到的商品文本。当前链路支持关键词检索、排除关键词和价格区间过滤。
整条链路依赖三类资源:
搜索召回引擎:承载商品索引,负责关键词检索、排除关键词和价格区间过滤。
PAI-FeatureStore:保存多轮对话上下文,支持“换成短袖”“预算再低一点”等连续追问。
大模型服务(阿里云 PAI-Token):负责需求理解和导购回复生成。
前提条件
在开始前,请确认已完成以下准备:
已开通并创建智能开放搜索 OpenSearch 召回引擎版实例。
已开通 PAI-FeatureStore 并创建项目,且已配置 FeatureDB 在线存储。
已准备 MaxCompute 项目,用于承载商品物品表,并作为 OpenSearch 召回引擎版的导入数据源。
已在阿里云 PAI-Token 服务获取可用的模型 API Key,并确认模型名称与服务地域。
已部署 PAI-Rec 推荐引擎服务,并可访问引擎配置发布页面。
步骤一:准备物品表数据
AI 导购链路需要准备一张物品表:
表 | 是否必备 | 作用 |
物品表 | 必备 | 用于构建搜索召回引擎商品索引,支持商品检索和商品卡片展示 |
会话存储不需要单独准备业务表,可在 PAI-FeatureStore 中手动创建一个会话特征视图,详见步骤三。
1.1 物品表字段
物品表建议以“一个可售商品 / SKU 一行”为粒度,并先落到 MaxCompute,作为后续导入搜索召回引擎的数据源。字段名不要求与下表完全一致,但需要能映射到对应含义。
字段 | 是否必备 | 用途 | 类型建议 | 示例值 | 配置建议 |
| 必备 | 商品唯一标识,用于商品卡片引用、更新和去重 | string |
| 必须唯一且非空 |
| 必备 | 商品标题,用于展示和语义理解 | string |
| 作为返回字段,也建议进入检索文本 |
| 必备 | 主检索字段,承载可被搜索的综合文本,可以将所有的商品描述字段合并在该字段中 | string |
| 配置为搜索召回引擎默认检索字段 |
| 推荐 | 商品详情、卖点、材质、版型、适用场景 | string |
| 进入检索文本,也作为返回信息 |
| 推荐 | 支持价格过滤和预算类需求 | number |
| 配置为价格字段,类型保持数值 |
| 推荐 | 品类 | string |
| 建议拼入 |
| 推荐 | 品牌 | string |
| 建议拼入 |
| 推荐 | 颜色 | string |
| 建议拼入 |
| 推荐 | 材质 | string |
| 建议拼入 |
| 推荐 | 风格、场景、人群、季节等描述 | array/string |
| 建议拼入 |
| 可选 | 前端商品卡片展示图片 | string |
| 如商品卡片需要图片则返回该字段 |
| 可选 | 标识商品是否可售 | string |
| 建议只把可售商品导入当前索引 |
1.2 数据准备建议
不要直接全量导入业务数据库字段,优先保留用户会感知、会搜索的字段;价格字段单独保留为数值,用于价格区间过滤。
删除冗长 HTML、重复文案、无搜索价值的大字段,避免影响索引质量和响应耗时。
同一字段的数据类型必须一致,例如
price不要有的行是数字、有的行是字符串。正式全量导入前,先准备 50-100 条代表性商品跑通字段配置、索引构建和搜索体验。
商品样例:
{
"item_id": "sku_10001",
"title": "蓝色纯棉长袖衬衫",
"default": "Blue Cotton Long Sleeve Shirt, Commuting, Slim Fit",
"content_desc": "纯棉面料,微宽松版型,适合通勤和日常穿搭。",
"price": 299.00,
"category": "女装/衬衫/长袖衬衫",
"brand": "ExampleBrand",
"color": "blue",
"material": "cotton",
"style_tags": ["commute", "minimal", "spring"],
"image_url": "https://example.com/images/sku_10001.jpg",
"sale_status": "on_sale"
}步骤二:在 OpenSearch 召回引擎版导入并配置商品索引
本步骤将物品表从 MaxCompute 导入智能开放搜索 OpenSearch 召回引擎版,并配置检索字段、模糊分析器、价格过滤和返回字段,使 AI 导购可以从真实商品中检索候选。更多操作详情,请参见 OpenSearch 文档:表管理, 表配置。
2.1 准备 MaxCompute 商品表
将步骤一整理好的物品表写入 MaxCompute 表。请确保用于导入的账号对该表具备 describe、select、download 权限,字段类型使用 OpenSearch 召回引擎版支持的 STRING、BIGINT、DOUBLE 等类型。
2.2 新建 MaxCompute 数据源
进入 OpenSearch 召回引擎版实例的配置中心,选择数据源配置,单击添加数据源。
数据源类型选择 MaxCompute,并填写:
数据源名称:遵循“实例名称_自定义名称”格式。
MaxCompute Project、AccessKey ID、AccessKey Secret。
表名及分区(Partition)。
是否开启自动索引重建。
单击校验,校验通过后保存数据源。
说明:如需增量更新并自动触发索引重建,可按控制台指引创建 [表名]_done 辅助表标记数据变更。2.3 配置索引表结构和模糊分析器配置
为数据源新增索引表结构和模糊分析器配置,确保 AI 导购可以按 default 字段检索商品。
配置示例如下:

如上图所示,导入表后,配置主键,属性字段,搜索结果展示字段,以及分析方式。
其中主键和价格要设置为属性字段,方便后续检索过滤使用。搜索结果展示字段建议包含商品的一些基本信息,这样方便后续大模型根据这些信息进行推荐和聚合分组回复。default 字段设置模糊分析器,该字段主要用来做关键词检索。
2.4 推送配置并重建索引
完成字段、索引、属性、返回字段和分析器配置后,推送配置并触发索引重建。等待索引构建完成后,再进行检索和导购体验测试。
2.5 在 PAI-Rec 中引用召回配置
索引就绪后,在 PAI-Rec 引擎配置中引用该 OpenSearch 召回引擎版实例与索引。
配置示例:
{
"RecallConfs": [
{
"Name": "opensearch_chat_recall",
"RecallType": "HA3_CHAT_RECALL",
"Ha3ChatRecallConf": {
"EngineName": "opensearch_aishopping",
"IndexName": "ai_guide_goods_simple_v2",
"DefaultField": "default",
"Analyzer": "fuzzy_search_analyzer",
"PriceField": "price"
}
}
],
"Ha3EngineConfs": {
"opensearch_aishopping": {
"Endpoint": "ha-cn-xxxx.public.ha.aliyuncs.com",
"Username": "ha_user_example",
"Password": "example-ha-password",
"InstanceId": "ha-cn-xxxx",
"Timeout": 3000
}
}
}字段说明:
字段名 | 类型 | 是否必填 | 描述 |
| string | 是 | 召回配置名称,需与 |
| string | 是 | 召回类型,按示例固定填写。 |
| string | 是 | OpenSearch 召回引擎版数据源名称,需与数据源配置中的 key 一致。 |
| string | 是 | 商品索引名称。 |
| string | 是 | 默认检索字段,当前链路按该字段进行关键词检索。 |
| string | 是 | OpenSearch 召回引擎版查询分析器名称,与索引侧模糊分析器配置对应。 |
| string | 是 | 价格字段名称,用于 |
| string | 是 | OpenSearch 召回引擎版 endpoint。 |
| string | 是 | OpenSearch 召回引擎版用户名。 |
| string | 是 | OpenSearch 召回引擎版密码。 |
| string | 是 | OpenSearch 召回引擎版实例 ID。 |
| integer | 是 | OpenSearch 召回引擎版请求超时时间,单位为毫秒;示例值 |
步骤三:在 FeatureStore 手动创建会话特征视图
如果还没有开通过 PAI-FeatureStore,请先开通并创建项目,参考文档:https://www.alibabacloud.com/help/zh/pai/configure-data-sources/?spm=a2c4g.11186623.help-menu-30347.d_7_2_1.63f99d0cKT8v4A
AI 导购运行时通过 PAI-FeatureStore 在线存储读写多轮对话上下文,支持“换成短袖”“预算再低一点”等连续追问。会话特征视图需手动创建,且必须开启在线特征表(FeatureDB)同步。更多操作详情,请参见配置FeatureStore项目。
3.1 创建特征实体与会话特征视图
登录 PAI 控制台,进入 FeatureStore,选择或创建项目(项目需关联 MaxCompute 项目与 FeatureDB 在线库)。
在特征实体页签,单击新建特征实体,创建会话实体,例如名称
session,Join Id 设置为session_id。在特征视图页签,单击新建特征视图,按如下方式配置:
名称:
ai_shopping_session_batch。类型:离线特征视图。
表结构:选择自定义 Schema(自定义表结构),按下表逐个添加字段。或者可以直接复制以下的 json schema 到自定义 Schema 中。
[ { "Type": "STRING", "Attributes": [ "PrimaryKey" ], "Name": "session_id" }, { "Type": "STRING", "Name": "session_blob" }, { "Type": "STRING", "Attributes": [ "Partition" ], "Name": "dt" }, { "Type": "STRING", "Attributes": [ "Partition" ], "Name": "hh" } ]
主键:指定
session_id为主键。在线同步:开启同步在线特征表,在线存储选择 FeatureDB。
关联特征实体:选择
session。
保存特征视图。
说明:系统会自动创建对应的 MaxCompute 离线表,但会话特征视图无需离线导入业务数据,AI 导购运行时会按会话直接写入在线库。请确认服务运行环境网络可以访问 FeatureDB。
注意:生产环境建议使用 VPC 访问 FeatureDB,默认不启用 TestMode。3.2 在 PAI-Rec 中引用会话存储配置
在 PAI-Rec 引擎配置中,将 AI 导购场景的会话存储指向上一步创建的特征视图。
配置示例:
```json
{
"SceneConfs": {
"ai_shopping": {
"default": {
"AIChatConfig": {
"SessionFeatureStoreName": "aishopping_fs",
"SessionFeatureView": "ai_shopping_session_batch"
}
}
}
},
"FeatureStoreConfs": {
"aishopping_fs": {
"RegionId": "cn-hangzhou",
"ProjectName": "ai_shopping",
"FeatureDBUsername": "featuredb_user",
"FeatureDBPassword": "example-featuredb-password"
}
}
}字段说明:
字段名 | 类型 | 是否必填 | 描述 |
| string | 是 | 会话存储使用的 FeatureStore 配置名称,需与 |
| string | 是 | 手动创建的会话特征视图名称。 |
| integer | 否 | 最多保留的历史对话轮数;未配置时默认 |
| integer | 否 | 最多保留的历史上下文 token 数;未配置时默认 |
| string | 是 | FeatureStore 所在地域。 |
| string | 是 | FeatureStore 项目名称。 |
| string | 是 | FeatureDB 用户名。 |
| string | 是 | FeatureDB 密码。 |
| string | 否 | FeatureStore 服务访问域名;未配置时使用 SDK 默认域名。 |
| boolean | 否 | 是否使用测试模式;未配置时默认 |
步骤四:配置大模型
进入阿里云 PAI-Token 服务,确认可用的 API Key。
确认模型名称和模型服务地域。
在 PAI-Rec 引擎配置中替换模型配置。
配置示例:
{
"AlgoConfs": [
{
"Name": "ai_chat_qwen",
"Type": "PAI_CHAT",
"PAIModelConf": {
"APIKey": "example-pai-model-api-key",
"Model": "qwen3.7-plus"
}
}
]
}字段说明:
字段名 | 类型 | 是否必填 | 描述 |
| string | 是 | 模型配置名称,需与 |
| string | 是 | 算法类型,固定为 |
| string | 是 | PAI-Token / PAI Model API Key。 |
| string | 是 | 模型名称。 |
| string | 否 | 模型服务地域;未配置时默认 |
| integer | 否 | 模型请求超时时间,单位为毫秒;未配置时默认 |
步骤五:组装并发布完整推荐配置
页面发布时粘贴的是一份完整 JSON,不是分别发布 OpenSearch 召回引擎版、FeatureStore 或模型配置。下面示例只保留 AI 导购生效所需的必填配置;RunMode、ListenConf 等通用引擎字段按模板保留即可,字段含义可参考引擎配置文档。
5.1 完整配置示例
{
"RunMode": "product",
"ListenConf": {
"HttpAddr": "",
"HttpPort": 8000
},
"SceneConfs": {
"ai_shopping": {
"default": {
"AIChatConfig": {
"DefaultLanguage": "zh",
"OutputLanguages": [
"zh",
"en",
"ar"
],
"PlannerPromptTemplates": {
"zh": "${AIShoppingPlannerPromptZh}",
"en": "${AIShoppingPlannerPromptEn}",
"ar": "${AIShoppingPlannerPromptAr}"
},
"ReplyPromptTemplates": {
"zh": "${AIShoppingReplyPromptZh}",
"en": "${AIShoppingReplyPromptEn}",
"ar": "${AIShoppingReplyPromptAr}"
},
"FallbackTemplates": {
"zh": {
"rate_limit": "${AIShoppingFallbackRateLimitZh}",
"timeout": "${AIShoppingFallbackTimeoutZh}",
"empty_after_tools": "${AIShoppingFallbackEmptyAfterToolsZh}",
"generic": "${AIShoppingFallbackGenericZh}"
},
"en": {
"rate_limit": "${AIShoppingFallbackRateLimitEn}",
"timeout": "${AIShoppingFallbackTimeoutEn}",
"empty_after_tools": "${AIShoppingFallbackEmptyAfterToolsEn}",
"generic": "${AIShoppingFallbackGenericEn}"
},
"ar": {
"rate_limit": "${AIShoppingFallbackRateLimitAr}",
"timeout": "${AIShoppingFallbackTimeoutAr}",
"empty_after_tools": "${AIShoppingFallbackEmptyAfterToolsAr}",
"generic": "${AIShoppingFallbackGenericAr}"
}
},
"LLMAlgoName": "ai_chat_qwen",
"RecallName": "opensearch_chat_recall",
"SessionFeatureStoreName": "aishopping_fs",
"SessionFeatureView": "ai_shopping_session_batch"
}
}
}
},
"AlgoConfs": [
{
"Name": "ai_chat_qwen",
"Type": "PAI_CHAT",
"PAIModelConf": {
"APIKey": "example-pai-model-api-key",
"Model": "qwen3.7-plus"
}
}
],
"RecallConfs": [
{
"Name": "opensearch_chat_recall",
"RecallType": "HA3_CHAT_RECALL",
"Ha3ChatRecallConf": {
"EngineName": "opensearch_aishopping",
"IndexName": "ai_guide_goods_simple_v2",
"DefaultField": "default",
"Analyzer": "fuzzy_search_analyzer",
"PriceField": "price"
}
}
],
"FeatureStoreConfs": {
"aishopping_fs": {
"RegionId": "cn-hangzhou",
"ProjectName": "ai_shopping",
"FeatureDBUsername": "featuredb_user",
"FeatureDBPassword": "example-featuredb-password"
}
},
"Ha3EngineConfs": {
"opensearch_aishopping": {
"Endpoint": "ha-cn-xxxx.public.ha.aliyuncs.com",
"Username": "ha_user_example",
"Password": "example-ha-password",
"InstanceId": "ha-cn-xxxx",
"Timeout": 3000
}
}
}本流程需要关注的字段如下;其他通用引擎字段按示例保留,不在这里重复介绍。
字段名 | 类型 | 是否必填 | 描述 |
| string | 是 | 默认回复语言;示例值 |
| array | 是 | 允许输出的语言列表;示例值 |
| object | 是 | 规划 prompt 模板,按语言配置;发布前复制当前线上稳定配置。 |
| object | 是 | 回复 prompt 模板,按语言配置;发布前复制当前线上稳定配置。 |
| object | 是 | 兜底回复模板,按语言和兜底类型配置;发布前复制当前线上稳定配置。 |
| string | 是 | 大模型配置名称,需与 `AlgoConfs[].Name` 一致。 |
| string | 是 | 商品召回配置名称,需与 `RecallConfs[].Name` 一致。 |
| string | 是 | 会话存储配置名称,需与 |
| string | 是 | 会话特征视图名称,需要与手动创建的特征视图一致。 |
| string | 是 | PAI-Token / PAI Model API Key。 |
| string | 是 | 模型名称。 |
| string | 是 | OpenSearch 召回引擎版商品索引名称。 |
| string | 是 | 商品主检索字段,建议使用物品表中的 |
| string | 是 | OpenSearch 召回引擎版查询分析器名称。 |
| string | 是 | 价格字段名称,用于预算和价格区间过滤。 |
| string | 是 | FeatureStore 所在地域。 |
| string | 是 | FeatureStore 项目名称。 |
| string | 是 | FeatureDB 用户名。 |
| string | 是 | FeatureDB 密码。 |
| string | 是 | OpenSearch 召回引擎版 endpoint。 |
| string | 是 | OpenSearch 召回引擎版用户名。 |
| string | 是 | OpenSearch 召回引擎版密码。 |
| string | 是 | OpenSearch 召回引擎版实例 ID。 |
| integer | 是 | OpenSearch 召回引擎版请求超时时间,单位为毫秒;示例值 |
| integer | 否 | 最多工具调用轮数;未配置时默认 |
| integer | 否 | 最多展示商品数量;未配置时默认 |
5.2 新建预发配置
进入引擎配置页面。
选择预发环境,示例:
prepub。单击新建配置。
填写配置名称
config_name,示例:pairec_config。填写配置说明,例如
AI 导购配置,YYYY-MM-DD。将替换完成的完整 JSON 粘贴到配置内容区域。
保存预发配置。
config_name 必须和服务使用的配置名保持一致。
5.3 确认发布
在预发配置详情页确认环境、配置名称和配置内容。
确认 OpenSearch 召回引擎版、FeatureStore、模型和 prompt 占位都已替换为实际值。
单击确认发布。
发布完成后,使用 AI 导购发起一次正常推荐请求,确认可以返回推荐结果。
如果服务没有按预期生效,优先确认 config_name 是否一致,再查看服务配置刷新周期和服务日志。
5.4 调用测试
5.4.1 curl 调用测试
AI 导购接口 /api/chat_search 采用 SSE(text/event-stream)流式返回。可用如下 curl 命令直接发起一次对话请求,-N 关闭缓冲以实时查看流式输出:
curl -N -X POST \
"<EAS_URL>/api/chat_search" \
-H "Content-Type: application/json" \
-H "Authorization: <EAS_TOKEN>" \
-d '{
"scene_id": "ai_shopping",
"session_id": "chat-search-smoke-001",
"uid": "test_user",
"language": "zh",
"input_message": {
"content": [
{ "type": "text", "text": "帮我推荐衬衫" }
]
}
}'请求参数说明:
参数 | 是否必填 | 描述 |
| 是 | EAS 服务调用地址,形如 |
| 否 | EAS 服务访问 Token;本地未开启鉴权时可省略该 header。 |
| 是 | 场景名,需与引擎配置 |
| 是 | 会话唯一标识,同一会话的多轮追问需复用同一取值。 |
| 是 | 用户标识,会话按 |
| 否 | 回复语言,需在 |
| 是 | 用户输入内容,当前仅支持 |
返回为 SSE 事件流。
说明:多轮追问(如“换成短袖”“预算再低一点”)只需复用同一个uid和session_id再次调用即可,服务会自动带上历史上下文。
5.4.2 EAS 专有网络设置
EAS 服务部署好后,需要额外配置专有网络来支持以 vpc 连接 OpenSearch 实例
配置示例如下
"cloud": {
"networking": {
"destination_cidrs": "100.103.xx.xxx/32",
"security_group_id": "sg-bpxxx",
"vpc_id": "vpc-bpxxx",
"vswitch_id": "vsw-bpxxx"
}
},其中 vpc_id, vswitch_id, security_group_id 为对应的 OpenSearch 实例 vpc 网络信息。destination_cidrs 可以通过 ping OpenSearch 实例地址得到。
为了避免调用超时, EAS 服务中最好还要增加下面配置:
"metadata": {
"rpc": {
"keepalive": 6000000
}
},5.4.2 页面调用测试
将物品表注册到 FeatureStore 中
为了接口中的 item_id 能够和物品的 title、image_url、price 等信息对应起来,需要在 FeatureStore 中注册物品表。注册后,展示的结果可以关联这些信息,获得更好的测试体验。
在 PAI-REC 页面中进行调试
FeatureStore 视图注册
在 PAI-REC 页面中,左侧进入 AI对话推荐 标签,进入数据注册页面,将上述的 FeatureStore 视图在 PAI-REC 中进行注册。
调试
进入 AI导购页面,左侧选择好环境,AI 对话推荐服务,FeatureStore 视图,点击右侧示例进行调试
常见问题
问题 | 排查方向 |
服务读不到新配置 | 检查 |
提示 prompt 缺失 | 检查对应语言的 planner、reply、fallback 是否已从稳定配置复制完整 |
语言不支持 | 检查 |
商品无结果 | 检查 OpenSearch 召回引擎版 index、default field、analyzer、价格字段 |
检索召回明显偏少 | 检查 |
价格过滤不生效 | 检查 |
商品卡片缺信息 | 检查物品表是否返回 |
会话不能保存 | 检查会话特征视图是否开启在线同步(FeatureDB)、FeatureStore 名称、FeatureView、FeatureDB 账号密码和网络 |
MaxCompute 导入失败 | 检查导入账号是否具备源表的 |
生产访问异常 | FeatureStore 生产环境应走 VPC,避免开启 |