小熊回收站|txtai:基于 Transformer 的人工智能搜索引擎

自然语言处理领域正在迅速发展 , 出现了许多新的进展 。 大规模的通用语言模型是一种令人兴奋的新能力 , 使我们能够在有限的计算和人力的情况下快速添加惊人的功能 。 创新仍在继续 , 新的模型和进步似乎每周都有 。 本文将对 txtai 进行介绍 , 这是一个基于人工智能的搜索引擎 , 可以在任何应用程序中实现基于自然语言理解(Natural Language Understanding , NLU)的搜索 。
txtai 介绍txtai 在文本部分上建立了一个基于人工智能的索引 。 txtai 支持建立文本索引来执行相似度搜索 , 并创建基于抽取(extractive)的问答系统 。 tatai 是开源的 , 可以在 github 上获得:
txtai 是构建在以下技术栈上的:

  • Sentence Transformers
  • Transformers
  • Faiss 、 Annoy 、 Hnswlib
  • Python 3.6+
txtai 背后的概念已用于支持下列自然语言处理应用程序:
  • cord19q :COVID-19 文献分析
  • paperai :用于医学 / 科学论文的人工智能文献发现和评论引擎
  • neuspo :一个以事实为导向的实时体育赛事和新闻网站
  • codequestion :直接从终端询问编码问题
安装并运行 txtai下面的代码段展示了如何安装 txtai 并创建一个嵌入模型 。
【小熊回收站|txtai:基于 Transformer 的人工智能搜索引擎】pip install txtai接下来 , 我们可以创建一个简单的内存模型 , 其中包含一些示例记录来尝试 txtai 。
import numpy as npfrom txtai.embeddings import Embeddings# Create embeddings model, backed by sentence-transformers & transformersembeddings = 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 queryuid = np.argmax(embeddings.similarity(query, sections))print("%-20s %s" % (query, sections[uid]))运行上面的代码将打印以下内容:
小熊回收站|txtai:基于 Transformer 的人工智能搜索引擎上面的示例显示 , 对于几乎所有的查询 , 实际文本并没有存储在文本部分列表中 。 这就是 Transformer 模型相对于基于令牌的搜索的真正威力 。
建立嵌入索引对于较小的文本列表 , 上述方法是有效的 。 但是对于较大的文档存储库 , 对每个查询进行标记和转换的所有嵌入是没有意义的 。 txtai 支持建立预计算索引 , 从而显著提高性能 。
在上一个示例的基础上 , 下面的示例运行索引方法来构建和存储文本嵌入 。 在这种情况下 , 每次搜索只将查询转换为嵌入向量 。
# Create an index for the list of sectionsembeddings.index([(uid, text, None) for uid, text in enumerate(sections)])print("%-20s %s" % ("Query", "Best Match"))print("-" * 50)# Run an embeddings search for each queryfor 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 sectionprint("%-20s %s" % (query, sections[uid]))