## 概述
PLATO2是一个超大规模生成式对话系统模型。它承袭了PLATO隐变量进行回复多样化生成的特性,能够就开放域话题进行流畅深入的聊天。据公开数据,其效果超越了Google 于2020年2月份发布的 Meena和Facebook AI Research于2020年4月份发布的Blender的效果。plato2_en_base包含310M参数,可用于一键预测对话回复,该Module仅支持使用GPU预测,不支持CPU。
更多详情参考论文[PLATO-2: Towards Building an Open-Domain Chatbot via Curriculum Learning](https://arxiv.org/abs/2006.16779)
## 命令行预测
```shell
$ hub run plato2_en_base --input_text="Hello, how are you"
```
## API
```python
def generate(texts):
```
预测API,输入对话上下文,输出机器回复。
**参数**
* texts (list\[str\] or str): 如果不在交互模式中,texts应为list,每个元素为一次对话的上下文,上下文应包含人类和机器人的对话内容,不同角色之间的聊天用分隔符"\t"进行分割;例如[["Hello\thi, nice to meet you\tnice to meet you"]]。这个输入中包含1次对话,机器人回复了"hi, nice to meet you"后人类回复“nice to meet you”,现在轮到机器人回复了。如果在交互模式中,texts应为str,模型将自动构建它的上下文。
**返回**
* results (list\[str\]): 每个元素为相应对话中机器人的新回复。
**代码示例**
```python
import paddlehub as hub
module = hub.Module(name="plato2_en_base")
test_texts = ["Hello","Hello\thi, nice to meet you\tnice to meet you"]
results = module.generate(texts=test_texts)
for result in results:
print(result)
```
```python
def interactive_mode(max_turn =6):
```
进入交互模式。交互模式中,generate接口的texts将支持字符串类型。
**参数**
* max_turn (int): 模型能记忆的对话轮次,当max_turn = 1时,模型只能记住当前对话,无法获知之前的对话内容。
**代码示例**
```python
import paddlehub as hub
module = hub.Module(name="plato2_en_base")
with module.interactive_mode(max_turn=6):
while True:
human_utterance = input("[Human]: ").strip()
robot_utterance = module.generate(human_utterance)
print("[Bot]: %s"%robot_utterance[0])
```
## 服务部署
PaddleHub Serving 可以部署在线服务。
### 第一步:启动PaddleHub Serving
运行启动命令:
```shell
$ hub serving start -m plato2_en_base -p 8866
```
这样就完成了一个服务化API的部署,默认端口号为8866。
**NOTE:** 在启动服务之前,请设置CUDA\_VISIBLE\_DEVICES环境变量。
### 第二步:发送预测请求
方式1: 自定义脚本发送对话信息
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
```python
import requests
import json
# 发送HTTP请求
data = {'texts':["Hello","Hello\thi, nice to meet you\tnice to meet you"]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/plato2_en_base"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 保存结果
results = r.json()["results"]
for result in results:
print(result)
```
方式2: 通过交互式客户端进入交互模式
您可以执行以下客户端脚本进入交互模式:
```python
import requests
import json
ADDR = "127.0.0.1" # Your serving address
PORT = 8866 # Your serving port
MAX_TURN = 6 # The maximum dialogue turns
headers = {"Content-type": "application/json"}
url = "http://%s:%s/predict/plato2_en_base" % (ADDR, PORT)
context = []
while True:
user_utt = input("[Human]: ").strip()
if user_utt == "[NEXT]":
context = ""
print("Restart")
else:
context.append(user_utt)
data = {'texts': ["\t".join(context[-MAX_TURN:])]}
r = requests.post(url=url, headers=headers, data=json.dumps(data))
bot_response = r.json()["results"][0]
print("[Bot]: %s"%bot_response)
context.append(bot_response)
```
## 查看代码
https://github.com/PaddlePaddle/Knover
### 依赖
1.8.2 <= paddlepaddle < 2.0.0
1.7.0 <= paddlehub < 2.0.0
## 更新历史
* 1.0.0
初始发布