Lantern 向量存储(自动检索器)
This guide shows how to perform auto-retrieval in LlamaIndex.
许多流行的向量数据库除了支持语义搜索的查询字符串外,还支持一组元数据过滤器。给定一个自然语言查询,我们首先使用LLM推断出一组元数据过滤器以及传递给向量数据库的正确查询字符串(两者也可以为空)。然后针对向量数据库执行这个完整的查询包。
这允许实现比前k个语义搜索更动态、更具表现力的检索形式。对于给定查询的相关上下文可能仅需对元数据标签进行过滤,或需要在过滤后的集合中进行过滤+语义搜索的联合组合,或仅需原始语义搜索。
我们以 Lantern 为例进行演示,但自动检索功能也已实现在许多其他向量数据库中(例如 Pinecone、Chroma、Weaviate 等)。
如果您在 Colab 上打开这个笔记本,您可能需要安装 LlamaIndex 🦙。
%pip install llama-index-vector-stores-lantern!pip install llama-index psycopg2-binary asyncpgimport loggingimport sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))# set up OpenAIimport os
os.environ["OPENAI_API_KEY"] = "<your-api-key>"
import openai
openai.api_key = os.environ["OPENAI_API_KEY"]import psycopg2from sqlalchemy import make_url
connection_string = "postgresql://postgres:postgres@localhost:5432"
url = make_url(connection_string)
db_name = "postgres"conn = psycopg2.connect(connection_string)conn.autocommit = Truefrom llama_index.core import VectorStoreIndex, StorageContextfrom llama_index.vector_stores.lantern import LanternVectorStorefrom llama_index.core.schema import TextNode
nodes = [ TextNode( text=( "Michael Jordan is a retired professional basketball player," " widely regarded as one of the greatest basketball players of all" " time." ), metadata={ "category": "Sports", "country": "United States", }, ), TextNode( text=( "Angelina Jolie is an American actress, filmmaker, and" " humanitarian. She has received numerous awards for her acting" " and is known for her philanthropic work." ), metadata={ "category": "Entertainment", "country": "United States", }, ), TextNode( text=( "Elon Musk is a business magnate, industrial designer, and" " engineer. He is the founder, CEO, and lead designer of SpaceX," " Tesla, Inc., Neuralink, and The Boring Company." ), metadata={ "category": "Business", "country": "United States", }, ), TextNode( text=( "Rihanna is a Barbadian singer, actress, and businesswoman. She" " has achieved significant success in the music industry and is" " known for her versatile musical style." ), metadata={ "category": "Music", "country": "Barbados", }, ), TextNode( text=( "Cristiano Ronaldo is a Portuguese professional footballer who is" " considered one of the greatest football players of all time. He" " has won numerous awards and set multiple records during his" " career." ), metadata={ "category": "Sports", "country": "Portugal", }, ),]使用 Lantern 向量存储构建向量索引
Section titled “Build Vector Index with Lantern Vector Store”这里我们将数据加载到向量存储中。如上所述,每个节点的文本和元数据都将在Lantern中转换为相应的表示形式。我们现在可以通过Lantern对这些数据运行语义查询和元数据过滤。
vector_store = LanternVectorStore.from_params( database=db_name, host=url.host, password=url.password, port=url.port, user=url.username, table_name="famous_people", embed_dim=1536, # openai embedding dimension m=16, # HNSW M parameter ef_construction=128, # HNSW ef construction parameter ef=64, # HNSW ef search parameter)
storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex(nodes, storage_context=storage_context)定义 VectorIndexAutoRetrieverVectorIndexAutoRetriever
Section titled “Define VectorIndexAutoRetriever”We define our core VectorIndexAutoRetriever module. The module takes in VectorStoreInfo,
which contains a structured description of the vector store collection and the metadata filters it supports.
This information will then be used in the auto-retrieval prompt where the LLM infers metadata filters.
from llama_index.core.retrievers import VectorIndexAutoRetrieverfrom llama_index.core.vector_stores import MetadataInfo, VectorStoreInfo
vector_store_info = VectorStoreInfo( content_info="brief biography of celebrities", metadata_info=[ MetadataInfo( name="category", type="str", description=( "Category of the celebrity, one of [Sports, Entertainment," " Business, Music]" ), ), MetadataInfo( name="country", type="str", description=( "Country of the celebrity, one of [United States, Barbados," " Portugal]" ), ), ],)retriever = VectorIndexAutoRetriever( index, vector_store_info=vector_store_info)我们尝试对一些示例数据进行运行。请注意元数据过滤器是如何被推断的 - 这有助于实现更精确的检索!
retriever.retrieve("Tell me about two celebrities from United States")