Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

原创
作者头像
点火三周
发布于 2024-07-12 14:12:30
发布于 2024-07-12 14:12:30
89002
代码可运行
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏
运行总次数:2
代码可运行

在构建真实的 RAG(检索增强生成)应用时,解析文档以使信息可搜索是重要的一步。Unstructured.io 和 Elasticsearch 在这个场景中有效地协同工作,为开发者提供了互补的工具来构建 RAG 应用。

Unstructured.io 提供了一组工具库,可以提取、清理和转换不同格式和不同内容来源的文档。一旦文档被添加到 Elasticsearch 索引中,开发者可以选择许多 Elastic 的功能,包括聚合、过滤、RBAC(基于角色的访问控制)工具以及 BM25 或向量搜索功能,将复杂的业务逻辑实现到 RAG 应用中。

在这篇博客中,我们将研究一个相当常见的用例,即 解析并导入一个包含文本、表格和图像的 PDF 文档。我们将使用 Elastic 的 ELSER 模型创建稀疏向量嵌入,然后使用 Elasticsearch 作为向量数据库存储和搜索这些嵌入。

Unstructured 的强大之处在于其模型能够识别文档的独特组成部分并将其提取为“文档元素”。Unstructured 还具有使用不同策略对分块进行分区的能力,而不仅仅是按字符数分块。这些“智能分区和分块”策略可以提高搜索相关性并减少 RAG 应用中的幻觉。

在解析数据后,我们将其存储为 Elasticsearch 向量数据库中的向量嵌入并运行搜索操作。我们使用 Elasticsearch 向量数据库连接器将这些数据发送到 Elastic。我们还将一个管道附加到流程中,以便在导入时创建 ELSER(一种开箱即用的稀疏编码模型,用于语义搜索)嵌入。

高级流程

  1. 在 Elastic 平台上部署 ELSER 模型
  2. 创建一个 导入管道,该管道将为导入的分块创建嵌入。字段 text 将存储分块文本,text_embeddings 将存储嵌入。我们将使用 ELSER v2 模型。
代码语言:json
AI代码解释
复制
PUT _ingest/pipeline/chunks-to-elser
{
  "processors": [
    {
      "inference": {
        "model_id": ".elser_model_2_linux-x86_64",
        "input_output": [
          {
            "input_field": "text",
            "output_field": "text_embedding"
          }
        ]
      }
    }
  ]
}
  1. 下一步是创建一个名为 unstructured-demo 的索引,并为 ELSER 嵌入创建必要的映射。我们还将我们在上一步中创建的管道附加到该索引上。其他所有字段都将动态映射。
代码语言:json
AI代码解释
复制
PUT unstructured-demo
{
  "settings": {
    "default_pipeline": "chunks-to-elser"
  },
  "mappings": {
    "properties": {
      "text_embedding": {
        "type": "sparse_vector"
      },
      "text": {
        "type": "text"
      }
    }
  }
}
  1. 最后一步是使用 Unstructured 的代码示例,利用 Elasticsearch 连接器 来创建分区和分块。请按照 安装依赖项的说明操作。
代码语言:python
代码运行次数:2
运行
AI代码解释
复制
import os
from unstructured.ingest.connector.elasticsearch import (
    ElasticsearchAccessConfig,
    ElasticsearchWriteConfig,
    SimpleElasticsearchConfig,
)
from unstructured.ingest.connector.local import SimpleLocalConfig
from unstructured.ingest.interfaces import (
    ChunkingConfig,
    PartitionConfig,
    ProcessorConfig,
    ReadConfig,
)
from unstructured.ingest.runner import LocalRunner
from unstructured.ingest.runner.writers.base_writer import Writer
from unstructured.ingest.runner.writers.elasticsearch import (
    ElasticsearchWriter,
)

我们将主机设置为 Elastic Cloud(Elasticsearch 服务)。我们设置用户名和密码,并设置要写入的索引:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def get_writer() -> Writer:
    return ElasticsearchWriter(
        connector_config=SimpleElasticsearchConfig(
            access_config=ElasticsearchAccessConfig(
                hosts="https://unstructured-demo.es.us-central1.gcp.cloud.es.io",
                username="elastic",
                password=<insert password>
            ),
            index_name="unstructured-demo",
        ),
        write_config=ElasticsearchWriteConfig(
            batch_size_bytes=15_000_000,
            num_processes=2,
        ),
    )

在下一步中,注册一个 Unstructured API 端点和密钥。Unstructured 中的分区功能从非结构化文档中提取结构化内容。partition 函数检测文档类型并自动确定适当的分区函数。如果用户知道他们的文件类型,也可以指定特定的分区函数。在分区步骤中,我们指示 Unstructured 通过传入 pdf_infer_table_structure=True 并将分区策略设置为 hi_res 来推断表结构,自动识别文档的布局。你可以了解各种 Unstructured 分区策略。我们将 分块策略 设置为 by_title,它“保留章节和页面边界”。分块策略对 RAG 应用的性能和质量有重大影响。你可以在 Unstructured 的 有效检索增强生成分块论文中了解更多。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
writer = get_writer()
runner = LocalRunner(
    processor_config=ProcessorConfig(
        verbose=True,
        output_dir="local-output-to-elasticsearch",
        num_processes=2,
    ),
    connector_config=SimpleLocalConfig(
        input_path=<path to PDF>,
    ),
    read_config=ReadConfig(),
    partition_config=PartitionConfig(
        pdf_infer_table_structure=True,
        strategy='hi_res',
        partition_by_api=True,
        partition_endpoint=<your partition endpoint>',
        api_key=<your api key>
    ),
    chunking_config=ChunkingConfig(
        chunk_elements=True,
        max_characters=500,
        chunking_strategy="by_title"
    ),
    writer=writer,
    writer_kwargs={},
)
runner.run()

在 Elasticsearch 向量数据库中的结果文档中,你会看到一些由 Unstructured API 生成的有趣的元数据。如果元素是一个表格,你会看到表格的 HTML 结构以及有关其外观的信息。如果它是文本块并且是早期块的延续,你会看到 is_continuation,这在 RAG 场景中很有价值,当你想将段落的整个上下文传递给 LLM 时。如果你想知道哪些单独的分区组成了一个块,你可以在 base-64 编码的 orig_elements 字段中找到它。在上面的示例中,我们使用了 Unstructured 的 API 服务。这些 API 服务可以通过三种不同方式使用:

  • 有限试用的 Unstructured API
  • SaaS Unstructured API
  • AWS/Azure Marketplace Unstructured API

试用版本的处理能力限制为 1000 页,并且你的文档可以用于专有模式的训练和评估目的。对于快速原型设计,你也可以查看 Unstructured 的开源版本。unstructured 库提供了使用其 Python 安装程序运行的选项。如果你想避免处理多个依赖项,可以使用捆绑了所有必需库的 Docker 容器。与开源版本相比,Unstructured API 提供了以下附加功能:

  • 显著提高的文档和表格提取性能,具有高级分块和改进的转换管道
  • 访问最新的视觉转换器模型和企业功能,例如安全性、SOC2 合规性、IAM(身份验证和身份管理)

结论

有效的文档解析是构建有效 RAG 解决方案的重要步骤。Unstructured 将原始文档转换为 LLM 可以理解的数据的方法,加上 Elastic 作为向量数据库和搜索平台的优势,将加速你使用 AI 的构建旅程。祝你搜索愉快!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块处理
在这篇文章中,我们将配置并使用 jina-embeddings-v2,这是第一个开源的8K上下文长度嵌入模型。我们会从使用 semantic_text 的开箱即用实现开始,然后介绍如何实现后期分块。
点火三周
2024/12/06
3170
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块处理
Elasticsearch 新的 semantic_text 映射:简化语义搜索
想要使用语义搜索处理数据,但又不想花费大量时间在技术细节上?我们引入了 semantic_text 字段类型,帮助你处理所需的基础设施和细节。
点火三周
2024/07/12
4090
Elasticsearch 新的 semantic_text 映射:简化语义搜索
LangChain 与 Elastic 合作,加入向量数据库和语义重排序功能以增强 RAG
在过去的一年里,生成式 AI 领域发生了很多变化。许多新服务和库相继出现。LangChain 已成为构建大语言模型 (LLM) 应用程序(例如检索增强生成 (RAG) 系统)最受欢迎的库之一。这个库使得原型设计和实验不同模型及检索系统变得非常容易。
点火三周
2024/08/11
7770
Elasticsearch案例:百行代码实现腾讯ES帮助文档的RAG
随着搜索引擎技术的不断发展,我们对于查询的需求也日益提高。传统的关键词搜索已经无法满足用户对于查询准确性和效率的要求。为此,我们引入了语义搜索技术。通过使用先进的自然语言处理(NLP)技术,语义搜索能够更好地理解用户的查询意图,并返回更相关的搜索结果。而随着机器学习技术的持续发展,特别是chatGPT等生成式大模型的火爆,一个新的技术方向应运而生 —— RAG。
点火三周
2023/11/02
5.8K5
Elasticsearch案例:百行代码实现腾讯ES帮助文档的RAG
Elasticsearch open Inference API 增加了对 Cohere Rerank 3 模型的支持
在最近的技术更新中,我们探索了一项新模型的集成,该模型旨在提升搜索结果的相关性和精确度。这一模型被称为“重排”(reranking),它通过对接现有的搜索系统提供的“前 n 个”搜索结果进行语义上的增强,从而改善了用户的搜索体验。
点火三周
2024/04/12
7620
Elasticsearch open Inference API 增加了对 Cohere Rerank 3 模型的支持
使用 LlamaIndex、Elasticsearch 和 Mistral 进行检索增强生成(RAG)
在这篇文章中,我们将探讨如何使用Elasticsearch作为向量数据库,结合RAG技术(检索增强生成)来实现问答体验。我们会使用LlamaIndex和一个本地运行的Mistral LLM模型。
点火三周
2024/04/15
2.4K0
使用 LlamaIndex、Elasticsearch 和 Mistral 进行检索增强生成(RAG)
使用 LangChain 和 Elasticsearch 实现隐私优先的人工智能搜索
过去几个周末,我一直沉浸在“即时工程”的迷人世界中,学习Elasticsearch® 等向量数据库如何通过充当长期记忆和语义知识存储来增强 ChatGPT 等大型语言模型 (LLM)。然而,困扰我和许多其他经验丰富的数据架构师的一件事是,许多教程和演示完全依赖于向大型网络公司和基于云的人工智能公司发送您的私人数据。
点火三周
2023/07/25
2.8K0
使用 LangChain 和 Elasticsearch 实现隐私优先的人工智能搜索
将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
近年来,使用嵌入来提高信息检索的相关性和准确性已经显著增长。像 Elasticsearch 这样的工具已经发展到支持这种类型的数据,通过专门的字段类型如 dense vectors、sparse vectors 和 semantic text。然而,要想取得好的效果,关键是要了解如何将嵌入正确映射到可用的 Elasticsearch 字段类型:semantic_text、dense_vector 和 sparse_vector。
点火三周
2025/05/16
2881
将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
使用 E5 嵌入模型进行多语言向量搜索
近年来,向量搜索席卷了搜索和信息检索领域。它能够将查询的语义与文档相匹配,合并文本的上下文和含义,并为用户提供前所未有的自然语言查询能力。向量搜索是促进大型语言模型 (LLM) 的重要上下文来源,它为生成式 AI 时代越来越多的现代搜索体验提供动力。
点火三周
2023/09/27
2.9K0
使用 E5 嵌入模型进行多语言向量搜索
Elasticsearch RAG案例:混合搜索的相关性调优
我们在上一篇文章《Elasticsearch案例:百行代码实现腾讯ES帮助文档的RAG》中给大家介绍了如何通过一个完整的搜索解决方案来快速实现 RAG ,其重点落在效率上 —— 完整而便捷的解决方案套件,使我们整个RAG的构建和上线过程事半功倍。而本文,我们则将重点落在搜索效果上,如何适配各种情况(不同的用户搜索习惯以及可能的缺陷数据),并达到最优效果。
点火三周
2023/11/16
4.6K0
Elasticsearch RAG案例:混合搜索的相关性调优
「最佳实践」腾讯云 Elasticsearch 8.13.3 向量混合检索
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2025/03/08
5500
「最佳实践」腾讯云 Elasticsearch 8.13.3 向量混合检索
基于腾讯云ES混合搜索与DeepSeek,十分钟构建RAG 应用
本文共计1669字 预计阅读时长6分钟 随着数据智能技术的不断发展,以大语言模型(LLM)驱动的AIGC为代表的内容生成技术已经成为企业数据智能能力中不可或
腾讯QQ大数据
2025/02/03
4.2K0
基于腾讯云ES混合搜索与DeepSeek,十分钟构建RAG 应用
构建智能代理:使用Elasticsearch与Langchain实现Agentic RAG
在实际应用中,使用LLMs(大型语言模型)的下一步逻辑是引入智能代理。本文旨在介绍智能代理在RAG(检索增强生成)工作流中的概念和使用。总的来说,智能代理代表了一个非常令人兴奋的领域,具有许多雄心勃勃的应用可能性。
点火三周
2024/12/17
5820
构建智能代理:使用Elasticsearch与Langchain实现Agentic RAG
腾讯云ES RAG最佳实践:百行代码轻松实现帮助文档的智能问答
腾讯云大数据Elasticsearch Service首发上线ES 8.8.1版本,提供强大的云端AI增强与向量检索能力,支持在端到端搜索与分析平台中实现自然语言处理、向量搜索以及与大模型的集成,10亿级向量检索平均响应延迟控制在毫秒级,助力客户实现由AI驱动的高级搜索能力,为搜索与分析带来全新的前沿体验。本文将结合腾讯云ES与ChatGPT,演示如何通过百行代码轻松实现ES帮助文档的智能问答系统。
腾讯QQ大数据
2023/11/18
1.1K1
腾讯云ES RAG最佳实践:百行代码轻松实现帮助文档的智能问答
如何通过 LlamaIndex 将数据导入 Elasticsearch
本文将介绍如何使用 LlamaIndex 将数据索引到 Elasticsearch 中,以实现 FAQ 搜索引擎。Elasticsearch 将作为我们的向量数据库,支持向量搜索,而 RAG(检索增强生成)将丰富搜索上下文,提供更准确的响应。
点火三周
2025/03/05
4030
如何通过 LlamaIndex 将数据导入 Elasticsearch
「最佳实践」腾讯云 Elasticsearch 8:预训练模型与一站式向量化语义检索的完美结合
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2023/12/28
2.6K16
「最佳实践」腾讯云 Elasticsearch 8:预训练模型与一站式向量化语义检索的完美结合
腾讯云 Elasticsearch RAG 案例
本文描述问题及解决方法同样适用于 腾讯云 Elasticsearch Service(ES)。
岳涛
2025/06/30
1860
腾讯云 Elasticsearch RAG 案例
Elasticsearch 开放推理 API 新增 Hugging Face 原生分块支持
通过 Elasticsearch 的开放推理 API,你可以使用 Hugging Face 的 Inference Endpoints 在 Elasticsearch 外部进行推理。这使你能够利用 Hugging Face 的可扩展基础设施,包括在 GPU 和 AI 加速器上进行推理的能力。生成的 Hugging Face 嵌入的使用能力作为第一个开放推理 API 集成在 Elasticsearch 8.11 中引入,从那时起,我们一直在努力更新它,增加了更强大的功能,使你能够以更少的努力获得更好的结果。
点火三周
2024/09/15
2390
Elasticsearch 开放推理 API 新增 Hugging Face 原生分块支持
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
随着数据智能技术的不断发展,以大语言模型(LLM)驱动的AIGC为代表的内容生成技术已经成为企业数据智能能力中不可或缺的一部分。但在实践过程中,LLM(例如ChatGPT)仍存在不少问题,例如信息更新不及时、垂直领域知识匮乏,且可能产生“幻觉”(即生成不准确的内容)等问题。
腾讯QQ大数据
2025/02/18
2030
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
随着数据智能技术的不断发展,以大语言模型(LLM)驱动的AIGC为代表的内容生成技术已经成为企业数据智能能力中不可或缺的一部分。但在实践过程中,LLM(例如ChatGPT)仍存在不少问题,例如信息更新不及时、垂直领域知识匮乏,且可能产生“幻觉”(即生成不准确的内容)等问题。
腾讯云大数据
2025/02/10
2640
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
推荐阅读
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块处理
3170
Elasticsearch 新的 semantic_text 映射:简化语义搜索
4090
LangChain 与 Elastic 合作,加入向量数据库和语义重排序功能以增强 RAG
7770
Elasticsearch案例:百行代码实现腾讯ES帮助文档的RAG
5.8K5
Elasticsearch open Inference API 增加了对 Cohere Rerank 3 模型的支持
7620
使用 LlamaIndex、Elasticsearch 和 Mistral 进行检索增强生成(RAG)
2.4K0
使用 LangChain 和 Elasticsearch 实现隐私优先的人工智能搜索
2.8K0
将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
2881
使用 E5 嵌入模型进行多语言向量搜索
2.9K0
Elasticsearch RAG案例:混合搜索的相关性调优
4.6K0
「最佳实践」腾讯云 Elasticsearch 8.13.3 向量混合检索
5500
基于腾讯云ES混合搜索与DeepSeek,十分钟构建RAG 应用
4.2K0
构建智能代理:使用Elasticsearch与Langchain实现Agentic RAG
5820
腾讯云ES RAG最佳实践:百行代码轻松实现帮助文档的智能问答
1.1K1
如何通过 LlamaIndex 将数据导入 Elasticsearch
4030
「最佳实践」腾讯云 Elasticsearch 8:预训练模型与一站式向量化语义检索的完美结合
2.6K16
腾讯云 Elasticsearch RAG 案例
1860
Elasticsearch 开放推理 API 新增 Hugging Face 原生分块支持
2390
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
2030
基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用
2640
相关推荐
使用 Jina Embeddings v2 在 Elasticsearch 中进行后期分块处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验