Elasticsearch 开放推理 API 新增 Hugging Face 原生分块支持

2024-09-15 15:21:58 浏览数 (3)

Elasticsearch 开放推理 API 新增 Hugging Face 原生分块支持

通过 Elasticsearch 的开放推理 API,你可以使用 Hugging Face 的 Inference Endpoints 在 Elasticsearch 外部进行推理。这使你能够利用 Hugging Face 的可扩展基础设施,包括在 GPU 和 AI 加速器上进行推理的能力。生成的 Hugging Face 嵌入的使用能力作为第一个开放推理 API 集成在 Elasticsearch 8.11 中引入,从那时起,我们一直在努力更新它,增加了更强大的功能,使你能够以更少的努力获得更好的结果。

通过集成 semantic_text 字段,文档可以原生分块并存储其嵌入。所有存储的嵌入默认在 Elasticsearch 向量数据库中使用标量量化进行压缩。通过 retrievers 检索这些嵌入,可以在使用多个托管在 Hugging Face(或任何其他通过开放推理 API 可访问的服务)的模型时实现搜索的可组合性,从而在单个文档中实现多种类型的嵌入。这些功能总和起来,为开发者节省了编写自定义逻辑的时间,使他们能够更快地构建有趣的生成型 AI 应用程序!

释疑

本博客文章中使用了“推理端点”一词,有两种不同的含义:

  1. Hugging Face 的 Inference Endpoints 服务
  2. Elasticsearch 的开放推理 API inference endpoint 对象

Hugging Face 的 Inference Endpoints 服务提供运行 Hugging Face Transformers 模型的计算实例,而 Elasticsearch 推理端点对象存储 Elasticsearch 访问和使用 Hugging Face 推理端点服务的配置。

什么是 Elasticsearch 开放推理 API?

开放推理 API 是在 Elasticsearch 中执行推理的入口。它允许你使用 Elasticsearch 外部的机器学习模型和服务,而无需编写任何复杂的粘合代码。你只需要提供一个 API 密钥并 创建一个推理端点对象。通过 Elasticsearch 开放推理 API,你可以使用 completion 任务在 LLM 上执行推理,使用 text_embeddingsparse_embedding 任务生成密集或稀疏文本嵌入,或使用 rerank 任务对文档进行排序。

什么是 Hugging Face 推理端点服务?

Hugging Face 的 Inference Endpoints 服务 允许你在云中部署和运行 Hugging Face Transformers 模型。请查看 Hugging Face 的指南以创建你自己的端点:https://huggingface.co/docs/inference-endpoints/guides/create_endpoint。

  • 确保将任务设置为与你部署的模型以及你将在 Elasticsearch 中映射的字段类型匹配。
  • 确保复制/记下端点 URL。
  • 创建一个用户访问令牌(也称为 API 密钥)以认证你对端点的请求:https://huggingface.co/settings/tokens。为了更好的安全性,选择一个细粒度访问令牌只给令牌所需的范围。
  • 确保安全地复制/记下 API 密钥(访问令牌)。

如何使用 Hugging Face 推理端点与 Elasticsearch 开放推理 API

要使用开放推理 API 与 Hugging Face 推理端点服务,你需要遵循以下三个步骤:

  1. 在 Hugging Face 中创建你想使用的模型的推理端点服务。
  2. 使用开放推理 API 在 Elasticsearch 中创建推理端点对象,并提供你的 Hugging Face API 密钥。
  3. 使用推理端点对象进行推理,或配置索引以使用语义文本自动嵌入你的文档。注意:你可以使用 cURL、任何其他 HTTP 客户端或 我们的其他客户端 执行这些步骤。

第一步:在 Hugging Face 中创建推理端点服务

请参阅 https://ui.endpoints.huggingface.co 了解如何在 Hugging Face 中创建推理端点服务。

第二步:在 Elasticsearch 中创建推理端点对象

代码语言:python代码运行次数:0复制
client.inference.put(
    task_type="text_embedding",
    inference_id="my_hf_endpoint",
    body={
        "service": "hugging_face",
        "service_settings": {
            "api_key": <HF_API_KEY>,
            "url": "<URL_TO_HUGGING_FACE_ENDPOINT>"
        },
    }
)

注意:任务类型设置为 text_embedding(密集向量嵌入),因为我们部署到 Hugging Face 推理端点服务的模型是密集文本嵌入模型(multilingual-e5-small)。在 Hugging Face 中创建端点时,我们还必须选择句子嵌入配置。

第三步:使用推理端点对象访问你的 Hugging Face 推理端点服务进行推理

代码语言:python代码运行次数:0复制
dense_embedding = client.inference.inference(
    inference_id='my_hf_endpoint',
    input="这是我文档的原始文本!"
)

第四步:将数据集以语义文本字段的形式导入索引

通过使用 semantic_text 字段,我们可以在利用原生分块的同时提高数据导入速度。为此,我们需要创建一个带有文本字段的索引(其中我们将插入原始文档文本),并在旁边创建一个语义文本字段,我们将文本复制到其中。当我们通过将数据插入 text_field 将数据导入该索引时,数据将自动复制到语义文本字段,并且文档将原生分块,使我们能够轻松执行语义搜索。

代码语言:python代码运行次数:0复制
client.indices.create(
    index="hf-semantic-text-index",
    mappings={
        "properties": {
            "infer_field": {
                "type": "semantic_text",
                "inference_id": "my_hf_endpoint"
            },
            "text_field": {
                "type": "text",
                "copy_to": "infer_field"
            }
        }
    }
)
代码语言:python代码运行次数:0复制
documents = load_my_dataset()
docs = []

for doc in documents:
    if len(docs) >= 100:
        helpers.bulk(client, docs)
        docs = []
    else:
        docs.append({
            "_index": "hf-semantic-text-index",
            "_source": {"text_field": doc['text']}
        })

第五步:使用语义文本执行语义搜索

代码语言:python代码运行次数:0复制
query = "进行语义搜索真的这么简单吗?"
semantic_search_results = client.search(
    index="hf-semantic-text-index",
    query={"semantic": {"field": "infer_field", "query": query}}
)

第六步:使用 Cohere 重新排序以获得更好的结果

使用 Elasticsearch 作为你的向量数据库的一个优势是我们不断扩展对创新第三方功能的支持。例如,可以通过结合使用 Hugging Face 模型创建的嵌入进行语义搜索和 Cohere 的重新排序功能来改进你的顶级搜索结果。要使用 Cohere 重新排序,你需要一个 Cohere API 密钥。

代码语言:python代码运行次数:0复制
client.inference.put(
    task_type="rerank",
    inference_id="my_cohere_rerank_endpoint",
    body={
        "service": "cohere",
        "service_settings": {
            "api_key": <COHERE_API_KEY>,
            "model_id": "rerank-english-v3.0"
        },
        "task_settings": {
            "top_n": 100,
            "return_documents": True
        }
    }
)
代码语言:python代码运行次数:0复制
reranked_search_results = client.search(
    index="hf-semantic-text-index",
    retriever={
        "text_similarity_reranker": {
            "retriever": {
                "standard": {
                    "query": {
                        "semantic": {
                            "field": "infer_field",
                            "query": query
                        }
                    }
                }
            },
            "field": "text_field",
            "inference_id": "my_cohere_rerank_endpoint",
            "inference_text": query,
            "rank_window_size": 100
        }
    }
)

立即使用 Hugging Face 推理端点服务与 Elastic!

试试这个笔记本,以开始使用我们的 Hugging Face 推理端点集成:使用 Hugging Face 和 Elasticsearch 的 GPU 加速推理索引数百万文档。

0 人点赞