当前位置: 首页 > 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.jsqmd.com/news/628924/

相关文章:

  • 聊聊2026年上海靠谱的化妆培训中心,比较好的学院排名 - 工业设备
  • MTKClient完全指南:解锁联发科设备底层控制的终极工具
  • MySQL 索引失效场景与调试方法
  • 揭秘Emotional First Aid Dataset:3步构建智能心理助手的完整方案
  • League-Toolkit终极指南:英雄联盟智能助手完整使用教程
  • 玉米脱粒机(cad+pro+说明书)
  • 终极指南:5分钟为Python桌面应用添加专业图标字体美化界面
  • LLM服务成本失控真相,深度拆解配额粒度设计、滑动窗口限流与租户隔离策略
  • Win11Debloat:Windows 11终极系统优化与隐私保护指南
  • Google新闻博彩链接风波:合规与合作的博弈
  • SecureCRT日志配置终极指南:7个必设项+14个变量详解(含%Y-%M-%D格式实战)
  • 分析南通五年一贯制专转本辅导,靠谱的品牌有哪些? - mypinpai
  • 终极纹理合成指南:GIMP Resynthesizer插件完全教程
  • 从Arduino到树莓派再到STM32:一文讲透不同平台下GPIO编程的‘潜规则’与避坑指南
  • 手把手教你用Python给数据“排座次”:深入理解斯皮尔曼相关系数的排名计算逻辑与重复值处理
  • 【RAG】【vector_stores034】Elasticsearch基础示例分析
  • 大儒家观:智能时代的心性四重奏
  • 基于属性的测试:框架抽象边界与生成属性融合难题
  • 合宙Air724UG Cat.1模块音频接口实战解析--从硬件设计到软件调试
  • 如何高效管理Pixiv插画收藏:Pixeval第三方客户端的完整指南
  • 2025届必备的五大AI写作平台解析与推荐
  • 如何5分钟完成黑苹果配置:OpCore-Simplify终极自动化工具完整指南
  • MCP协议实战:如何用Anthropic的开放标准快速搭建AI工具链(含代码示例)
  • OpCore Simplify:如何用图形化工具10分钟完成黑苹果EFI配置终极指南
  • 别再只用U-Net了!手把手教你用R2U-Net搞定医学图像分割(附PyTorch代码)
  • curatedMetagenomicData:开启人类微生物组研究的新纪元
  • Pixel Epic · Wisdom Terminal 助力软件测试:自动生成测试用例与缺陷分析
  • 3个场景让React Native打包代码不再神秘:React Native Decompiler深度指南
  • 授权发布:京城信德斋郑重声明 - 品牌排行榜单
  • Kotlin DSL实战:build.gradle.kts中的依赖管理与模块化配置