作者:Hemant Malik 及 Joan Fontanals Martínez

探索如何使用 Elasticsearch Open Inference API 访问 Jina AI 模型。
我们在 Jina AI 的朋友们将 Jina AI 的嵌入模型和重新排名产品的原生集成添加到 Elasticsearch 开放推理 API 中。这包括对行业领先的多语言文本嵌入和多语言重新排名的支持 ------ 针对检索、聚类和分类进行了优化。此次集成为开发者提供了一套基于 Elasticsearch 向量数据库和 Jina AI 的高性能、高性价比的AI信息检索和语义应用工具包。
Jina AI 的模型采用非对称搜索嵌入和高性能重排序模型来提高准确率,将顶级 AI 融入 Elasticsearch 应用程序中,无需额外的集成或开发成本。
这篇文章探讨了如何使用 Elasticsearch 开放推理 API 访问 Jina AI 模型。
关于 Jina AI 模型
Jina AI 成立于 2020 年,是一家领先的搜索基础公司,致力于创建嵌入、重新排名器和小型语言模型,帮助开发人员构建可靠、高质量的多模式搜索应用程序。
Jina Embeddings v3 是 Jina AI 推出的多语言嵌入模型,支持 8K 标记输入长度。 Jina CLIP v2 是一种多模式和多语言嵌入模型,支持 8K 标记的文本和图像输入。 Jina Reranker v2 是一个神经重排序模型,它支持多种语言并且经过后期训练,特别适用于代理用例。 ReaderLM-v2 是一个小型语言模型,它将来自各种来源的输入数据转换为适合与 LLM 交互的 Markdown 或结构化数据格式。
入门
我们将使用 Kibana Dev Console 来完成设置。或者,这里有一个 Jupyter 笔记本可以帮助你入门。
首先,你需要一个 Jina AI API 密钥。你可以在此处获取具有一百万个令牌使用限制的免费密钥。
Jina AI 提供了多种模型,但我们建议使用最新的嵌入模型 jina-embeddings-v3 及其重新排名模型 jina-reranker-v2-base-multilingual。
步骤 1:创建 Jina AI 推理 API 端点以生成嵌入
通过以 jinaai 形式提供服务,在 Elasticsearch 中创建文本嵌入推理端点。在服务设置中,将你的 Jina AI API 密钥用作 api_key 和 model_id 作为 jina-embeddings-v3。
PUT _inference/text_embedding/jina_embeddings
{
"service": "jinaai",
"service_settings": {
"api_key": "<api-key>",
"model_id": "jina-embeddings-v3"
}
}
让我们测试我们的 Jina AI 端点来验证配置。为此,让我们对示例文本进行推理:
POST _inference/text_embedding/jina_embeddings
{
"input": "Jina AI models are now supported natively in Elasticsearch."
}
步骤 2:创建 Jina AI 推理 API 端点以进行重新排名
类似地,创建一个名为 jina_rerank 的 rerank task_type 服务,供搜索期间使用。在服务设置中使用 jinaai 作为服务名称、使用你的 Jina AI API 密钥作为 api_key、使用 jina-reranker-v2-base-multilingual 作为 model_id。
API 的 task_settings 部分使用 top_n 设置设置 jina_rerank 返回的最大文档数,此处设置为 10。return_documents 设置通知 jina_rerank 它应该返回它所识别的搜索候选文档的完整副本。
PUT _inference/rerank/jina_rerank
{
"service": "jinaai",
"service_settings": {
"api_key": "<api-key>",
"model_id": "jina-reranker-v2-base-multilingual"
},
"task_settings": {
"top_n": 10,
"return_documents": true
}
}
在 Kibana 开发控制台中,这些命令应该返回 200 响应代码,表明服务已正确配置。
步骤 3:生成嵌入(自动)
让我们创建一个索引,配置为使用 jina_embeddings 来生成嵌入。我们将创建一个名为 film_index 的索引,并使用 jina_embeddings 作为 inference_id 的值,自动生成和存储具有 semantic_text 类型的嵌入。
PUT film_index
{
"mappings": {
"properties": {
"blurb": {
"type": "semantic_text",
"inference_id": "jina_embeddings"
}
}
}
}
现在我们可以将文档批量插入索引。我们在本教程中使用下面的电影数据集,其中包含有关六部电影的信息。每个文档都是一个 JSON 字符串,其中有一个标有 blurb 的字段。
PUT film_index/_bulk?pretty
{ "index" : { "_index" : "film_index" } }
{"title": "Casablanca", "director": "Michael Curtiz", "year": 1942, "runtime_min": 102, "genre": ["Drama", "Romance"], "blurb": "A cynical expatriate cafe owner struggles to choose between love and virtue in wartime Morocco"}
{ "index" : { "_index" : "film_index" } }
{"title": "2001: A Space Odyssey", "director": "Stanley Kubrick", "year": 1968, "runtime_min": 149, "genre": ["Sci-Fi", "Adventure"], "blurb": "Humanity finds a mysterious monolith on the moon that triggers a journey to Jupiter"}
{ "index" : { "_index" : "film_index" } }
{"title": "Parasite", "director": "Bong Joon-ho", "year": 2019, "runtime_min": 132, "genre": ["Thriller", "Drama"], "blurb": "A poor family schemes to become employed by a wealthy household with devastating consequences"}
{ "index" : { "_index" : "film_index" } }
{"title": "The Godfather", "director": "Francis Ford Coppola", "year": 1972, "runtime_min": 175, "genre": ["Crime", "Drama"], "blurb": "Aging patriarch of an organized crime dynasty transfers control to his reluctant son"}
{ "index" : { "_index" : "film_index" } }
{"title": "Inception", "director": "Christopher Nolan", "year": 2010, "runtime_min": 148, "genre": ["Sci-Fi", "Action"], "blurb": "A thief who enters people's dreams attempts to plant an idea in a CEO's subconscious"}
{ "index" : { "_index" : "film_index" } }
{"title": "The Grand Budapest Hotel", "director": "Wes Anderson", "year": 2014, "runtime_min": 99, "genre": ["Comedy", "Drama"], "blurb": "A legendary concierge teams up with a lobby boy to clear his name in a priceless painting theft"}
随着文档被索引,请击鼓...... Elasticsearch 开放推理 API 将调用 jina_embeddings 服务来为简介文本生成嵌入。这种无缝的开发人员体验归功于 Elasticsearch 开放推理 API 中的 semantic_text 类型和 Jina AI 集成。
步骤 4:语义重新排序
现在你可以使用语义嵌入向量搜索 film_index。下面的 API 调用将
-
使用 jina_embeddings 服务为查询字符串 "An inspiring love story" 创建嵌入。
-
将结果嵌入与 film_index 中存储的嵌入进行比较。
-
返回 blurb 字段与查询最匹配的存储文档。
GET film_index/_search
{
"query": {
"semantic": {
"field": "blurb",
"query": "An inspiring love story"
}
}
}
现在,让我们使用 jina_rerank。它将执行与上面相同的查询匹配过程,然后选取 50 个最佳匹配(由 rank_window_size 字段指定)并使用 jina_rerank 服务对结果进行更精确的排名,返回前 10 名(如之前在 jina-rerank 的配置中所指定)。
POST film_index/_search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"semantic": {
"field": "blurb",
"query": "An inspiring love story"
}
}
}
},
"field": "blurb",
"rank_window_size": 50,
"inference_id": "jina_rerank",
"inference_text": "An inspiring love story"
}
}
}
带有 Elasticsearch 和 Jina AI 的 RAG
当开发人员将 Elasticsearch 用于他们的 RAG 用例时,在推理 API 中本地使用 Jina AI 的搜索基础的能力可以实现对 Jina AI 的搜索基础的低成本和无缝访问。开发人员现在就可以在 Elastic Cloud Serverless 中使用此集成,并且它将很快在 Elasticsearch 8.18 版本中推出。感谢 Jina AI 团队的贡献!
Elasticsearch 与行业领先的 Gen AI 工具和提供商进行了原生集成。查看我们的网络研讨会,了解如何超越 RAG 基础知识,或构建可用于生产的应用程序*Elastic Vector Database*。
为了为你的用例构建最佳搜索解决方案,请开始免费云试用完全托管的 Elastic Cloud 项目,或立即使用 "curl -fsSL https://elastic.co/start-local sh|" 在几分钟内在你的本地机器上试用 Elastic。
Elasticsearch 与行业领先的 Gen AI 工具和提供商进行了原生集成。查看我们的网络研讨会,了解如何超越 RAG 基础知识,或构建可用于生产的应用程序 Elastic Vector Database。