当前位置: 首页 > news >正文

【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实现自动检索,以及如何定义向量存储和元数据信息。这些知识将帮助您构建更智能、更高效的检索应用。

http://www.cnnetsun.cn/news/1844897.html

相关文章:

  • 终极指南:如何使用ECAPA-TDNN构建99%准确率的说话人验证系统
  • 新能源场站正在被“数据洪水”淹没:我们不缺天气预报,缺的是能直接落袋为安的“经营参谋”
  • 谈薪技巧:如何拿到理想的薪资?
  • Kafka安全加固实战:SASL/PLAIN认证配置详解
  • Wan2.1-UMT5进阶:利用Claude Code辅助编写模型调用与处理脚本
  • SpringBoot+QQ邮箱实战:从零搭建邮件服务到高级模板应用全解析
  • 提示词迭代无记录、回滚靠猜、AB测试难复现:你还在用Excel管Prompt?
  • 解密高效目标检测:MobileNet-SSD实战应用全解析
  • GLM-4.1V-9B-Bate数据处理管道构建:从MATLAB到AI模型的端到端流程
  • NB-IoT-NPUSCH(三)-单音与多音调制技术解析
  • 阿里Qwen3-VL-WEBUI实战:从零配置GPU环境,开启多模态AI应用
  • 宝塔面板RabbitMQ安装后管理界面进不去?别只重启,试试这个密码修改和权限配置流程
  • 塞尔达传说旷野之息存档编辑器:快速修改卢比、武器和属性的终极指南 [特殊字符]
  • Qwen3-TTS-12Hz-1.7B-Base效果展示:德语严谨播报vs意大利热情解说对比
  • 麒麟V10 SP3系统下MySQL 8.0的部署与安全加固实战
  • SDMatte开源模型对比评测:与业界主流Matting方案的效果与性能分析
  • Windows11系统精简优化:一键清理预装软件与隐私保护的完整指南
  • LangChain + Kimi + Tavily:三剑客打造实时信息驱动的智能体(Agent)
  • 终极Joplin大纲插件使用指南:5分钟掌握高效笔记导航
  • 深度解析MIT四足机器人控制:从ROS+PyBullet仿真到实际部署的完整指南
  • 别再只画5V了!Type-C接口的CC引脚和5.1k下拉电阻,到底该怎么接?
  • pinyin4j 实战:多音字精准匹配与优化策略
  • 升级 Indy HTTP Server 至 OpenSSL 3.0:从兼容性到实战部署
  • 暗黑破坏神2存档编辑器终极指南:5分钟掌握完整存档修改功能
  • GLM-TTS批量推理教程:JSONL文件配置,自动化生成海量音频
  • G-Helper:华硕笔记本的终极轻量级控制方案
  • Android10+开机自启动避坑指南:BroadcastReceiver与JobScheduler实战对比
  • vscode-drawio v1.8.0架构深度解析:VS Code中的Draw.io集成技术实现
  • Android AAudio低延迟音频流实战:从独占模式到性能调优
  • Python-SoundFile音频库:如何用3行代码搞定专业音频处理?