乐趣区

关于机器人:从-0-到-1开发一个智能问答机器人

「搜寻」并不局限于咱们常说的搜索引擎、搜寻框,实际上, 问答机器人实质上也是一种「搜寻」, 输出相干查问,返回最靠近或最相干的答案。

明天,咱们将演示如何利用 Jina 全家桶,创立一个智能问答机器人,并将其部署到云端。

开发过程一览:4 步创立问答机器人

新冠暴发之初,人们对这种新型病毒充斥疑难,本教程将以疫情相干的问答为利用场景,以一般 Chatbot 的交互模式为依靠,最终实现用户在终端键入查问(问题)后,智能问答机器人能够输入相干的答案。

创立问答机器人的过程包含:

1、加载数据到搜寻利用

2、创立并运行 Flow 索引数据(数据编码并将向量和元数据存储到磁盘上)

3、运行雷同的 Flow,用户输出问题进行搜寻

4、在浏览器中运行 GUI

从 0 到 1:开发过程详解

1、下载数据集

下载 COVID-QA 数据集,你能够:Clone GitHub Repo 或在 Kaggle 下载。

COVID-QA 数据集详情一览

 因为本示例中,咱们只会用到问答相干的数据,因而仅应用 community.csv 文件即可。该文件中包含 400 多对源自 4 个大洲、15 个英文网站的相干 QA。

2、设置

创立一个名为 config.py 的文件,便于前期批改根本设置:

PORT = 23456 # which port will we run the REST interface on?
NUM_DOCS = 30000 # how many rows of the CSV do we want to index?
DATA_FILE = "./data/community.csv" # where can we find the CSV

装置 DocArray 和 Jina:

pip install docarray jina

3、将数据转换为 DocumentArray

Document 是 Jina 的原始数据类型,文本、图像、音频、视频等各种类型的数据,都会转换为 Document。一组 Document 组成一个 DocumentArray。

以上性能都能够通过 DocArray 实现。

本示例中,每一行 CSV 文件都会被视为一个 Document,所有 Document 组成一个 DocumentArray 后,才进行下一步解决。

利用 DocArray 的 from_CSV 性能,能够疾速解决 CSV 文件。在 app.py 中应用 from_CSV:

from config import DATA_FILE, NUM_DOCS

docs = DocumentArray.from_csv(DATA_FILE, field_resolver={"question": "text"}, size=NUM_DOCS
)

援用先前在 config.py 中设置的 DATA_FILE 和 NUM_DOCS。将所有 Document 的 text 属性映射到相干的 question 字段中。其余字段将作为元数据,主动增加到 Document 的 tags 属性中。

4、创立索引 Flow

获取 DocumentArray,对于 Document:

  • 将其内容编码为向量并存储在索引中,以便稍后搜寻

这里须要用到 Flow:

flow = (Flow(protocol="http", port=PORT)
    .add(
        name="encoder",
        uses="jinahub+docker://TransformerTorchEncoder",
        uses_with={"pretrained_model_name_or_path": "sentence-transformers/paraphrase-mpnet-base-v2"},
    )
    .add(name="indexer", uses="jinahub://SimpleIndexer", install_requirements=True)
)

如上图代码所示,这里应用 Flow().add(…).add(…) 调用 Jina Hub 的 Executor:

  • Encoding:第一个 .add() 用于增加编码器 Executor–TransformerTorchEncoder,它运行在 Docker 容器中,无需放心依赖。这里还能够设定心愿应用的模型。
  • Indexing:最初一个 .add() 调用了索引器 Executor–SimpleIndexer。因为 SimpleIndexer 须要编写本地文件系统(该示例中可应用 uses_with 和 volume 选项),因而无需在 Docker 中运行。

此外,在这段代码中,咱们还启用了 HTTP 网关,并在 Flow 参数中创立了端口。

5、运行索引 Flow

通过以下形式运行 Flow:

with flow:
    flow.index(docs, show_progress=True)

要启动索引 Flow,须要在终端中运行 app.py。首次运行可能比较慢,因为须要从 Jina Hub 下载 Executor,并解决这些数据。

注:这里可能会呈现一些正告,间接疏忽即可。

此处只索引了局部 Document

 

接下来咱们将看到一个蕴含索引数据的 workspace 目录:

在这个 workspace 文件夹中,能够看到 index.db,这是一个 SQLite 数据库,用于存储数据:

对整个数据集进行索引后,workspace 目录约占用 5.4 Mb 存储空间。

 

6、向机器人发问

应用雷同的 Flow 搜寻问题的答案。如前文所述,Jina 全家桶中原始的数据类型是 Document,所以:

  • 将问题包装成一个 Document
  • 将该 Document 传递给 Flow
  • 获取从 Flow 中返回的最相似的问题
  • 从最相似的问题中,打印答案字段
question = Document(text="Can I catch COVID from my cat?")
with flow:
    results = flow.search(question)

print(results[0].matches[0].tags["answer"])

这段代码中,咱们应用了跟索引的时候雷同的两个 Executor,然而性能并不相同:

  • Encoding: 将问题文本字符编码成向量
  • Indexing: 在索引中搜寻与问题 (question) 向量最靠近的向量,并返回匹配的数据

当初再次运行 app.py 能够失去如下答案:

Covid-19 is the result of a zoonotic outbreak from bats to an intermediate (and unidentified host) thence to humans….The SARS-CoV-2 infects humans via the ACE2 surface receptor, but this receptor is not only found in humans. Other animals have similar but not exactly the same ACE2 receptors and several dogs and one cat have returned positive swabs for SARS-CoV-2. The cat developed covid-19 symptoms.

进阶示例中,长答案会被分解成句子块,只把最相干的返回给用户。

6、应用 Streamlit 创立 UI

用 Streamlit 创立前端,借助 Streamlit-Chat 模块创立一个相似聊天机器人的界面:

pip install streamlit-chat streamlit

再次设置一个根本的前端 config.py:

PORT = 23456
SERVER = "0.0.0.0"
TOP_K = 1

frontend.py 十分重要,它决定了咱们与后端交互并获取最佳答案的形式。这里须要用到 Jina Client:

from jina import Client

def search_by_text(input, server=SERVER, port=PORT, limit=TOP_K):
    client = Client(host=server, protocol="http", port=port)
    response = client.search(Document(text=input),
        parameters={"limit": limit},
        return_results=True,
        show_progress=True,
    )
    match = response[0].matches[0].tags["answer"]

    return match

更多可参考:Jina 轻松学 —— 用 Jina + Streamlit 极速搭建搜寻利用

7、连贯 UI 和 Flow

应用 flow.block() 放弃端口关上:

# question = Document(text="Can I catch COVID from my cat?")
# with flow:
#     results = flow.search(question)

# print(results[0].matches[0].tags["answer"])

with flow:
  flow.block()

再次运行后端代码:

python app.py

在新终端中,运行前端代码:

streamlit frontend.py

这样一来,一个由神经搜寻 (Neural Search) 技术驱动的智能问答机器人,就搞定了!

进阶操作:拆分数据集 & 微调模型

截止目前,问答机器人输入的答案都是大段文本,蕴含了泛滥的上下文内容。在理论应用中,用户更心愿只输入有用且相干的「句子」。

借助 Jina Hub 上的 Executor–Sentencizer,咱们能够把数据集中的「段落」拆分成「句子」。

此外,这个教程中应用的预训练模型,并不是专门为医学问题创立的。为了进步性能,咱们能够借助 Finetuner 进行微调。

以上就是咱们本期教程的全部内容,残缺 demo 请拜访 Here。

快动动小手,开发一个你本人的智能问答机器人吧!

开发者们问 Jina

Q1:开发过程呈现报错或 Bug,如何解决?

A:拜访 GitHub Repo 在对应的产品下提交 Issue 或 PR

Q2:如何退出社区、参加探讨?

A:咱们目前反对 Slack 社区以及微信公众号社群:

Slack:英文社区,与来自寰球的 Jina 用户探讨最新的利用场景及技术发展趋势。

微信群:中文社区,结识更多国内同行,摸索 Jina 本土化利用场景。私信小助手获取群入口。

Q3:如何获取社区反对,宣发集体我的项目?

A:私信小助手,咱们将根据我的项目状况及开发者需要,帮忙开发者在社区进步集体影响力。

Q4:老手如何入门 Jina 全家桶?

A:从这些材料开始,理解 Jina 生态、开启你的神经搜寻之旅:

Learning Portal(英文):从入门到精进,3 个等级的学习材料及课后测验,助力你成为神经搜寻高手。

退出移动版