Skip to content

Fleet Context Embeddings - 为 Llamaindex 图书馆构建混合搜索引擎#

在本指南中,我们将使用 Fleet Context 下载 LlamaIndex 文档的嵌入,并在其上构建一个混合的稠密/稀疏向量检索引擎。

先决条件#

!pip install llama-index
!pip install --upgrade fleet-context
import os
import openai

os.environ["OPENAI_API_KEY"] = "sk-..." # 在这里添加你的 API 密钥!
openai.api_key = os.environ["OPENAI_API_KEY"]

从 Fleet Context 下载嵌入#

我们将使用 Fleet Context 下载 LlamaIndex 文档的嵌入(\~12k 个块,\~100mb 内容)。您可以通过指定库名称作为参数来下载前 1220 个库中的任何一个的嵌入。您可以在页面底部查看完整的支持库列表这里

我们这样做是因为 Fleet 构建了一个嵌入管道,保留了许多重要信息,这些信息将使检索和生成更好,包括页面位置(用于重新排序)、块类型(类/函数/属性等)、父节等。您可以在他们的 Github 页面上阅读更多相关信息。

from context import download_embeddings

df = download_embeddings("llamaindex")

输出

    100%|██████████| 83.7M/83.7M [00:03<00:00, 27.4MiB/s]
                                         id  \
    0  e268e2a1-9193-4e7b-bb9b-7a4cb88fc735
    1  e495514b-1378-4696-aaf9-44af948de1a1
    2  e804f616-7db0-4455-9a06-49dd275f3139
    3  eb85c854-78f1-4116-ae08-53b2a2a9fa41
    4  edfc116e-cf58-4118-bad4-c4bc0ca1495e
# 显示一些元数据的示例
df["metadata"][0]
display(Markdown(f"{df['metadata'][8000]['text']}"))

输出

classmethod from_dict(data: Dict[str, Any], kwargs: Any)  Self classmethod from_json(data_str: str, kwargs: Any)  Self classmethod from_orm(obj: Any)  Model json(, include: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, exclude: Optional[Union[AbstractSetIntStr, MappingIntStrAny]] = None, by_alias: bool = False, skip_defaults: Optional[bool] = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, encoder: Optional[Callable[[Any], Any]] = None, models_as_dict: bool = True*, dumps_kwargs: Any)  unicode 生成模型的 JSON 表示,包括和排除参数如 dict()

为 LlamaIndex 创建 Pinecone 索引以进行混合搜索#

我们将创建一个 Pinecone 索引,并将我们的向量插入其中,以便我们可以使用稀疏向量和稠密向量进行混合检索。在继续之前,请确保您拥有Pinecone 账户

import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().handlers = []
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
import pinecone

api_key = "..."  # 在这里添加你的 Pinecone API 密钥
pinecone.init(
    api_key=api_key, environment="us-east-1-aws"
)  # 在这里添加你的数据库区域
# Fleet Context 使用 OpenAI 的 text-embedding-ada-002 模型,具有 1536 个维度。

# 注意:Pinecone 要求混合搜索使用点积相似度
pinecone.create_index(
    "quickstart-fleet-context",
    dimension=1536,
    metric="dotproduct",
    pod_type="p1",
)

pinecone.describe_index(
    "quickstart-fleet-context"
)  # 确保您在 Pinecone 中创建了一个索引
from llama_index.vector_stores.pinecone import PineconeVectorStore

pinecone_index = pinecone.Index("quickstart-fleet-context")
vector_store = PineconeVectorStore(pinecone_index, add_sparse_vector=True)

批量将向量插入 Pinecone#

Pinecone 建议每次插入 100 个向量。我们将在稍微修改数据格式后执行此操作。

import random
import itertools


def chunks(iterable, batch_size=100):
    """一个帮助函数,将可迭代对象分成大小为 batch_size 的块。"""
    it = iter(iterable)
    chunk = tuple(itertools.islice(it, batch_size))
    while chunk:
        yield chunk
        chunk = tuple(itertools.islice(it, batch_size))


# 生成器,生成许多 (id, vector, metadata, sparse_values) 对
data_generator = map(
    lambda row: {
        "id": row[1]["id"],
        "values": row[1]["values"],
        "metadata": row[1]["metadata"],
        "sparse_values": row[1]["sparse_values"],
    },
    df.iterrows(),
)

# 每次插入 1000 个向量的数据
for ids_vectors_chunk in chunks(data_generator, batch_size=100):
    print(f"正在插入 {len(ids_vectors_chunk)} 个向量...")
    pinecone_index.upsert(vectors=ids_vectors_chunk)

在 LlamaIndex 中构建 Pinecone 向量存储#

最后,我们将通过 LlamaIndex 构建 Pinecone 向量存储,并查询以获取结果。

from llama_index.core import VectorStoreIndex
from IPython.display import Markdown, display
index = VectorStoreIndex.from_vector_store(vector_store=vector_store)



查询您的索引!#

query_engine = index.as_query_engine(
    vector_store_query_mode="hybrid", similarity_top_k=8
)
response = query_engine.query("How do I use llama_index SimpleDirectoryReader")
display(Markdown(f"<b>{response}</b>"))

输出:

<b>要使用 llama_index 中的 SimpleDirectoryReader,您需要从 llama_index 库中导入它。一旦导入,您可以通过将目录路径作为参数来创建 SimpleDirectoryReader 类的实例。然后,您可以在 SimpleDirectoryReader 实例上使用 `load_data()` 方法来从指定目录加载文档。</b>