ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

在之前的文章 “ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(一)” 中,我们详细描述了如何结合 ChatGPT 及 Elasticsearch 来进行搜索。它使用了如下的架构:

在今天的文章中,我们来详细描述实现这个的详细步骤。这个项目的源码在地址 GitHub - jeffvestal/ElasticDocs_GPT: Combining the search power of Elasticsearch with the Question Answering power of GPT。我们可以通过如下的命令来进行下载:

git clone https://github.com/jeffvestal/ElasticDocs_GPT

在下面的展示中,我将使用最新的 Elastic Stack 8.7.0 来进行展示。

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据

ChatGPT 和 Elasticsearch:OpenAI 满足私有数据设置演练

安装及准备

Elasticsearch

我们可参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch” 来安装 Elasticsearch。特别地,我们需要按照 Elastic Stack 8.x 的安装指南来进行安装。

在 Elasticsearch 终端输出中,找到 elastic 用户的密码和 Kibana 的注册令牌。 这些是在 Elasticsearch 第一次启动时打印的。

我们记下这个密码,并在下面的配置中进行使用。同时它也会生成相应的证书文件:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.7.0
$ cd config/certs/
$ ls
http.p12      http_ca.crt   transport.p12

保存密码、注册令牌和证书路径名。 你将在后面的步骤中需要它们。如果你对这些操作还不是很熟的话,请参考我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。

安装 Kibana

我们接下来安装 Kibana。我们可以参考我之前的文章 “如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana” 来进行我们的安装。特别地,我们需要安装 Kibana 8.2 版本。如果你还不清楚如何安装 Kibana 8.2,那么请阅读我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单”。在启动 Kibana 之前,我们可以修改 Kibana 的配置文件如下。添加如下的句子到 config/kibana.yml 中去:

config/kibana.yml

enterpriseSearch.host: http://localhost:3002

然后,我们使用如下的命令来启动 Kibana:

bin/kibana

我们在浏览器中输入上面输出的地址然后输入相应的 enrollment token 就可以把 Kibana 启动起来。

Java安装

你需要安装 Java。版本在 Java 8 或者 Java 11。我们可以参考链接来查找需要的 Java 版本。

App search 安装

我们在地址 https://www.elastic.co/downloads/app-search 找到我们需要的版本进行下载。并按照页面上相应的指令来进行按照。如果你想针对你以前的版本进行安装的话,请参阅地址 https://www.elastic.co/downloads/past-releases#app-search。

等我们下载完 Enterprise Search 的安装包,我们可以使用如下的命令来进行解压缩:

$ pwd
/Users/liuxg/elastic
$ ls
elasticsearch-8.7.0                       kibana-8.7.0
elasticsearch-8.7.0-darwin-aarch64.tar.gz kibana-8.7.0-darwin-aarch64.tar.gz
enterprise-search-8.7.0.tar.gz
$ tar xzf enterprise-search-8.7.0.tar.gz 
$ cd enterprise-search-8.7.0
$ ls
LICENSE    NOTICE.txt README.md  bin        config     lib        metricbeat

如上所示,它含有一个叫做 config 的目录。我们在启动  Enterprise Search 之前,必须做一些相应的配置。我们需要修改 config/enterprise-search.yml 文件。在这个文件中添加如下的内容:

config/enterprise-search.yml

allow_es_settings_modification: true
secret_management.encryption_keys: ['q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D']
elasticsearch.username: elastic
elasticsearch.password: "*CpJpvlY4A+nqDeCv5l="
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.7.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601

在上面,请注意 elasticsearch.password 是我们在 Elasticsearch 安装过程中生成的密码。elasticsearch.ssl.certificate_authority 必须根据自己的 Elasticsearch 安装路径中生成的证书进行配置。在上面的配置中,我们还没有配置 secret_management.encryption_keys。我们可以使用上面的配置先运行,然后让系统帮我们生成。在配置上面的密码时,我们需要添加上引号。我发现在密码中含有 * 字符会有错误的信息。我们使用如下的命令来启动:

bin/enterprise-search

在启动的过程中,我们可以看到生成的用户名及密码信息:

      username: enterprise_search
      password: uqdqfp68es4o1bk5

我们记下这个用户名及密码。在启动的过程中,我们还可以看到一个生成的 secret_session_key:

我们也把它拷贝下来,并添加到配置文件中去:

config/enterprise-search.yml 

allow_es_settings_modification: true
secret_management.encryption_keys: ['q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D']
elasticsearch.username: elastic
elasticsearch.password: "*CpJpvlY4A+nqDeCv5l="
elasticsearch.host: https://127.0.0.1:9200
elasticsearch.ssl.enabled: true
elasticsearch.ssl.certificate_authority: /Users/liuxg/elastic/elasticsearch-8.7.0/config/certs/http_ca.crt
kibana.external_url: http://localhost:5601

secret_session_key: b481fff41aa906f8cadaecc69b7f6358449f2b515f79b333ccb355eec15107dbf1b09a5cdefe85efe3ac1563dae20539d7f7a13762b4cfac31203a6750469d7b
feature_flag.elasticsearch_search_api: true

为了能够使得我们能够在 App Search 中使用 Elasticsearch 搜索,我们必须设置
feature_flag.elasticsearch_search_api: true。 我们再次重新启动 enterprise search:

./bin/enterprise-search 

这次启动后,我们再也不会看到任何的配置输出了。这样我们的 enterprise search 就配置好了。

安装 eland

 Eland 可以通过 pip 从 PyPI 安装。在安装之前,我们需要安装好自己的 Python。

$ python --version
Python 3.10.2

可以使用 Pip 从 PyPI 安装 Eland:

python -m pip install eland

也可以使用 Conda 从 Conda Forge 安装 Eland:

conda install -c conda-forge eland

希望在不安装 Eland 的情况下使用它的用户,为了只运行可用的脚本,可以构建 Docker 容器:

git clone https://github.com/elastic/eland
cd eland
docker build -t elastic/eland .

Eland 将 Hugging Face 转换器模型到其 TorchScript 表示的转换和分块过程封装在一个 Python 方法中; 因此,这是推荐的导入方法。

  1. 安装 Eland Python 客户端。
  2. 运行 eland_import_hub_model 脚本。 例如:
eland_import_hub_model --url <clusterUrl> \ 
--hub-model-id elastic/distilbert-base-cased-finetuned-conll03-english \ 
--task-type ner 
  • 指定 URL 以访问你的集群。 例如,https://<user>:<password>@<hostname>:<port>。
  • 在 Hugging Face 模型中心中指定模型的标识符。
  • 指定 NLP 任务的类型。 支持的值为 fill_mask、ner、text_classification、text_embedding, question_answering 和 zero_shot_classification。

启动白金试用

因为机器学习是一个订阅功能,我们需要在 Kibana 中进行启动。有关更多关于订阅的信息,请访问 订阅 | Elastic Stack 产品和支持 | Elastic。

这样我们就启动了试用功能。 

获得 API key 与 OpenAI API 连接

要向 ChatGPT 发送文档和问题,我们需要一个 OpenAI API 帐户和密钥。 如果你还没有帐户,可以创建一个免费帐户,你将获得初始数量的免费积分。

  • 转到 https://platform.openai.com 并单击 “Signup”。 你可以完成使用电子邮件地址和密码或使用 Google 或 Microsoft 登录的过程。

创建帐户后,你需要创建一个 API 密钥:

  • 单击 API Keys。
  • 单击创 Create new secret key。
  • 复制新密钥并将其保存在安全的地方,因为你将无法再次查看该密钥。

我们把上面的 API key 保存下来。这个 key 将在下面被使用。

上传模型至 Elasticsearch

为了方便上传模型,根据仓库里的文件修改成如下的一个文件:

main.py

from pathlib import Path
from eland.ml.pytorch import PyTorchModel
from eland.ml.pytorch.transformers import TransformerModel
from elasticsearch import Elasticsearch
from elasticsearch.client import MlClient

import getpass

USERNAME = "elastic"
PASSWORD = "*CpJpvlY4A+nqDeCv5l="
ELATICSEARCH_ENDPOINT = "localhost:9200"
ELASTCSEARCH_CERT_PATH = "/Users/liuxg/elastic/elasticsearch-8.7.0/config/certs/http_ca.crt"
CERT_FINGERPRINT = "5a4b34414532c53698e4006e6c2b2c1c8d90d4a9d1bd995198fe6e902de00a35"

# es_cloud_id = getpass.getpass('Enter Elastic Cloud ID:  ')
# es_user = getpass.getpass('Enter cluster username:  ') 
# es_pass = getpass.getpass('Enter cluster password:  ') 

url  = f'https://{USERNAME}:{PASSWORD}@{ELATICSEARCH_ENDPOINT}'
print("url: " + url)

es = Elasticsearch(url, ca_certs = ELASTCSEARCH_CERT_PATH, verify_certs = True)
resp = es.info()

# es = Elasticsearch(ELATICSEARCH_ENDPOINT, 
#                    ssl_assert_fingerprint = (CERT_FINGERPRINT),
#                    basic_auth=(USERNAME, PASSWORD),
#                    verify_certs = False)
# resp = es.info(
    
print((resp))

hf_model_id='sentence-transformers/all-distilroberta-v1'
tm = TransformerModel(hf_model_id, "text_embedding")

#set the modelID as it is named in Elasticsearch
es_model_id = tm.elasticsearch_model_id()

# Download the model from Hugging Face
tmp_path = "models"
Path(tmp_path).mkdir(parents=True, exist_ok=True)
model_path, config, vocab_path = tm.save(tmp_path)

# Load the model into Elasticsearch
ptm = PyTorchModel(es, es_model_id)
ptm.import_model(model_path=model_path, config_path=None, vocab_path=vocab_path, config=config) 

s = MlClient.start_trained_model_deployment(es, model_id=es_model_id)
s.body

stats = MlClient.get_trained_models_stats(es, model_id=es_model_id)
stats.body['trained_model_stats'][0]['deployment_stats']['nodes'][0]['routing_state']

有关如何在 Python 中连接 Elasticsearch 的知识,请阅读我之前的文章 “Elasticsearch:关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”。

针对最新的 eland 版本,我们需要修改上面的这句代码:

tm = TransformerModel(model_id=hf_model_id, task_type="text_embedding")

我们运行上面的 Python 应用:

pip -q install eland elasticsearch sentence_transformers transformers torch==1.11
python3 main.py

我们回到 Kibana 界面去查看:

 

从上面的输出中,我们可以看到模型已经加载成功。我们可以看到它的状态是 started。

Elasticsearch 索引和网络爬虫

接下来我们将创建一个新的 Elasticsearch 索引来存储我们的 Elastic 文档,将网络爬虫配置为自动抓取这些文档并为其编制索引,并使用摄取管道为文档标题生成向量。

请注意,你可以在此步骤中使用你的专有数据,以创建适合你的领域的问答体验。

 

我们接着去 Dev Tools,并打入如下的命令:

POST search-elastic-docs/_mapping
{
  "properties": {
    "title-vector": {
      "type": "dense_vector",
      "dims": 768,
      "index": true,
      "similarity": "dot_product"
    }
  }
}

 

接下来,我们来配置网络爬虫以爬取 Elastic Docs 站点:

我们从下开始输入,直到顶部。我们输入如下的字符串:

release-notes
/guide/en/.*/current/.*

Elasticsearch 的网络爬虫现在将开始爬取文档站点,为标题字段生成向量,并对文档和向量建立索引。

我们回到 Dev Tools 进行查看:

我们可以看到一个叫做 .ds-logs-elastic_crawler-default-2023.04.28-000001 的索引 及 search-elastic-docs 已经生成。如果我们查看的话,我们可以看到一些结果:

我们可以看到 title-vector 是一个向量字段。它是一个 768 维的向量。这个可以被用于我们来做搜索。随着时间的推移,我们会发现 search-elastic-docs 的大小在不断地变化,并且一直在增大:

我们需要等一段时间。直至它完成。

搜索数据

一旦数据完全被爬完,我们可以修改下载下来的文件,并做如下的修改:

elasticdocs_gpt.py 

import os
import streamlit as st
import openai
from elasticsearch import Elasticsearch

# This code is part of an Elastic Blog showing how to combine
# Elasticsearch's search relevancy power with 
# OpenAI's GPT's Question Answering power
# https://www.elastic.co/blog/chatgpt-elasticsearch-openai-meets-private-data

# Code is presented for demo purposes but should not be used in production
# You may encounter exceptions which are not handled in the code


# Required Environment Variables
# openai_api - OpenAI API Key
# cloud_id - Elastic Cloud Deployment ID
# cloud_user - Elasticsearch Cluster User
# cloud_pass - Elasticsearch User Password

print("App started...")

USERNAME = "elastic"
PASSWORD = "*CpJpvlY4A+nqDeCv5l="
ELATICSEARCH_ENDPOINT = "localhost:9200"
ELASTCSEARCH_CERT_PATH = "/Users/liuxg/elastic/elasticsearch-8.7.0/config/certs/http_ca.crt"
CERT_FINGERPRINT = "5a4b34414532c53698e4006e6c2b2c1c8d90d4a9d1bd995198fe6e902de00a35"

openai.api_key = os.environ['openai_api']
model = "gpt-3.5-turbo-0301"

# Connect to Elastic Cloud cluster
def es_connect(cid, user, passwd):
    es = Elasticsearch(cloud_id=cid, http_auth=(user, passwd))
    return es

def es_connect_with_cert():
    url  = f'https://{USERNAME}:{PASSWORD}@{ELATICSEARCH_ENDPOINT}'
    es = Elasticsearch(url, ca_certs = ELASTCSEARCH_CERT_PATH, verify_certs = True)
    return es

# Search ElasticSearch index and return body and URL of the result
def search(query_text):
    # cid = os.environ['cloud_id']
    # cp = os.environ['cloud_pass']
    # cu = os.environ['cloud_user']
    # es = es_connect(cid, cu, cp)
    es = es_connect_with_cert()
  
    # Elasticsearch query (BM25) and kNN configuration for hybrid search
    query = {
        "bool": {
            "must": [{
                "match": {
                    "title": {
                        "query": query_text,
                        "boost": 1
                    }
                }
            }],
            "filter": [{
                "exists": {
                    "field": "title-vector"
                }
            }]
        }
    }

    knn = {
        "field": "title-vector",
        "k": 1,
        "num_candidates": 20,
        "query_vector_builder": {
            "text_embedding": {
                "model_id": "sentence-transformers__all-distilroberta-v1",
                "model_text": query_text
            }
        },
        "boost": 24
    }

    fields = ["title", "body_content", "url"]
    index = 'search-elastic-docs'
    resp = es.search(index=index,
                     query=query,
                     knn=knn,
                     fields=fields,
                     size=1,
                     source=False)

    body = resp['hits']['hits'][0]['fields']['body_content'][0]
    url = resp['hits']['hits'][0]['fields']['url'][0]

    return body, url

def truncate_text(text, max_tokens):
    tokens = text.split()
    if len(tokens) <= max_tokens:
        return text

    return ' '.join(tokens[:max_tokens])

# Generate a response from ChatGPT based on the given prompt
def chat_gpt(prompt, model="gpt-3.5-turbo", max_tokens=1024, max_context_tokens=4000, safety_margin=5):
    # Truncate the prompt content to fit within the model's context length
    truncated_prompt = truncate_text(prompt, max_context_tokens - max_tokens - safety_margin)

    response = openai.ChatCompletion.create(model=model,
                                            messages=[{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": truncated_prompt}])

    return response["choices"][0]["message"]["content"]


st.title("ElasticDocs GPT")

# Main chat form
with st.form("chat_form"):
    query = st.text_input("You: ")
    submit_button = st.form_submit_button("Send")

# Generate and display response on form submission
negResponse = "I'm unable to answer the question based on the information I have from Elastic Docs."
if submit_button:
    resp, url = search(query)
    print(resp)
    prompt = f"Answer this question: {query}\nUsing only the information from this Elastic Doc: {resp}\nIf the answer is not contained in the supplied doc reply '{negResponse}' and nothing else"
    answer = chat_gpt(prompt)
    
    if negResponse in answer:
        st.write(f"ChatGPT: {answer.strip()}")
    else:
        st.write(f"ChatGPT: {answer.strip()}\n\nDocs: {url}")

在上面我们需要根据自己的配置修改如下的这个部分:

USERNAME = "elastic"
PASSWORD = "*CpJpvlY4A+nqDeCv5l="
ELATICSEARCH_ENDPOINT = "localhost:9200"
ELASTCSEARCH_CERT_PATH = "/Users/liuxg/elastic/elasticsearch-8.7.0/config/certs/http_ca.crt"
CERT_FINGERPRINT = "5a4b34414532c53698e4006e6c2b2c1c8d90d4a9d1bd995198fe6e902de00a35"

我们可以以如下的方式来运行:

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

我们接下来,在命令行中打入如下的命令来把 Open AI 的 API key 设置到变量中去:

export openai_api="your_open_api_key"

注意:你需要把自己申请的 key 替换上面的 key。

接下来,我们使用如下的命令来运行:

如上所示,它显示的两个 url 在我的电脑上不可用,单独它的端口地址是对的。我在浏览器中打开地址 http://localhost:8501:

如上所示, 当我输入 “Show me the API call for an inference processor” 时,它显示如上所示的结果。我们再使用一个例子 “How do I add a new integration to elastic agent”:

这个是在我们的数据还在爬的途中时生成的结果。如下是在完成一半的过程中搜索到的结果:

 

随着数据的增多,我们可以看到如下的结果:

如前所述,允许 ChatGPT 仅根据训练过的数据回答问题的风险之一是它容易产生错误答案的幻觉。 该项目的目标之一是为 ChatGPT 提供包含正确信息的数据,并让它制定答案。

我们等数据完全被爬完后,我们搜索 “How to install elasticsearch on macOS?”:

那么当我们给 ChatGPT 一个不包含正确信息的文档时会发生什么? 比如,让它告诉你如何造船(Show me how to build a boat)(Elastic 的文档目前没有涵盖)

当 ChatGPT 无法在我们提供的文档中找到问题的答案时,它会退回到我们的提示指令,简单地告诉用户它无法回答问题。

相关推荐

AgentHack Shanghai|基于阿里云AI搜索 Elasticsearch x Qoder 构建AI Agent应用

2026年12月12日,Elastic社区、阿里云与Qoder联合举办AgentHack实战活动,聚焦AI编程、搜索检索与智能体工具链融合。参赛者将使用唯一指定工具QoderCN,在一天内完成从需求分析到可演示原型的构建,结合阿里云AI搜索或Elastic生态实现真实场景应用。活动提供技术工作坊、导师答疑及1个月QoderCN专业版会员,鼓励展示数据检索、工具调用与任务闭环的完整链路。参赛者可基于阿里云Elasticsearch、ElasticCloud或自部署环境,打造企业知识问答、业务分析等智能体原型,

Elastic 中国社区官方博客 1433

Elastic 线下 Meetup 将于 2026 年 12 月 19 号下午在西安举行

2026年12月19日,Elastic、阿里云与新智锦绣联合举办西安站ElasticMeetup。活动聚焦Elasticsearch向量搜索、AI Agents构建及企业级知识引擎演进,特邀刘晓国、陈星宇、孔祥超等专家分享技术前沿实践。内容涵盖语义搜索、智能诊断、云原生管控与大模型时代搜索架构升级,助力开发者掌握企业级AI应用落地核心能力。

Elastic 中国社区官方博客 1291

Elastic 线下 Meetup 将于 2026 年 11 月 28 号下午在杭州举行

2026年11月28日,杭州阿里云谷园区将举办AI搜索技术盛会。活动汇聚Elastic社区首席布道师刘晓国、中国电子云高斌、阿里云汤祯捷及预言家科技欧阳楚才等专家,聚焦Elasticsearch向量搜索、AI Agents构建、本体智能体上下文引擎与电商智能导购系统,探讨AgenticSearch 2.0、多模态检索与企业级智能搜索演进。现场设茶歇、合影与抽奖,报名成功后请扫码入群。

Elastic 中国社区官方博客 1077

Elastic:如何成为一名 Elastic 认证工程师,Elastic 认证分析师及 Elastic 认证可观测性工程师

Elasticsearch 无疑是是目前世界上最为流行的大数据搜索引擎。根据 DB - Engines 的统计,Elasticsearch 雄踞排行榜第一名,并且市场还在不断地扩大:能够成为一名 Elastic 认证工程师也是很多开发者的梦想。这个代表了 Elastic 的最高认证,在业界也得到了很高的认知度。得到认证的工程师,必须除了具有丰富的 Elastic Stack 知识,而且必须有丰富的操作及有效的解决问题的能力。拥有这个认证证书,也代表了个人及公司的荣誉。针对个人的好处是,你可以..

Elastic 中国社区官方博客 2万+

Elastic:开发者上手指南

你们好,我是Elastic的刘晓国。如果大家想开始学习Elastic的话,那么这里将是你理想的学习园地。在我的博客几乎涵盖了你想学习的许多方面。在这里,我来讲述一下作为一个菜鸟该如何阅读我的这些博客文章。我们可以按照如下的步骤来学习:1)Elasticsearch简介:对Elasticsearch做了一个简单的介绍2)Elasticsearch中的一些重要概念:cluster,n..........................................................

Elastic 中国社区官方博客 17万+

Elastic:培训视频 - ​在生产环境中配置 Fleet Server 和 Elastic Agent 之间的安全

在这篇文章中,我将会把我写的有些内容录制成视频,供大家参考。希望对大家有所帮助。优酷的视频频道地址在这里。Elastic 简介及Elastic Stack 安装:优酷,腾讯 Elastic Stack docker 部署:优酷,腾讯 Elasticsearch中的一些重要概念(Cluster/Shards/Replica/Document/Type/Index):优酷,腾讯 开始使用El...............

Elastic 中国社区官方博客 1万+

Elasticsearch 简介

Elasticsearch是一个非常强大的搜索引擎。它目前被广泛地使用于各个IT公司。Elasticsearch是由Elastic公司创建并开源维护的。它的开源代码位于https://github.com/elastic/elasticsearch。同时,Elastic公司也拥有Logstash及Kibana开源项目。这个三个开源项目组合在一起,就形成了 ELK软件栈。他们三个共同形成了一个强大的...

Elastic 中国社区官方博客 17万+

Kibana 中的人工智能连接器:你的 agent 可调用的 90 多个数据源

Elastic推出Kibana内置的90+人工智能连接器,支持Slack、GitHub、Confluence、PagerDuty等平台,让agent在推理中自动调用外部数据源,无需编写集成代码。通过身份验证中继服务,agent可安全访问个人或组织数据,快速关联告警与背景信息(如变更记录、讨论串、文档),显著缩短故障排查时间。结合ElasticCloud Trial,用户可即刻体验完整功能。

Elastic 中国社区官方博客 240

更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描

Elasticsearch 现在在成本模型中将文档位数的权重提高至原来的三倍,因此 DiskBBQ 会先尝试预处理和更深层的重排序,再增加一个比特,使量化向量在保持相同召回率的同时维持较小的体积。

Elastic 中国社区官方博客 278

对 OpenTelemetry Kafka 接收器的两项改动,避免一个缓慢的租户拖住其他租户

Elastic通过两项改进解决OpenTelemetry Kafka接收器中的“吵闹邻居”问题:一是为每个Kafka分区引入独立工作单元,实现租户间分区隔离;二是添加租户限流处理器,动态限制各租户在共享发送队列中的槽位占用,防止慢租户阻塞其他租户。结合max_in_flight配置提升单分区吞吐量与内存控制,确保记录不丢失、投递至少一次,同时保障多租户环境下稳定高效的数据处理。

Elastic 中国社区官方博客 348

三次模型调用,占据 92% 的等待时间:使用 OpenTelemetry 实现人工智能 agent 可观测性

使用OpenTelemetry追踪LangChain购物助手,发现92%耗时源于三次模型调用。虽将比较模型替换为更便宜的版本后,成本降低76%-83%,但四成问题响应变慢。通过追踪数据定位瓶颈,结合ES|QL分析词元用量与费用,验证了成本优化但延迟未改善。借助Elastic AI Agent建议,进一步测试return_direct=True以跳过冗余调用,实现性能与成本双赢。可观测性助力精准决策,确保答案正确、响应高效。

Elastic 中国社区官方博客 406

Elasticsearch:稠密向量字段类型

dense_vector字段用于存储稠密向量,支持k近邻搜索(kNN),默认启用索引并使用余弦相似度。可接受浮点数数组或Base64编码字符串输入,支持自动量化(如int8、int4、bbq)以降低内存占用。通过index_options配置索引类型(如hnsw、bbq_disk),并可启用过采样与重新评分提升精度。向量默认不存储于_source中以节省空间,可通过fields或_source.exclude_vectors显式返回。支持bit向量及GPU加速索引,适用于高维向量场景。

Elastic 中国社区官方博客 291

使用 Qoder 将 CSV 文件导入 Elasticsearch

本文演示如何通过Qoder智能助手,仅用4轮对话,将IMDB电影数据CSV文件(10,178条)高效导入Elasticsearch。无需编写代码,Qoder自动完成依赖安装、连接配置、字段类型推断(text/keyword/double)、数据验证及导入,支持自定义映射与数据转换,耗时约30秒,显著简化数据导入流程。

Elastic 中国社区官方博客 248

两条规则,一次故障,一条告警:变点检测如何减少告警噪声

Elastic Carlos Crespo揭示了基于ES|QL规则的AI agent如何通过重运行查询验证告警真实性,实现从日志变化到重大事件告警的自动化。系统先通过变点检测识别规则行为突变,再由发现agent核实故障存在性、规模与影响范围,并合并同类信号以减少噪声。每条告警均附带可追溯的查询证据,确保结论可验证。最终生成的告警包含严重程度、置信度、受影响拓扑及量化指标,支持运维决策。该流程结合代码与模型分工,保障可靠性与可解释性,已在多场景测试中验证有效性。

Elastic 中国社区官方博客 333

把词向量“贴”在地球仪上:用球面视角看 Embedding 的真实几何

本文通过将归一化词向量投影至3D球面,利用slerp绘制大圆弧,以真实反映余弦相似度对应的测地线距离。相比传统PCA平面散点图,球面可视化避免几何扭曲,直观呈现词间语义关系。结合Plotly实现交互式“词语地球仪”,可旋转观察聚类、跨语言对齐(如“cat”与“猫”),并对比高维真值与降维后距离的失真。代码简洁(<200行),支持模型替换与扩展,揭示“向量相近”在球面上的真实形态。

Elastic 中国社区官方博客 265

我们的 agent 技能如何调研、构建和测试完整的 Elastic 集成

作者:来自 Elastic我们让 agent 技能处理美国国家标准与技术研究院的国家漏洞数据库接口,得到了两个数据流和一个经过验证的通用表达式语言程序,并通过了流水线测试和系统测试。调研发现,一天中 78% 的通用漏洞与披露记录都是旧记录的重新发布,这一发现改变了设计。Elasticsearch 原生集成了业界领先的生成式人工智能工具和服务提供商。欢迎观看我们的网络研讨会,了解如何,或使用构建可用于生产环境的应用。要为你的使用场景构建最佳搜索解决方案,立即开始,或在你的上试用 Elastic。

Elastic 中国社区官方博客 133

基于 Elasticsearch 与 Jina AI 的全模态智能搜索实践:技术全解析

是一个结构清晰、覆盖全面且极具实操价值的开源项目。它不仅展示了Jina AI 多模态模型在非结构化数据表征上的强悍性能,也展现了在混合检索(BM25 + k-NN + RRF)以及多模态 RAG 架构上的工程实践。无论是准备构建企业级智能知识库、多媒体图库检索系统,还是探索音视频多模态推荐,该项目都提供了非常优秀的代码模版与架构参考。

Elastic 中国社区官方博客 211

你的日志早已写好告警:在 Elasticsearch 中生成 ES|QL 检测查询

Elastic Observability Labs展示如何基于OpenTelemetry日志自动生成精准的ES|QL检测查询。通过30个知识指标(27个推断、3个计算),生成10条查询,其中4条转化为Kibana告警规则。查询严格遵循三条提示词规则:精确匹配短语、不依赖log.level、仅在同文档中组合谓词。正常运行时匹配0条,故障期间捕获676条支付服务异常日志。查询随依赖知识失效自动停用,确保持续有效性。

Elastic 中国社区官方博客 685

Elastic Cloud 无服务器服务审计日志:将审计记录发送到可观测性或安全解决方案

ElasticCloud无服务器服务推出审计日志投递功能,支持将Elasticsearch与Kibana的活动日志(如索引变更、登录行为、数据访问)自动投递至同一组织内的可观测性或安全项目。附带8条告警规则和7个仪表板,涵盖凭据攻击检测、对象取证、数据访问追踪等场景。通过忽略筛选条件可降低存储成本,实现按需保留关键证据。支持跨项目日志聚合,助力安全与合规团队高效调查。立即免费试用14天,体验AI驱动的搜索与智能监控。

Elastic 中国社区官方博客 183

Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者

Elastic在《ForresterWave®:2026年第四季度智能运维平台》中被评为强劲表现者,获五项最高评分,涵盖算法可信度、可观测性即代码、AI技术栈、数据主权与定价透明度。其人工智能站点可靠性工程师以透明推理、完整上下文、持续学习和开放标准为核心,实现可验证排查、高效存储与跨环境兼容,助力团队信任AI、提升响应效率,推动智能运维迈向可验证、可进化的新阶段。

Elastic 中国社区官方博客 195

使用 OpenTelemetry 在 Elastic 中实现 Claude 平台的人工智能 agent 可观测性

Elastic与Claude平台集成,通过OpenTelemetry将AI agent追踪数据实时发送至Elastic,实现无代码观测。用户可在Kibana中查看模型请求、工具调用及上下文协议的完整交互轮次,包含耗时、词元计数与对话内容。支持服务清单、告警规则与SLO设置,结合SDK可实现跨服务追踪。免费云试用已开放,快速接入即可全面掌握Claude agent性能与成本。

Elastic 中国社区官方博客 894

三个区域、三个 Kibana、一个视图:跨集群搜索登陆 Elastic 合成监测

Elastic 9.5推出合成监测跨集群搜索功能,实现多集群监测器统一视图。无需复制数据,中央Kibana可实时查询远程集群的探测结果,展示状态、用户旅程、截图与证书,支持按远程集群筛选与分组。配置仍保留在原集群,仅提供只读访问,管理需返回源Kibana。适用于有状态部署,暂不支持无服务器服务。告警跨集群功能正在开发中。

Elastic 中国社区官方博客 384

Elastic 重大事件功能如何将 100 条日志样本转化为检测规则

本文介绍Elastic重大事件功能如何通过智能日志采样,从100份样本中提取27个知识指标(如服务、依赖关系、技术等),构建有证据支撑的日志源描述,进而生成精准检测规则。相比均匀采样易遗漏罕见故障信息,该系统采用三路分层采样(按实体筛选、多样性、随机)确保覆盖长尾模式,并通过循环迭代与去重机制提升准确性。知识指标可审核、手动保留或排除,支持持续接入。第二部分将基于这些指标生成可执行的查询,实现从“看到”到“检测”的跨越。

Elastic 中国社区官方博客 301

给海量查询“减负”:列式查询改写如何让检索更“省力”

Elasticsearch 9.5.0推出的列式查询改写技术,实现“零改造、高兼容、高精准”的查询优化。通过按需读取字段、谓词下推与嵌套扁平化,显著降低冗余读取与解码开销。基于1.8亿条日志的实测验证:16个用例命中数完全一致,核心时延持平,边界场景稳定,DSL语法兼容。系统自动降级兜底,确保功能可用。该技术特别适用于日志检索等海量数据场景,为集群性能提升提供开箱即用的底层支撑。

Elastic 中国社区官方博客 637

Elastic 如何帮助奥迪 Revolut F1® 车队在工程软件中找到关键信息

Elastic与奥迪RevolutF1®车队达成多年合作,将作为2026年美国大奖赛官方赛事合作伙伴,并自2027年起成为其官方搜索与可观测性供应商。通过Elastic技术栈(Logstash、Elasticsearch、Kibana),车队实现跨系统日志与遥测数据的统一视图,助力工程师在毫秒级内快速排查问题,提升软件可靠性。该合作不仅强化工程效率,更推动AI辅助诊断与决策支持,为赛车性能持续优化提供技术支撑。

Elastic 中国社区官方博客 218

5 分钟内将 56 页扫描文档转化为带引用的答案:面向搜索无法读取的文档的检索增强生成流水线

通过Elasticsearch与jina-ocr-v1结合,可将扫描版PDF(如56页植物指南)快速转化为可检索、可引用的知识库。该流程利用单一模型完成文档解析,输出结构化Markdown,再由Elasticsearch自动分块并生成嵌入向量,支持混合检索(关键词+语义)。用户以自然语言提问,系统返回带页码引用的答案及推荐商品,全程在统一平台内完成,无需自建流水线。

Elastic 中国社区官方博客 499

我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic

Elastic团队历时三年,将OpenTelemetry Java Agent从内联字节码插桩迁移至基于invokedynamic的类加载器隔离模式,支持100+插桩模块,提升可维护性与调试能力。相比此前三人团队的迁移,此次协作规模扩大,通过渐进式发布、运行时开关与自动化工具确保生产稳定。新架构实现插桩代码独立加载、兼容Java平台模块系统,并解决旧版本字节码兼容性问题。2026年7月,相关任务正式关闭,标志着迁移完成。

Elastic 中国社区官方博客 331

将 Elastic 引入 Claude:原因、方法与注意事项

Elastic发布Claude插件,将自身AI能力融入开发者工作流。从提交到上线仅用三周,但过程充满挑战:需绕过权限限制、调整版本管理策略(改用stable分支)、应对审核警告(如凭据提示、图标缺失等),且上线后无通知。插件首发于社区目录,需额外验证才能进入官方市场。作者强调,技术之外,与Anthropic团队的人际沟通是关键。经验表明,文档未覆盖的细节常需实战互动解决。欢迎开发者共享经验,共同推动生态发展。

Elastic 中国社区官方博客 117

告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch

Kabanos是一款专为macOS设计的本地优先桌面客户端,整合Elasticsearch与OpenSearch集群管理痛点。它结合MongoDB Compass式树状浏览与Kibana DevTools高效控制台,支持凭据安全加密、生产环境二次确认、只读模式及沙盒化架构,保障操作安全。内置查询库、自动化Routines与DryRun模式,提升运维效率。基于Electron与Zod校验,实现渲染层与网络请求隔离。快速上手:克隆仓库,启动Docker测试集群,运行pnpm dev即可使用。开源项目欢迎贡献,推

Elastic 中国社区官方博客 392

控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警

Kibana通用告警将ES|QL查询转化为可管理的告警数据,支持灵活的规则定义、精细的延迟与恢复控制、跨系统告警统一视图及基于工作流的通知策略。它与经典告警并行运行,适用于复杂场景,如自定义严重级别、多源告警整合与精细化通知管理。2026年10月起将在Elastic云端无服务器服务中默认启用,兼容托管与自托管部署,助力团队实现高效、可扩展的可观测性告警体系。

Elastic 中国社区官方博客 394
上一篇: Enterprise:如何在 Elastic 企业搜索引擎中添加对更多语言的支持
下一篇: Elasticsearch:定制 Elasticsearch 镜像
Elastic 中国社区官方博客
Elastic 中国社区官方博客 企业官方账号 企业官方账号 领域专家: 大数据技术领域 领域专家: 大数据技术领域
博客等级 码龄12年 5万+粉丝 3111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值