共计 3393 个字符,预计需要花费 9 分钟才能阅读完成。
传统电商搜索的三大痛点
在电商场景中,传统搜索引擎存在几个明显的局限性,这些限制影响了用户的购物体验和转化率。

-
长尾词识别能力差 :当用户输入非标准或模糊的商品名称时,传统搜索往往无法准确匹配到相关商品。比如搜索“上班穿的舒服鞋子”,可能无法正确识别用户想要的是“商务休闲鞋”。
-
个性化推荐不足 :大多数电商平台的搜索结果是基于商品热度或简单的用户历史行为,缺乏深度的个性化。同一搜索词对所有用户返回相同结果,无法满足个体化需求。
-
多轮交互体验差 :传统搜索是单次请求 - 响应模式,无法支持像自然对话那样的多轮交互来澄清需求或细化搜索条件。
技术方案设计
ChatGPT API 选型
OpenAI 提供了两种主要的 API 模式,各有适用场景:
-
Completion 模式 :适合单次问答场景,输入一段文本,模型会继续补全。优点是简单直接,响应速度快。
-
Chat 模式 :专门为对话场景优化,支持多轮对话上下文保持。这正是我们智能购物助手需要的核心能力。
建议选择 Chat 模式,因为它:
1. 原生支持对话历史管理
2. 可以识别用户意图和实体更准确
3. 提供系统消息设置,能更好地控制助手行为
商品知识库向量化
要让 ChatGPT 理解商品信息,需要将商品数据转化为向量嵌入 (Embeddings)。推荐使用专门的向量数据库:
- Pinecone:全托管服务,简单易用,适合快速验证
- Milvus:开源方案,可自建,适合需要深度定制的场景
实现步骤:
- 使用 OpenAI 的 text-embedding-ada-002 模型生成商品描述的向量
- 将向量和商品 ID 存入向量数据库
- 用户查询时,先转换为向量,再做最近邻搜索
对话状态机设计
为了管理复杂的购物对话流程,需要设计状态机。以下是核心状态和转移:
stateDiagram
[*] --> 欢迎
欢迎 --> 商品搜索: 用户表达需求
商品搜索 --> 商品详情: 用户选择商品
商品详情 --> 购物车: 用户添加购物车
购物车 --> 支付: 用户确认订单
支付 --> [*]: 完成
商品搜索 --> 需求澄清: 信息不足
需求澄清 --> 商品搜索
代码实现
核心对话处理类
import openai
from redis import Redis
from ratelimit import limits, sleep_and_retry
class ShoppingAssistant:
def __init__(self, redis_conn):
self.redis = redis_conn
self.conversation_expire = 3600 # 1 小时对话过期
@sleep_and_retry
@limits(calls=60, period=60) # 限流 60 次 / 分钟
def chat_completion(self, messages):
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=0.7
)
return response.choices[0].message.content
except Exception as e:
# 记录错误并返回友好提示
log_error(e)
return "抱歉,我暂时无法处理您的请求,请稍后再试。"
def get_or_create_conversation(self, user_id):
"""从 Redis 获取或初始化对话上下文"""
key = f"conversation:{user_id}"
conv = self.redis.get(key)
if conv:
return json.loads(conv)
else:
initial_conv = [{"role": "system", "content": "你是一个专业的购物助手..."}
]
self.redis.setex(key, self.conversation_expire, json.dumps(initial_conv))
return initial_conv
def process_message(self, user_id, user_input):
"""处理用户消息的核心流程"""
conv = self.get_or_create_conversation(user_id)
conv.append({"role": "user", "content": user_input})
# 调用 API 前可先做意图识别等预处理
response = self.chat_completion(conv)
# 更新对话上下文
conv.append({"role": "assistant", "content": response})
self.redis.setex(f"conversation:{user_id}",
self.conversation_expire,
json.dumps(conv)
)
return response
使用 LangChain 实现多步询价
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
# 定义询价模板
price_template = """ 基于以下商品信息,为用户生成价格分析:商品: {product_name}
市场价: {market_price}
促销活动: {promotion}
用户预算: {user_budget}
---
分析:"""
price_prompt = PromptTemplate(input_variables=["product_name", "market_price", "promotion", "user_budget"],
template=price_template
)
# 创建询价链
price_chain = LLMChain(llm=OpenAI(temperature=0),
prompt=price_prompt
)
# 使用示例
analysis = price_chain.run({
"product_name": "iPhone 14",
"market_price": "6999 元",
"promotion": "618 限时减 500",
"user_budget": "6500 元"
})
性能优化
缓存策略
对话上下文使用 Redis 缓存可以显著减少 API 调用:
- 每个用户对话独立存储,设置合理过期时间
- 高频商品信息可额外缓存
- 使用哈希结构存储复杂对象
异步处理
对于耗时操作,使用 Celery 任务队列:
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def async_generate_recommendations(user_id, query):
# 复杂推荐逻辑...
return recommendations
# 调用示例
async_result = async_generate_recommendations.delay(user.id, search_query)
生产环境注意事项
敏感信息过滤
使用正则表达式过滤用户输入中的敏感信息:
import re
sensitive_patterns = [r"\b\d{16}\b", # 信用卡号
r"\b\d{3}-\d{2}-\d{4}\b", # SSN
]
def filter_sensitive(text):
for pattern in sensitive_patterns:
text = re.sub(pattern, "[REDACTED]", text)
return text
日志脱敏
存储对话日志前必须脱敏:
- 移除或替换所有 PII(个人身份信息)
- 使用单向哈希处理用户 ID
- 加密存储敏感会话内容
开放性问题
- 如何设计评估指标来平衡推荐准确性和响应速度?是更关注 CTR、转化率,还是用户满意度调查?
- 当处理高并发请求时,应该优先保障核心功能的可用性,还是维持所有功能的降级服务?如何设计优雅降级方案?
总结
通过本文介绍的技术方案,开发者可以在较短时间内搭建起一个功能完善的智能购物助手。关键在于:合理使用 ChatGPT 的对话能力、设计高效的商品检索系统,以及确保生产环境的安全可靠。随着对话数据的积累,还可以进一步优化推荐算法和用户体验。
