LLMs之VDB:Elasticsearch的简介、安装和使用方法、案例应用之详细攻略
目录
Elasticsearch的简介
1、特点
Elasticsearch的安装和使用方法
1、安装
T1、云服务—使用 Elastic Cloud
T2、本地安装、运行和管理Elasticsearch(仅限开发和测试)
用start-local脚本在Docker中快速搭建Elasticsearch和Kibana本地环境的方法,步骤如下:
前提条件:安装Docker和WSL(针对Windows)
运行脚本
访问服务
API访问
发送到Elasticsearch的请求
T1、使用curl命令
elasticsearch%E5%AE%A2%E6%88%B7%E7%AB%AF-toc" style="margin-left:160px;">T2、使用Python的elasticsearch客户端
使用开发者工具控制台
2、使用方法
2.1、添加数据
添加单个文档
批量添加文档可以使用_bulk API
2.2、搜索数据
2.3、Kibana探索
3、Elasticsearch与LangChain结合
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具集成到LangChain中并进行向量数据库操作来构建强大的LLM应用—开启Elasticsearch服务→管理(添加文档/删除文档)→查询(直接基于相似度查询/将向量存储转换为检索器封装查询)
1、安装和配置 Elasticsearch
T1、使用 Docker 本地安装
T2、使用 Elastic Cloud 云服务
获取Elastic Cloud 云服务的用户名/密码
使用 API 密钥
2、使用方法
2.1、利用ElasticsearchEmbeddings实现嵌入模型
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具中的嵌入模型生成文本嵌入向量并进行测试——开启Elasticsearch服务(本地安装Elasticsearch采用Docker运行/采用Elastic Cloud云服务)→测试嵌入向量(多个文档或单个文档的查询)
2.2、利用EcloudESVectorStore实现向量存储
2.3、利用ElasticsearchRetriever或ElasticSearchBM25Retriever实现检索器
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具中的ElasticsearchRetriever对比多种不同搜索方法并构建RAG系统—基于本地Docker开启Elasticsearch服务(与Elasticsearch集群交互)→定义数据/创建索引/向量化并索引到Elasticsearch中→对比不同的检索方法(向量搜索/BM25搜索/混合搜索/模糊匹配/复杂过滤)→自定义文档映射器→结合GPT-4o构建RAG系统
2.4、利用ElasticsearchChatMessageHistory实现在Elasticsearch 中记录聊天消息历史
2.5、利用ElasticsearchCache实现持久化缓存
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库的ElasticsearchCache缓存策略来实现持久化缓存(避免重复提问相同或类似的问题)——开启服务并配置ElasticsearchCache(配置Elasticsearch服务地址和索引名称)→设置缓存→从缓存中查询→如果缓存中没有答案则调用GPT-4模型生成答案→缓存答案→测试两次查询(第1次查询调用GPT-4并缓存结果/第2次查询相同问题+从缓存中直接返回结果)
2.6、其他功能
Elasticsearch的案例应用
1、检索增强生成 (RAG)
LLMs之VDB之Elasticsearch之RAG:基于Langchain框架结合OpenAI向量化并存储到Elasticsearch来搭建带文档来源和上下文互联的问答系统—开启Elasticsearch云服务并创建OpenAI嵌入模型→数据导入与索引(递归字符分割文档)→批量导入到Elasticsearch向量数据库→构建基础的问题检索和回答链→RAG链中增强溯源功能(引入可解释性,包括仅返回来源主题或所在主题的整体内容)→RAG链中增强上下文关联功能(引入多轮交互性)
LLMs之SelfQueryRAG:基于Langchain和Elasticsearch构建自查询检索器将非结构化查询转化为结构化查询并应用于向量存储以实现更精准的搜索—定义一批文档数据→定义OpenAI嵌入模型并向量化到Elasticsearch中→设置自查询检索器(利用LLMs解析查询意图+结合预定义的文档元数据+生成结构化的过滤条件)→测试检索功能(使用简单查询和过滤器来测试检索器、限定结果数量)
2、向量搜索
3、全文搜索
LLMs之RAG:基于Langchain框架和Elasticsearch库采用关键词搜索结合Anthropic模型生成能力来构建基于文档的问答系统——配置Elasticsearch客户端→初始化AnthropicBedrock客户端→定义搜索算法的索引及文档→采用bm25算法从Elasticsearch中获取与查询相关的结果→创建基于上下文的提示词→调用Anthropic模型生成回答
4、日志
5、指标
6、应用性能监控 (APM)
7、安全日志
Elasticsearch的简介
Elasticsearch是一个分布式、RESTful的搜索和分析引擎,也是一个可扩展的数据存储和向量数据库,针对生产规模的工作负载进行了优化,速度和相关性极佳。它是Elastic公司开放式堆栈平台的基础。 可以进行近乎实时的海量数据集搜索、向量搜索,并与生成式AI应用程序集成等等。
官网地址:Elasticsearch:官方分布式搜索和分析引擎 | Elastic
GitHub地址:GitHub - elastic/elasticsearch: Free and Open Source, Distributed, RESTful Search Engine
1、特点
>> 主要功能:集中存储数据,提供快速搜索、微调相关性、强大的分析能力,并能轻松扩展规模以应对不断涌现的各种用例。
>> 数据类型支持:支持数字、文本、地理位置、结构化和非结构化等多种数据类型。
>> 速度和效率:Elasticsearch以其极快的速度著称,通过倒排索引、BKD树和列存储等技术实现高效的全文检索、数值数据和位置数据存储以及分析,让用户能够快速获得答案并进行迭代。 所有数据都被编入索引,确保快速访问。
>> 可扩展性:从单节点到包含数百个节点的集群,能够处理PB级数据,并能水平扩展以每秒处理海量事件。自动管理索引和查询在集群中的分布,确保流畅操作。
>> 弹性与高可用性:作为分布式系统,Elasticsearch能够检测并应对硬件故障和网络分割等问题,确保集群和数据的安全性和可用性。跨集群复制功能提供热备份。
>> 灵活性:允许用户在性能和成本之间取得平衡。数据可以本地存储或远程存储于低成本的S3等存储中。运行时字段功能允许快速加载数据并适应变化。
>> 向量数据库:Elasticsearch是目前部署最广泛的向量数据库。
>> 部署方式:支持本地部署和Elastic Cloud(在AWS、Google Cloud和Azure上部署托管型Elasticsearch和Kibana)。
>> 查询和分析:支持多种类型的搜索(结构化数据、非结构化数据、地理位置、指标,以及从管道查询语言搜索),并允许用户定义自己的搜索方式。 提供聚合功能,方便用户从大规模数据中探索趋势和模式。
>> 新增功能: Elasticsearch 查询语言 (ES|QL) 简化数据调查并提高效率;Elasticsearch Relevance Engine™ (ESRE) 支持基于人工智能的搜索应用,提供开箱即用的语义搜索和混合搜索能力。
>> 客户端库:提供标准的RESTful API和JSON接口,并提供多种编程语言的客户端库(Java、Python、.NET、SQL、PHP等),以及社区贡献的客户端。
Elasticsearch的安装和使用方法
1、安装
Elasticsearch的安装和使用方式主要有两种:
T1、云服务—使用 Elastic Cloud
这是最简单的方法,创建一个托管部署。
T2、本地安装、运行和管理Elasticsearch(仅限开发和测试)
自己安装和管理Elasticsearch,可以从 elastic.co/downloads/elasticsearch下载最新版本。
用start-local脚本在Docker中快速搭建Elasticsearch和Kibana本地环境的方法,步骤如下:
前提条件:安装Docker和WSL(针对Windows)
确保已安装Docker。如果使用Windows系统,还需要安装Windows Subsystem for Linux (WSL)。
运行脚本
在本地设置Elasticsearch和Kibana,请运行start-local脚本
curl -fsSL https://elastic.co/start-local | sh
这会创建一个elastic-start-local文件夹,包含配置文件,并使用Docker启动Elasticsearch和Kibana。
访问服务
Elasticsearch访问地址:http://localhost:9200;
Kibana访问地址:http://localhost:5601
脚本会生成一个elastic用户的随机密码,显示在安装结束时,并存储在.env文件中。
重要提示:此本地设置仅供本地测试使用。HTTPS已禁用,Elasticsearch使用基本身份验证。出于安全考虑,Elasticsearch和Kibana只能通过localhost访问。 .env文件中还生成了一个ES_LOCAL_API_KEY,用于通过编程语言客户端或REST API连接Elasticsearch。
API访问
为Elasticsearch生成并存储在.env文件中的ES_LOCAL_API_KEY是一个API密钥。 使用此密钥连接到Elasticsearch,可使用编程语言客户端或REST APII与Elasticsearch交互。
从elastic-start-local文件夹中,使用curl检查与Elasticsearch的连接:
source .env
curl $ES_LOCAL_URL -H "Authorization: ApiKey ${ES_LOCAL_API_KEY}"
发送到Elasticsearch的请求
通过REST API向Elasticsearch发送数据和其他请求。 可以使用任何发送HTTP请求的客户端(例如Elasticsearch语言客户端和curl)与之交互。
T1、使用curl命令
例如,使用基本身份验证创建新的Elasticsearch索引:
curl -u elastic:$ELASTIC_PASSWORD \-X PUT \http://localhost:9200/my-new-index \-H 'Content-Type: application/json'
elasticsearch%E5%AE%A2%E6%88%B7%E7%AB%AF" style="text-align:left;">T2、使用Python的elasticsearch客户端
要使用语言客户端连接到本地开发Elasticsearch集群,你可以使用elastic用户名和环境变量中设置的密码进行基本认证。
Elasticsearch endpoint: http://localhost:9200
Username: elastic
Password: $ELASTIC_PASSWORD(你在环境变量中设置的值)
例如,要连接到 Python 的 elasticsearch 客户端:
import os
from elasticsearch import Elasticsearch
username = 'elastic'
password = os.getenv('ELASTIC_PASSWORD') # Value you set in the environment variable
client = Elasticsearch("http://localhost:9200",basic_auth=(username, password)
)
print(client.info())
使用开发者工具控制台
Kibana的开发者控制台提供了一种轻松的方式来实验和测试请求。 要访问控制台,请打开Kibana,然后转到管理 > 开发工具。
2、使用方法
2.1、添加数据
您通过REST API发送JSON对象(文档)将索引数据输入Elasticsearch。 不管您有结构化文本、未结构化文本、数值数据还是地理空间数据, Elasticsearch都能高效地存储和索引这些数据,支持快速搜索。
对于带有时间戳的数据(如日志和指标),你通常会将文档添加到一个由多个自动生成的辅助索引组成的 数据流中。
要将单个文档添加到索引中,请提交一个针对索引的HTTP POST请求。
添加单个文档
通过REST API发送JSON对象(文档)来索引数据。 例如,添加单个文档:
POST /customer/_doc/1
{"firstname": "Jennifer","lastname": "Walters"
}
此请求会自动创建不存在于customer索引,如果不存在, 添加一个ID为1的新文档, 并存储和索引firstname和lastname字段。
新文档可以从集群中的任何节点立即获取。 您可以通过指定其文档ID的GET请求获取它:
GET /customer/_doc/1
批量添加文档可以使用_bulk API
要在一次请求中添加多个文档,请使用_bulk API。 批量数据必须是换行分隔的JSON(NDJSON)。 每行必须以换行符(\n)结束,包括最后一行。
PUT customer/_bulk
{ "create": { } }
{ "firstname": "Monica","lastname":"Rambeau"}
{ "create": { } }
{ "firstname": "Carol","lastname":"Danvers"}
{ "create": { } }
{ "firstname": "Wanda","lastname":"Maximoff"}
{ "create": { } }
{ "firstname": "Jennifer","lastname":"Takeda"}
2.2、搜索数据
索引文档可在近实时进行搜索。 以下搜索匹配所有姓名为Jennifer的customer索引中的所有客户。
例如,搜索名为“Jennifer”的客户:
GET customer/_search
{"query" : {"match" : { "firstname": "Jennifer" }}
}
2.3、Kibana探索
Kibana的Discover功能可以交互式地搜索和过滤数据,创建可视化效果,构建和共享仪表板。
你可以在Kibana中使用Discover进行交互式搜索和筛选数据。 之后,你就可以开始创建可视化、构建和共享仪表板了。
要开始使用,请创建一个数据视图,该视图连接到一个或多个Elasticsearch索引、数据流或索引别名。
>> 请访问 管理 > 堆栈管理 > Kibana > 数据视图。
>> 选择创建数据视图。
>> 输入数据视图的名称和匹配一个或多个指数的模式,例如客户。
>> 选择 将数据视图保存到Kibana。
>> 要开始探索,请前往分析 > 发现。
3、Elasticsearch与LangChain结合
Elasticsearch是一个分布式 RESTful 搜索和分析引擎,能够执行向量搜索和词法搜索。它基于 Apache Lucene 库构建。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 界面和无架构 JSON 文档。将 Elasticsearch 集成到 LangChain 中,核心思路是利用 Elasticsearch 的强大搜索和向量数据库能力,提升 LangChain 应用的效率和功能。
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具集成到LangChain中并进行向量数据库操作来构建强大的LLM应用—开启Elasticsearch服务→管理(添加文档/删除文档)→查询(直接基于相似度查询/将向量存储转换为检索器封装查询)
https://yunyaniu.blog.csdn.net/article/details/143750381
1、安装和配置 Elasticsearch
要使用 Elasticsearch,需要一个 Elasticsearch 集群,可以本地设置或创建一个 Elastic 帐户。可以通过以下两种方式设置 Elasticsearch 实例:
>> 本地安装:可以通过官方的 Elasticsearch Docker 镜像来本地运行。
>> 云服务Elastic Cloud:这是一个托管的 Elasticsearch 服务。
T1、使用 Docker 本地安装
docker run -p 9200:9200 -e "discovery.type=single-node" -e "xpack.security.enabled=false" -e "xpack.security.http.ssl.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:8.9.0
T2、使用 Elastic Cloud 云服务
>> LangChain Elasticsearch 客户端:安装 elasticsearch 和 langchain-elasticsearch 包,这两个包提供了 LangChain 与 Elasticsearch 交互的必要接口。
pip install elasticsearch
pip install langchain-elasticsearch
pip install --upgrade --quiet elasticsearch langchain langchain-community
获取Elastic Cloud 云服务的用户名/密码
登录 Elastic Cloud 控制台→进入 "Security" > "Users"→找到 "elastic" 用户并点击 "Edit"→点击 "Reset password"→按照提示重置密码
es_username = os.environ.get("ES_USERNAME", "elastic")
es_password = os.environ.get("ES_PASSWORD", "change me...")
使用 API 密钥
获取 API 密钥→登录 Elastic Cloud 控制台→打开 Kibana 并进入 Stack Management > API Keys→点击 "Create API key"→输入 API 密钥名称并点击 "Create"。
es_api_key = os.environ.get("ES_API_KEY")
2、使用方法
2.1、利用ElasticsearchEmbeddings实现嵌入模型
ElasticsearchEmbeddings 类用于生成文本嵌入,这些嵌入随后可以存储在 Elasticsearch 的向量存储中。文档同样提供了使用示例。
from langchain_elasticsearch import ElasticsearchEmbeddings
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具中的嵌入模型生成文本嵌入向量并进行测试——开启Elasticsearch服务(本地安装Elasticsearch采用Docker运行/采用Elastic Cloud云服务)→测试嵌入向量(多个文档或单个文档的查询)
https://yunyaniu.blog.csdn.net/article/details/143750439
2.2、利用EcloudESVectorStore实现向量存储
ElasticsearchStore 类允许将向量嵌入存储在 Elasticsearch 中,这对于基于向量相似度进行语义搜索至关重要。
from langchain_elasticsearch import ElasticsearchStore
from langchain_community.vectorstores.ecloud_vector_search import EcloudESVectorStore
2.3、利用ElasticsearchRetriever或ElasticSearchBM25Retriever实现检索器
包括两种检索器,ElasticsearchRetriever 和 ElasticSearchBM25Retriever。前者允许使用 Elasticsearch 的 Query DSL 进行灵活的查询,后者则利用 BM25 算法进行更有效的文本检索。
from langchain_elasticsearch import ElasticsearchRetriever
from langchain_community.retrievers import ElasticSearchBM25Retriever
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具中的ElasticsearchRetriever对比多种不同搜索方法并构建RAG系统—基于本地Docker开启Elasticsearch服务(与Elasticsearch集群交互)→定义数据/创建索引/向量化并索引到Elasticsearch中→对比不同的检索方法(向量搜索/BM25搜索/混合搜索/模糊匹配/复杂过滤)→自定义文档映射器→结合GPT-4o构建RAG系统
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库工具中的ElasticsearchRetriever对比多种不同搜索方法并构建RAG系统—基于本地Docker开-CSDN博客
2.4、利用ElasticsearchChatMessageHistory实现在Elasticsearch 中记录聊天消息历史
原文地址:https://python.langchain.com/docs/integrations/memory/elasticsearch_chat_message_history/
# 初始化 Elasticsearch 客户端和聊天消息历史
import os
from langchain_community.chat_message_histories import (ElasticsearchChatMessageHistory,)es_url = os.environ.get("ES_URL", "http://localhost:9200")# 如果使用 Elastic Cloud:
# es_cloud_id = os.environ.get("ES_CLOUD_ID")
history = ElasticsearchChatMessageHistory(es_url=es_url,index="test-history",session_id="test-session"
)
# 添加用户和 AI 消息:在 Elasticsearch 中记录聊天消息历史
history.add_user_message("hi!")
history.add_ai_message("whats up?")'''
indexing message content='hi!' additional_kwargs={} example=False
indexing message content='whats up?' additional_kwargs={} example=False
'''
2.5、利用ElasticsearchCache实现持久化缓存
使用ElasticsearchCache来实现持久化缓存
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库的ElasticsearchCache缓存策略来实现持久化缓存(避免重复提问相同或类似的问题)——开启服务并配置ElasticsearchCache(配置Elasticsearch服务地址和索引名称)→设置缓存→从缓存中查询→如果缓存中没有答案则调用GPT-4模型生成答案→缓存答案→测试两次查询(第1次查询调用GPT-4并缓存结果/第2次查询相同问题+从缓存中直接返回结果)
LLMs之VDB之Elasticsearch:基于Elasticsearch向量数据库的ElasticsearchCache缓存策略来实现持久化缓存(避免重复提问相同或类似的问题)——开启服务并配置E-CSDN博客
2.6、其他功能
除了向量存储和检索器, Elasticsearch 在 LangChain 中的其他应用,例如缓存 (ElasticsearchCache, ElasticsearchEmbeddingsCache)、聊天历史记录 (ElasticsearchChatMessageHistory) 以及数据库链 (ElasticsearchDatabaseChain)。
from langchain_elasticsearch import ElasticsearchChatMessageHistory
from langchain_elasticsearch import ElasticsearchCache
from langchain_elasticsearch import ElasticsearchEmbeddingsCache
from langchain.chains.elasticsearch_database import ElasticsearchDatabaseChain
Elasticsearch的案例应用
Elasticsearch支持多种用例,包括:
1、检索增强生成 (RAG)
持续更新中……
LLMs之VDB之Elasticsearch之RAG:基于Langchain框架结合OpenAI向量化并存储到Elasticsearch来搭建带文档来源和上下文互联的问答系统—开启Elasticsearch云服务并创建OpenAI嵌入模型→数据导入与索引(递归字符分割文档)→批量导入到Elasticsearch向量数据库→构建基础的问题检索和回答链→RAG链中增强溯源功能(引入可解释性,包括仅返回来源主题或所在主题的整体内容)→RAG链中增强上下文关联功能(引入多轮交互性)
https://yunyaniu.blog.csdn.net/article/details/143755518
LLMs之SelfQueryRAG:基于Langchain和Elasticsearch构建自查询检索器将非结构化查询转化为结构化查询并应用于向量存储以实现更精准的搜索—定义一批文档数据→定义OpenAI嵌入模型并向量化到Elasticsearch中→设置自查询检索器(利用LLMs解析查询意图+结合预定义的文档元数据+生成结构化的过滤条件)→测试检索功能(使用简单查询和过滤器来测试检索器、限定结果数量)
https://yunyaniu.blog.csdn.net/article/details/143755806
2、向量搜索
持续更新中……
3、全文搜索
持续更新中……
LLMs之RAG:基于Langchain框架和Elasticsearch库采用关键词搜索结合Anthropic模型生成能力来构建基于文档的问答系统——配置Elasticsearch客户端→初始化AnthropicBedrock客户端→定义搜索算法的索引及文档→采用bm25算法从Elasticsearch中获取与查询相关的结果→创建基于上下文的提示词→调用Anthropic模型生成回答
https://yunyaniu.blog.csdn.net/article/details/143755895
4、日志
持续更新中……
5、指标
持续更新中……
6、应用性能监控 (APM)
持续更新中……
7、安全日志
持续更新中……