这篇是实操向的,从开通实例到机器人跑起来,一步步走。不讲概念,只讲怎么做。

第一步:开通企微实例,拿到凭证

在 Eyun 控制台开通企微实例,拿到三样东西:

  • appid:实例标识,格式 we_xxx

  • App Token:API 调用凭证,格式 eyk_xxxx

  • 签名密钥:回调验签用

回调地址填你的服务器地址,比如 https://your-domain.com/wx-api/webhook/。

第二步:搭回调服务

用 Flask 搭一个最小可用的回调服务:

from flask import Flask, request
import hmac, hashlib, json, requests

app = Flask(__name__)

BASE = "https://your-base-url"
APPID = "we_xxx"
TOKEN = "eyk_xxxx"
SECRET = "your-signature-secret"
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

@app.route("/wx-api/webhook/", methods=["POST", "GET"])
def webhook():
    # 验证请求
    echostr = request.args.get("echostr") or (
        request.json.get("echostr") if request.is_json else None
    )
    if echostr:
        return echostr

    # 验签
    signature = request.headers.get("X-Eyun-Signature")
    raw_body = request.get_data(cache=True)
    expected = hmac.new(SECRET.encode(), raw_body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, signature):
        return "forbidden", 403

    # 去重
    delivery_id = request.headers.get("X-Eyun-Delivery")
    if not redis.setnx(f"cb:{delivery_id}", 1, ex=86400):
        return "ok"

    # 处理消息
    data = request.json["data"]
    handle_message(data)
    return "ok"

def handle_message(data):
    if data.get("messageType") != 1:  # 只处理群聊
        return

    text = data.get("content", "").strip()
    if not text:
        return

    # 判断该不该回
    if not should_reply(text):
        return

    # 调 AI
    answer = ask_ai(text, data["roomId"])

    # 发送回复
    send_text(data["conversationId"], answer)

def should_reply(text):
    if len(text) < 5:
        return False
    return any(k in text for k in ["怎么", "请问", "求助", "@机器人"])

def ask_ai(question, room_id):
    # 取群上下文
    context = get_recent_messages(room_id, limit=10)

    messages = [
        {"role": "system", "content": "你是企业微信群里的 AI 客服,回复简洁专业。"},
        {"role": "user", "content": f"群聊记录:\n{context}\n\n问题:{question}"}
    ]

    resp = requests.post(
        "https://api.deepseek.com/v1/chat/completions",
        headers={"Authorization": f"Bearer {DEEPSEEK_KEY}"},
        json={"model": "deepseek-chat", "messages": messages, "max_tokens": 500}
    ).json()

    return resp["choices"][0]["message"]["content"]

def send_text(conv_id, text):
    requests.post(
        f"{BASE}/wx-api/api/message/sendText",
        headers=HEADERS,
        json={"appid": APPID, "conversationId": conv_id, "content": text}
    )

if __name__ == "__main__":
    app.run(port=5000)

第三步:配置 AI 模型

DeepSeek 和 OpenAI 的调用方式一样,换 endpoint 和 model 名就行:

平台

Endpoint

Model

DeepSeek

https://api.deepseek.com/v1/chat/completions

deepseek-chat

OpenAI

https://api.openai.com/v1/chat/completions

gpt-4

API Key 在各自平台申请,充钱就能用。

第四步:加知识库(可选)

如果希望机器人回答产品相关问题,需要接知识库。简单做法是把 FAQ 存成文本,每次调 AI 时塞进去:

FAQ = """
Q: 怎么申请权限?
A: 在 OA 系统提交申请,审批通过后自动开通。

Q: 怎么重置密码?
A: 点击登录页"忘记密码",按提示操作。
"""

def ask_ai(question, room_id):
    messages = [
        {"role": "system", "content": f"你是企业微信群里的 AI 客服。参考以下 FAQ:\n{FAQ}"},
        {"role": "user", "content": question}
    ]
    # ...

FAQ 多的话,建议用向量数据库(Pinecone、Milvus、Chroma)做检索,别全塞 prompt 里。

第五步:上线前检查

  • 回调地址能公网访问,HTTPS

  • 签名密钥配置正确

  • 群聊消息能正常接收

  • AI API Key 有余额

  • 单群频控已加

一个真实的上线数据

某团队的群 AI 客服,上线第一周:

  • 收到消息 1,200 条

  • AI 回复 340 条(28%)

  • 转人工 86 条(7%)

  • 平均响应时间 4 秒

剩下的 65% 是闲聊和已解决的问题,AI 正确识别并跳过了。

企微回调和发送的字段在Eyun 开发文档里能查到,实例和凭证在 Eyun 控制台开通。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐