Skip to content
LlamaIndex 文档版本 跟随上游 源快照 e99df735 更新于 2026-10-18

本指南展示如何在 LlamaIndex 中执行自动检索。

许多流行的向量数据库除了支持用于语义搜索的查询字符串外,还支持一组元数据过滤器。给定自然语言查询,我们首先使用 LLM 推断一组元数据过滤器以及要传给向量数据库的正确查询字符串(两者都可以为空)。然后,这个整体查询包会针对向量数据库执行。

这允许超越 top-k 语义搜索,实现更动态、更具表现力的检索形式。给定查询的相关上下文可能只需要对元数据标签进行过滤,或者需要在过滤集内进行过滤 + 语义搜索的联合组合,或者只需要原始语义搜索。

我们以 Lantern 为例进行演示,但自动检索也在许多其他向量数据库中实现(例如 Pinecone、Chroma、Weaviate 等)。

如果你在 Colab 中打开这个 Notebook,可能需要先安装 LlamaIndex 🦙。

%pip install llama-index-vector-stores-lantern
!pip install llama-index psycopg2-binary asyncpg
import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
# set up OpenAI
import os

os.environ["OPENAI_API_KEY"] = "<your-api-key>"

import openai

openai.api_key = os.environ["OPENAI_API_KEY"]
import psycopg2
from 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 = True
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.lantern import LanternVectorStore
from 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 向量存储构建向量索引

在这里,我们将数据加载到向量存储中。如上所述,每个节点的文本和元数据都将转换为 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)

定义 VectorIndexAutoRetriever

我们定义核心 VectorIndexAutoRetriever 模块。该模块接收 VectorStoreInfo,其中包含向量存储集合及其支持的元数据过滤器的结构化描述。然后,此信息将用于自动检索提示词中,供 LLM 推断元数据过滤器。

from llama_index.core.retrievers import VectorIndexAutoRetriever
from 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")

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。