dot 快速的未来即将在您所在的城市举办活动。

加入我们在 Redis 发布会

如何使用 Redis 和 AI 构建语言处理管道

确认偏差是所有医务人员必须努力克服的一个问题。无法考虑挑战现有观点的不同想法会阻碍他们面对既定诊断时考虑新诊断的能力。

这是一个源于医学文献的问题,医务人员更有可能倾向于支持其现有观点的文章。意见的多样性对于塑造能够提供有效诊断的整体视角至关重要。

为此,该 Launchpad 应用程序创建了一个语言处理机器学习管道,以消除医学文献中的确认偏差。使用 Redis,Launchpad 应用程序创建了一个管道,能够通过高效的数据传输将文本转换为知识图。

让我们研究一下该团队如何实现这一点。但在深入研究之前,请务必查看我们在 Launchpad上的所有不同且创新的应用程序。

https://www.youtube.com/embed/c9BLQZ6pPFE

  1. 您将构建什么?
  2. 您将需要什么?
  3. 架构
  4. 入门
  5. 浏览 Redis 知识图网站
  6. 结论

1. 您将构建什么?

让我们探索如何使用 Redis 为自然语言处理 (NLP) 构建管道。

我们将通过突出显示每个组件以及解压缩其功能来揭示 Redis 如何用于将此想法变为现实。

2. 您将需要什么?

  • Python 3.6: 强大、功能强大且快速的编程语言
  • Redis 流: 管理来自 cord-19 的数据消耗并将数据传输到 RedisGears
  • RedisGears: 预处理来自 cord-19 的现有文章
  • RedisGraph: 存储从 RedisGears 处理的信息
  • RedisAI: 执行深度学习/机器学习模型以管理 RedisGears 中的数据
  • Cord-19: 是关于 Covid-19 和相关历史冠状病毒研究的科学论文的不断增长的资源。它旨在通过其深入的元数据和结构化全文论文集来增强文本挖掘和信息检索系统的开发。

3. 架构

NLP 管道 1:将文本转换为知识图

从头到尾,Redis 是此管道的数据结构。它的作用是将文本转换为知识图。让我们快速了解一下知识图是什么以及它在此项目中的作用。

什么是知识图?

如今的系统不仅仅存储文件夹、文件和网页。相反,它们是复杂性的网络,由实体组成,例如对象、情况或概念。知识图将突出显示每个实体的属性及其之间的关系。此信息通常存储在图形数据库中,并以图形结构可视化。

知识图的组成部分有哪些?

知识图由 2 个主要组成部分组成

  • 节点: 代表对象、地点、人或概念
  • 边: 定义节点之间的关系

以下是节点和边如何用于集成数据的示例。

工作原理

  1. 摄取文档: Cord-19 文档被解析并从 body_text 中提取。然后,这些文档在 Redis 集群中的段落下保存。
  2. 检测语言: RedisGears 注册文本中的关键读数,并丢弃任何非英文的医学文献。
  3. 将段落拆分为句子: 段落然后被映射到句子。
  4. 拼写检查器: symspell 库及其映射用于处理输出并将其保存到哈希。
  5. 匹配器: 预构建的 Aho-Corasick 自动机然后用于使用 UMLS Methathesaurus 将传入的单词与医学概念匹配
  6. 填充 RedisGraph: 匹配的句子然后加载到 RedisGraph 的边中,节点是概念 (CUI)
  7. 前端存储库: 此项目和即将推出的 VR/AR 的源代码
  8. Flask API 服务器: 只是用于查询 RedisGraph 的简单 Flask API 服务器

在第一个管道中,您将了解如何使用医学词典为医学文献创建知识图。它使用 RedisGears 处理信息并将其存储在 RedisGraph 中。

首先,使用以下代码解压缩和解析 metadata.zip,其中文件名称、标题和年份被提取到 HASH 中

redis_client.hset(f"article_id:{article_id}",mapping={'title': each_line['title']})
redis_client.hset(f"article_id:{article_id}",mapping={'publication_date':each_line['publish_time']})

以下代码通过读取 JSON 文件工作 - data/sample_folder 中的示例:the-pattern-platform/RedisIntakeRedisClusterSample.py

它还将 JSON 解析为字符串

rediscluster_client.set(f”paragraphs:{article_id}“,” “.join(article_body))

以下代码是使用 RedisGears 的主要预处理任务:the-pattern-platform/gears_pipeline_sentence_register.py 

它还监听段落的更新:键

gb = GB('KeysReader')
gb.filter(filter_language)
gb.flatmap(parse_paragraphs)
gb.map(spellcheck_sentences)
gb.foreach(save_sentences)
gb.count()
gb.register('paragraphs:*',keyTypes=['string','hash'], mode="async_local")

这使用 RedisGears 和 HSET/SADD。

如何使用 Aho-Corasick 算法将句子转换为边 (句子) 和节点 (概念)

第一步是使用以下代码

bg = GearsBuilder('KeysReader')
bg.foreach(process_item)
bg.count()
bg.register('sentence:*',  mode="async_local",onRegistered=OnRegisteredAutomata)

下一行代码将在每个分片上创建一个流:

'XADD', 'edges_matched_{%s}' % shard_id, '*','source',f'{source_entity_id}','destination',f'{destination_entity_id}','source_name',source_canonical_name,'destination_name',destination_canonical_name,'rank',1,'year',year)

以下是提高句子分数的方法

zincrby(f'edges_scored:{source_entity_id}:{destination_entity_id}',1, sentence_key)

如何从 RedisGears 填充 RedisGraph

the-pattern-platform/edges_to_graph_streamed.py 通过在 RedisGraph 中创建节点、边或更新其排名来工作

"GRAPH.QUERY", "cord19medical","""MERGE (source: entity { id: '%s', label :'entity', name: '%s'}) 
         ON CREATE SET source.rank=1
         ON MATCH SET source.rank=(source.rank+1)
         MERGE (destination: entity { id: '%s', label: 'entity', name: '%s' })
         ON CREATE SET destination.rank=1
         ON MATCH SET destination.rank=(destination.rank+1)
         MERGE (source)-[r:related]->(destination)
         ON CREATE SET r.rank=1, r.year=%s
         ON MATCH SET r.rank=(r.rank+1)
         ON CREATE SET r.rank=1
         ON MATCH SET r.rank=(r.rank+1)""" % (source_id ,source_name,destination_id,destination_name,year))

如何在 API 调用期间查询 RedisGraph 数据

the-pattern-api/graphsearch/graph_search.py

具有年份节点 ID、限制和年份的边

"WITH $ids as ids MATCH (e:entity)-[r]->(t:entity) where (e.id in ids) and (r.year in $years) RETURN DISTINCT e.id, t.id, max(r.rank), r.year ORDER BY r.rank DESC LIMIT $limits"""

节点

"""WITH $ids as ids MATCH (e:entity) where (e.id in ids) RETURN DISTINCT e.id,e.name,max(e.rank)"""

接下来,使用以下代码查找得分最高的文章:

app.py uses zrangebyscore(f"edges_scored:{edges_query}",'-inf','inf',0,5)

使用管道中最幽默的代码

向您的安全架构师展示以下代码

import httpimport
    with httpimport.remote_repo(['stop_words'], "https://raw.githubusercontent.com/explosion/spaCy/master/spacy/lang/en/"):
        import stop_words
    from stop_words import STOP_WORDS

    with httpimport.remote_repo(['utils'], "https://raw.githubusercontent.com/redis-developer/the-pattern-automata/main/automata/"):
        import utils
    from utils import loadAutomata, find_matches

这是必要的,因为 RedisGears 不支持提交项目或模块。

NLP 管道 2:BERT QA

BERT 代表来自 Transformer 的双向编码器表示。它是由 Google AI 的研究人员创建的,是处理自然语言任务(包括问答 (SQuAD v1.1.)、自然语言推理 (MNLI) 等)的世界领导者。

以下是 BERT 模型的一些流行用例

  • 下一个句子预测文本: 发生在您的 Gmail 自动完成您的句子时。
  • 文本摘要: 为冗长的文章提供简洁但有意义的摘要。
  • 问答: 以自然语言自动回答用户的问题
  • 文本分类: 将文本分类为有组织的组,使内容更容易访问和理解。

最先进的代码位于the-pattern-api/qasearch/qa_bert.py 中。它查询 RedisGears + RedisAI 集群,为用户提供一个问题:

get "bertqa{5M5}_PMC140314.xml:{5M5}:44_When air samples collected?"

它查询分片 {5MP} 上的 bertqa 前缀,其中 PMC140314.xml:{5M5}:44(见下文) 是预标记 REDIS AI 张量(潜在答案)的键,而“何时收集空气样本?”是用户的问题。

PMC140314.xml:{5M5}:44

RedisGears 然后捕获 keymiss 事件 the-pattern-api/qasearch/qa_redisai_gear_map_keymiss_np.py

gb = GB('KeysReader')
gb.map(qa_cached_keymiss)
gb.register(prefix='bertqa*', commands=['get'], eventTypes=['keymiss'], mode="async_local")

RedisGears 然后运行以下操作

  • redisAI.getTensorFromKey
  • redisAI.createModelRunner
  • redisAI.createTensorFromBlob
  • redisAI.modelRunnerAddInput
  • redisAI.modelRunnerRunAsync 在 async/await 中

对于非阻塞主线程模式,模型使用 AI.modelset 在每个分片上预加载,位于 the-pattern-api/qasearch/export_load_bert.py 中。

NLP 管道 3:用于摘要的 T5

摘要通过在句子上运行:前缀并运行 t5-base 变压器标记器来工作,使用简单的 SET 命令和 python.pickle 模块将结果保存到 RedisGraph 中,将摘要键(从 article_id 派生)添加到

rconn.sadd('processed_docs_stage3_queue', summary_key)

以下代码订阅队列并运行简单的 SET 和 SREM 命令

summary_processor_t5.py

然后,这将更新 RedisGraph 中的哈希

redis_client.hset(f"article_id:{article_id}",mapping={'summary': output})

4. 入门

Redis 提供 rgcluster Docker 镜像 以及 redis-cluster 脚本。重要的是要确保集群以高可用性配置部署。每个主服务器必须至少有一个副本。这是因为您在部署机器学习模型时必须重新启动主服务器。

如果主节点重启,并且没有副本,那么集群将进入故障状态,您需要手动重新创建它。

其他参数包括执行时间和内存。脏模型在内存中占用 1.4 GB,您需要在此处包含协议缓冲区内存。您还需要为集群和齿轮图表增加执行时间,因为所有任务都是计算密集型的,因此您需要确保时间限制得到满足。

步骤 1. 先决条件

确保您在系统中安装了 virtualenv、Docker 和 Docker Compose。

apt install docker-compose
brew install pyenv-virtualenv 

 

步骤 2. 克隆存储库

git clone --recurse-submodules https://github.com/redis-developer/the-pattern.git
cd the-pattern
./start.sh
cd ./the-pattern-platform/
source ~/venv_cord19/bin/activate #or create new venv
pip install -r requirements.txt
bash cluster_pipeline.sh

等待一会儿,然后检查以下内容

RedisGraph 已填充

redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (n:entity) RETURN count(n) as entity_count" 
redis-cli -p 9001 -h 127.0.0.1 GRAPH.QUERY cord19medical "MATCH (e:entity)-[r]->(t:entity) RETURN count(r) as edge_count"

API 是否响应

curl -i -H "Content-Type: application/json" -X POST -d '{"search":"How does temperature and humidity affect the transmission of 2019-nCoV"}' https://#:8080/gsearch

步骤 3:启动 UI

cd the-pattern-ui
npm install 
npm install -g @angular/cli@9
ng serve

步骤 4. 问答 API

cd the-pattern-api/qasearch/
sh start.sh

注意:这将在每个分片上下载并预加载 1.4 GB 的 BERT QA 模型。由于其大小,它可能会在笔记本电脑上崩溃。通过运行以下命令进行验证:

curl -H "Content-Type: application/json" -X POST -d '{"search":"How does temperature and humidity affect the transmission of 2019-nCoV?"}' https://#:8080/qasearch

步骤 5:总结管道

从“the-pattern”存储库转到 RedisGears 集群上的存储库

cd the-pattern-bart-summary
# source same enviroment with gears-cli (no other dependencies required)
source ~/venv_cord19/bin/activate 
gears-cli run --host 127.0.0.1 --port 30001 tokenizer_gears_for_sum.py --requirements requirements.txt

此任务可能会超时,但您可以安全地重新运行所有内容。

在 GPU 或服务器上,配置 NVidia 驱动程序

sudo apt update
    sudo apt install nvidia-340
    lspci | grep -i nvidia
    sudo apt-get install linux-headers-$(uname -r)
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
    wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-$distribution.pin
    sudo mv cuda-$distribution.pin /etc/apt/preferences.d/cuda-repository-pin-600
    sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/7fa2af80.pub
    echo "deb http://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
    sudo apt-get update
    sudo apt-get -y install cuda-drivers
    # install anaconda
    curl -O https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
    sh Anaconda3-2020.11-Linux-x86_64.sh
    source ~/.bashrc
    conda create -n thepattern_env python=3.8
    conda activate thepattern_env
    conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11 -c pytorch

配置实例到 RedisGraph Docker 镜像的访问(或使用 Redis Enterprise)

git clone https://raw.githubusercontent.com/redis-developer/the-pattern-bart-summary.git
#start tmux 
conda activate thepattern_env
pip3 install -r requirements.txt
python3 summary_processor_t5.py

演练

虽然 RedisGears 允许您部署和运行机器学习库,如 spacyBERT transformers,但下面的解决方案采用了一种更简单的方法

以下是整个管道的快速概述:以上 7 行允许您使用所有可用的 CPU 在分布式集群或单台机器上运行逻辑。作为旁注,在您需要扩展到超过 1000 个节点之前,不需要进行任何更改。

对所有字符串或哈希使用为命名空间段落注册的 KeysReader。您的管道需要在异步模式下运行。如果您是一位数据科学家,我们建议使用 gb.run 来帮助确保 RedisGears 工作并以批处理模式运行。然后它将以批处理模式运行。之后,将其更改为注册以捕获新数据。

默认情况下,函数将返回到输出,因此需要 count() - 为了防止将整个数据集获取回发出命令的机器(Cord19 为 90 GB)。

总的来说,预处理是一个简单的过程。您可以访问完整的代码 这里

需要注意的重要事项

  1. 节点进程只能本地保存。我们不会移动数据,您想要保存的任何内容都应该有哈希标签。例如,要添加到已处理文档集中,请使用以下内容
  1. 确保将外部库加载到计算威胁中。例如,symspell 需要额外的字典,并且需要两个步骤才能加载

您可以直接从 UMLS 数据构建 Aho-Corasick 自动机。Aho-Corasick 将允许您将传入的句子匹配到节点对,并将句子作为图中的边呈现。与 Gears 相关的代码很简单:

bg = GearsBuilder('KeysReader')
bg.foreach(process_item)
bg.count()
bg.register('sentence:*',  mode="async_local",onRegistered=OnRegisteredAutomata)

5. 浏览Redis 知识图站点

Redis 知识图旨在根据长而详细的查询创建知识图。

初步步骤:选择“入门”,然后选择“护士”或“医学生”。

步骤 1:在搜索栏中输入您的查询

步骤 2:选择与您的搜索最相关的查询

步骤 3:在不同的节点之间浏览,并使用底部的切换栏更改搜索日期

结论:使用 Redis 消除确认偏差

使用 Redis,Launchpad 应用程序创建了一个管道,帮助医务人员在不受到确认偏差的影响下浏览医学文献。紧密集成的 Redis 系统促进了组件之间数据的无缝传输,催生了医务人员可以利用的知识图。

您可以访问 Redis Launchpad,详细了解此创新应用程序的方方面面。在您访问时,您可能还想浏览我们 令人兴奋的应用程序范围

您可以前往 Launchpad,详细了解该应用程序以及我们激动人心的应用程序集合中的许多其他应用程序。

谁创建了这个应用程序?

亚历山大·米哈列夫

亚历山大是一位充满激情的研究员和开发人员,他总是乐于探索新技术并开发“新事物”。

请务必 访问他的 GitHub 页面,查看他参与的所有最新项目。