写入数据文本向量化

写入数据文本向量化 #

Easysearch 使用 Ingest 管道中的一系列处理器,可以对写入的数据进行处理,并且支持对文本进行向量化。本文档介绍如何在 Easysearch 中使用 text_embedding 处理器对写入数据进行向量化。

相关指南(先读这些) #

先决条件 #

支持与 OpenAI API 兼容的 embedding 接口,支持 Ollama embedding 接口。

text_embedding 处理器需要安装 Easysearch 的 ai 插件。Easysearch 2.4.0 原生 HNSW 不需要安装 knn 插件。

在生产环境中使用数据采集时,您的集群应至少包含一个节点,且该节点的节点角色权限设置为 ingest

创建带有向量字段的索引 #

首先创建原生 HNSW 索引。text_vector 是保存模型输出的字段,mapping 维度必须与处理器的 dims 和模型输出一致。

PUT /my-index
{
  "mappings": {
    "properties": {
      "text_vector": {
        "type": "dense_vector",
        "dims": 768,
        "index": true,
        "similarity": "cosine",
        "index_options": {
          "type": "hnsw",
          "m": 16,
          "ef_construction": 100
        }
      }
    }
  }
}

创建或更新 text_embedding 处理器 #

请求路径:

PUT _ingest/pipeline/<pipeline-id>

请求示例:

    PUT _ingest/pipeline/text-embedding-pipeline
    {
      "description": "用于生成文本嵌入向量的管道",
      "processors": [
        {
          "text_embedding": {
            "url": "https://api.openai.com/v1/embeddings",
            "vendor": "openai",
            "api_key": "<api_key>",
            "text_field": "input_text",
            "vector_field": "text_vector",
            "model_id": "text-embedding-3-small",
            "dims": 768,
            "ignore_missing": false,
            "ignore_failure": false
          }
        }
      ]
    }

请求体字段: #

下表列出了用于创建或更新管道的请求体字段。

参数是否必填类型说明
processors必填数组处理器列表,按顺序执行。示例中仅包含 text_embedding 处理器。
description可选字符串管道的描述信息,用于说明用途(如“生成文本嵌入向量”)。
url必填字符串Embedding API 的完整 URL(如 https://api.openai.com/v1/embeddings )。
vendor必填字符串服务提供商标识,固定为 "openai""ollama"
api_key可选字符串Embedding 服务的 API 密钥。OpenAI 等需要认证的服务必须提供;不需要认证的 Ollama 服务可以省略。
text_field必填字符串输入文本的字段名(如 "input_text"),需与索引中的字段匹配。
vector_field必填字符串存储向量的目标字段名(如 "text_vector"),必须与索引的 dense_vector mapping 一致。
model_id必填字符串模型名称(如 "text-embedding-3-small""text-embedding-v3")。
dims可选整数请求服务返回的向量维度;省略时使用模型默认输出。最终维度必须与 mapping 中的 dims 一致。
batch_size可选整数批处理请求中的文档数量,必须大于 0,默认 1
ignore_missing可选布尔值text_field 不存在是否跳过处理(默认 false)。
ignore_failure可选布尔值若处理失败是否继续执行后续处理器(默认 false)。

若使用国内大模型,例如阿里云的千问,需替换为
url: https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings
model_id: text-embedding-v3
dims: 根据模型确定

路径参数: #

参数是否必填类型说明
pipeline-id必填字符串分配给管道的唯一标识符,即管道 ID。

若已部署 Ollama 服务,按下面示例使用:

PUT _ingest/pipeline/ollama-embedding-pipeline
{
  "description": "Ollama embedding 示例",
  "processors": [
    {
      "text_embedding": {
        "url": "http://localhost:11434/api/embed",
        "vendor": "ollama",
        "text_field": "input_text",
        "vector_field": "text_vector",
        "model_id": "nomic-embed-text:latest",
        "ignore_missing": false,
        "ignore_failure": false
      }
    }
  ]
}

查看 text_embedding 处理器 #

查看 text_embedding 处理器与查看其他处理器的 api 一致:

GET _ingest/pipeline

返回输出:

{
  "ollama-embedding-pipeline": {
    "description": "Ollama embedding 示例",
    "processors": [
      {
        "text_embedding": {
          "ignore_failure": false,
          "vendor": "ollama",
          "vector_field": "text_vector",
          "text_field": "input_text",
          "ignore_missing": false,
          "model_id": "nomic-embed-text:latest",
          "url": "http://localhost:11434/api/embed"
        }
      }
    ]
  },
  "text-embedding-pipeline": {
    "description": "用于生成文本嵌入向量的管道",
    "processors": [
      {
        "text_embedding": {
          "ignore_failure": false,
          "dims": 768,
          "api_key": "*************************************************vE",
          "vendor": "openai",
          "vector_field": "text_vector",
          "text_field": "input_text",
          "ignore_missing": false,
          "model_id": "text-embedding-3-small",
          "url": "https://poloai.top/v1/embeddings"
        }
      }
    ]
  }
}

api_key 会被遮掩,防止泄露

使用 text_embedding 处理器进行写入时转换 #

与使用其他处理器一致,

POST /_bulk?pipeline=text-embedding-pipeline&pretty&refresh=wait_for
{ "index": { "_index": "my-index" } }
{ "input_text": "第一个批量处理的文本。", "source": "bulk api example 1" }
{ "index": { "_index": "my-index", "_id": "bulk_doc_2" } }
{ "input_text": "第二个批量处理的文本,指定了ID。", "priority": 1 }
{ "index": { "_index": "my-index" } }
{ "input_text": "这是另一示例文本。", "tags": ["bulk", "test"] }

查看写入结果

GET my-index/_search

返回输出:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "dd2DAZgB6WXmvHRNYksX",
        "_score": 1,
        "_source": {
          "input_text": "第一个批量处理的文本。",
          "text_vector": [
            0.012978158,
            0.007739224,
            -0.015867598,
            0.005287578,
            ......

删除 text_embedding 处理器 #

与删除其他处理器一致

DELETE  _ingest/pipeline/text-embedding-pipeline