咸鱼+扣子智能体+阿里智能体智能客服大模型智能体答复解决方案

一、项目背景与需求

闲鱼作为国内最大的二手交易平台,每天都有海量的商品咨询消息。对于汽车拆件卖家来说,面对大量的买家咨询,如何高效、专业地回复成为一大痛点。传统的自动回复脚本只能匹配关键词,无法理解上下文,更无法处理复杂的议价场景。

本文介绍一个基于大语言模型的闲鱼智能客服机器人系统,专门针对汽车拆件业务场景设计,能够:

  • 自动接收并回复闲鱼消息

  • 支持人工接管模式

  • 自动处理商品信息

  • 保持对话上下文连贯性

二、系统架构设计

复制代码
┌─────────────────────────────────────────────────────────────┐
│                      闲鱼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()

关键技术点:

  1. Cookie管理:需要正确处理闲鱼登录态,支持Cookie过期后的自动更新

  2. 心跳机制:维持WebSocket长连接,防止被服务端断开

  3. 消息解密:闲鱼消息采用加密传输,需要实现对应的解密算法

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获取方式

  1. 浏览器登录闲鱼网页版(https://www.goofish.com

  2. 打开开发者工具(F12)

  3. 进入Network标签页

  4. 刷新页面,找到任意请求

  5. 复制完整的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)

八、总结与展望

本文实现了一个完整的闲鱼智能客服机器人系统,具备以下特点:

  1. 智能化:基于大语言模型,能理解复杂的对话场景

  2. 可扩展:Agent架构支持轻松添加新的业务模块

  3. 稳定性:具备自动重连、心跳保活、Token刷新等机制

  4. 安全性:内置安全过滤,防止发送违规内容

未来可以进一步优化的方向:

  • 接入向量数据库,实现商品知识的RAG检索增强

  • 增加多模态能力,支持图片识别和回复

  • 完善议价策略,根据商品热度动态调整让利幅度

  • 接入订单系统,实现自动发货