「搜索」并不局限于我们常说的搜索引擎、搜索框,实际上,问答机器人本质上也是一种「搜索」,输入相关查询,返回最接近或最相关的答案。

今天,我们将演示如何利用 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_DOCSdocs = 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 Clientdef 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 个等级的学习资料及课后测验,助力你成为神经搜索高手。

从 0 到 1,开发一个智能问答机器人相关推荐

  1. 开发一个智能问答机器人

    近期开发了一套基于自然语言处理的问答机器人,之前没有做过python,主要做asp.net,写这篇目的是给想要开发这类智能客服系统的朋友提供一个思路,项目已经上线,但在开发和设计过程中仍然有很多问题没 ...

  2. 原来AI也可以如此简单!教你从0到1开发开源知识问答机器人

    摘要:使用华为云EI智能机器人技术,从0到1开发一款开源知识问答机器人. 前言 最近有幸参与了开源社开源问答机器人的知识库编写,碰巧看到华为云也有类似的智能机器人,抱着试一试的心态,我开始了EI智能机 ...

  3. 机器人对话常用语模板_原来AI也可以如此简单!教你从0到1开发开源知识问答机器人...

    摘要:使用华为云EI智能机器人技术,从0到1开发一款开源知识问答机器人. 前言 最近有幸参与了开源社开源问答机器人的知识库编写,碰巧看到华为云也有类似的智能机器人,抱着试一试的心态,我开始了EI智能机 ...

  4. 勇敢跨越,从0到1开发一个属于自己的App

    1 前言 码字不易,且行且珍惜. 之前听一个老铁说,一个开发者的真正蜕变,要从真正做一个属于自己的App开始,你只有自己一个人摸索.研究,真正靠自己踏上这条路,才能尝尽这条路上的酸甜苦辣,才会成长!于 ...

  5. 实现一个微信公众号智能问答机器人

    前言 实现一个微信公众号智能问答机器人.(注:该项目开发并不复杂,但是需要的前提条件较多,需要有一定经验的开发人员才能吃透这篇文章) 1. 前期准备 注册一个微信公众号(如果没有可以用微信官方测试的公 ...

  6. 报告 | 腾讯知文,从0到1打造下一代智能问答引擎【CCF-GAIR】

    图片来源于雷锋网 雷锋网: 关于自然语言处理NLP和自然语言理解NLU研究到底到了哪一阶段?还有哪些亟待突破的技术难点?接下来又将产生哪些服务于大众的应用? CCF-GAIR 2018 大会NLP 专 ...

  7. 开发一个智能对话系统用什么工具?

    Rasa是Conversational AI在智能业务对话领域工程落地全球最为成功对话机器人系统,是基于Transformer架构的全球使用最广泛的智能业务对话机器人框架,是NLP技术的集大成者.在当 ...

  8. 可视化入门:从 0 到 1 开发一个图表库

    作者介绍 万木:蚂蚁体验技术部前端工程师,AntV G2 栈的核心维护者,多次在 IEEE Vast Challenge,ChinaVis Challenge 等数据分析挑战赛中获得优异成绩.喜欢写代 ...

  9. 物联网全栈教程--手把手教你开发一个智能浇花器

    下面来说一下课程的安排,本教程可以分为三大章节,30个小章节,在1-10章节,手把手讲解了如何实现一个定时/实时控制的浇花器,可以对浇花器电量进行显示,可以进行定时设置,以及实时控制,低功耗模式等等, ...

  10. Uni-app学习从0到1开发一个app——(3)简单小工程内容介绍

    文章目录 工程文件 看看一个标准的hello微信小程序工程文件的组成和作用. 工程文件 可以参考官方教程:传送门 之前的文章有详细的开发环境介绍,传送门Uni-app学习从0到1开发一个app--(2 ...

最新文章

  1. centos安装与配置dhcp服务
  2. 面试:讲一讲Spring中的循环依赖
  3. 第四章-数据共享与保护
  4. 绝了!Pandas绘图功能
  5. linux中断处理汇编入口,Linux中断处理体系结构分析(一)
  6. “围棋人机大战”唯一人类的胜利记录将被制作成NFT进行拍卖
  7. scala类型匹配注意事项
  8. mt4 指标 涨跌幅 颜色k线_精品主图 精准K线买卖点提示通达信指标公式源码
  9. 一行代码安装jupyter | 解决jupyter下载慢的问题
  10. C# 使用HTMLhelp生成chm文件添加搜索并解决搜索找不到主题的问题
  11. 分享可用的谷歌学术(google scholar) hosts
  12. 【JavaScript设计模式】装饰器模式
  13. Firefox无法打开VMWare console的解决方案
  14. [2018国家集训队][UOJ449] 喂鸽子 [dp+组合数学]
  15. 翁恺c语言视频作业题,翁恺入门C语言第2周编程练习
  16. python概率编程_TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
  17. android一键清理任务,Android 一键清理、内存清理功能实现
  18. golang for嵌套循环中break 的注意事项和使用细节: break 语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
  19. 微软专业资历认证有哪些?
  20. 多计算机网络企业网 开题报告,(中小型企业网络设计开题报告.doc

热门文章

  1. 码农翻身讲网络4:从Token到Sessions说到OAuth认证和CAS单点登录
  2. 深入理解Java枚举类型(enum)
  3. Qt:局域网文件同步工具
  4. MTK Pump Express 快速充电原理分析
  5. 预充电电路工作原理_电池管理系统中的高压预充电电路原理解析
  6. 简体字和繁体字转换四种方法
  7. This request has been blocked; the content must be served over HTTPS
  8. MAC如何将[搜狗输入法]设置为默认输入法
  9. 异步十二进制加法计数器(统一使用上升沿触发的D触发器)设计
  10. 读懂Redis源码,我总结了这7点心得