news 2026/9/28 7:37:59

【RAG】【vector_stores033】Elasticsearch自动检索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【RAG】【vector_stores033】Elasticsearch自动检索

案例目标

本案例展示了如何使用Elasticsearch向量存储与LlamaIndex实现自动检索功能。自动检索是一种高级检索技术,它可以根据自然语言查询自动推断出适当的元数据过滤条件和查询字符串。

通过本案例,您将学习到:

  • 如何使用Elasticsearch作为向量存储后端
  • 如何定义向量存储的元数据信息
  • 如何使用VectorIndexAutoRetriever实现自动检索
  • 如何让LLM自动推断元数据过滤条件
  • 如何结合语义搜索和元数据过滤实现更精确的检索
自动检索

根据自然语言查询自动推断元数据过滤条件

向量存储

使用Elasticsearch作为向量存储后端

元数据过滤

支持多种元数据类型的过滤条件

语义搜索

结合语义搜索和元数据过滤提高检索精度

技术栈与核心依赖

本案例使用以下技术栈和依赖:

LlamaIndexElasticsearchOpenAIPython

核心依赖包:
llama-index-vector-stores-elasticsearch llama-index openai
关键组件:
  • ElasticsearchStore: 连接Elasticsearch向量存储
  • VectorIndexAutoRetriever: 实现自动检索功能
  • VectorStoreInfo: 定义向量存储和元数据信息
  • MetadataInfo: 描述元数据字段信息

环境配置

1. 安装必要的依赖包
pip install llama-index-vector-stores-elasticsearch pip install llama-index
2. 配置OpenAI API密钥
import os import getpass os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") import openai openai.api_key = os.environ["OPENAI_API_KEY"]
3. 导入必要的依赖
import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout)) from llama_index.core import VectorStoreIndex, StorageContext from llama_index.vector_stores.elasticsearch import ElasticsearchStore from llama_index.core.schema import TextNode from llama_index.core.retrievers import VectorIndexAutoRetriever from llama_index.core.vector_stores import MetadataInfo, VectorStoreInfo
4. 启动Elasticsearch服务

确保Elasticsearch服务在本地运行,默认地址为 http://localhost:9200

案例实现

1. 定义示例数据

# 定义带有元数据的文本节点 nodes = [ TextNode( text=( "A bunch of scientists bring back dinosaurs and mayhem breaks" " loose" ), metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"}, ), TextNode( text=( "Leo DiCaprio gets lost in a dream within a dream within a dream" " within a ..." ), metadata={ "year": 2010, "director": "Christopher Nolan", "rating": 8.2, }, ), TextNode( text=( "A psychologist / detective gets lost in a series of dreams within" " dreams within dreams and Inception reused the idea" ), metadata={"year": 2006, "director": "Satoshi Kon", "rating": 8.6}, ), TextNode( text=( "A bunch of normal-sized women are supremely wholesome and some" " men pine after them" ), metadata={"year": 2019, "director": "Greta Gerwig", "rating": 8.3}, ), TextNode( text="Toys come alive and have a blast doing so", metadata={"year": 1995, "genre": "animated"}, ), ]

2. 构建Elasticsearch向量索引

# 创建Elasticsearch向量存储 vector_store = ElasticsearchStore( index_name="auto_retriever_movies", es_url="http://localhost:9200" ) storage_context = StorageContext.from_defaults(vector_store=vector_store) # 创建向量索引 index = VectorStoreIndex(nodes, storage_context=storage_context)

3. 定义VectorIndexAutoRetriever

# 定义向量存储信息 vector_store_info = VectorStoreInfo( content_info="Brief summary of a movie", metadata_info=[ MetadataInfo( name="genre", description="The genre of the movie", type="string or list[string]", ), MetadataInfo( name="year", description="The year the movie was released", type="integer", ), MetadataInfo( name="director", description="The name of the movie director", type="string", ), MetadataInfo( name="rating", description="A 1-10 rating for the movie", type="float", ), ], ) # 创建自动检索器 retriever = VectorIndexAutoRetriever( index, vector_store_info=vector_store_info )

4. 执行自动检索查询

# 查询1:查找Christopher Nolan在2020年前导演的电影 results = retriever.retrieve( "What are 2 movies by Christopher Nolan were made before 2020?" ) print(results)
# 查询2:查找Andrei Tarkovsky导演的科幻电影 results = retriever.retrieve("Has Andrei Tarkovsky directed any science fiction movies") print(results)

案例效果

本案例展示了Elasticsearch自动检索的强大功能,实现了以下效果:

  • 自动元数据过滤:系统能够根据自然语言查询自动推断出适当的元数据过滤条件
  • 语义搜索增强:结合语义搜索和元数据过滤,提高检索的精确度
  • 灵活查询处理:可以处理各种复杂的查询场景,包括多条件组合查询
  • 智能查询理解:系统能够理解查询意图,并自动选择最合适的检索策略
关键观察:
  • 对于"What are 2 movies by Christopher Nolan were made before 2020?"查询,系统自动推断出director="Christopher Nolan"和year<2020的过滤条件
  • 对于"Has Andrei Tarkovsky directed any science fiction movies?"查询,系统自动推断出director="Andrei Tarkovsky"和genre="science fiction"的过滤条件
  • 系统不仅应用了元数据过滤,还使用了语义搜索,确保检索结果的语义相关性

输出示例: INFO:llama_index.indices.vector_store.retrievers.auto_retriever.auto_retriever:Using query str: science fiction Using query str: science fiction INFO:llama_index.indices.vector_store.retrievers.auto_retriever.auto_retriever:Using filters: {'director': 'Andrei Tarkovsky'} Using filters: {'director': 'Andrei Tarkovsky'} INFO:llama_index.indices.vector_store.retrievers.auto_retriever.auto_retriever:Using top_k: 2 Using top_k: 2

案例实现思路

本案例的实现思路如下:

  1. 环境准备:安装必要的依赖包,配置OpenAI API密钥,启动Elasticsearch服务
  2. 数据准备:创建带有文本和元数据的TextNode对象
  3. 向量存储创建:使用ElasticsearchStore创建向量存储,并将数据加载到Elasticsearch
  4. 向量存储信息定义:使用VectorStoreInfo和MetadataInfo定义向量存储和元数据信息
  5. 自动检索器创建:使用VectorIndexAutoRetriever创建自动检索器
  6. 查询执行:使用自然语言查询,系统自动推断元数据过滤条件和查询字符串
技术要点:
  • VectorIndexAutoRetriever是LlamaIndex提供的自动检索器,它使用LLM自动推断查询参数
  • VectorStoreInfo描述了向量存储的内容和元数据字段信息
  • MetadataInfo定义了每个元数据字段的名称、描述和类型
  • 系统根据自然语言查询自动生成查询字符串和元数据过滤条件
  • 检索结果结合了语义搜索和元数据过滤,提高了检索的精确度

扩展建议

基于本案例,可以考虑以下扩展方向:

  • 更多元数据类型:扩展支持更多的元数据类型,如日期、地理位置等
  • 复杂过滤条件:实现更复杂的过滤条件,如范围查询、模糊匹配等
  • 多语言支持:扩展支持多语言查询和文档
  • 自定义提示模板:自定义自动检索的提示模板,提高特定领域的检索效果
  • 性能优化:优化大规模数据下的检索性能
  • 可视化界面:开发可视化界面,方便用户使用自动检索功能
  • 结果排序优化:实现更智能的结果排序算法
  • 多向量存储支持:支持同时查询多个向量存储

总结

本案例详细介绍了如何使用Elasticsearch向量存储和LlamaIndex的VectorIndexAutoRetriever实现自动检索功能。通过定义向量存储信息和元数据信息,系统能够根据自然语言查询自动推断出适当的元数据过滤条件和查询字符串。

自动检索技术结合了语义搜索和元数据过滤的优点,能够实现更精确、更智能的检索。它特别适合于需要处理复杂查询场景的应用,如电影推荐、文档检索、知识问答等。

通过本案例的学习,您应该掌握了如何使用VectorIndexAutoRetriever实现自动检索,以及如何定义向量存储和元数据信息。这些知识将帮助您构建更智能、更高效的检索应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 3:30:19

终极指南:如何使用ECAPA-TDNN构建99%准确率的说话人验证系统

终极指南&#xff1a;如何使用ECAPA-TDNN构建99%准确率的说话人验证系统 【免费下载链接】ECAPA-TDNN Unofficial reimplementation of ECAPA-TDNN for speaker recognition (EER0.86 for Vox1_O when train only in Vox2) 项目地址: https://gitcode.com/gh_mirrors/ec/ECAP…

作者头像 李华
网站建设 2026/9/18 3:19:59

新能源场站正在被“数据洪水”淹没:我们不缺天气预报,缺的是能直接落袋为安的“经营参谋”

你有没有发现一个很奇怪的现象&#xff1f;这两年&#xff0c;新能源场站的气象服务越来越“卷”了。从原来看个温度风速&#xff0c;现在动不动就是“xx大模型”、“1公里x1公里网格”、“未来45天预测”。但问题来了&#xff1a;数据越多&#xff0c;场站长的焦虑反而越重。就…

作者头像 李华
网站建设 2026/9/18 20:06:04

谈薪技巧:如何拿到理想的薪资?

谈薪技巧&#xff1a;如何拿到理想的薪资&#xff1f; 在职场中&#xff0c;薪资谈判是许多人既期待又忐忑的环节。能否拿到理想的薪资&#xff0c;不仅关系到当下的收入&#xff0c;还可能影响未来的职业发展。很多人因为缺乏技巧&#xff0c;要么不敢开口&#xff0c;要么谈…

作者头像 李华
网站建设 2026/9/21 16:08:41

Kafka安全加固实战:SASL/PLAIN认证配置详解

1. 为什么你的Kafka需要SASL/PLAIN认证&#xff1f; 最近帮朋友排查一个Kafka数据泄露问题&#xff0c;发现他们测试环境的Kafka集群居然裸奔在公网上&#xff0c;没有任何认证措施。这就像把自家大门钥匙插在门锁上&#xff0c;谁都能随便进出。今天我们就来聊聊如何用SASL/PL…

作者头像 李华
网站建设 2026/9/17 20:57:12

Wan2.1-UMT5进阶:利用Claude Code辅助编写模型调用与处理脚本

Wan2.1-UMT5进阶&#xff1a;利用Claude Code辅助编写模型调用与处理脚本 1. 引言&#xff1a;当AI模型遇上AI编程助手 最近在折腾Wan2.1-UMT5这个视频生成模型&#xff0c;说实话&#xff0c;功能挺强大的&#xff0c;但每次想用它做点自动化的事情&#xff0c;就得写一堆Py…

作者头像 李华
网站建设 2026/9/21 17:38:25

SpringBoot+QQ邮箱实战:从零搭建邮件服务到高级模板应用全解析

1. 环境准备与QQ邮箱配置 在开始SpringBoot整合QQ邮箱之前&#xff0c;我们需要先做好基础准备工作。就像盖房子需要打地基一样&#xff0c;邮件服务开发也需要先搭建好开发环境。我建议使用JDK 17版本&#xff0c;这是目前SpringBoot官方推荐的最新稳定版本。开发工具可以选择…

作者头像 李华