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

article/2025/8/28 20:33:23

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

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


http://chatgpt.dhexx.cn/article/JqDEIh4U.shtml

相关文章

FAQ问答机器人

FAQ问答机器人 0.Abstract1.任务介绍数据集评估方法测试集 2.使用ELMo预训练模型3.使用BERT预训练模型4.针对基线模型的分析思考以及可能的提升方向5.BERT训练模型1) 损失函数2) 数据集构造同义句(正例)的构造:非同义句(负例)的构造: 3) 对于如何计算分数的探讨 6. 结论以及原因…

聊天机器人与自动问答技术

文章转载自:http://www.itlipeng.cn/?p574 原文发表时间:2015-01-24 引言 最近半年,微软的聊天机器人小冰比较火,有些人对这方面的技术产生了兴趣,恰好之前做过自动问答方面的一些简单工作,这次写一篇…

开发一个智能问答机器人(优化篇)

上一篇介绍了整个问答机器人的技术架构和特定,本篇着重说下 如何让机器人(看起来)更智能 输入联想 使用jquery.autosuggest.js实现的输入联想,在输入2个字后,在5000个问答中基于全文检索,检索10条记录&am…

动手做个 AI 机器人,帮我回消息

大家好,我是鱼皮,自从做了知识分享,我的微信就没消停过,平均每天会收到几百个消息,大部分都是学编程的朋友向我咨询编程问题。 但毕竟我只有一个人,没法所有消息都一个个回复,所以也是很愧疚和…

开发一个智能问答机器人

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

【原创】聊天机器人与自动问答技术

聊天机器人与自动问答技术 作者:mjs (360电商技术) 引言 最近半年,微软的聊天机器人小冰比较火,有些人对这方面的技术产生了兴趣,恰好之前做过自动问答方面的一些简单工作,这次写一篇应景之作&…

智能问答机器人

1. 前言 问答机器人现在很多场合都有使用,比如:网页智能客服、微信公众号智能回复、淘宝的售后客服,QQ聊天机器人等等。有了这些客户机器人就能帮我们回答很多预置的一些问题,帮助用户解决常见问题,还可以进行自主训练…

智能问答机器人概述

智能问答机器人概述 总览任务机器人FAQ机器人闲聊机器人 总览 处理逻辑: query–>中控逻辑–>response 任务机器人 指特定条件下提供信息或服务的机器人。 任务型机器人核心模块主要包括三部分: 自然语言理解模块 —— Language Understanding …

数仓实时数据同步 debezium

数仓实时数据同步 debezium 背景debezium 简介架构基本概念 例子Router目前遇到的问题 背景 数据湖将源库的数据同步到hive数仓ods层,或直接在kafka中用于后面计算。源库包括mysql、postgresql、sqlserver、oracle,大部分是mysql数据库。当前采用的sqoo…

基于日志的同步数据一致性和实时抽取

宜信技术研发中心架构师 目前就职于宜信技术研发中心,任架构师,负责流式计算和大数据业务产品解决方案。曾任职于Naver china(韩国最大搜索引擎公司)中国研发中心资深工程师,多年从事CUBRID分布式数据库集群开发和CUB…

解析 TiDB 在线数据同步工具 Syncer

TiDB 是一个完全分布式的关系型数据库,从诞生的第一天起,我们就想让它来兼容 MySQL 语法,希望让原有的 MySQL 用户 (不管是单机的 MySQL,还是多机的 MySQL Sharding) 都可以在基本不修改代码的情况下,除了可以保留原有…

服务器与客户端的数据同步

2019独角兽企业重金招聘Python工程师标准>>> 问题 从一个例子说起,我们的客户端从服务器获取数据,这里假定获取文章。第一次使用,我们获取服务器端最新发表的几篇文章。 我们可以每次都重新获取,但这样费时又费流量。好…

数据实时同步或抽取上收的技术分析

原文:http://blog.csdn.net/dsg_gulibin/article/details/1696365 1 实现数据集中的技术手段分析比较 根据业界提供数据同步或抽取的解决方案来看,主要包括以下几大类: l 存储复制技术 l 数据库复制技术 l …

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP(Network Time Protocol)网络时间协议,是用来使计算机时间同步的一种协议,它可以使计算机对其服务器或时钟源做同步…

如何实时同步数据到StarRocks

我们知道,是StarRocks基于Doris开发的,它在多表连接查询的性能方面引领OLAP市场,是一个很好用的结构化数据仓库。但是一直没有很好的工具能够实现业务数据库的数据实时同步到StarRocks分布式数据仓库集群中,本文将带领读者一起来通…

文件实时同步

rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的、数据在内存缓存区完成之后还没有写入到磁盘中去、所以有时候要同步到磁盘中去的,而rsync说白了跟复制差不多、能将一个文件从一个地方复制到另外一个地方的、但是他也可以实现跨主机复…

系统间通讯实现数据信息实时同步解决方案

项目开发阶段遇到一个需求,描述大致就是同一个用户在A系统数据库保存的数据信息与在B系统数据库保存的数据信息要保持同步。当A系统用户修改了个人信息,A系统后台在将用户修改后的信息入库的同时也会向B系统发送消息,让B系统后台进行自动数据…

一文带你玩转实时数据同步方案

1、概述 1.1、目标 实时数据同步主要实现从源数据库到目标数据库的实时数据同步。源数据主要支持mysql数据库,目标数据包括mysql数据库和hbase数据库。 下面是实时数据同步的数据流转图,mysql的增量订阅数据经过canal和kafka,数据最终实时…

两台服务器同时写文件 怎么做同步,两台服务器做实时数据同步

两台服务器做实时数据同步 内容精选 换一换 DCS Memcached即将下线,部分Region已暂停售卖,建议使用Redis4.0/5.0。本章节主要描述Memcached主备实例。Memcached主备实例在单机实例基础上,增强服务高可用以及数据高可靠性。Memcached主备实例具…

实时数据同步方案

一.Flume收集各数据库日志,准实时抽取到HDFS 安装HDP,包含Flume 方案优点: 1.配置简单,不用编程:只要在flume.conf文件中配置source、channel及sink的相关属性 2.采用普通SQL轮询的方式实现,具有通用性&…