
一、项目背景与需求
闲鱼作为国内最大的二手交易平台,每天都有海量的商品咨询消息。对于汽车拆件卖家来说,面对大量的买家咨询,如何高效、专业地回复成为一大痛点。传统的自动回复脚本只能匹配关键词,无法理解上下文,更无法处理复杂的议价场景。
本文介绍一个基于大语言模型的闲鱼智能客服机器人系统,专门针对汽车拆件业务场景设计,能够:
-
自动接收并回复闲鱼消息
-
支持人工接管模式
-
自动处理商品信息
-
保持对话上下文连贯性
二、系统架构设计
┌─────────────────────────────────────────────────────────────┐
│ 闲鱼WebSocket服务 │
└─────────────────────────────────────────────────────────────┘
▲
│ WebSocket长连接
▼
┌─────────────────────────────────────────────────────────────┐
│ XianyuLive (连接层) │
│ - WebSocket连接管理 │
│ - 心跳维护 │
│ - 消息收发 │
│ - Token刷新 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ XianyuReplyBot (回复引擎) │
│ - 意图识别 │
│ - 对话生成 │
│ - 安全过滤 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 大语言模型 (通义千问) │
└─────────────────────────────────────────────────────────────┘
三、核心模块详解
3.1 连接层:WebSocket消息处理
闲鱼的消息系统基于WebSocket长连接实现,我们需要模拟浏览器行为来建立连接。
class XianyuLive:
def __init__(self, cookies_str):
self.xianyu = XianyuApis()
self.base_url = 'wss://wss-goofish.dingtalk.com/'
self.cookies = trans_cookies(cookies_str)
self.device_id = generate_device_id(self.myid)
self.context_manager = ChatContextManager()
关键技术点:
-
Cookie管理:需要正确处理闲鱼登录态,支持Cookie过期后的自动更新
-
心跳机制:维持WebSocket长连接,防止被服务端断开
-
消息解密:闲鱼消息采用加密传输,需要实现对应的解密算法
3.2 消息处理核心
async def handle_message(self, message_data, websocket):
"""处理所有类型的消息"""
# 1. 判断消息类型
if self.is_chat_message(message):
# 2. 提取消息信息
create_time = int(message["1"]["5"])
send_user_id = message["1"]["10"]["senderUserId"]
send_message = message["1"]["10"]["reminderContent"]
# 3. 时效性验证(过滤5分钟前的消息)
if (time.time() * 1000 - create_time) > self.message_expire_time:
return
# 4. 人工接管模式检查
if self.is_manual_mode(chat_id):
return
# 5. 调用大模型生成回复
bot_reply = bot.generate_reply(send_message, item_description, context)
# 6. 发送回复
await self.send_msg(websocket, chat_id, send_user_id, bot_reply)
3.3 大模型回复引擎
采用基于通义千问的Agent架构,支持动态提示词加载:
class XianyuReplyBot:
def __init__(self):
self.client = OpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("MODEL_BASE_URL")
)
self._init_system_prompts()
self._init_agents()
def generate_reply(self, user_msg: str, item_desc: str, context: List[Dict]) -> str:
"""生成回复主流程"""
agent = self.agents['default']
return agent.generate(
user_msg=user_msg,
item_desc=item_desc,
context=self.format_history(context),
bargain_count=0
)
Agent架构设计:
class BaseAgent:
"""Agent基类"""
def __init__(self, client, system_prompt, safety_filter):
self.client = client
self.system_prompt = system_prompt
self.safety_filter = safety_filter
def _build_messages(self, user_msg: str, item_desc: str, context: str):
"""构建消息链"""
return [
{"role": "system", "content": f"【商品信息】{item_desc}\n【对话历史】{context}\n{self.system_prompt}"},
{"role": "user", "content": user_msg}
]
class DefaultAgent(BaseAgent):
"""咸鱼汽车拆件客服Agent"""
def generate(self, user_msg: str, item_desc: str, context: str, bargain_count: int = 0) -> str:
messages = self._build_messages(user_msg, item_desc, context)
response = self.client.chat.completions.create(
model=os.getenv("MODEL_NAME", "qwen-max"),
messages=messages,
temperature=0.7,
max_tokens=500
)
return response.choices[0].message.content
3.4 对话上下文管理
为了保持对话的连贯性,需要维护每个会话的对话历史:
class ChatContextManager:
def __init__(self):
self.contexts = {} # chat_id -> List[Dict]
def add_message_by_chat(self, chat_id, user_id, item_id, role, content):
"""添加消息到对应会话上下文"""
if chat_id not in self.contexts:
self.contexts[chat_id] = []
self.contexts[chat_id].append({
'role': role,
'content': content,
'timestamp': time.time(),
'user_id': user_id,
'item_id': item_id
})
# 限制上下文长度,防止token超限
if len(self.contexts[chat_id]) > MAX_CONTEXT_LENGTH:
self.contexts[chat_id] = self.contexts[chat_id][-MAX_CONTEXT_LENGTH:]
3.5 安全过滤机制
防止机器人发送敏感信息:
def _safe_filter(self, text: str) -> str:
"""安全过滤模块"""
blocked_phrases = ["微信", "QQ", "支付宝", "银行卡", "线下"]
if any(p in text for p in blocked_phrases):
return "[安全提醒]请通过平台沟通"
return text
四、特色功能实现
4.1 人工接管模式
当遇到复杂问题时,可以一键切换人工接管:
def toggle_manual_mode(self, chat_id):
"""切换人工接管模式"""
if self.is_manual_mode(chat_id):
self.exit_manual_mode(chat_id)
return "auto"
else:
self.enter_manual_mode(chat_id)
return "manual"
# 通过发送特定关键词切换模式
if self.check_toggle_keywords(send_message):
mode = self.toggle_manual_mode(chat_id)
if mode == "manual":
logger.info(f"🔴 已接管会话 {chat_id}")
4.2 Token自动刷新
Cookie过期自动刷新机制:
async def refresh_token(self):
"""刷新token"""
token_result = self.xianyu.get_token(self.device_id)
if 'data' in token_result and 'accessToken' in token_result['data']:
new_token = token_result['data']['accessToken']
self.current_token = new_token
return new_token
4.3 模拟人工输入
为了让回复更自然,可以模拟人工输入延迟:
if self.simulate_human_typing:
# 基础延迟 + 打字速度模拟
base_delay = random.uniform(0, 1)
typing_delay = len(bot_reply) * random.uniform(0.1, 0.3)
total_delay = min(base_delay + typing_delay, 10.0)
await asyncio.sleep(total_delay)
五、提示词设计
提示词是决定回复质量的关键,以下是汽车拆件客服的提示词示例:
你是一个闲鱼汽车拆件卖家客服,负责回复买家关于汽车拆车件的咨询。
【角色设定】
- 你是专业的汽车配件卖家
- 态度友好、专业、耐心
- 提供准确的产品信息
【回复规范】
- 使用口语化、自然的语言
- 对于价格问题,给出合理的报价解释
- 对于技术问题,给出专业的解答
- 不得主动要求买家添加微信/QQ等外部联系方式
【商品信息】
{商品描述}
【对话历史】
{历史对话}
六、部署与配置
6.1 环境变量配置
创建.env文件:
# 通义千问配置
API_KEY=your_api_key_here
MODEL_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
MODEL_NAME=qwen-max
# 闲鱼Cookie
COOKIES_STR=your_cookies_string
# 功能开关
SIMULATE_HUMAN_TYPING=True
LOG_LEVEL=INFO
MANUAL_MODE_TIMEOUT=3600
6.2 启动服务
python main.py
6.3 Cookie获取方式
-
浏览器登录闲鱼网页版(https://www.goofish.com)
-
打开开发者工具(F12)
-
进入Network标签页
-
刷新页面,找到任意请求
-
复制完整的Cookie字符串
七、性能优化
7.1 异步处理
使用asyncio实现高并发消息处理:
async def main(self):
async with websockets.connect(self.base_url, extra_headers=headers) as websocket:
# 并发处理心跳和消息接收
self.heartbeat_task = asyncio.create_task(self.heartbeat_loop(websocket))
self.token_refresh_task = asyncio.create_task(self.token_refresh_loop())
async for message in websocket:
await self.handle_message(message_data, websocket)
7.2 上下文限制
限制对话历史长度,防止token超限:
MAX_CONTEXT_LENGTH = 20 # 保留最近20条消息
def _truncate_context(self, messages):
if len(messages) > MAX_CONTEXT_LENGTH:
# 保留系统提示和最近的消息
return messages[:1] + messages[-(MAX_CONTEXT_LENGTH-1):]
return messages
7.3 重连机制
网络异常时自动重连:
while True:
try:
async with websockets.connect(...) as websocket:
# 连接成功后的处理
...
except websockets.exceptions.ConnectionClosed:
logger.warning("连接已关闭,5秒后重连...")
await asyncio.sleep(5)
except Exception as e:
logger.error(f"连接错误: {e}")
await asyncio.sleep(5)
八、总结与展望
本文实现了一个完整的闲鱼智能客服机器人系统,具备以下特点:
-
智能化:基于大语言模型,能理解复杂的对话场景
-
可扩展:Agent架构支持轻松添加新的业务模块
-
稳定性:具备自动重连、心跳保活、Token刷新等机制
-
安全性:内置安全过滤,防止发送违规内容
未来可以进一步优化的方向:
-
接入向量数据库,实现商品知识的RAG检索增强
-
增加多模态能力,支持图片识别和回复
-
完善议价策略,根据商品热度动态调整让利幅度
-
接入订单系统,实现自动发货