了解 BSI IT Grundschutz:使用 GenAI 搜索你的(私人)PDF 宝藏的秘诀

2024年10月9日   |   by mebius

作者:来自 ElasticChristine Komander

%title插图%num

有没有想过如何让多年来收集的文档可以通过语义而不是关键字进行搜索?处理充满有价值信息的 PDF 可能具有挑战性,尤其是在分块和创建跨多种语言的可搜索数据时。

这篇博文将指导你将文档集合转换为 AI 驱动的语义搜索系统。我们将探索 Elastic 如何为 RAG 提供端到端解决方案:提取 PDF、将其处理成块、向量化内容,并提供一个交互式游乐场来查询和与数据交互。探索如何让你的信息不仅更易于访问,而且真正具有对话性。你将能够测试如何轻松创建相关信息摘要,了解每个给出的答案的相关性分数,并最大限度地了解创建答案的确切原因。

semantic_text 字段类型

语义搜索(semantic search)通过理解单词含义和上下文来增强数据发现。Elastic 的 semantic_text 字段类型通过处理后台的复杂性(包括推理、分块和持续改进)来简化语义搜索实施。它对基于段落的文本特别有效,可以自动处理分块策略,并为未来计划了可自定义的选项。

对于需要不同分块策略的复杂文档(例如具有复杂布局、嵌入图像或独特格式的文档),请考虑使用 Apache TikaUnstructuredTesseract OCR 等工具来预处理内容。

先决条件

要实现本博客中描述的技术,你需要:

  • 针对 Vector Search 优化的 Elastic 云部署或具有以下配置的本地 Elasticsearch 集群:
    • 为搜索配置的数据节点(1:15 比例)
    • 具有至少 8 GB RAM 的 ML 节点
    • Elastic 版本 8.15
  • 访问生成式 AI 服务(如下的其中一种):
    • OpenAI 或 AWS Bedrock(本例中使用)
    • 对于本地设置:与 OpenAI 兼容的 SDK(例如 localai.io 或 LM Studio)用于访问本地托管的 LLM
  • 你希望使用生成式 AI 支持的搜索访问的 PDF 文件:
    • 如果你想按照 BSI Grundschutz 的示例操作,你可以在 BSI 官方网站上找到 PDF
    • 或者,你可以使用个人 PDF 集合进行测试。文件必须组织在一个文件夹中。

此设置将提供必要的基础设施,以有效地处理和交互你的数据。

Elastic 中的配置

首先,我们将加载并启动多语言嵌入模型。对于本博客,我们使用紧凑型 E5 模型,该模型可随时下载并部署在你的 Elastic Cloud 环境中。

请按照以下步骤操作:

  1. 打开 Kibana
  2. 导航至 Analytics > Machine Learning > Trained Models
  3. 选择 “Model Management”,然后单击 “Add Trained Models” 按钮

%title插图%num

从列表中选择 E5-small 模型 (ID:.multilingual-e5-small),然后单击 “Download”。几分钟后,当模型加载完成后,单击 “start/deploy” 符号进行部署。

接下来,导航到 Dev Console 以设置推理服务:

  1. 打开 Dev Console
  2. 使用以下命令创建指向我们的嵌入模型的推理服务:
PUT _inference/text_embedding/my-e5-model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_allocations": 1,
    "num_threads": 1,
    "model_id": ".multilingual-e5-small"
  }
}

在推理服务运行时,让我们为目标索引创建一个映射,并合并 semantic_text 字段类型:

PUT grundschutz-embeddings
{
  "mappings": {
    "properties": {
      "semantic_text": { 
        "type": "semantic_text", 
        "inference_id": "my-e5-model" 
      },
      "attachment.content": { 
        "type": "text",
        "copy_to": "semantic_text" 
      }
    }
  }
}

最后,我们创建一个提取管道来处理 PDF 文档的二进制内容:

PUT _ingest/pipeline/attachment
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "remove_binary": true
      }
    }
  ]
}

管道包含 attachment 处理器,它利用 Apache Tika 从二进制内容(例如 PDF 和其他文档格式)中提取文本信息。通过结合包含 semantic_text 字段的索引映射和管道,我们将能够一步索引 PDF、创建块和嵌入(请参阅下一章)。

完成此设置后,我们现在可以开始索引文档了。

将 “IT Grundschutz” 推送并索引到 Elastic

在此示例中,我们将使用德国联邦信息安全局 (German Federal Office for Information Security – BSI) 的 IT 基线保护 (“Grundschutz Kompendium”) 中的 PDF。

德国关键基础设施 (German critical infrastructure – KRITIS) 组织和联邦当局必须根据这些 BSI 标准构建其安全环境。但是,这些 PDF 的结构通常使得将现有措施与指南保持一致变得具有挑战性。在尝试在这些文档中查找特定解tgcode释或主题时,传统的关键字搜索通常会失败。

这些文档为语义搜索功能提供了理想的测试用例,对非英语语言的技术内容提出了挑战。

上面的映射(mapping)处理 PDF 内容提取,而 Elastic 自动管理推理和分块。

数据加载可以通过多种方式完成。Elastic 的 Python 客户端简化了流程并顺利集成。

对于经典的 Elastic 部署(无论是在本地还是由 Elastic 管理),可以使用以下方式安装该软件包:

python -m pip install elasticsearch

转换和加载 PDF 所需的 Python 代码如下所示:

import os
import base64
from elasticsearch import Elasticsearch, helpers
from getpass import getpass

es = Elasticsearch(hosts=getpass("Host Address: "), api_key=getpass("Elastic API Key: ")
pipeline_id = 'attachment'  # the pipeline we have created before
pdf_dir = '/yourfolder/grundschutz'  # the folder with the documents 

# Function to convert PDF file to base64-encoded binary

def convert_pdf_to_base64(file_path):
    with open(file_path, "rb") as file:
        return base64.b64encode(file.read()).decode('utf-8')

# Function to generate actions for the bulk API
def genertgcodeate_actions(pdf_dir):
    for filename in os.litgcodestdir(pdf_dir):
        if filename.lower().endswith(".pdf"):
            file_path = os.path.join(pdf_dir, filename)
            base64_encoded = convert_pdf_to_base64(file_path)
            yield {
                "_index": "grundschutz-embeddings",
                "_source": {
                    "data": base64_encoded
                }
            }
       

# Use the helpers.bulk() function to index documents in bulk
helpers.bulk(es, generate_actions(pdf_dir), pipeline=pipeline_id)

print("Finished indexing PDF documents.")

索引针对语义、全文或混合搜索而设置。分块将大型 PDF 分解为可管理的部分,从而简化索引编制并允许更精确地搜索文档中的特定部分或主题。通过将这些分块存储为嵌套对象,单个 PDF 中的所有相关信息都保存在一个文档中,从而确保获得全面且上下文相关的搜索结果。现在一切都已准备就绪,可以进行搜索:

%title插图%num

使用 Playground 进行原型搜索

在此步骤中,目标是查看所创建的内容是否符合实际标准。这涉及使用 Elastic 的新 “Playground” 功能,本博客对此进行了更详细的描述。

要开始使用 Playground,首先设置一个或多个 LLM 的连接器。你可以从 OpenAI、AWS Bedrock 或 Google Gemini 等公共选项中进行选择,也可以使用私人托管的 LLM。使用多个连接器进行测试可以帮助比较性能并选择最适合该工作的连接器。

在我们的用例中,信息是公开的,因此使用公共 LLM API 不会带来风险。在此示例中,已为 OpenAI 和 AWS Bedrock 设置了连接器:

%title插图%num

导航到游乐场并通过单击 “Add data sources” 和 “Save and continue” 选择之前创建的索引:

%title插图%num

现在我们可以开始提问了(在本例中是用德语),并通过连接器选择其中一个可用的 LLM:

%title插图%num

查看问题的答案和添加到上下文窗口的文档。

%title插图%num

由于我们使用多语言嵌入模型来创建内容,因此尝试使用不同语言与信息进行交互是一个好主意。

%title插图%num

你可以进一步利用 Playground 中的代码示例为你的用户构建搜索应用程序

总结和结论

因此,我们终于找到了一种简单的方法来测试可能的用例的质量并在合理的时间内开发原型。你已经了解了 Elastic 的功能如何工作以及如何有效地应用它们。

  • 灵活性:轻松加载和使用嵌入模型,而不会陷入分块和结构。
  • 速度和性能

    • Elastic 允许快速开发和部署,从而可以轻松高效地迭代和改进解决方案。该技术专为速度而设计,可实现极快的处理速度和快速的周转时间。
  • 透明度:使用 Playground 准确了解答案的得出方式。

%title插图%num

  • 统一文档存储:将结构化和非结构化信息存储在一个文档中,以便你的搜索应用程序轻松访问原始文档名称或作者等关键详细信息。

%title插图%num

因此,请深入研究,开始构建你自己的搜索体验,并了解 RAG 如何帮助你在聊天机器人中获得更多相关性和透明度。关注我们的 Search Labs,随时了解 Elastic 的最新动态。

准备好自己尝试一下了吗?开始免费试用
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!

原文:BSI IT Grundschutz: Easy approach to GenAI-powered search — Search Labs

文章来源于互联网:了解 BSI IT Grundschutz:使用 GenAI 搜索你的(私人)PDF 宝藏的秘诀

相关推荐: Elasticsearch 8 RAG 技术分享

作者:来自 Elastic 中国区首席架构师 Jerry 本文由 Elastic 中国区首席架构师 Jerry Zhu 在【AI 搜索 TechDay】上的分享整理而成。【AI 搜索 TechDay】 是 Elastic 和阿里云联合主办的 AI 技术 Mee…

Tags: , , , , ,