Qdrant 向量存储
创建 Qdrant 客户端
Section titled “Creating a Qdrant client”%pip install llama-index-vector-stores-qdrant llama-index-readers-file llama-index-embeddings-fastembed llama-index-llms-openaiimport loggingimport sysimport os
import qdrant_clientfrom IPython.display import Markdown, displayfrom llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.core import StorageContextfrom llama_index.vector_stores.qdrant import QdrantVectorStorefrom llama_index.embeddings.fastembed import FastEmbedEmbeddingfrom llama_index.core import Settings
Settings.embed_model = FastEmbedEmbedding(model_name="BAAI/bge-base-en-v1.5")如果是首次运行,请使用以下命令安装依赖项:
!pip install -U qdrant_client fastembed设置您的OpenAI密钥以验证LLM身份
请按照以下步骤将 OpenAI API 密钥设置到 OPENAI_API_KEY 环境变量中 -
- 使用终端
export OPENAI_API_KEY=your_api_key_here- 在 Jupyter Notebook 中使用 IPython 魔术命令
%env OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>- 使用 Python 脚本
import os
os.environ["OPENAI_API_KEY"] = "your_api_key_here"注意:通常建议将敏感信息(如API密钥)设置为环境变量,而不是将其硬编码到脚本中。
logging.basicConfig(stream=sys.stdout, level=logging.INFO)logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))下载数据
!mkdir -p 'data/paul_graham/'!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'# load documentsdocuments = SimpleDirectoryReader("./data/paul_graham/").load_data()client = qdrant_client.QdrantClient( # you can use :memory: mode for fast and light-weight experiments, # it does not require to have Qdrant deployed anywhere # but requires qdrant-client >= 1.1.1 # location=":memory:" # otherwise set Qdrant instance address with: # url="http://<host>:<port>" # otherwise set Qdrant instance with host and port: host="localhost", port=6333 # set API KEY for Qdrant Cloud # api_key="<qdrant-api-key>",)vector_store = QdrantVectorStore(client=client, collection_name="paul_graham")storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents( documents, storage_context=storage_context,)# set Logging to DEBUG for more detailed outputsquery_engine = index.as_query_engine()response = query_engine.query("What did the author do growing up?")display(Markdown(f"<b>{response}</b>"))作者在大学之前从事写作和编程工作。
# set Logging to DEBUG for more detailed outputsquery_engine = index.as_query_engine()response = query_engine.query( "What did the author do after his time at Viaweb?")display(Markdown(f"<b>{response}</b>"))作者在离开Viaweb后,安排为一个为顾客做项目的团队做自由职业工作。
异步构建 VectorStoreIndex
Section titled “Build the VectorStoreIndex asynchronously”# To connect to the same event-loop,# allows async events to run on notebook
import nest_asyncio
nest_asyncio.apply()aclient = qdrant_client.AsyncQdrantClient( # you can use :memory: mode for fast and light-weight experiments, # it does not require to have Qdrant deployed anywhere # but requires qdrant-client >= 1.1.1 location=":memory:" # otherwise set Qdrant instance address with: # uri="http://<host>:<port>" # set API KEY for Qdrant Cloud # api_key="<qdrant-api-key>",)vector_store = QdrantVectorStore( collection_name="paul_graham", client=client, aclient=aclient, prefer_grpc=True,)storage_context = StorageContext.from_defaults(vector_store=vector_store)index = VectorStoreIndex.from_documents( documents, storage_context=storage_context, use_async=True,)query_engine = index.as_query_engine(use_async=True)response = await query_engine.aquery("What did the author do growing up?")display(Markdown(f"<b>{response}</b>"))作者致力于撰写短篇小说和编程,特别是在九年级时使用早期版本的Fortran在IBM 1401计算机上工作。后来,作者转向了微型计算机领域,大约在1980年从TRS-80开始,编写了简单的游戏、程序和一个文字处理器。
# set Logging to DEBUG for more detailed outputsquery_engine = index.as_query_engine(use_async=True)response = await query_engine.aquery( "What did the author do after his time at Viaweb?")display(Markdown(f"<b>{response}</b>"))该作者在Viaweb工作后,共同创立了Y Combinator。
在创建 qdrant 索引时,您可以启用混合搜索。这里我们使用 Qdrant 的 BM25 功能来快速创建用于混合检索的稀疏和密集索引。
from qdrant_client import QdrantClient, AsyncQdrantClientfrom llama_index.core import VectorStoreIndexfrom llama_index.core import StorageContextfrom llama_index.vector_stores.qdrant import QdrantVectorStore
client = QdrantClient(host="localhost", port=6333)aclient = AsyncQdrantClient(host="localhost", port=6333)
vector_store = QdrantVectorStore( client=client, aclient=aclient, collection_name="paul_graham_hybrid", enable_hybrid=True, fastembed_sparse_model="Qdrant/bm25",)
index = VectorStoreIndex.from_documents( documents, storage_context=StorageContext.from_defaults(vector_store=vector_store),)
# retrieve 2 sparse, 2 dense, and filter down to 3 total hybrid resultsquery_engine = index.as_query_engine( vector_store_query_mode="hybrid", sparse_top_k=2, similarity_top_k=2, hybrid_top_k=3,)
response = query_engine.query("What did the author do growing up?")display(Markdown(f"<b>{response}</b>"))要恢复索引,在大多数情况下,您可以直接使用向量存储对象本身进行恢复。索引由Qdrant自动保存。
loaded_index = VectorStoreIndex.from_vector_store( vector_store, # Embedding model should match the original embedding model # embed_model=Settings.embed_model)