『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道

背景

之前一段时间有通过用GPT对接对接过个人微信的群,但是没过多久微信就被警告不能扫码了,所以这次尝试把Llama 2接入到钉钉中,弄一个钉钉机器人

钉钉机器人

创建机器人

首先进入到钉钉开放平台的后台管理系统:

进入到 应用开发->机器人
『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第1张图片

右上角选择 创建应用,选择继续使用旧版创建机器人,输入需要创建的机器人的名称等信息。

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第2张图片

创建完成后,在开发管理中填写消息接受地址, 在消息接收地址中填写post地址即可。 这个地址可以通过@群机器人,将消息发送到指定外部服务,还可以将外部服务的响应结果返回到群组。这里填写一个公网可访问的HTTPS/HTTP地址,用于接收POST过来的消息。

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第3张图片

添加机器人

这时候你的钉钉上就会出现一个XX-TEST内部测试群,进入该群设置选项,选择智能群助手

为你的组织添加机器人,选择自定义机器人,简单的补充下相关信息就创建完成了。
『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第4张图片
『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第5张图片
创建完成后需要获取和配置机器人信息,点击刚刚创建好的小机器人。

获取webhook
我们需要复制 Webhook 这个地址后面用于消息推送使用(确保上方消息推送功能也是开启的哦)
『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第6张图片

配置安全设置

钉钉机器人的安全策略有三种,第一种是使用关键字,就是说你推送的消息里必须包含你创建机器人时定义的关键字,如果不包含就推送不了消息,第二种就是使用加密签名,第三种是定义几个ip源,非这些源的请求会被拒绝。

因为我的组织只有两个人,不需要很高的安全性,所以我这里用最容易配置的自定义关键字。

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第7张图片

PHP对接钉钉机器人发送信息

一:创建llama2 API
创建端点

首先需要登录AWS

在Search中搜索SageMaker,进入SageMaker控制台

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第8张图片
在SageMaker控制台点击Studio,创建一个默认域

在控制台找到SageMaker JumpStart,点击SageMaker JumpStart

我们可以选择现有的 SageMaker 训练作业,该作业将自动填充所有相关信息。此信息包括容器框架、训练脚本位置、模型构件位置、实例类型、默认训练和验证数据集以及目标列。

在SageMaker JumpStart有很多模型,你可以选择你自己需要的模型进行创建

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第9张图片

在搜索框中搜索Llama-2-7B-Chat模型,点击模型。进入模型详情,点击Deploy。

『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第10张图片

暴露API

在Search中搜索Lambda,进入Lambda控制台
Lambda函数基本步骤:

  • 创建Lambda函数
  • 添加代码
  • 添加触发器
    选择API GateWay,选择HTTP API,Security 选择Open,添加触发器
  • 获取API地址
    『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第11张图片
    『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第12张图片
二:在php中调用llama2 API

使用PHP作为后端语言对接钉钉群聊机器人接口,接受钉钉机器人发送的消息,并查询模型后返回

接受钉钉消息并返回回复

request->param('text');
        $content = trim($text['content']);

        if (empty($content) || $content === "你好" || $content === "您好") {
            $message = "你好";
        } else {
            $data = $this->LlmRequest($content);
            if ($data['code'] == 1) {
                $message = "出错了,请稍后再试";
            } else {
                $message = $data['data'];
            }
        }
        //推送到钉钉
        $ding = new DingDing();
        $res = $ding->textMsgSend("chatbot:" . $message);
        return $res;
    }

    private function LlmRequest($text)
    {
        $llm_api_url = "API地址";
        $json_body = json_encode([
            "inputs" => [
                [
                    ["role" => "system", "content" => "你现在是一个聊天机器人,根据用户的问话进行合理的回答"],
                    ["role" => "user", "content" => $text]
                ]
            ],
            "parameters" => ["max_new_tokens" => 256, "top_p" => 0.9, "temperature" => 0.6]
        ]);

        $ch = curl_init($llm_api_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_body);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
        ]);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $response = curl_exec($ch);

        curl_close($ch);
        if ($response === false) {
            return ['data' => "", 'code' => 1];
        } else {
            // 处理响应
            $dataArray = json_decode($response, true);
            // 访问内容
            $content = $dataArray[0]['generation']['content'];
            return ['data' => $content, 'code' => 0];
        }
    }

}

PHP钉钉消息的类,钉钉发送信息代码
在代码中$robot_url 填写之前创建的钉钉机器人的webhook地址

robot_url = $robot_url;
        }
    }

    public function textMsgSend($msg, $mobile = [])
    {
        $msgJson = json_encode([
            'msgtype' => 'text',
            'text' => [
                "content" => $msg
            ],
            'at' => [
                'atMobiles' => $mobile,
                'isAtAll' => false
            ]
        ]);
        $result = $this->sendRequest($msgJson);
        return $result;
    }


    public function sendRequest($json)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->robot_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=utf-8'));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 不用开启curl证书验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
}

接下来我们就可以在钉钉中愉快地和 机器人对话了。
效果:
『亚马逊云科技产品测评』活动征文|搭建基于llama2的钉钉聊天机器人_第13张图片

你可能感兴趣的:(科技,钉钉,机器人)