Txtai ElasticSearch相似性较慢

at0kjp5o  于 2022-09-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(186)

我一直在尝试运行txtai,希望能在ElasticSearch中实现语义搜索。我的主要目标是能够使用它在帮助台系统中查询票证,并返回与我的查询类似的票证。

示例查询:我应该使用什么操作系统?

这将返回一个结果列表(类似于在输入问题标题时stackoverflow所做的操作)。

在使用txtai时,我注意到它的速度非常慢。请求一个结果,我的响应时间几乎是10秒,而ElasticSearch返回50个结果的“瞬时”速度。也许在这应该如何执行的问题上,我遗漏了什么。

我将分享我目前正在使用的测试代码:

from txtai.pipeline import Similarity
from elasticsearch import Elasticsearch, helpers

# Connect to ES instance

es = Elasticsearch(hosts=["http://localhost:9200"], timeout=60, retry_on_timeout=True)

def ranksearch(query, limit):
  results = [text for _, text in search(query, limit * 10)]
  return [(score, results[x]) for x, score in similarity(query, results)][:limit]

def search(query, limit):
  query = {
      "size": limit,
      "query": {
          "query_string": {"query": query}
      }
  }

  results = []
  for result in es.search(index="articles", body=query)["hits"]["hits"]:
    source = result["_source"]
    results.append((min(result["_score"], 18) / 18, source["title"]))
  return results

similarity = Similarity("valhalla/distilbart-mnli-12-3")

limit = 1
query = "Bad News"
print(ranksearch(query, limit))

如有任何帮助,我们不胜感激。

cs7cruho

cs7cruho1#

以下是GitHub上一次讨论的摘要。完整的讨论可在此处找到:https://github.com/neuml/txtai/issues/319

从我在那里发布的帖子中:
GPU确实带来了巨大的不同,但您可以使用CPU获得不错的运行时性能。

对于T410来说,相似性管道可能有点重。即使是最小的型号也只有1 GB,这仍然是一个大型号。这似乎是一个较小的嵌入相似性模型的用例。在精确度上会有一个折衷,但它可能是性能与精确度的正确组合。

下面的示例代码修改了您的示例,以使用嵌入模型计算相似度。作为参考,这款机型为90MB。

from txtai.embeddings import Embeddings from elasticsearch import
Elasticsearch, helpers

# Connect to ES instance es = Elasticsearch(hosts=["http://localhost:9200"], timeout=60,

retry_on_timeout=True)

def ranksearch(query, limit):   results = [text for _, text in
search(query, limit * 10)]   return [(score, results[x]) for x, score
in embeddings.similarity(query, results)][:limit]

def search(query, limit):   query = {
      "size": limit,
      "query": {
          "query_string": {"query": query}
      }   }

  results = []   for result in es.search(index="articles",
body=query)["hits"]["hits"]:
    source = result["_source"]
    results.append((min(result["_score"], 18) / 18, source["title"]))   return results

import time

start = time.time() embeddings = Embeddings({"path":
"sentence-transformers/all-MiniLM-L6-v2"}) print(f"Load time
{time.time() - start}")

start = time.time() ranksearch("Bad News", 1) print(f"Query 1
{time.time() - start}")

start = time.time() ranksearch("Good News", 1) print(f"Query 2
{time.time() - start}")

相关问题