wecom-cs-automation
$
npx mdskill add aAAaqwq/AGI-Super-Team/wecom-cs-automationAutomate WeCom customer service with intelligent automation.
- Handles friend requests, knowledge-based Q&A, and manual handoffs.
- Integrates with WeCom Webhooks, PostgreSQL, pgvector, and LLM APIs.
- Uses semantic search and confidence thresholds to route queries.
- Delivers results via automated replies and Telegram notifications.
SKILL.md
.github/skills/wecom-cs-automationView on GitHub ↗
---
name: wecom-cs-automation
description: 企业微信客服自动化系统。自动同意好友添加、基于知识库的智能问答、未知问题人工介入提醒。适用于企业微信客服场景的 AI 助手机器人。
allowed-tools: Bash, Read, Write, Edit, Exec, mcporter__*
---
# 企业微信客服自动化系统
这是一个完整的企业微信客服 AI 助手解决方案,能够自动处理好友添加、智能问答、人工转接等场景。
## 核心功能
### 1. 自动同意好友添加
- 实时监听好友添加事件
- 自动通过好友请求
- 发送欢迎消息
- 标注用户来源和标签
### 2. 基于知识库的智能问答
- 向量知识库存储企业知识
- 语义搜索匹配问题
- LLM 生成专业回复
- 支持多轮对话上下文
### 3. 未知问题人工介入
- 置信度阈值判断
- 自动提醒人工客服
- 转接对话给人工
- 记录未解决问题用于优化
## 技术架构
```
┌─────────────┐
│ 企业微信 │
│ Webhook │
└──────┬──────┘
│
▼
┌─────────────────┐
│ 回调服务器 │
│ (Go/Python) │
└──────┬──────────┘
│
├──────────────────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ 向量知识库 │ │ LLM API │
│ (PG+pgvector)│ │ (Kimi/GPT-4) │
└──────────────┘ └──────────────┘
│
▼
┌──────────────┐
│ 人工提醒 │
│ (Telegram) │
└──────────────┘
```
## 快速开始
### 第一步:配置企业微信应用
1. **创建企业微信应用**
- 登录企业微信管理后台
- 应用管理 → 创建应用 → 选择"微信客服"
- 记录以下信息:
- `corp_id`: 企业 ID
- `agent_id`: 应用 AgentId
- `secret`: 应用 Secret
2. **配置回调地址**
```
URL: https://your-domain.com/wecom/callback
Token: 自定义验证令牌
EncodingAESKey: 自动生成
```
3. **订阅所需事件**
- 联系人变更事件
- 消息事件
- 外部联系人免验证添加事件
### 第二步:设置知识库
```bash
# 1. 安装 PostgreSQL + pgvector
sudo apt install postgresql-14
sudo -u postgres psql -c "CREATE EXTENSION vector;"
# 2. 创建数据库
sudo -u postgres createdb wecom_kb
# 3. 初始化表结构
psql wecom_kb < ~/clawd/skills/wecom-cs-automation/schema.sql
```
### 第三步:导入知识库数据
```bash
# 1. 准备知识文档(Markdown 格式)
# 2. 切片并向量化
python3 ~/clawd/skills/wecom-cs-automation/scripts/import_kb.py \
--input knowledge.md \
--token $(pass show api/kimi)
# 3. 验证导入
psql wecom_kb -c "SELECT COUNT(*) FROM knowledge_chunks;"
```
### 第四步:启动回调服务
```bash
# 1. 配置环境变量
cat > .env << EOF
WECOM_CORP_ID=$(pass show api/wecom-corp-id)
WECOM_AGENT_SECRET=$(pass show api/wecom-agent-secret)
WECOM_TOKEN=your_webhook_token
WECOM_AES_KEY=your_aes_key
KB_DB_URL=postgresql://localhost/wecom_kb
LLM_API_KEY=$(pass show api/kimi)
LLM_API_BASE=https://api.moonshot.cn/v1
NOTIFICATION_CHANNEL=telegram:8518085684
EOF
# 2. 启动服务(Python FastAPI)
uvicorn wecom_callback_server:app --host 0.0.0.0 --port 8000
# 或使用 Go
go run cmd/server/main.go
```
### 第五步:验证服务
```bash
# 1. 检查服务状态
curl http://localhost:8000/health
# 2. 测试知识库搜索
curl -X POST http://localhost:8000/api/test_kb \
-H "Content-Type: application/json" \
-d '{"query": "如何退款?"}'
```
## 使用方法
### 场景 1:自动欢迎新好友
当用户添加客服为好友时:
```python
# skills/wecom-cs-automation/workflows/on_friend_add.py
async def handle_friend_add(user_id, user_name):
# 1. 通过好友请求
await wecom.accept_friend(user_id)
# 2. 添加用户标签
await wecom.add_external_tag(user_id, tags=["新客户"])
# 3. 发送欢迎消息
welcome_msg = f"""👋 欢迎来到{name}!
我是智能客服小助手,可以帮您:
• 查询订单状态
• 解答常见问题
• 处理售后问题
如有复杂问题,我会转接人工客服为您服务。"""
await wecom.send_text(user_id, welcome_msg)
```
### 场景 2:知识库问答
```python
# skills/wecom-cs-automation/workflows/answer_question.py
async def handle_question(user_id, question):
# 1. 搜索知识库
chunks = await search_knowledge(question, top_k=3)
# 2. 构建提示词
context = "\n\n".join([c.content for c in chunks])
prompt = f"""基于以下知识库内容回答用户问题:
知识库:
{context}
用户问题:{question}
如果知识库中没有相关信息,请回复"抱歉,这个问题我暂时无法回答,已为您转接人工客服。\""""
# 3. 调用 LLM
answer = await call_llm(prompt)
# 4. 判断是否需要人工介入
if "暂时无法回答" in answer or chunks[0].similarity < 0.7:
await escalate_to_human(user_id, question)
else:
await wecom.send_text(user_id, answer)
```
### 场景 3:人工介入提醒
```python
# skills/wecom-cs-automation/workflows/escalate.py
async def escalate_to_human(user_id, question):
# 1. 发送用户消息
await wecom.send_text(user_id, "⏳ 已为您转接人工客服,请稍候...")
# 2. 通过 Telegram 通知人工客服
user_info = await wecom.get_user_info(user_id)
notification = f"""🚨 需要人工介入
用户:{user_info.name} ({user_info.id})
问题:{question}
时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}
请及时处理。"""
await send_telegram_message(notification)
# 3. 记录未解决问题
await save_unknown_question(user_id, question)
```
## 目录结构
```
~/clawd/skills/wecom-cs-automation/
├── SKILL.md # 本文件
├── schema.sql # 数据库表结构
├── config/
│ ├── kb_config.yaml # 知识库配置
│ └── escalation_rules.yaml # 转人工规则
├── scripts/
│ ├── import_kb.py # 导入知识库
│ ├── search_kb.py # 测试知识库搜索
│ └── init_db.py # 初始化数据库
├── workflows/
│ ├── on_friend_add.py # 好友添加处理
│ ├── answer_question.py # 问答处理
│ └── escalate.py # 人工转接
├── server/
│ ├── main.py # FastAPI 主服务
│ ├── wecom_client.py # 企业微信 API 客户端
│ ├── kb_searcher.py # 知识库搜索
│ └── notification.py # 通知服务
└── knowledge/
└── sample.md # 示例知识文档
```
## API 配置
### 所需密钥
```bash
# 企业微信
pass insert api/wecom-corp-id # 企业 ID
pass insert api/wecom-agent-secret # 应用 Secret
# LLM(推荐 Kimi,中文优化)
pass insert api/kimi # 已有
# Telegram 通知(可选)
pass insert api/telegram-bot # 已有
```
### 配置文件
创建 `~/clawd/skills/wecom-cs-automation/.env`:
```env
# 企业微信配置
WECOM_CORP_ID=${WECOM_CORP_ID}
WECOM_AGENT_ID=1000002
WECOM_AGENT_SECRET=${WECOM_AGENT_SECRET}
WECOM_TOKEN=random_token_here
WECOM_ENCODING_AES_KEY=base64_key_here
# 数据库
KB_DB_URL=postgresql://postgres@localhost/wecom_kb
# LLM
LLM_PROVIDER=kimi
LLM_API_KEY=${LLM_API_KEY}
LLM_API_BASE=https://api.moonshot.cn/v1
LLM_MODEL=moonshot-v1-8k
# 知识库搜索
KB_SIMILARITY_THRESHOLD=0.7
KB_TOP_K=3
# 人工介入
NOTIFICATION_ENABLED=true
NOTIFICATION_CHANNEL=telegram:8518085684
```
## 工作流程详解
### 完整消息处理流程
```mermaid
graph TD
A[接收消息] --> B{是否为文本?}
B -->|是| C[搜索知识库]
B -->|否| D[其他类型处理]
C --> E{相似度 > 阈值?}
E -->|是| F[生成回答]
E -->|否| G[转人工]
F --> H[发送回复]
G --> I[通知人工客服]
D --> J[按类型处理]
```
### 数据流
```python
# 1. 接收 Webhook
@app.post("/wecom/callback")
async def wecom_callback(payload: WebhookPayload):
event = payload.Event[0]
# 2. 路由事件
if event.Event == "add_external_contact":
await handle_friend_add(event.UserId)
elif event.Event == "msg":
await handle_message(event)
return {"errcode": 0}
# 3. 处理消息
async def handle_message(event):
user_id = event.FromUserName
content = event.Content
# 搜索知识库
results = search_kb(content)
# 判断置信度
if results[0].score > CONFIDENCE_THRESHOLD:
# 自动回复
answer = generate_answer(results, content)
send_message(user_id, answer)
else:
# 转人工
escalate_to_human(user_id, content)
```
## 知识库管理
### 添加知识
```bash
# 方式 1:从 Markdown 导入
python3 scripts/import_kb.py \
--input ~/clawd/knowledge/faq.md \
--category "常见问题"
# 方式 2:直接插入数据库
psql wecom_kb
INSERT INTO knowledge_chunks (content, metadata)
VALUES (
'退货政策:7天无理由退货',
'{"category": "售后", "tags": ["退货", "政策"]}'
);
```
### 更新知识
```bash
# 重新导入(自动去重)
python3 scripts/import_kb.py --input faq.md --refresh
```
### 测试搜索
```bash
python3 scripts/search_kb.py "如何退款?"
```
## 监控与维护
### 日志查看
```bash
# 服务日志
tail -f /var/log/wecom-cs/server.log
# 数据库日志
tail -f /var/log/postgresql/postgresql-14-main.log
```
### 性能监控
```python
# 添加到 server/main.py
from prometheus_client import Counter, Histogram
message_counter = Counter('messages_total', 'Total messages')
answer_latency = Histogram('answer_latency_seconds', 'Answer latency')
@answer_latency.time()
def handle_message():
message_counter.inc()
# ...
```
### 人工介入统计
```sql
-- 查看未解决问题分布
SELECT
COUNT(*) as count,
SUBSTRING(content, 1, 30) as question_preview
FROM unknown_questions
GROUP BY question_preview
ORDER BY count DESC
LIMIT 10;
```
## 安全最佳实践
1. **密钥管理**
- 所有密钥使用 `pass` 存储
- 环境变量引用,不硬编码
2. **数据隐私**
- 客户信息加密存储
- 定期清理敏感日志
3. **访问控制**
- Webhook 验证签名
- IP 白名单限制
4. **审计日志**
- 记录所有人工介入
- 定期审查访问日志
## 故障排查
### 问题 1:回调接收不到消息
```bash
# 检查端口监听
ss -ltnp | grep 8000
# 检查 Nginx 配置(如有)
nginx -t
# 查看防火墙
sudo ufw status
```
### 问题 2:知识库搜索无结果
```bash
# 检查数据
psql wecom_kb -c "SELECT COUNT(*) FROM knowledge_chunks;"
# 测试搜索
python3 scripts/search_kb.py "测试查询"
# 重新向量化
python3 scripts/import_kb.py --rebuild
```
### 问题 3:人工提醒未发送
```bash
# 测试 Telegram 连接
curl -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
-d "chat_id=8518085684&text=测试"
# 检查通知配置
cat .env | grep NOTIFICATION
```
## 扩展功能
### 1. 多轮对话记忆
```python
# 使用 Redis 存储会话上下文
async def get_conversation_history(user_id):
return redis.get(f"conv:{user_id}")
async def append_message(user_id, role, content):
redis.rpush(f"conv:{user_id}", f"{role}:{content}")
```
### 2. 情感分析
```python
# 检测用户情绪
async def analyze_sentiment(text):
result = openai.ChatCompletion.create(
model="gpt-4",
messages=[{
"role": "system",
"content": "判断用户情绪(正面/负面/中性),只返回一个词。"
}, {
"role": "user",
"content": text
}]
)
return result.choices[0].message.content
```
### 3. 主动营销
```python
# 定期推送
async def daily_promotion():
users = get_active_users(days=7)
for user_id in users:
await wecom.send_text(user_id, "今日特惠:...")
```
## 相关技能
- **feishu-automation**: 飞书平台自动化
- **notion-automation**: Notion 知识库集成
- **telegram-automation**: Telegram 通知集成
## 参考资源
- [企业微信 API 文档](https://developer.work.weixin.qq.com/document/path/90665)
- [PostgreSQL pgvector](https://github.com/pgvector/pgvector)
- [FastAPI WebSocket](https://fastapi.tiangolo.com/advanced/websockets/)
- [Kimi API 文档](https://platform.moonshot.cn/docs)
More from aAAaqwq/AGI-Super-Team
- a-fund-monitor监控 A 股基金实时估值与盘后净值,自动判断交易日并生成提醒或分析。
- account-executive>
- add-leadAdd company/person/relationship to CRM
- adsComprehensive ad account analysis across all major platforms (Google, Meta
- ads-agentAI-агент для управления Facebook рекламой. Вызывай для анализа, оптимизации, создания кампаний и отчётов.
- afrexai-compliance-auditRun internal compliance audits against major governance and security
- afrexai-personal-financeComplete personal finance system — budgeting, debt payoff, investing, tax optimization, net worth tracking, and financial independence planning. Use when managing money, building wealth, paying off debt, planning retirement, or optimizing taxes. Zero dependencies.
- after-salesUse when managing post-purchase experience, building customer loyalty, or increasing repeat purchases
- agent-contactsAI agent contacts — add, list, remove MCP contacts. Use when someone gives an agent URL, or when you need to view/remove contacts.
- agent-model-switcher批量查看和切换子 agent 的模型配置,用于统一调整多 agent 的 provider/model 设置。