向任何应用程序添加自然语言理解
搜索是许多应用程序的基础。 数据开始堆积之后,用户希望能够找到它。 它是互联网的基础,并且是从未解决或完成的不断增长的挑战。
随着许多新的发展,自然语言处理(NLP)领域正在迅速发展。 大型通用语言模型是一项令人兴奋的新功能,使我们能够在有限的计算和人员的情况下快速添加惊人的功能。 随着新模型的不断创新和进步,似乎每周一次。
本文介绍txtai,这是一种由AI支持的搜索引擎,可在任何应用程序中启用基于自然语言理解(NLU)的搜索。
txtai简介
txtai在文本的各个部分上建立了一个AI驱动的索引。 txtai支持构建文本索引以执行相似性搜索并创建基于提取问题的系统。 txtai是开源的,可在GitHub上获得。http://github.com/neuml/txtai
txtai构建在以下技术栈上:
· Transformer
· Faiss,Annoy,Hnswlib
· Python 3.6
txtai和/或其背后的概念已用于为以下列出的自然语言处理(NLP)应用程序提供支持:
· cord19q — COVID-19文献分析 https://github.com/neuml/cord19q
· paperai —用于医学/科学论文的人工智能技术文献发现和审阅引擎 https://github.com/neuml/paperai
· neuspo-以事实为导向的实时体育赛事和新闻网站 https://neuspo.com/
· codequestion —直接从终端询问编码问题 https://github.com/neuml/codequestion
安装并运行txtai
以下代码段显示了如何安装txtai和创建嵌入模型。
pip install txtai
接下来,我们可以使用几个示例记录创建一个简单的内存模型,以尝试txtai。
import numpy as np
from txtai.embeddings import Embeddings
# Create embeddings model, backed by sentence-transformers & transformers
embeddings = Embeddings({"method": "transformers", "path": "sentence-transformers/bert-base-nli-mean-tokens"})
sections = ["US tops 5 million confirmed virus cases",
"Canada\'s last fully intact ice shelf has suddenly collapsed, forming a Manhattan-sized iceberg",
"Beijing mobilises invasion craft along coast as Taiwan tensions escalate",
"The National Park Service warns against sacrificing slower friends in a bear attack",
"Maine man wins $1M from $25 lottery ticket",
"Make huge profits without work, earn up to $100,000 a day"]
print("%-20s %s" % ("Query", "Best Match"))
print("-" * 50)
for query in ("feel good story", "climate change", "health", "war", "wildlife", "asia",
"north america", "dishonest junk"):
# Get index of best section that best matches query
uid = np.argmax(embeddings.similarity(query, sections))
print("%-20s %s" % (query, sections[uid]))
运行上面的代码将打印以下内容:
上面的示例显示了几乎所有查询,实际文本未存储在文本部分的列表中。 与基于令牌的搜索相比,这是变压器模型的真正优势。 开箱即用的东西是!
建立嵌入索引
对于少量文本列表,上述方法适用。 但是对于较大的文档存储库,没有必要对每个查询进行标记化和转换所有嵌入。 txtai支持构建预先计算的索引,从而显着提高性能。
在前面的示例的基础上,下面的示例运行index方法来构建和存储文本嵌入。 在这种情况下,每次搜索仅将查询转换为嵌入向量。
# Create an index for the list of sections
embeddings.index([(uid, text, None) for uid, text in enumerate(sections)])
print("%-20s %s" % ("Query", "Best Match"))
print("-" * 50)
# Run an embeddings search for each query
for query in ("feel good story", "climate change", "health", "war", "wildlife", "asia",
"north america", "dishonest junk"):
# Extract uid of first result
# search result format: (uid, score)
uid = embeddings.search(query, 1)[0][0]
# Print section
print("%-20s %s" % (query, sections[uid]))
再次将返回相同的结果,唯一的不同是预先计算了嵌入。
保存并加载Embeddings索引
嵌入索引可以保存到磁盘并重新加载。 目前,索引不是增量创建的,索引需要完全重建以合并新数据。
embeddings.save("index")
embeddings = Embeddings()
embeddings.load("index")
uid = embeddings.search("climate change", 1)[0][0]
print(sections[uid])
上面代码的结果:
Canada\’s last fully intact ice shelf has suddenly collapsed, forming a Manhattan-sized iceberg
只需编写少量代码,我们就可以构建对自然语言有深刻理解的系统。 来自Transformer模型的知识量惊人。
句子嵌入
txtai构建句子嵌入以执行相似性搜索。 txtai接受每个文本记录条目,对其进行标记并构建该记录的嵌入表示。 在搜索时,查询被转换为文本嵌入,然后与文本嵌入的存储库进行比较。
txtai支持两种创建文本嵌入的方法,句子转换器和词嵌入向量。 两种方法都有其优点,如下所示。https://github.com/huggingface/transformers
· 通过对Transformers库生成的矢量进行平均池化来创建单个嵌入矢量。
· 支持存储在Hugging Face的模型中心或本地存储的模型。
· 有关如何创建自定义模型的详细信息,请参见Sentence Transformers。该模型可以保存在本地或上传到Hugging Face的模型中心。
· 基本模型需要强大的计算能力(首选GPU)。 可能会建立更小/更轻的模型,这些模型会牺牲速度的准确性。
· 通过每个单词成分的BM25评分创建单个嵌入矢量。 上面的参考详细描述了该方法。
· 由pymagnitude库支持。 可以从参考链接安装预训练的单词向量。
· 有关可以为自定义数据集构建单词向量的代码,请参见vectors.py。
· 默认模型的速度明显提高。 对于较大的数据集,它在速度和准确性上有很好的折衷。
大规模相似搜索
如上所述,txtai使用相似性搜索将句子嵌入与存储库中的所有句子嵌入进行比较。 可能想到的第一个问题是,它将如何扩展到数百万或数十亿条记录? 答案是使用近似最近邻(ANN)搜索。 ANN可以在大量数据集上高效执行相似性查询。
Python中提供了许多强大的库,这些库支持ANN搜索。 txtai具有可配置的索引后端,该后端允许插入不同的ANN库。 目前,txtai支持:
- https://github.com/facebookresearch/faiss
- https://github.com/spotify/annoy
- https://github.com/nmslib/hnswlib
txtai对上述每个库都使用了明智的默认设置,以使其尽可能容易地启动和运行。 默认情况下,根据目标环境对索引的选择进行抽象。
上面的库没有将嵌入与记录ID关联的方法,或者假定ID是整数。 txtai负责此工作,并保留一个内部ID映射,该映射允许任何ID类型。
提取性问题解答
除相似性搜索外,txtai还支持对返回结果进行提取式问答。 这项强大的功能使您可以向一系列其他问题提出搜索结果列表。
一个示例用例是Kaggle上的CORD-19挑战。 这项工作需要为一系列医疗查询创建摘要表,并为每个结果提取其他列。
下面显示了如何在txtai中创建抽取式质量检查组件。
from txtai.embeddings import Embeddings
from txtai.extractor import Extractor
# Create embeddings model, backed by sentence-transformers & transformers
embeddings = Embeddings({"method": "transformers", "path": "sentence-transformers/bert-base-nli-mean-tokens"})
# Create extractor instance
extractor = Extractor(embeddings, "distilbert-base-cased-distilled-squad")
下一步是加载一组结果以提出问题。 以下示例包含带有一系列体育赛事得分的文本片段。
以上部分的结果。
我们可以看到提取器能够理解以上各节的上下文,并且能够回答相关问题。 Extractor组件可以与txtai Embeddings索引以及外部数据存储一起使用。 这种模块性使我们可以从txtai中选择要使用的功能,以创建自然语言感知的搜索系统。
进一步阅读
可以在以下笔记本中找到txtai的更多详细示例和用例。
总结
NLP正在快速发展,一年前甚至不可能实现。 本文介绍了txtai,这是一种由AI驱动的搜索引擎,它可以快速集成强大的模型并具有对自然语言的深刻理解。 Hugging Face的模型中心具有许多基础模型和社区提供的模型,可用于自定义几乎所有数据集的搜索。 可能性是无限的,我们很高兴看到可以在txtai之上构建的东西!
内容出处:,
声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/share/18483.html