主题
在本 notebook 中,我们将展示如何使用 Postgresql 和 Lantern 在 LlamaIndex 中执行向量搜索
如果你在 Colab 中打开这个 Notebook,可能需要先安装 LlamaIndex 🦙。
%pip install llama-index-vector-stores-lantern
%pip install llama-index-embeddings-openai!pip install psycopg2-binary llama-index asyncpgfrom llama_index.core import SimpleDirectoryReader, StorageContext
from llama_index.core import VectorStoreIndex
from llama_index.vector_stores.lantern import LanternVectorStore
import textwrap
import openai设置 OpenAI
第一步是配置 OpenAI 密钥。它将用于为加载到索引中的文档创建嵌入
import os
os.environ["OPENAI_API_KEY"] = "<your_key>"
openai.api_key = "<your_key>"下载数据
!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'加载文档
使用 SimpleDirectoryReader 加载存储在 data/paul_graham/ 中的文档
documents = SimpleDirectoryReader("./data/paul_graham").load_data()
print("Document ID:", documents[0].doc_id)创建数据库
使用在 localhost 上运行的现有 Postgres,创建我们将要使用的数据库。
import psycopg2
connection_string = "postgresql://postgres:postgres@localhost:5432"
db_name = "postgres"
conn = psycopg2.connect(connection_string)
conn.autocommit = True
with conn.cursor() as c:
c.execute(f"DROP DATABASE IF EXISTS {db_name}")
c.execute(f"CREATE DATABASE {db_name}")from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core import Settings
# Setup global settings with embedding model
# So query strings will be transformed to embeddings and HNSW index will be used
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")创建索引
在这里,我们使用先前加载的文档创建一个由 Postgres 支持的索引。LanternVectorStore 接受几个参数。
from sqlalchemy import make_url
url = make_url(connection_string)
vector_store = LanternVectorStore.from_params(
database=db_name,
host=url.host,
password=url.password,
port=url.port,
user=url.username,
table_name="paul_graham_essay",
embed_dim=1536, # openai embedding dimension
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context, show_progress=True
)
query_engine = index.as_query_engine()查询索引
现在我们可以使用索引来提问了。
response = query_engine.query("What did the author do?")print(textwrap.fill(str(response), 100))response = query_engine.query("What happened in the mid 1980s?")print(textwrap.fill(str(response), 100))查询现有索引
vector_store = LanternVectorStore.from_params(
database=db_name,
host=url.host,
password=url.password,
port=url.port,
user=url.username,
table_name="paul_graham_essay",
embed_dim=1536, # openai embedding dimension
m=16, # HNSW M parameter
ef_construction=128, # HNSW ef construction parameter
ef=64, # HNSW ef search parameter
)
# Read more about HNSW parameters here: https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md
index = VectorStoreIndex.from_vector_store(vector_store=vector_store)
query_engine = index.as_query_engine()response = query_engine.query("What did the author do?")print(textwrap.fill(str(response), 100))混合搜索
要启用混合搜索,你需要:
- 在构造
LanternVectorStore时传入hybrid_search=True(并可选地使用所需语言配置text_search_config) - 在构造查询引擎时传入
vector_store_query_mode="hybrid"(此配置会在底层传递给检索器)。你还可以选择设置sparse_top_k,以配置应从稀疏文本搜索中获取多少结果(默认使用与similarity_top_k相同的值)。
from sqlalchemy import make_url
url = make_url(connection_string)
hybrid_vector_store = LanternVectorStore.from_params(
database=db_name,
host=url.host,
password=url.password,
port=url.port,
user=url.username,
table_name="paul_graham_essay_hybrid_search",
embed_dim=1536, # openai embedding dimension
hybrid_search=True,
text_search_config="english",
)
storage_context = StorageContext.from_defaults(
vector_store=hybrid_vector_store
)
hybrid_index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context
)hybrid_query_engine = hybrid_index.as_query_engine(
vector_store_query_mode="hybrid", sparse_top_k=2
)
hybrid_response = hybrid_query_engine.query(
"Who does Paul Graham think of with the word schtick"
)print(hybrid_response)